blob: 3640736d535bbffc83aa1df92305beed09777474 [file] [log] [blame]
Manuel Klimek1da79332012-08-20 20:54:03 +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) {
Manuel Klimek67619ff2012-09-07 13:10:32 +000023 if (!id) return;
Manuel Klimek1da79332012-08-20 20:54:03 +000024 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>
Manuel Klimek67619ff2012-09-07 13:10:32 +000032<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
Manuel Klimek1da79332012-08-20 20:54:03 +000033
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
Manuel Klimek8c5f9482013-06-21 09:59:59 +000060<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
Manuel Klimek1da79332012-08-20 20:54:03 +000072<!-- ======================================================================= -->
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
Manuel Klimek8c5f9482013-06-21 09:59:59 +000088<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
Manuel Klimek1da79332012-08-20 20:54:03 +000099<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
Manuel Klimek532870f2013-07-24 05:46:07 +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('ctorInitializer0')"><a name="ctorInitializer0Anchor">ctorInitializer</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104<tr><td colspan="4" class="doc" id="ctorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107 class C {
108 C() : i(42) {}
109 int i;
110 };
111</pre></td></tr>
112
113
Daniel Jasperc7093d92013-02-25 12:39:41 +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>
115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118 class C {
119 public:
120 int a;
121 };
122accessSpecDecl()
123 matches 'public:'
124</pre></td></tr>
125
126
Manuel Klimek67619ff2012-09-07 13:10:32 +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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000128<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000129
130Example matches Z
131 template&lt;class T&gt; class Z {};
132</pre></td></tr>
133
134
Manuel Klimek67619ff2012-09-07 13:10:32 +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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000136<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000137
138Given
139 template&lt;typename T&gt; class A {};
140 template&lt;&gt; class A&lt;double&gt; {};
141 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000142classTemplateSpecializationDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000143 matches the specializations A&lt;int&gt; and A&lt;double&gt;
144</pre></td></tr>
145
146
Manuel Klimek67619ff2012-09-07 13:10:32 +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('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000148<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000149
150Example matches Foo::Foo() and Foo::Foo(int)
151 class Foo {
152 public:
153 Foo();
154 Foo(int);
155 int DoSomething();
156 };
157</pre></td></tr>
158
159
Manuel Klimek67619ff2012-09-07 13:10:32 +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('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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000161<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
162
163Examples matches X, C, and the friend declaration inside C;
164 void X();
165 class C {
166 friend X;
167 };
168</pre></td></tr>
169
170
Manuel Klimek1a68afd2013-06-20 13:08:29 +0000171<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>
172<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
173and non-type template parameter declarations).
174
175Given
176 class X { int y; };
177declaratorDecl()
178 matches int y.
179</pre></td></tr>
180
181
Manuel Klimek67619ff2012-09-07 13:10:32 +0000182<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000183<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000184
185Example matches Foo::~Foo()
186 class Foo {
187 public:
188 virtual ~Foo();
189 };
190</pre></td></tr>
191
192
Manuel Klimek67619ff2012-09-07 13:10:32 +0000193<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000194<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000195
196Example matches A, B, C
197 enum X {
198 A, B, C
199 };
200</pre></td></tr>
201
202
Manuel Klimek67619ff2012-09-07 13:10:32 +0000203<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000204<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
205
206Example matches X
207 enum X {
208 A, B, C
209 };
210</pre></td></tr>
211
212
Manuel Klimek67619ff2012-09-07 13:10:32 +0000213<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000214<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000215
216Given
217 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000218fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000219 matches 'm'.
220</pre></td></tr>
221
222
Manuel Klimek532870f2013-07-24 05:46:07 +0000223<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>
224<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
225
226Given
227 class X { friend void foo(); };
228friendDecl()
229 matches 'friend void foo()'.
230</pre></td></tr>
231
232
Manuel Klimek67619ff2012-09-07 13:10:32 +0000233<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000234<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000235
236Example matches f
237 void f();
238</pre></td></tr>
239
240
Manuel Klimek67619ff2012-09-07 13:10:32 +0000241<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000242<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000243
244Example matches f
245 template&lt;class T&gt; void f(T t) {}
246</pre></td></tr>
247
248
Manuel Klimek67619ff2012-09-07 13:10:32 +0000249<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000250<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000251
252Example matches y
253 class X { void y() };
254</pre></td></tr>
255
256
Manuel Klimek67619ff2012-09-07 13:10:32 +0000257<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000258<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
Manuel Klimek1da79332012-08-20 20:54:03 +0000259
260Example matches X, S, the anonymous union type, i, and U;
261 typedef int X;
262 struct S {
263 union {
264 int i;
265 } U;
266 };
267</pre></td></tr>
268
269
Edwin Vane0332e0a2013-05-09 16:42:37 +0000270<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>
271<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
272
273Given
274 namespace {}
275 namespace test {}
276namespaceDecl()
277 matches "namespace {}" and "namespace test {}"
278</pre></td></tr>
279
280
Manuel Klimek1a68afd2013-06-20 13:08:29 +0000281<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>
282<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
283
284Given
285 void f(int x);
286parmVarDecl()
287 matches int x.
288</pre></td></tr>
289
290
Manuel Klimek67619ff2012-09-07 13:10:32 +0000291<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000292<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000293
294Example matches X, Z
295 class X;
296 template&lt;class T&gt; class Z {};
297</pre></td></tr>
298
299
Manuel Klimek532870f2013-07-24 05:46:07 +0000300<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>
301<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
302
303Given
304 template&lt;typename X&gt;
305 class C : private X {
306 using X::x;
307 };
308unresolvedUsingValueDecl()
309 matches using X::x </pre></td></tr>
310
311
Manuel Klimek67619ff2012-09-07 13:10:32 +0000312<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000313<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
314
315Given
316 namespace X { int x; }
317 using X::x;
318usingDecl()
319 matches using X::x </pre></td></tr>
320
321
Manuel Klimek67619ff2012-09-07 13:10:32 +0000322<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000323<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000324
325Note: this does not match declarations of member variables, which are
326"field" declarations in Clang parlance.
327
328Example matches a
329 int a;
330</pre></td></tr>
331
332
Manuel Klimek41df16e2013-01-09 09:38:21 +0000333<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>
334<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
335</pre></td></tr>
336
337
338<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>
339<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
340
341Given
342 namespace ns {
343 struct A { static void f(); };
344 void A::f() {}
345 void g() { A::f(); }
346 }
347 ns::A a;
348nestedNameSpecifier()
349 matches "ns::" and both "A::"
350</pre></td></tr>
351
352
353<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>
354<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
355</pre></td></tr>
356
357
Manuel Klimek67619ff2012-09-07 13:10:32 +0000358<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000359<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
360
361Given
362 int i = a[1];
363arraySubscriptExpr()
364 matches "a[1]"
365</pre></td></tr>
366
367
Daniel Jaspere0b89972012-12-04 12:08:08 +0000368<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>
369<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
370
371 int i = 100;
372 __asm("mov al, 2");
373asmStmt()
374 matches '__asm("mov al, 2")'
375</pre></td></tr>
376
377
Manuel Klimek67619ff2012-09-07 13:10:32 +0000378<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000379<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
380
381Example matches a || b
382 !(a || b)
383</pre></td></tr>
384
385
Manuel Klimek67619ff2012-09-07 13:10:32 +0000386<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000387<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000388
389Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000390 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000391 FunctionTakesString(GetStringByValue());
392 FunctionTakesStringByPointer(GetStringPointer());
393</pre></td></tr>
394
395
Daniel Jaspere0b89972012-12-04 12:08:08 +0000396<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
397<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
398
399Example matches true
400 true
401</pre></td></tr>
402
403
404<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>
405<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
406
407Given
408 while (true) { break; }
409breakStmt()
410 matches 'break'
411</pre></td></tr>
412
413
414<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>
415<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
416
417Example: Matches (int*) 2.2f in
418 int i = (int) 2.2f;
419</pre></td></tr>
420
421
Manuel Klimek67619ff2012-09-07 13:10:32 +0000422<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000423<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000424
425Example matches x.y() and y()
426 X x;
427 x.y();
428 y();
429</pre></td></tr>
430
431
Manuel Klimek03a83232013-06-10 08:52:15 +0000432<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>
433<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
434
435Given
436 switch(a) { case 42: break; default: break; }
437caseStmt()
438 matches 'case 42: break;'.
439</pre></td></tr>
440
441
Daniel Jaspere0b89972012-12-04 12:08:08 +0000442<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>
443<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
444
445Example: castExpr() matches each of the following:
446 (int) 3;
447 const_cast&lt;Expr *&gt;(SubExpr);
448 char c = 0;
449but does not match
450 int i = (0);
451 int k = 0;
452</pre></td></tr>
453
454
455<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('catchStmt0')"><a name="catchStmt0Anchor">catchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
456<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
457
458 try {} catch(int i) {}
459catchStmt()
460 matches 'catch(int i)'
461</pre></td></tr>
462
463
464<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>
465<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
466
467Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
468though.
469
470Example matches 'a', L'a'
471 char ch = 'a'; wchar_t chw = L'a';
472</pre></td></tr>
473
474
Manuel Klimek415514d2013-02-06 20:36:22 +0000475<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>
476<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
477
478Example match: {1}, (1, 2)
479 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
480</pre></td></tr>
481
482
Manuel Klimek67619ff2012-09-07 13:10:32 +0000483<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000484<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000485
486Example matches '{}' and '{{}}'in 'for (;;) {{}}'
487 for (;;) {{}}
488</pre></td></tr>
489
490
Manuel Klimek67619ff2012-09-07 13:10:32 +0000491<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000492<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
493
494Example matches a ? b : c
495 (a ? b : c) + 42
496</pre></td></tr>
497
498
Daniel Jaspere0b89972012-12-04 12:08:08 +0000499<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
500<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
501
502Example: Matches const_cast&lt;int*&gt;(&amp;r) in
503 int n = 42;
504 const int &amp;r(n);
505 int* p = const_cast&lt;int*&gt;(&amp;r);
506</pre></td></tr>
507
508
Manuel Klimek67619ff2012-09-07 13:10:32 +0000509<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000510<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000511
512Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000513 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000514 void f(const string &amp;a, const string &amp;b);
515 char *ptr;
516 int n;
517 f(string(ptr, n), ptr);
518</pre></td></tr>
519
520
Daniel Jaspere0b89972012-12-04 12:08:08 +0000521<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>
522<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
523
524Given
525 while (true) { continue; }
526continueStmt()
527 matches 'continue'
528</pre></td></tr>
529
530
Manuel Klimek67619ff2012-09-07 13:10:32 +0000531<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000532<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000533
534Example matches x in if (x)
535 bool x;
536 if (x) {}
537</pre></td></tr>
538
539
Manuel Klimek67619ff2012-09-07 13:10:32 +0000540<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000541<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000542
543Given
544 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000545declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000546 matches 'int a'.
547</pre></td></tr>
548
549
Manuel Klimek67619ff2012-09-07 13:10:32 +0000550<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000551<tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site.
Manuel Klimek1da79332012-08-20 20:54:03 +0000552
553Example matches the CXXDefaultArgExpr placeholder inserted for the
554 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000555 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000556 void f(int x, int y = 0);
557 f(42);
558</pre></td></tr>
559
560
Manuel Klimek03a83232013-06-10 08:52:15 +0000561<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>
562<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
563
564Given
565 switch(a) { case 42: break; default: break; }
566defaultStmt()
567 matches 'default: break;'.
568</pre></td></tr>
569
570
Manuel Klimek67619ff2012-09-07 13:10:32 +0000571<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000572<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000573
574Given
575 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000576deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000577 matches 'delete X'.
578</pre></td></tr>
579
580
Manuel Klimek67619ff2012-09-07 13:10:32 +0000581<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000582<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
583
584Given
585 do {} while (true);
586doStmt()
587 matches 'do {} while(true)'
588</pre></td></tr>
589
590
Daniel Jaspere0b89972012-12-04 12:08:08 +0000591<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
592<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
593
594Example:
595 dynamicCastExpr()
596matches
597 dynamic_cast&lt;D*&gt;(&amp;b);
598in
599 struct B { virtual ~B() {} }; struct D : B {};
600 B b;
601 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
602</pre></td></tr>
603
604
605<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>
606<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
607
608Matches any cast expression written in user code, whether it be a
609C-style cast, a functional-style cast, or a keyword cast.
610
611Does not match implicit conversions.
612
613Note: the name "explicitCast" is chosen to match Clang's terminology, as
614Clang uses the term "cast" to apply to implicit conversions as well as to
615actual cast expressions.
616
617hasDestinationType.
618
619Example: matches all five of the casts in
620 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
621but does not match the implicit conversion in
622 long ell = 42;
623</pre></td></tr>
624
625
Manuel Klimek67619ff2012-09-07 13:10:32 +0000626<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000627<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000628
629Example matches x()
630 void f() { x(); }
631</pre></td></tr>
632
633
Daniel Jaspere0b89972012-12-04 12:08:08 +0000634<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forRangeStmt0')"><a name="forRangeStmt0Anchor">forRangeStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
635<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
636
637forRangeStmt() matches 'for (auto a : i)'
638 int i[] = {1, 2, 3}; for (auto a : i);
639 for(int j = 0; j &lt; 5; ++j);
640</pre></td></tr>
641
642
Manuel Klimek67619ff2012-09-07 13:10:32 +0000643<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000644<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
645
646Example matches 'for (;;) {}'
647 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000648 int i[] = {1, 2, 3}; for (auto a : i);
649</pre></td></tr>
650
651
652<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
653<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
654
655Example: Matches Foo(bar);
656 Foo f = bar;
657 Foo g = (Foo) bar;
658 Foo h = Foo(bar);
659</pre></td></tr>
660
661
662<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>
663<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
664
665Given
666 goto FOO;
667 FOO: bar();
668gotoStmt()
669 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000670</pre></td></tr>
671
672
Manuel Klimek67619ff2012-09-07 13:10:32 +0000673<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000674<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
675
676Example matches 'if (x) {}'
677 if (x) {}
678</pre></td></tr>
679
680
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
682<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
683
684This matches many different places, including function call return value
685eliding, as well as any type conversions.
686</pre></td></tr>
687
688
Manuel Klimek67619ff2012-09-07 13:10:32 +0000689<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000690<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
691
692Given
693 int a[] = { 1, 2 };
694 struct B { int x, y; };
695 B b = { 5, 6 };
696initList()
697 matches "{ 1, 2 }" and "{ 5, 6 }"
698</pre></td></tr>
699
700
Daniel Jaspere0b89972012-12-04 12:08:08 +0000701<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>
702<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
703
704Not matching character-encoded integers such as L'a'.
705
706Example matches 1, 1L, 0x1, 1U
707</pre></td></tr>
708
709
710<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
711<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
712
713Given
714 goto FOO;
715 FOO: bar();
716labelStmt()
717 matches 'FOO:'
718</pre></td></tr>
719
720
721<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>
722<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
723
724Example matches [&amp;](){return 5;}
725 [&amp;](){return 5;}
726</pre></td></tr>
727
728
Manuel Klimek67619ff2012-09-07 13:10:32 +0000729<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000730<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
731
732Example: Given
733 struct T {void func()};
734 T f();
735 void g(T);
736materializeTemporaryExpr() matches 'f()' in these statements
737 T u(f());
738 g(f());
739but does not match
740 f();
741 f().func();
742</pre></td></tr>
743
744
Manuel Klimek67619ff2012-09-07 13:10:32 +0000745<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000746<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000747
748Example matches x.y()
749 X x;
750 x.y();
751</pre></td></tr>
752
753
Manuel Klimek67619ff2012-09-07 13:10:32 +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('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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000755<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000756
757Given
758 class Y {
759 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
760 int a; static int b;
761 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000762memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000763 matches this-&gt;x, x, y.x, a, this-&gt;b
764</pre></td></tr>
765
766
Manuel Klimek67619ff2012-09-07 13:10:32 +0000767<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000768<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000769
770Given
771 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000772newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000773 matches 'new X'.
774</pre></td></tr>
775
776
Daniel Jaspere0b89972012-12-04 12:08:08 +0000777<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullPtrLiteralExpr0')"><a name="nullPtrLiteralExpr0Anchor">nullPtrLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
778<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
779</pre></td></tr>
780
781
782<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>
783<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
784
785 foo();;
786nullStmt()
787 matches the second ';'
788</pre></td></tr>
789
790
Manuel Klimek67619ff2012-09-07 13:10:32 +0000791<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000792<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000793
794Note that if an operator isn't overloaded, it won't match. Instead, use
795binaryOperator matcher.
796Currently it does not match operators such as new delete.
797FIXME: figure out why these do not match?
798
799Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000800 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000801 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
802 ostream &amp;o; int b = 1, c = 1;
803 o &lt;&lt; b &lt;&lt; c;
804</pre></td></tr>
805
806
Daniel Jaspere0b89972012-12-04 12:08:08 +0000807<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
808<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
809
810Either the source expression or the destination type can be matched
811using has(), but hasDestinationType() is more specific and can be
812more readable.
813
814Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
815 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
816</pre></td></tr>
817
818
819<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>
820<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
821
822Given
823 return 1;
824returnStmt()
825 matches 'return 1'
826</pre></td></tr>
827
828
829<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
830<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
831
832hasDestinationType
833reinterpretCast
834
835Example:
836 staticCastExpr()
837matches
838 static_cast&lt;long&gt;(8)
839in
840 long eight(static_cast&lt;long&gt;(8));
841</pre></td></tr>
842
843
Manuel Klimek67619ff2012-09-07 13:10:32 +0000844<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>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000845<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000846
847Given
848 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000849stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000850 matches both the compound statement '{ ++a; }' and '++a'.
851</pre></td></tr>
852
853
Daniel Jaspere0b89972012-12-04 12:08:08 +0000854<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>
855<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
856
857Example matches "abcd", L"abcd"
858 char *s = "abcd"; wchar_t *ws = L"abcd"
859</pre></td></tr>
860
861
Manuel Klimek67619ff2012-09-07 13:10:32 +0000862<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000863<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
864
865Given
866 switch(a) { case 42: break; default: break; }
867switchCase()
868 matches 'case 42: break;' and 'default: break;'.
869</pre></td></tr>
870
871
Daniel Jaspere0b89972012-12-04 12:08:08 +0000872<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>
873<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
874
875Given
876 switch(a) { case 42: break; default: break; }
877switchStmt()
878 matches 'switch(a)'.
879</pre></td></tr>
880
881
882<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('thisExpr0')"><a name="thisExpr0Anchor">thisExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
883<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
884
885Example matches the implicit this expression in "return i".
886 (matcher = thisExpr())
887struct foo {
888 int i;
889 int f() { return i; }
890};
891</pre></td></tr>
892
893
894<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('throwExpr0')"><a name="throwExpr0Anchor">throwExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
895<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
896
897 try { throw 5; } catch(int i) {}
898throwExpr()
899 matches 'throw 5'
900</pre></td></tr>
901
902
903<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('tryStmt0')"><a name="tryStmt0Anchor">tryStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
904<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
905
906 try {} catch(int i) {}
907tryStmt()
908 matches 'try {}'
909</pre></td></tr>
910
911
Manuel Klimek67619ff2012-09-07 13:10:32 +0000912<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000913<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
914
915Given
916 Foo x = bar;
917 int y = sizeof(x) + alignof(x);
918unaryExprOrTypeTraitExpr()
919 matches sizeof(x) and alignof(x)
920</pre></td></tr>
921
922
Manuel Klimek67619ff2012-09-07 13:10:32 +0000923<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000924<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
925
926Example matches !a
927 !a || b
928</pre></td></tr>
929
930
Manuel Klimek532870f2013-07-24 05:46:07 +0000931<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedConstructExpr0')"><a name="unresolvedConstructExpr0Anchor">unresolvedConstructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
932<tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
933
934Example matches T(t) in return statement of f
935 (matcher = unresolvedConstructExpr())
936 template &lt;typename T&gt;
937 void f(const T&amp; t) { return T(t); }
938</pre></td></tr>
939
940
Daniel Jaspere0b89972012-12-04 12:08:08 +0000941<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>
942<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
943
944Example match: "foo"_suffix
945</pre></td></tr>
946
947
Manuel Klimek67619ff2012-09-07 13:10:32 +0000948<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>
Manuel Klimek1da79332012-08-20 20:54:03 +0000949<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
950
951Given
952 while (true) {}
953whileStmt()
954 matches 'while (true) {}'.
955</pre></td></tr>
956
Daniel Jaspere0b89972012-12-04 12:08:08 +0000957
Manuel Klimek41df16e2013-01-09 09:38:21 +0000958<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('arrayTypeLoc0')"><a name="arrayTypeLoc0Anchor">arrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;...</td></tr>
959<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
960
961Given
962 int a[] = { 2, 3 };
963 int b[4];
964 void f() { int c[a[0]]; }
965arrayType()
966 matches "int a[]", "int b[4]" and "int c[a[0]]";
967</pre></td></tr>
968
969
970<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('atomicTypeLoc0')"><a name="atomicTypeLoc0Anchor">atomicTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>&gt;...</td></tr>
971<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
972
973Given
974 _Atomic(int) i;
975atomicType()
976 matches "_Atomic(int) i"
977</pre></td></tr>
978
979
980<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('autoTypeLoc0')"><a name="autoTypeLoc0Anchor">autoTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoTypeLoc.html">AutoTypeLoc</a>&gt;...</td></tr>
981<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
982
983Given:
984 auto n = 4;
985 int v[] = { 2, 3 }
986 for (auto i : v) { }
987autoType()
988 matches "auto n" and "auto i"
989</pre></td></tr>
990
991
992<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('blockPointerTypeLoc0')"><a name="blockPointerTypeLoc0Anchor">blockPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;...</td></tr>
993<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
994"void (^)(int)".
995
996The pointee is always required to be a FunctionType.
997</pre></td></tr>
998
999
1000<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('builtinTypeLoc0')"><a name="builtinTypeLoc0Anchor">builtinTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BuiltinTypeLoc.html">BuiltinTypeLoc</a>&gt;...</td></tr>
1001<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
1002
1003Given
1004 struct A {};
1005 A a;
1006 int b;
1007 float c;
1008 bool d;
1009builtinType()
1010 matches "int b", "float c" and "bool d"
1011</pre></td></tr>
1012
1013
1014<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('complexTypeLoc0')"><a name="complexTypeLoc0Anchor">complexTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;...</td></tr>
1015<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
1016
1017Given
1018 _Complex float f;
1019complexType()
1020 matches "_Complex float f"
1021</pre></td></tr>
1022
1023
1024<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('constantArrayTypeLoc0')"><a name="constantArrayTypeLoc0Anchor">constantArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayTypeLoc.html">ConstantArrayTypeLoc</a>&gt;...</td></tr>
1025<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
1026
1027Given
1028 void() {
1029 int a[2];
1030 int b[] = { 2, 3 };
1031 int c[b[0]];
1032 }
1033constantArrayType()
1034 matches "int a[2]"
1035</pre></td></tr>
1036
1037
1038<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayTypeLoc0')"><a name="dependentSizedArrayTypeLoc0Anchor">dependentSizedArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayTypeLoc.html">DependentSizedArrayTypeLoc</a>&gt;...</td></tr>
1039<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1040
1041Given
1042 template&lt;typename T, int Size&gt;
1043 class array {
1044 T data[Size];
1045 };
1046dependentSizedArrayType
1047 matches "T data[Size]"
1048</pre></td></tr>
1049
1050
Edwin Vane742d9e72013-02-25 20:43:32 +00001051<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
1052<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
1053qualified name.
1054
1055Given
1056 namespace N {
1057 namespace M {
1058 class D {};
1059 }
1060 }
1061 class C {};
1062
1063 class C c;
1064 N::M::D d;
1065
1066elaboratedType() matches the type of the variable declarations of both
1067c and d.
1068</pre></td></tr>
1069
1070
Manuel Klimek41df16e2013-01-09 09:38:21 +00001071<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('functionTypeLoc0')"><a name="functionTypeLoc0Anchor">functionTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTypeLoc.html">FunctionTypeLoc</a>&gt;...</td></tr>
1072<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
1073
1074Given
1075 int (*f)(int);
1076 void g();
1077functionType()
1078 matches "int (*f)(int)" and the type of "g".
1079</pre></td></tr>
1080
1081
1082<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayTypeLoc0')"><a name="incompleteArrayTypeLoc0Anchor">incompleteArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayTypeLoc.html">IncompleteArrayTypeLoc</a>&gt;...</td></tr>
1083<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
1084
1085Given
1086 int a[] = { 2, 3 };
1087 int b[42];
1088 void f(int c[]) { int d[a[0]]; };
1089incompleteArrayType()
1090 matches "int a[]" and "int c[]"
1091</pre></td></tr>
1092
1093
Edwin Vane8203d9f2013-03-28 13:50:22 +00001094<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceTypeLoc0')"><a name="lValueReferenceTypeLoc0Anchor">lValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceTypeLoc.html">LValueReferenceTypeLoc</a>&gt;...</td></tr>
1095<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001096
1097Given:
1098 int *a;
1099 int &amp;b = *a;
1100 int &amp;&amp;c = 1;
1101 auto &amp;d = b;
1102 auto &amp;&amp;e = c;
1103 auto &amp;&amp;f = 2;
1104 int g = 5;
1105
Edwin Vane8203d9f2013-03-28 13:50:22 +00001106lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001107matched since the type is deduced as int&amp; by reference collapsing rules.
1108</pre></td></tr>
1109
1110
Manuel Klimek41df16e2013-01-09 09:38:21 +00001111<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('memberPointerTypeLoc0')"><a name="memberPointerTypeLoc0Anchor">memberPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;...</td></tr>
1112<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
1113Given
1114 struct A { int i; }
1115 A::* ptr = A::i;
1116memberPointerType()
1117 matches "A::* ptr"
1118</pre></td></tr>
1119
1120
Edwin Vane88be2fd2013-04-01 18:33:34 +00001121<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('parenTypeLoc0')"><a name="parenTypeLoc0Anchor">parenTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenTypeLoc.html">ParenTypeLoc</a>&gt;...</td></tr>
1122<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1123
1124Given
1125 int (*ptr_to_array)[4];
1126 int *array_of_ptrs[4];
1127
1128varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1129array_of_ptrs.
1130</pre></td></tr>
1131
1132
Manuel Klimek41df16e2013-01-09 09:38:21 +00001133<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
1134<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1135
1136Given
1137 int *a;
1138 int &amp;b = *a;
1139 int c = 5;
1140pointerType()
1141 matches "int *a"
1142</pre></td></tr>
1143
1144
Edwin Vane8203d9f2013-03-28 13:50:22 +00001145<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceTypeLoc0')"><a name="rValueReferenceTypeLoc0Anchor">rValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceTypeLoc.html">RValueReferenceTypeLoc</a>&gt;...</td></tr>
1146<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1147
1148Given:
1149 int *a;
1150 int &amp;b = *a;
1151 int &amp;&amp;c = 1;
1152 auto &amp;d = b;
1153 auto &amp;&amp;e = c;
1154 auto &amp;&amp;f = 2;
1155 int g = 5;
1156
1157rValueReferenceType() matches the types of c and f. e is not
1158matched as it is deduced to int&amp; by reference collapsing rules.
1159</pre></td></tr>
1160
1161
Edwin Vane742d9e72013-02-25 20:43:32 +00001162<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('recordTypeLoc0')"><a name="recordTypeLoc0Anchor">recordTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordTypeLoc.html">RecordTypeLoc</a>&gt;...</td></tr>
1163<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1164
1165Given
1166 class C {};
1167 struct S {};
1168
1169 C c;
1170 S s;
1171
1172recordType() matches the type of the variable declarations of both c
1173and s.
1174</pre></td></tr>
1175
1176
Manuel Klimek41df16e2013-01-09 09:38:21 +00001177<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
Edwin Vanef4b48042013-03-07 15:44:40 +00001178<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001179
1180Given
1181 int *a;
1182 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001183 int &amp;&amp;c = 1;
1184 auto &amp;d = b;
1185 auto &amp;&amp;e = c;
1186 auto &amp;&amp;f = 2;
1187 int g = 5;
1188
1189referenceType() matches the types of b, c, d, e, and f.
1190</pre></td></tr>
1191
1192
Edwin Vane3abf7782013-02-25 14:49:29 +00001193<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
1194<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1195
1196Given
1197 template &lt;typename T&gt;
1198 class C { };
1199
1200 template class C&lt;int&gt;; A
1201 C&lt;char&gt; var; B
1202
1203templateSpecializationType() matches the type of the explicit
1204instantiation in A and the type of the variable declaration in B.
1205</pre></td></tr>
1206
1207
Daniel Jaspere0b89972012-12-04 12:08:08 +00001208<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>
1209<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1210</pre></td></tr>
1211
1212
Manuel Klimek41df16e2013-01-09 09:38:21 +00001213<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typedefTypeLoc0')"><a name="typedefTypeLoc0Anchor">typedefTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefTypeLoc.html">TypedefTypeLoc</a>&gt;...</td></tr>
1214<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1215
1216Given
1217 typedef int X;
1218typedefType()
1219 matches "typedef int X"
1220</pre></td></tr>
1221
1222
Manuel Klimek532870f2013-07-24 05:46:07 +00001223<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('unaryTransformTypeLoc0')"><a name="unaryTransformTypeLoc0Anchor">unaryTransformTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformTypeLoc.html">UnaryTransformTypeLoc</a>&gt;...</td></tr>
1224<tr><td colspan="4" class="doc" id="unaryTransformTypeLoc0"><pre>Matches types nodes representing unary type transformations.
1225
1226Given:
1227 typedef __underlying_type(T) type;
1228unaryTransformType()
1229 matches "__underlying_type(T)"
1230</pre></td></tr>
1231
1232
Manuel Klimek41df16e2013-01-09 09:38:21 +00001233<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('variableArrayTypeLoc0')"><a name="variableArrayTypeLoc0Anchor">variableArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayTypeLoc.html">VariableArrayTypeLoc</a>&gt;...</td></tr>
1234<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1235integer-constant-expression.
1236
1237Given
1238 void f() {
1239 int a[] = { 2, 3 }
1240 int b[42];
1241 int c[a[0]];
1242variableArrayType()
1243 matches "int c[a[0]]"
1244</pre></td></tr>
1245
1246
1247<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1248<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1249
1250Given
1251 int a[] = { 2, 3 };
1252 int b[4];
1253 void f() { int c[a[0]]; }
1254arrayType()
1255 matches "int a[]", "int b[4]" and "int c[a[0]]";
1256</pre></td></tr>
1257
1258
1259<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1260<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1261
1262Given
1263 _Atomic(int) i;
1264atomicType()
1265 matches "_Atomic(int) i"
1266</pre></td></tr>
1267
1268
1269<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1270<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1271
1272Given:
1273 auto n = 4;
1274 int v[] = { 2, 3 }
1275 for (auto i : v) { }
1276autoType()
1277 matches "auto n" and "auto i"
1278</pre></td></tr>
1279
1280
1281<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>
1282<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1283"void (^)(int)".
1284
1285The pointee is always required to be a FunctionType.
1286</pre></td></tr>
1287
1288
1289<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>
1290<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1291
1292Given
1293 struct A {};
1294 A a;
1295 int b;
1296 float c;
1297 bool d;
1298builtinType()
1299 matches "int b", "float c" and "bool d"
1300</pre></td></tr>
1301
1302
1303<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>
1304<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1305
1306Given
1307 _Complex float f;
1308complexType()
1309 matches "_Complex float f"
1310</pre></td></tr>
1311
1312
1313<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1314<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1315
1316Given
1317 void() {
1318 int a[2];
1319 int b[] = { 2, 3 };
1320 int c[b[0]];
1321 }
1322constantArrayType()
1323 matches "int a[2]"
1324</pre></td></tr>
1325
1326
1327<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>
1328<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1329
1330Given
1331 template&lt;typename T, int Size&gt;
1332 class array {
1333 T data[Size];
1334 };
1335dependentSizedArrayType
1336 matches "T data[Size]"
1337</pre></td></tr>
1338
1339
Edwin Vane742d9e72013-02-25 20:43:32 +00001340<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>
1341<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1342qualified name.
1343
1344Given
1345 namespace N {
1346 namespace M {
1347 class D {};
1348 }
1349 }
1350 class C {};
1351
1352 class C c;
1353 N::M::D d;
1354
1355elaboratedType() matches the type of the variable declarations of both
1356c and d.
1357</pre></td></tr>
1358
1359
Manuel Klimek41df16e2013-01-09 09:38:21 +00001360<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>
1361<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1362
1363Given
1364 int (*f)(int);
1365 void g();
1366functionType()
1367 matches "int (*f)(int)" and the type of "g".
1368</pre></td></tr>
1369
1370
1371<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1372<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1373
1374Given
1375 int a[] = { 2, 3 };
1376 int b[42];
1377 void f(int c[]) { int d[a[0]]; };
1378incompleteArrayType()
1379 matches "int a[]" and "int c[]"
1380</pre></td></tr>
1381
1382
Edwin Vane8203d9f2013-03-28 13:50:22 +00001383<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>
1384<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001385
1386Given:
1387 int *a;
1388 int &amp;b = *a;
1389 int &amp;&amp;c = 1;
1390 auto &amp;d = b;
1391 auto &amp;&amp;e = c;
1392 auto &amp;&amp;f = 2;
1393 int g = 5;
1394
Edwin Vane8203d9f2013-03-28 13:50:22 +00001395lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001396matched since the type is deduced as int&amp; by reference collapsing rules.
1397</pre></td></tr>
1398
1399
Manuel Klimek41df16e2013-01-09 09:38:21 +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('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>
1401<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1402Given
1403 struct A { int i; }
1404 A::* ptr = A::i;
1405memberPointerType()
1406 matches "A::* ptr"
1407</pre></td></tr>
1408
1409
Edwin Vane88be2fd2013-04-01 18:33:34 +00001410<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>
1411<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1412
1413Given
1414 int (*ptr_to_array)[4];
1415 int *array_of_ptrs[4];
1416
1417varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1418array_of_ptrs.
1419</pre></td></tr>
1420
1421
Manuel Klimek41df16e2013-01-09 09:38:21 +00001422<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>
1423<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1424
1425Given
1426 int *a;
1427 int &amp;b = *a;
1428 int c = 5;
1429pointerType()
1430 matches "int *a"
1431</pre></td></tr>
1432
1433
Edwin Vane8203d9f2013-03-28 13:50:22 +00001434<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1435<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1436
1437Given:
1438 int *a;
1439 int &amp;b = *a;
1440 int &amp;&amp;c = 1;
1441 auto &amp;d = b;
1442 auto &amp;&amp;e = c;
1443 auto &amp;&amp;f = 2;
1444 int g = 5;
1445
1446rValueReferenceType() matches the types of c and f. e is not
1447matched as it is deduced to int&amp; by reference collapsing rules.
1448</pre></td></tr>
1449
1450
Edwin Vane742d9e72013-02-25 20:43:32 +00001451<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1452<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1453
1454Given
1455 class C {};
1456 struct S {};
1457
1458 C c;
1459 S s;
1460
1461recordType() matches the type of the variable declarations of both c
1462and s.
1463</pre></td></tr>
1464
1465
Manuel Klimek41df16e2013-01-09 09:38:21 +00001466<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>
Edwin Vanef4b48042013-03-07 15:44:40 +00001467<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001468
1469Given
1470 int *a;
1471 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001472 int &amp;&amp;c = 1;
1473 auto &amp;d = b;
1474 auto &amp;&amp;e = c;
1475 auto &amp;&amp;f = 2;
1476 int g = 5;
1477
1478referenceType() matches the types of b, c, d, e, and f.
1479</pre></td></tr>
1480
1481
Edwin Vane3abf7782013-02-25 14:49:29 +00001482<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>
1483<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1484
1485Given
1486 template &lt;typename T&gt;
1487 class C { };
1488
1489 template class C&lt;int&gt;; A
1490 C&lt;char&gt; var; B
1491
1492templateSpecializationType() matches the type of the explicit
1493instantiation in A and the type of the variable declaration in B.
1494</pre></td></tr>
1495
1496
Daniel Jaspere0b89972012-12-04 12:08:08 +00001497<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>
1498<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1499</pre></td></tr>
1500
Manuel Klimek41df16e2013-01-09 09:38:21 +00001501
1502<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>
1503<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1504
1505Given
1506 typedef int X;
1507typedefType()
1508 matches "typedef int X"
1509</pre></td></tr>
1510
1511
Manuel Klimek532870f2013-07-24 05:46:07 +00001512<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>
1513<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1514
1515Given:
1516 typedef __underlying_type(T) type;
1517unaryTransformType()
1518 matches "__underlying_type(T)"
1519</pre></td></tr>
1520
1521
Manuel Klimek41df16e2013-01-09 09:38:21 +00001522<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>
1523<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1524integer-constant-expression.
1525
1526Given
1527 void f() {
1528 int a[] = { 2, 3 }
1529 int b[42];
1530 int c[a[0]];
1531variableArrayType()
1532 matches "int c[a[0]]"
1533</pre></td></tr>
1534
Manuel Klimek1da79332012-08-20 20:54:03 +00001535<!--END_DECL_MATCHERS -->
1536</table>
1537
1538<!-- ======================================================================= -->
1539<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1540<!-- ======================================================================= -->
1541
1542<p>Narrowing matchers match certain attributes on the current node, thus
1543narrowing down the set of nodes of the current type to match on.</p>
1544
1545<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1546which allow users to create more powerful match expressions.</p>
1547
1548<table>
1549<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1550<!-- START_NARROWING_MATCHERS -->
1551
Manuel Klimek67619ff2012-09-07 13:10:32 +00001552<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001553<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1554
1555Usable as: Any Matcher
1556</pre></td></tr>
1557
1558
Manuel Klimek67619ff2012-09-07 13:10:32 +00001559<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001560<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1561
1562Usable as: Any Matcher
1563</pre></td></tr>
1564
1565
Manuel Klimek67619ff2012-09-07 13:10:32 +00001566<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001567<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1568
1569Useful when another matcher requires a child matcher, but there's no
1570additional constraint. This will often be used with an explicit conversion
1571to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1572
1573Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1574"int* p" and "void f()" in
1575 int* p;
1576 void f();
1577
1578Usable as: Any Matcher
1579</pre></td></tr>
1580
1581
Manuel Klimek67619ff2012-09-07 13:10:32 +00001582<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001583<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1584
Manuel Klimeke44a0062012-08-26 23:55:24 +00001585Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001586 class X {};
1587 class Y {};
1588
1589Usable as: Any Matcher
1590</pre></td></tr>
1591
1592
Manuel Klimek67619ff2012-09-07 13:10:32 +00001593<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001594<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1595unary).
1596
1597Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1598 !(a || b)
1599</pre></td></tr>
1600
1601
Manuel Klimek67619ff2012-09-07 13:10:32 +00001602<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001603<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1604
1605Example matches true (matcher = boolLiteral(equals(true)))
1606 true
1607
1608Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1609 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;
1610</pre></td></tr>
1611
1612
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00001613<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>
1614<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1615a specific number of arguments (including absent default arguments).
1616
1617Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1618 void f(int x, int y);
1619 f(0, 0);
1620</pre></td></tr>
1621
1622
Manuel Klimek67619ff2012-09-07 13:10:32 +00001623<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001624<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1625by the compiler (eg. implicit defaultcopy constructors).
1626</pre></td></tr>
1627
1628
Manuel Klimek67619ff2012-09-07 13:10:32 +00001629<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001630<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1631code (as opposed to implicitly added by the compiler).
1632
1633Given
1634 struct Foo {
1635 Foo() { }
1636 Foo(int) : foo_("A") { }
1637 string foo_;
1638 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001639constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001640 will match Foo(int), but not Foo()
1641</pre></td></tr>
1642
1643
Edwin Vane6a19a972013-03-06 17:02:57 +00001644<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001645<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1646
1647Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001648"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001649
Edwin Vane6a19a972013-03-06 17:02:57 +00001650Given:
1651 class A { int operator*(); };
1652 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1653 A a;
1654 a &lt;&lt; a; &lt;-- This matches
1655
1656operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1657line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1658the declaration of A.
1659
1660Usable 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_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;
1661</pre></td></tr>
1662
1663
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001664<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>
1665<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1666
1667Given
1668struct A {
1669 void foo() const;
1670 void bar();
1671};
1672
1673methodDecl(isConst()) matches A::foo() but not A::bar()
1674</pre></td></tr>
1675
1676
Edwin Vane5771a2f2013-04-09 20:46:36 +00001677<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>
1678<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1679
1680Given
1681 class A {
1682 public:
1683 virtual void x();
1684 };
1685 class B : public A {
1686 public:
1687 virtual void x();
1688 };
1689 matches B::x
1690</pre></td></tr>
1691
1692
1693<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>
1694<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1695
1696Given
1697 class A {
1698 public:
1699 virtual void x();
1700 };
1701 matches A::x
1702</pre></td></tr>
1703
1704
Edwin Vane6a19a972013-03-06 17:02:57 +00001705<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>
1706<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1707
1708Matches overloaded operator names specified in strings without the
1709"operator" prefix: e.g. "&lt;&lt;".
1710
1711Given:
1712 class A { int operator*(); };
1713 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1714 A a;
1715 a &lt;&lt; a; &lt;-- This matches
1716
1717operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1718line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1719the declaration of A.
1720
1721Usable 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_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00001722</pre></td></tr>
1723
1724
Manuel Klimek67619ff2012-09-07 13:10:32 +00001725<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>StringRef BaseName</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001726<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1727</pre></td></tr>
1728
1729
Manuel Klimek415514d2013-02-06 20:36:22 +00001730<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>
1731<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001732static member variable template instantiations.
1733
1734Given
1735 template&lt;typename T&gt; void A(T t) { }
1736 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001737functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001738 matches the specialization A&lt;int&gt;().
1739
1740Usable 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;
1741</pre></td></tr>
1742
1743
Daniel Jaspere0b89972012-12-04 12:08:08 +00001744<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>StringRef BaseName</td></tr>
1745<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1746isSameOrDerivedFrom(hasName(...)).
1747</pre></td></tr>
1748
1749
Manuel Klimek415514d2013-02-06 20:36:22 +00001750<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>
1751<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001752member variable template instantiations.
1753
1754Given
1755 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1756or
1757 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001758recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001759 matches the template instantiation of X&lt;A&gt;.
1760
1761But given
1762 template &lt;typename T&gt; class X {}; class A {};
1763 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001764recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001765 does not match, as X&lt;A&gt; is an explicit template specialization.
1766
1767Usable 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;
1768</pre></td></tr>
1769
1770
Manuel Klimek67619ff2012-09-07 13:10:32 +00001771<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001772<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1773a specific number of arguments (including absent default arguments).
1774
Manuel Klimeke44a0062012-08-26 23:55:24 +00001775Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001776 void f(int x, int y);
1777 f(0, 0);
1778</pre></td></tr>
1779
1780
Manuel Klimek67619ff2012-09-07 13:10:32 +00001781<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001782<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1783
1784Example matches true (matcher = boolLiteral(equals(true)))
1785 true
1786
1787Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1788 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;
1789</pre></td></tr>
1790
1791
Manuel Klimek67619ff2012-09-07 13:10:32 +00001792<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001793<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1794child statements.
1795
1796Example: Given
1797 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001798compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001799 matches '{}'
1800 but does not match the outer compound statement.
1801</pre></td></tr>
1802
1803
Daniel Jaspere0b89972012-12-04 12:08:08 +00001804<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>
1805<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1806
1807Given
1808 int a[42];
1809 int b[2 * 21];
1810 int c[41], d[43];
1811constantArrayType(hasSize(42))
1812 matches "int a[42]" and "int b[2 * 21]"
1813</pre></td></tr>
1814
1815
Manuel Klimek67619ff2012-09-07 13:10:32 +00001816<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001817<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1818declarations.
1819
1820Example: Given
1821 int a, b;
1822 int c;
1823 int d = 2, e;
1824declCountIs(2)
1825 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1826</pre></td></tr>
1827
1828
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001829<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>
1830<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1831
1832Matches a node if it equals the node previously bound to ID.
1833
1834Given
1835 class X { int a; int b; };
1836recordDecl(
1837 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1838 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1839 matches the class X, as a and b have the same type.
1840
1841Note that when multiple matches are involved via forEach* matchers,
1842equalsBoundNodes acts as a filter.
1843For example:
1844compoundStmt(
1845 forEachDescendant(varDecl().bind("d")),
1846 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1847will trigger a match for each combination of variable declaration
1848and reference to that variable declaration within a compound statement.
1849</pre></td></tr>
1850
1851
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001852<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>Decl* Other</td></tr>
1853<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1854
1855Decl has pointer identity in the AST.
1856</pre></td></tr>
1857
1858
Daniel Jasperc7093d92013-02-25 12:39:41 +00001859<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>
1860<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1861
1862Given
1863 class C {
1864 public: int a;
1865 protected: int b;
1866 private: int c;
1867 };
1868fieldDecl(isPrivate())
1869 matches 'int c;'
1870</pre></td></tr>
1871
1872
1873<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>
1874<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1875
1876Given
1877 class C {
1878 public: int a;
1879 protected: int b;
1880 private: int c;
1881 };
1882fieldDecl(isProtected())
1883 matches 'int b;'
1884</pre></td></tr>
1885
1886
1887<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>
1888<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1889
1890Given
1891 class C {
1892 public: int a;
1893 protected: int b;
1894 private: int c;
1895 };
1896fieldDecl(isPublic())
1897 matches 'int a;'
1898</pre></td></tr>
1899
1900
Manuel Klimek67619ff2012-09-07 13:10:32 +00001901<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001902<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1903
1904Example matches true (matcher = boolLiteral(equals(true)))
1905 true
1906
1907Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1908 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;
1909</pre></td></tr>
1910
1911
Manuel Klimek415514d2013-02-06 20:36:22 +00001912<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>
1913<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001914
1915Example matches A, va, fa
1916 class A {};
1917 class B; Doesn't match, as it has no body.
1918 int va;
1919 extern int vb; Doesn't match, as it doesn't define the variable.
1920 void fa() {}
1921 void fb(); Doesn't match, as it has no body.
1922
1923Usable 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;
1924</pre></td></tr>
1925
1926
Manuel Klimek415514d2013-02-06 20:36:22 +00001927<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>
1928<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001929static member variable template instantiations.
1930
1931Given
1932 template&lt;typename T&gt; void A(T t) { }
1933 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001934functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001935 matches the specialization A&lt;int&gt;().
1936
1937Usable 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;
1938</pre></td></tr>
1939
1940
Manuel Klimek67619ff2012-09-07 13:10:32 +00001941<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001942<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1943
1944Given:
1945 extern "C" void f() {}
1946 extern "C" { void g() {} }
1947 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001948functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001949 matches the declaration of f and g, but not the declaration h
1950</pre></td></tr>
1951
1952
Manuel Klimek415514d2013-02-06 20:36:22 +00001953<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>
1954<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001955member variable template instantiations.
1956
1957Given
1958 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1959or
1960 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001961recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001962 matches the template instantiation of X&lt;A&gt;.
1963
1964But given
1965 template &lt;typename T&gt; class X {}; class A {};
1966 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001967recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001968 does not match, as X&lt;A&gt; is an explicit template specialization.
1969
1970Usable 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;
1971</pre></td></tr>
1972
1973
Daniel Jaspere0b89972012-12-04 12:08:08 +00001974<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>
1975<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1976
1977Given
1978 void f(int i) {}
1979 void g(int i, int j) {}
1980functionDecl(parameterCountIs(2))
1981 matches g(int i, int j) {}
1982</pre></td></tr>
1983
1984
Manuel Klimek67619ff2012-09-07 13:10:32 +00001985<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001986<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1987
1988Example matches true (matcher = boolLiteral(equals(true)))
1989 true
1990
1991Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1992 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;
1993</pre></td></tr>
1994
1995
Manuel Klimek67619ff2012-09-07 13:10:32 +00001996<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00001997<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1998to '.'.
1999
2000Member calls on the implicit this pointer match as called with '-&gt;'.
2001
2002Given
2003 class Y {
2004 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2005 int a;
2006 static int b;
2007 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002008memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00002009 matches this-&gt;x, x, y.x, a, this-&gt;b
2010</pre></td></tr>
2011
2012
Manuel Klimek67619ff2012-09-07 13:10:32 +00002013<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002014<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2015
2016Supports specifying enclosing namespaces or classes by prefixing the name
2017with '&lt;enclosing&gt;::'.
2018Does not match typedefs of an underlying type with the given name.
2019
2020Example matches X (Name == "X")
2021 class X;
2022
2023Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2024 namespace a { namespace b { class X; } }
2025</pre></td></tr>
2026
2027
Manuel Klimek67619ff2012-09-07 13:10:32 +00002028<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>
Manuel Klimek41df16e2013-01-09 09:38:21 +00002029<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2030a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00002031
2032Supports specifying enclosing namespaces or classes by
2033prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2034of an underlying type with the given name.
2035
2036Example matches X (regexp == "::X")
2037 class X;
2038
2039Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2040 namespace foo { namespace bar { class X; } }
2041</pre></td></tr>
2042
2043
Manuel Klimek67619ff2012-09-07 13:10:32 +00002044<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002045<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
2046
2047Given
2048 class Y { public: void x(); };
2049 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002050callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002051 matches y-&gt;x()
2052</pre></td></tr>
2053
2054
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002055<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>
2056<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
2057
2058Matches a node if it equals the node previously bound to ID.
2059
2060Given
2061 class X { int a; int b; };
2062recordDecl(
2063 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2064 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2065 matches the class X, as a and b have the same type.
2066
2067Note that when multiple matches are involved via forEach* matchers,
2068equalsBoundNodes acts as a filter.
2069For example:
2070compoundStmt(
2071 forEachDescendant(varDecl().bind("d")),
2072 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2073will trigger a match for each combination of variable declaration
2074and reference to that variable declaration within a compound statement.
2075</pre></td></tr>
2076
2077
Edwin Vane7b69cd02013-04-02 18:15:55 +00002078<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>
2079<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
2080the node, not hidden within a typedef.
2081
2082Given
2083 typedef const int const_int;
2084 const_int i;
2085 int *const j;
2086 int *volatile k;
2087 int m;
2088varDecl(hasType(hasLocalQualifiers())) matches only j and k.
2089i is const-qualified but the qualifier is not local.
2090</pre></td></tr>
2091
2092
Manuel Klimek67619ff2012-09-07 13:10:32 +00002093<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002094<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2095include "top-level" const.
2096
2097Given
2098 void a(int);
2099 void b(int const);
2100 void c(const int);
2101 void d(const int*);
2102 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00002103functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002104 matches "void b(int const)", "void c(const int)" and
2105 "void e(int const) {}". It does not match d as there
2106 is no top-level const on the parameter type "const int *".
2107</pre></td></tr>
2108
2109
Manuel Klimek67619ff2012-09-07 13:10:32 +00002110<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002111<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2112
2113Given
2114 void a(int);
2115 void b(long);
2116 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002117functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002118matches "a(int)", "b(long)", but not "c(double)".
2119</pre></td></tr>
2120
2121
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002122<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>
2123<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2124
2125Matches a node if it equals the node previously bound to ID.
2126
2127Given
2128 class X { int a; int b; };
2129recordDecl(
2130 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2131 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2132 matches the class X, as a and b have the same type.
2133
2134Note that when multiple matches are involved via forEach* matchers,
2135equalsBoundNodes acts as a filter.
2136For example:
2137compoundStmt(
2138 forEachDescendant(varDecl().bind("d")),
2139 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2140will trigger a match for each combination of variable declaration
2141and reference to that variable declaration within a compound statement.
2142</pre></td></tr>
2143
2144
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00002145<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>Stmt* Other</td></tr>
2146<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
2147
2148Stmt has pointer identity in the AST.
2149
2150</pre></td></tr>
2151
2152
Manuel Klimek415514d2013-02-06 20:36:22 +00002153<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>
2154<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00002155
2156Example matches A, va, fa
2157 class A {};
2158 class B; Doesn't match, as it has no body.
2159 int va;
2160 extern int vb; Doesn't match, as it doesn't define the variable.
2161 void fa() {}
2162 void fb(); Doesn't match, as it has no body.
2163
2164Usable 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;
2165</pre></td></tr>
2166
2167
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002168<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>
2169<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2170
2171Matches a node if it equals the node previously bound to ID.
2172
2173Given
2174 class X { int a; int b; };
2175recordDecl(
2176 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2177 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2178 matches the class X, as a and b have the same type.
2179
2180Note that when multiple matches are involved via forEach* matchers,
2181equalsBoundNodes acts as a filter.
2182For example:
2183compoundStmt(
2184 forEachDescendant(varDecl().bind("d")),
2185 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2186will trigger a match for each combination of variable declaration
2187and reference to that variable declaration within a compound statement.
2188</pre></td></tr>
2189
2190
Manuel Klimek67619ff2012-09-07 13:10:32 +00002191<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002192<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2193
2194Given
2195 int x;
2196 int s = sizeof(x) + alignof(x)
2197unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2198 matches sizeof(x)
2199</pre></td></tr>
2200
2201
Manuel Klimek67619ff2012-09-07 13:10:32 +00002202<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002203<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2204unary).
2205
2206Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2207 !(a || b)
2208</pre></td></tr>
2209
2210
Manuel Klimek67619ff2012-09-07 13:10:32 +00002211<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002212<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2213
2214Example matches A, va, fa
2215 class A {};
2216 class B; Doesn't match, as it has no body.
2217 int va;
2218 extern int vb; Doesn't match, as it doesn't define the variable.
2219 void fa() {}
2220 void fb(); Doesn't match, as it has no body.
2221
2222Usable 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;
2223</pre></td></tr>
2224
2225
Manuel Klimek67619ff2012-09-07 13:10:32 +00002226<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002227<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2228static member variable template instantiations.
2229
2230Given
2231 template&lt;typename T&gt; void A(T t) { }
2232 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002233functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002234 matches the specialization A&lt;int&gt;().
2235
2236Usable 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;
2237</pre></td></tr>
2238
2239
Manuel Klimek67619ff2012-09-07 13:10:32 +00002240<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002241<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2242member variable template instantiations.
2243
2244Given
2245 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2246or
2247 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002248recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002249 matches the template instantiation of X&lt;A&gt;.
2250
2251But given
2252 template &lt;typename T&gt; class X {}; class A {};
2253 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002254recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002255 does not match, as X&lt;A&gt; is an explicit template specialization.
2256
2257Usable 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;
2258</pre></td></tr>
2259
2260<!--END_NARROWING_MATCHERS -->
2261</table>
2262
2263<!-- ======================================================================= -->
2264<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2265<!-- ======================================================================= -->
2266
2267<p>Traversal matchers specify the relationship to other nodes that are
2268reachable from the current node.</p>
2269
2270<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2271forEachDescendant) which work on all nodes and allow users to write more generic
2272match expressions.</p>
2273
2274<table>
2275<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2276<!-- START_TRAVERSAL_MATCHERS -->
2277
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002278<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
2279<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2280
2281Unlike anyOf, eachOf will generate a match result for each
2282matching submatcher.
2283
2284For example, in:
2285 class A { int a; int b; };
2286The matcher:
2287 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2288 has(fieldDecl(hasName("b")).bind("v"))))
2289will generate two results binding "v", the first of which binds
2290the field declaration of a, the second the field declaration of
2291b.
2292
2293Usable as: Any Matcher
2294</pre></td></tr>
2295
2296
2297<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt; Matcher</td></tr>
2298<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2299
2300Generates results for each match.
2301
2302For example, in:
2303 class A { class B {}; class C {}; };
2304The matcher:
2305 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2306will generate results for A, B and C.
2307
2308Usable as: Any Matcher
2309</pre></td></tr>
2310
2311
Manuel Klimek67619ff2012-09-07 13:10:32 +00002312<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;ChildT&gt; ChildMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002313<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2314provided matcher.
2315
Manuel Klimeke44a0062012-08-26 23:55:24 +00002316Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002317 class X {}; Matches X, because X::X is a class of name X inside X.
2318 class Y { class X {}; };
2319 class Z { class Y { class X {}; }; }; Does not match Z.
2320
2321ChildT must be an AST base type.
2322
2323As opposed to 'has', 'forEach' will cause a match for each result that
2324matches instead of only on the first one.
2325
2326Usable as: Any Matcher
2327</pre></td></tr>
2328
2329
Manuel Klimek67619ff2012-09-07 13:10:32 +00002330<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;DescendantT&gt; DescendantMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002331<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2332provided matcher.
2333
2334Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002335 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002336 class X {}; Matches X, because X::X is a class of name X inside X.
2337 class A { class X {}; };
2338 class B { class C { class X {}; }; };
2339
2340DescendantT must be an AST base type.
2341
2342As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2343each result that matches instead of only on the first one.
2344
2345Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002346 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002347will match 10 times (plus injected class name matches) on:
2348 class A { class B { class C { class D { class E {}; }; }; }; };
2349
2350Usable as: Any Matcher
2351</pre></td></tr>
2352
2353
Manuel Klimek67619ff2012-09-07 13:10:32 +00002354<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;ChildT&gt; ChildMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002355<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2356provided matcher.
2357
Manuel Klimeke44a0062012-08-26 23:55:24 +00002358Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002359 class X {}; Matches X, because X::X is a class of name X inside X.
2360 class Y { class X {}; };
2361 class Z { class Y { class X {}; }; }; Does not match Z.
2362
2363ChildT must be an AST base type.
2364
2365Usable as: Any Matcher
2366</pre></td></tr>
2367
2368
Manuel Klimek67619ff2012-09-07 13:10:32 +00002369<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;AncestorT&gt; AncestorMatcher</td></tr>
2370<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2371matcher.
2372
2373Given
2374void f() { if (true) { int x = 42; } }
2375void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002376expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002377
2378Usable as: Any Matcher
2379</pre></td></tr>
2380
2381
2382<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;DescendantT&gt; DescendantMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002383<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2384provided matcher.
2385
2386Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002387 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002388 class X {}; Matches X, because X::X is a class of name X inside X.
2389 class Y { class X {}; };
2390 class Z { class Y { class X {}; }; };
2391
2392DescendantT must be an AST base type.
2393
2394Usable as: Any Matcher
2395</pre></td></tr>
2396
2397
Daniel Jaspere0b89972012-12-04 12:08:08 +00002398<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;ParentT&gt; ParentMatcher</td></tr>
2399<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2400matcher.
2401
2402Given
2403void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2404compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2405
2406Usable as: Any Matcher
2407</pre></td></tr>
2408
2409
Manuel Klimek67619ff2012-09-07 13:10:32 +00002410<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002411<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2412
2413Given
2414 int i[5];
2415 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002416arraySubscriptExpression(hasBase(implicitCastExpr(
2417 hasSourceExpression(declRefExpr()))))
2418 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002419</pre></td></tr>
2420
2421
Manuel Klimek67619ff2012-09-07 13:10:32 +00002422<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002423<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2424
2425Given
2426 int i[5];
2427 void f() { i[1] = 42; }
2428arraySubscriptExpression(hasIndex(integerLiteral()))
2429 matches i[1] with the integerLiteral() matching 1
2430</pre></td></tr>
2431
2432
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002433<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>
2434<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
Manuel Klimek41df16e2013-01-09 09:38:21 +00002435type.
2436
2437Given
2438 struct A {};
2439 A a[7];
2440 int b[7];
2441arrayType(hasElementType(builtinType()))
2442 matches "int b[7]"
2443
2444Usable 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;
2445</pre></td></tr>
2446
2447
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002448<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>
2449<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
Manuel Klimek41df16e2013-01-09 09:38:21 +00002450type.
2451
2452Given
2453 struct A {};
2454 A a[7];
2455 int b[7];
2456arrayType(hasElementType(builtinType()))
2457 matches "int b[7]"
2458
2459Usable 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;
2460</pre></td></tr>
2461
2462
2463<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>
2464<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2465
2466Given
2467 _Atomic(int) i;
2468 _Atomic(float) f;
2469atomicType(hasValueType(isInteger()))
2470 matches "_Atomic(int) i"
2471
2472Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2473</pre></td></tr>
2474
2475
2476<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>
2477<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2478
2479Given
2480 _Atomic(int) i;
2481 _Atomic(float) f;
2482atomicType(hasValueType(isInteger()))
2483 matches "_Atomic(int) i"
2484
2485Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2486</pre></td></tr>
2487
2488
2489<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>
2490<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2491
2492Note: There is no TypeLoc for the deduced type and thus no
2493getDeducedLoc() matcher.
2494
2495Given
2496 auto a = 1;
2497 auto b = 2.0;
2498autoType(hasDeducedType(isInteger()))
2499 matches "auto a"
2500
2501Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2502</pre></td></tr>
2503
2504
Manuel Klimek67619ff2012-09-07 13:10:32 +00002505<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002506<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2507binary operator matches.
2508</pre></td></tr>
2509
2510
Manuel Klimek67619ff2012-09-07 13:10:32 +00002511<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002512<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2513
2514Example matches a (matcher = binaryOperator(hasLHS()))
2515 a || b
2516</pre></td></tr>
2517
2518
Manuel Klimek67619ff2012-09-07 13:10:32 +00002519<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002520<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2521
2522Example matches b (matcher = binaryOperator(hasRHS()))
2523 a || b
2524</pre></td></tr>
2525
2526
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002527<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>
2528<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00002529pointee matches a given matcher.
2530
2531Given
2532 int *a;
2533 int const *b;
2534 float const *f;
2535pointerType(pointee(isConstQualified(), isInteger()))
2536 matches "int const *b"
2537
2538Usable 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;,
2539 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;
2540</pre></td></tr>
2541
2542
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002543<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>
2544<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00002545pointee matches a given matcher.
2546
2547Given
2548 int *a;
2549 int const *b;
2550 float const *f;
2551pointerType(pointee(isConstQualified(), isInteger()))
2552 matches "int const *b"
2553
2554Usable 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;,
2555 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;
2556</pre></td></tr>
2557
2558
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00002559<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>
2560<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
2561expression.
2562
2563Given
2564 void x(int, int, int) { int y; x(1, y, 42); }
2565callExpr(hasAnyArgument(declRefExpr()))
2566 matches x(1, y, 42)
2567with hasAnyArgument(...)
2568 matching y
2569
2570FIXME: Currently this will ignore parentheses and implicit casts on
2571the argument before applying the inner matcher. We'll want to remove
2572this to allow for greater control by the user once ignoreImplicit()
2573has been implemented.
2574</pre></td></tr>
2575
2576
2577<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>
2578<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
2579call expression.
2580
2581Example matches y in x(y)
2582 (matcher = callExpr(hasArgument(0, declRefExpr())))
2583 void x(int) { int y; x(y); }
2584</pre></td></tr>
2585
2586
Edwin Vane3abf7782013-02-25 14:49:29 +00002587<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</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>
Manuel Klimek03a83232013-06-10 08:52:15 +00002588<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
2589matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002590
Manuel Klimek03a83232013-06-10 08:52:15 +00002591The associated declaration is:
2592- for type nodes, the declaration of the underlying type
2593- for CallExpr, the declaration of the callee
2594- for MemberExpr, the declaration of the referenced member
2595- for CXXConstructExpr, the declaration of the constructor
2596
2597Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2598function. e.g. various subtypes of clang::Type and various expressions.
2599FIXME: Add all node types for which this is matcher is usable due to
2600getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002601
Daniel Jaspere0b89972012-12-04 12:08:08 +00002602Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, 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;,
Edwin Vane3abf7782013-02-25 14:49:29 +00002603 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_1TypedefType.html">TypedefType</a>&gt;,
2604 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002605</pre></td></tr>
2606
2607
Manuel Klimek532870f2013-07-24 05:46:07 +00002608<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>
2609<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
2610
2611Given
2612 class A { A() : i(42), j(42) {} int i; int j; };
2613constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
2614 will trigger two matches, binding for 'i' and 'j' respectively.
2615</pre></td></tr>
2616
2617
Manuel Klimek67619ff2012-09-07 13:10:32 +00002618<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002619<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2620
2621Given
2622 struct Foo {
2623 Foo() : foo_(1) { }
2624 int foo_;
2625 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002626recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002627 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2628</pre></td></tr>
2629
2630
Manuel Klimek67619ff2012-09-07 13:10:32 +00002631<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002632<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2633
2634Given
2635 struct Foo {
2636 Foo() : foo_(1) { }
2637 int foo_;
2638 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002639recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002640 forField(hasName("foo_"))))))
2641 matches Foo
2642with forField matching foo_
2643</pre></td></tr>
2644
2645
Manuel Klimek67619ff2012-09-07 13:10:32 +00002646<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002647<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2648
2649Given
2650 struct Foo {
2651 Foo() : foo_(1) { }
2652 int foo_;
2653 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002654recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002655 withInitializer(integerLiteral(equals(1)))))))
2656 matches Foo
2657with withInitializer matching (1)
2658</pre></td></tr>
2659
2660
Manuel Klimek67619ff2012-09-07 13:10:32 +00002661<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002662<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2663
Manuel Klimeke44a0062012-08-26 23:55:24 +00002664Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002665 class Y { public: void x(); };
2666 void z() { Y y; y.x(); }",
2667
2668FIXME: Overload to allow directly matching types?
2669</pre></td></tr>
2670
2671
Manuel Klimek67619ff2012-09-07 13:10:32 +00002672<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002673<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2674
2675
Manuel Klimek532870f2013-07-24 05:46:07 +00002676<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002677<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2678</pre></td></tr>
2679
2680
Manuel Klimek67619ff2012-09-07 13:10:32 +00002681<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002682<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2683belongs to.
2684
2685FIXME: Generalize this for other kinds of declarations.
2686FIXME: What other kind of declarations would we need to generalize
2687this to?
2688
2689Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002690 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002691 ofClass(hasName("A"))))))
2692 class A {
2693 public:
2694 A();
2695 };
2696 A a = A();
2697</pre></td></tr>
2698
2699
Edwin Vane6a19a972013-03-06 17:02:57 +00002700<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>
2701<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2702
2703Given:
2704 class A { void func(); };
2705 class B { void member(); };
2706
2707recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2708but not B.
2709</pre></td></tr>
2710
2711
Manuel Klimek67619ff2012-09-07 13:10:32 +00002712<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002713<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2714a class matching Base.
2715
Manuel Klimek67619ff2012-09-07 13:10:32 +00002716Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002717
Manuel Klimek67619ff2012-09-07 13:10:32 +00002718Example matches Y, Z, C (Base == hasName("X"))
2719 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002720 class Y : public X {}; directly derived
2721 class Z : public Y {}; indirectly derived
2722 typedef X A;
2723 typedef A B;
2724 class C : public B {}; derived from a typedef of X
2725
2726In the following example, Bar matches isDerivedFrom(hasName("X")):
2727 class Foo;
2728 typedef Foo X;
2729 class Bar : public Foo {}; derived from a type that X is a typedef of
2730</pre></td></tr>
2731
2732
Daniel Jaspere0b89972012-12-04 12:08:08 +00002733<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>
2734<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2735match Base.
2736</pre></td></tr>
2737
2738
Manuel Klimek532870f2013-07-24 05:46:07 +00002739<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002740<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2741given matcher.
2742
Manuel Klimeke44a0062012-08-26 23:55:24 +00002743Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002744 class Y { public: void x(); };
2745 void z() { Y y; y.x();
2746</pre></td></tr>
2747
2748
Manuel Klimek67619ff2012-09-07 13:10:32 +00002749<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002750<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2751expression.
2752
2753Given
2754 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002755callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002756 matches x(1, y, 42)
2757with hasAnyArgument(...)
2758 matching y
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002759
2760FIXME: Currently this will ignore parentheses and implicit casts on
2761the argument before applying the inner matcher. We'll want to remove
2762this to allow for greater control by the user once ignoreImplicit()
2763has been implemented.
Manuel Klimek1da79332012-08-20 20:54:03 +00002764</pre></td></tr>
2765
2766
Manuel Klimek67619ff2012-09-07 13:10:32 +00002767<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002768<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2769call expression.
2770
2771Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002772 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002773 void x(int) { int y; x(y); }
2774</pre></td></tr>
2775
2776
Edwin Vane3abf7782013-02-25 14:49:29 +00002777<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</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>
Manuel Klimek03a83232013-06-10 08:52:15 +00002778<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
2779matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002780
Manuel Klimek03a83232013-06-10 08:52:15 +00002781The associated declaration is:
2782- for type nodes, the declaration of the underlying type
2783- for CallExpr, the declaration of the callee
2784- for MemberExpr, the declaration of the referenced member
2785- for CXXConstructExpr, the declaration of the constructor
2786
2787Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2788function. e.g. various subtypes of clang::Type and various expressions.
2789FIXME: Add all node types for which this is matcher is usable due to
2790getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002791
Daniel Jaspere0b89972012-12-04 12:08:08 +00002792Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, 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;,
Edwin Vane3abf7782013-02-25 14:49:29 +00002793 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_1TypedefType.html">TypedefType</a>&gt;,
2794 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002795</pre></td></tr>
2796
2797
Manuel Klimek03a83232013-06-10 08:52:15 +00002798<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>
2799<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2800extension, matches the constant given in the statement.
2801
2802Given
2803 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2804caseStmt(hasCaseConstant(integerLiteral()))
2805 matches "case 1:"
2806</pre></td></tr>
2807
2808
Manuel Klimek67619ff2012-09-07 13:10:32 +00002809<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002810<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2811
2812Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002813 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002814class URL { URL(string); };
2815URL url = "a string";
2816</pre></td></tr>
2817
2818
Manuel Klimek67619ff2012-09-07 13:10:32 +00002819<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002820<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2821TemplateArgument matching the given InnerMatcher.
2822
2823Given
2824 template&lt;typename T&gt; class A {};
2825 template&lt;&gt; class A&lt;double&gt; {};
2826 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002827classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002828 refersToType(asString("int"))))
2829 matches the specialization A&lt;int&gt;
2830</pre></td></tr>
2831
2832
Manuel Klimek67619ff2012-09-07 13:10:32 +00002833<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002834<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2835matches the given InnerMatcher.
2836
2837Given
2838 template&lt;typename T, typename U&gt; class A {};
2839 A&lt;bool, int&gt; b;
2840 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002841classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002842 1, refersToType(asString("int"))))
2843 matches the specialization A&lt;bool, int&gt;
2844</pre></td></tr>
2845
2846
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002847<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>
2848<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
Manuel Klimek41df16e2013-01-09 09:38:21 +00002849type.
2850
2851Given
2852 struct A {};
2853 A a[7];
2854 int b[7];
2855arrayType(hasElementType(builtinType()))
2856 matches "int b[7]"
2857
2858Usable 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;
2859</pre></td></tr>
2860
2861
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002862<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>
2863<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
Manuel Klimek41df16e2013-01-09 09:38:21 +00002864type.
2865
2866Given
2867 struct A {};
2868 A a[7];
2869 int b[7];
2870arrayType(hasElementType(builtinType()))
2871 matches "int b[7]"
2872
2873Usable 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;
2874</pre></td></tr>
2875
2876
Manuel Klimek67619ff2012-09-07 13:10:32 +00002877<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002878<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2879a given matcher.
2880
2881Given
2882 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002883hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002884 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002885with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002886 matching '{}'
2887</pre></td></tr>
2888
2889
Manuel Klimek67619ff2012-09-07 13:10:32 +00002890<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002891<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2892or conditional operator.
2893
2894Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2895 if (true) {}
2896</pre></td></tr>
2897
2898
Manuel Klimek67619ff2012-09-07 13:10:32 +00002899<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002900<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2901
2902Example matches b
2903 condition ? a : b
2904</pre></td></tr>
2905
2906
Manuel Klimek67619ff2012-09-07 13:10:32 +00002907<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002908<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2909
2910Example matches a
2911 condition ? a : b
2912</pre></td></tr>
2913
2914
Manuel Klimek67619ff2012-09-07 13:10:32 +00002915<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002916<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2917specific using shadow declaration.
2918
2919FIXME: This currently only works for functions. Fix.
2920
2921Given
2922 namespace a { void f() {} }
2923 using a::f;
2924 void g() {
2925 f(); Matches this ..
2926 a::f(); .. but not this.
2927 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002928declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002929 matches f()
2930</pre></td></tr>
2931
2932
Manuel Klimek67619ff2012-09-07 13:10:32 +00002933<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002934<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2935specified matcher.
2936
2937Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002938 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002939 bool x;
2940 if (x) {}
2941</pre></td></tr>
2942
2943
Manuel Klimek67619ff2012-09-07 13:10:32 +00002944<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002945<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2946
2947Note that this does not work for global declarations because the AST
2948breaks up multiple-declaration DeclStmt's into multiple single-declaration
2949DeclStmt's.
2950Example: Given non-global declarations
2951 int a, b = 0;
2952 int c;
2953 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002954declStmt(containsDeclaration(
2955 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002956 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002957declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002958 matches 'int a, b = 0' as well as 'int d = 2, e;'
2959 but 'int c;' is not matched.
2960</pre></td></tr>
2961
2962
Manuel Klimek67619ff2012-09-07 13:10:32 +00002963<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00002964<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2965
2966Given
2967 int a, b;
2968 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002969declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002970 matches 'int c;' but not 'int a, b;'.
2971</pre></td></tr>
2972
2973
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002974<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>
2975<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
2976the inner matcher.
2977
2978Given
2979 int x;
2980declaratorDecl(hasTypeLoc(loc(asString("int"))))
2981 matches int x
2982</pre></td></tr>
2983
2984
Edwin Vane742d9e72013-02-25 20:43:32 +00002985<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>
2986<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2987Decl, matches InnerMatcher.
2988
2989Given
2990 namespace N {
2991 namespace M {
2992 class D {};
2993 }
2994 }
2995
2996recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2997declaration of class D.
2998</pre></td></tr>
2999
3000
Manuel Klimek67619ff2012-09-07 13:10:32 +00003001<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003002<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
3003a given body.
3004
3005Given
3006 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003007hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003008 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003009with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003010 matching '{}'
3011</pre></td></tr>
3012
3013
Manuel Klimek67619ff2012-09-07 13:10:32 +00003014<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003015<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
3016or conditional operator.
3017
3018Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3019 if (true) {}
3020</pre></td></tr>
3021
3022
Edwin Vane742d9e72013-02-25 20:43:32 +00003023<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>
3024<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00003025matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00003026
3027Given
3028 namespace N {
3029 namespace M {
3030 class D {};
3031 }
3032 }
3033 N::M::D d;
3034
3035elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3036matches the type of the variable declaration of d.
3037</pre></td></tr>
3038
3039
3040<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>
3041<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
3042
3043Given
3044 namespace N {
3045 namespace M {
3046 class D {};
3047 }
3048 }
3049 N::M::D d;
3050
3051elaboratedType(namesType(recordType(
3052hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3053declaration of d.
3054</pre></td></tr>
3055
3056
Manuel Klimek67619ff2012-09-07 13:10:32 +00003057<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003058<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
3059
3060(Note: Clang's AST refers to other conversions as "casts" too, and calls
3061actual casts "explicit" casts.)
3062</pre></td></tr>
3063
3064
Manuel Klimek532870f2013-07-24 05:46:07 +00003065<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3066<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
Manuel Klimek1da79332012-08-20 20:54:03 +00003067declaration's type.
3068
3069In case of a value declaration (for example a variable declaration),
3070this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003071declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3072while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003073of x."
3074
Manuel Klimeke44a0062012-08-26 23:55:24 +00003075Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3076 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003077 class X {};
3078 void y(X &amp;x) { x; X z; }
3079
3080Usable 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;
3081</pre></td></tr>
3082
3083
Manuel Klimek67619ff2012-09-07 13:10:32 +00003084<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003085<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
3086are stripped off.
3087
3088Parentheses and explicit casts are not discarded.
3089Given
3090 int arr[5];
3091 int a = 0;
3092 char b = 0;
3093 const int c = a;
3094 int *d = arr;
3095 long e = (long) 0l;
3096The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00003097 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
3098 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003099would match the declarations for a, b, c, and d, but not e.
3100While
Manuel Klimeke44a0062012-08-26 23:55:24 +00003101 varDecl(hasInitializer(integerLiteral()))
3102 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003103only match the declarations for b, c, and d.
3104</pre></td></tr>
3105
3106
Manuel Klimek67619ff2012-09-07 13:10:32 +00003107<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003108<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
3109casts are stripped off.
3110
3111Implicit and non-C Style casts are also discarded.
3112Given
3113 int a = 0;
3114 char b = (0);
3115 void* c = reinterpret_cast&lt;char*&gt;(0);
3116 char d = char(0);
3117The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00003118 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003119would match the declarations for a, b, c, and d.
3120while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003121 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003122only match the declaration for a.
3123</pre></td></tr>
3124
3125
Manuel Klimek67619ff2012-09-07 13:10:32 +00003126<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003127<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
3128parentheses are stripped off.
3129
3130Explicit casts are not discarded.
3131Given
3132 int arr[5];
3133 int a = 0;
3134 char b = (0);
3135 const int c = a;
3136 int *d = (arr);
3137 long e = ((long) 0l);
3138The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00003139 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3140 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003141would match the declarations for a, b, c, and d, but not e.
3142while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003143 varDecl(hasInitializer(integerLiteral()))
3144 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003145would only match the declaration for a.
3146</pre></td></tr>
3147
3148
Manuel Klimek67619ff2012-09-07 13:10:32 +00003149<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003150<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3151a given body.
3152
3153Given
3154 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003155hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003156 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003157with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003158 matching '{}'
3159</pre></td></tr>
3160
3161
Manuel Klimek67619ff2012-09-07 13:10:32 +00003162<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003163<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3164or conditional operator.
3165
3166Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3167 if (true) {}
3168</pre></td></tr>
3169
3170
Manuel Klimek67619ff2012-09-07 13:10:32 +00003171<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003172<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3173
3174Example:
3175 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3176matches '++x' in
3177 for (x; x &lt; N; ++x) { }
3178</pre></td></tr>
3179
3180
Manuel Klimek67619ff2012-09-07 13:10:32 +00003181<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003182<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3183
3184Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00003185 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003186matches 'int x = 0' in
3187 for (int x = 0; x &lt; N; ++x) { }
3188</pre></td></tr>
3189
3190
Manuel Klimek67619ff2012-09-07 13:10:32 +00003191<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003192<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3193
3194Does not match the 'this' parameter of a method.
3195
3196Given
3197 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003198methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003199 matches f(int x, int y, int z) {}
3200with hasAnyParameter(...)
3201 matching int y
3202</pre></td></tr>
3203
3204
Manuel Klimek67619ff2012-09-07 13:10:32 +00003205<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003206<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3207
3208Given
3209 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003210methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003211 matches f(int x) {}
3212with hasParameter(...)
3213 matching int x
3214</pre></td></tr>
3215
3216
Manuel Klimek67619ff2012-09-07 13:10:32 +00003217<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003218<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3219
3220Given:
3221 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003222methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003223 matches int f() { return 1; }
3224</pre></td></tr>
3225
3226
Manuel Klimek67619ff2012-09-07 13:10:32 +00003227<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003228<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3229or conditional operator.
3230
3231Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3232 if (true) {}
3233</pre></td></tr>
3234
3235
Manuel Klimek67619ff2012-09-07 13:10:32 +00003236<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003237<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3238
3239Given
3240 if (A* a = GetAPointer()) {}
3241hasConditionVariableStatment(...)
3242 matches 'A* a = GetAPointer()'.
3243</pre></td></tr>
3244
3245
Manuel Klimek67619ff2012-09-07 13:10:32 +00003246<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003247<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3248matcher.
3249
3250FIXME: Unit test this matcher
3251</pre></td></tr>
3252
3253
Edwin Vane3abf7782013-02-25 14:49:29 +00003254<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</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>
Manuel Klimek03a83232013-06-10 08:52:15 +00003255<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3256matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00003257
Manuel Klimek03a83232013-06-10 08:52:15 +00003258The associated declaration is:
3259- for type nodes, the declaration of the underlying type
3260- for CallExpr, the declaration of the callee
3261- for MemberExpr, the declaration of the referenced member
3262- for CXXConstructExpr, the declaration of the constructor
3263
3264Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3265function. e.g. various subtypes of clang::Type and various expressions.
3266FIXME: Add all node types for which this is matcher is usable due to
3267getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003268
Daniel Jaspere0b89972012-12-04 12:08:08 +00003269Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, 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;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003270 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_1TypedefType.html">TypedefType</a>&gt;,
3271 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003272</pre></td></tr>
3273
3274
Manuel Klimek67619ff2012-09-07 13:10:32 +00003275<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003276<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3277matched by a given matcher.
3278
3279Given
3280 struct X { int m; };
3281 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003282memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003283 matches "x.m" and "m"
3284with hasObjectExpression(...)
3285 matching "x" and the implicit object expression of "m" which has type X*.
3286</pre></td></tr>
3287
3288
Manuel Klimek67619ff2012-09-07 13:10:32 +00003289<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003290<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3291given matcher.
3292
3293Given
3294 struct { int first, second; } first, second;
3295 int i(second.first);
3296 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003297memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003298 matches second.first
3299 but not first.second (because the member name there is "second").
3300</pre></td></tr>
3301
3302
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003303<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>
3304<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00003305pointee matches a given matcher.
3306
3307Given
3308 int *a;
3309 int const *b;
3310 float const *f;
3311pointerType(pointee(isConstQualified(), isInteger()))
3312 matches "int const *b"
3313
3314Usable 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;,
3315 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;
3316</pre></td></tr>
3317
3318
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003319<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>
3320<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00003321pointee matches a given matcher.
3322
3323Given
3324 int *a;
3325 int const *b;
3326 float const *f;
3327pointerType(pointee(isConstQualified(), isInteger()))
3328 matches "int const *b"
3329
3330Usable 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;,
3331 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;
3332</pre></td></tr>
3333
3334
Manuel Klimek415514d2013-02-06 20:36:22 +00003335<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>
Daniel Jaspere0b89972012-12-04 12:08:08 +00003336<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3337
3338Given
3339 struct A { struct B { struct C {}; }; };
3340 A::B::C c;
3341nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3342 matches "A::"
3343</pre></td></tr>
3344
3345
Manuel Klimek41df16e2013-01-09 09:38:21 +00003346<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&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>
3347<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3348NestedNameSpecifier-matcher matches.
3349</pre></td></tr>
3350
3351
Daniel Jaspere0b89972012-12-04 12:08:08 +00003352<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>
3353<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3354given TypeLoc.
3355
3356Given
3357 struct A { struct B { struct C {}; }; };
3358 A::B::C c;
3359nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3360 hasDeclaration(recordDecl(hasName("A")))))))
3361 matches "A::"
3362</pre></td></tr>
3363
3364
Manuel Klimek415514d2013-02-06 20:36:22 +00003365<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>
Daniel Jaspere0b89972012-12-04 12:08:08 +00003366<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3367
3368Given
3369 struct A { struct B { struct C {}; }; };
3370 A::B::C c;
3371nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3372 matches "A::"
3373</pre></td></tr>
3374
3375
3376<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>
3377<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3378given namespace matcher.
3379
3380Given
3381 namespace ns { struct A {}; }
3382 ns::A a;
3383nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3384 matches "ns::"
3385</pre></td></tr>
3386
3387
3388<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>
3389<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3390given QualType matcher without qualifiers.
3391
3392Given
3393 struct A { struct B { struct C {}; }; };
3394 A::B::C c;
3395nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3396 matches "A::"
3397</pre></td></tr>
3398
3399
Edwin Vane88be2fd2013-04-01 18:33:34 +00003400<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>
3401<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3402
3403Given
3404 int (*ptr_to_array)[4];
3405 int (*ptr_to_func)(int);
3406
3407varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3408ptr_to_func but not ptr_to_array.
3409
3410Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3411</pre></td></tr>
3412
3413
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003414<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>
3415<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00003416pointee matches a given matcher.
3417
3418Given
3419 int *a;
3420 int const *b;
3421 float const *f;
3422pointerType(pointee(isConstQualified(), isInteger()))
3423 matches "int const *b"
3424
3425Usable 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;,
3426 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;
3427</pre></td></tr>
3428
3429
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003430<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>
3431<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00003432pointee matches a given matcher.
3433
3434Given
3435 int *a;
3436 int const *b;
3437 float const *f;
3438pointerType(pointee(isConstQualified(), isInteger()))
3439 matches "int const *b"
3440
3441Usable 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;,
3442 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;
3443</pre></td></tr>
3444
3445
Edwin Vane6a19a972013-03-06 17:02:57 +00003446<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>
3447<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3448
3449Given:
3450 typedef int &amp;int_ref;
3451 int a;
3452 int_ref b = a;
3453
3454varDecl(hasType(qualType(referenceType()))))) will not match the
3455declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3456</pre></td></tr>
3457
3458
Edwin Vane3abf7782013-02-25 14:49:29 +00003459<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</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>
Manuel Klimek03a83232013-06-10 08:52:15 +00003460<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3461matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003462
Manuel Klimek03a83232013-06-10 08:52:15 +00003463The associated declaration is:
3464- for type nodes, the declaration of the underlying type
3465- for CallExpr, the declaration of the callee
3466- for MemberExpr, the declaration of the referenced member
3467- for CXXConstructExpr, the declaration of the constructor
3468
3469Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3470function. e.g. various subtypes of clang::Type and various expressions.
3471FIXME: Add all node types for which this is matcher is usable due to
3472getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003473
Daniel Jaspere0b89972012-12-04 12:08:08 +00003474Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, 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;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003475 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_1TypedefType.html">TypedefType</a>&gt;,
3476 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003477</pre></td></tr>
3478
3479
Manuel Klimek532870f2013-07-24 05:46:07 +00003480<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003481<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3482</pre></td></tr>
3483
3484
Manuel Klimek532870f2013-07-24 05:46:07 +00003485<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003486<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3487</pre></td></tr>
3488
3489
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003490<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>
3491<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00003492pointee matches a given matcher.
3493
3494Given
3495 int *a;
3496 int const *b;
3497 float const *f;
3498pointerType(pointee(isConstQualified(), isInteger()))
3499 matches "int const *b"
3500
3501Usable 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;,
3502 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;
3503</pre></td></tr>
3504
3505
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003506<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>
3507<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
Manuel Klimek41df16e2013-01-09 09:38:21 +00003508pointee matches a given matcher.
3509
3510Given
3511 int *a;
3512 int const *b;
3513 float const *f;
3514pointerType(pointee(isConstQualified(), isInteger()))
3515 matches "int const *b"
3516
3517Usable 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;,
3518 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;
3519</pre></td></tr>
3520
3521
Manuel Klimek67619ff2012-09-07 13:10:32 +00003522<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003523<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3524alignof.
3525</pre></td></tr>
3526
3527
Manuel Klimek67619ff2012-09-07 13:10:32 +00003528<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003529<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3530sizeof.
3531</pre></td></tr>
3532
3533
Manuel Klimek03a83232013-06-10 08:52:15 +00003534<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>
3535<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3536statement. This matcher may produce multiple matches.
3537
3538Given
3539 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3540switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3541 matches four times, with "c" binding each of "case 1:", "case 2:",
3542"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3543"switch (1)", "switch (2)" and "switch (2)".
3544</pre></td></tr>
3545
3546
Manuel Klimek67619ff2012-09-07 13:10:32 +00003547<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003548<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3549
3550Given
3551 template&lt;typename T&gt; struct A {};
3552 struct B { B* next; };
3553 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003554classTemplateSpecializationDecl(hasAnyTemplateArgument(
3555 refersToDeclaration(fieldDecl(hasName("next"))))
3556 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003557 B::next
3558</pre></td></tr>
3559
3560
Manuel Klimek67619ff2012-09-07 13:10:32 +00003561<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003562<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3563
3564Given
3565 struct X {};
3566 template&lt;typename T&gt; struct A {};
3567 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003568classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003569 refersToType(class(hasName("X")))))
3570 matches the specialization A&lt;X&gt;
3571</pre></td></tr>
3572
3573
Edwin Vane3abf7782013-02-25 14:49:29 +00003574<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</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>
Manuel Klimek03a83232013-06-10 08:52:15 +00003575<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
3576matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003577
Manuel Klimek03a83232013-06-10 08:52:15 +00003578The associated declaration is:
3579- for type nodes, the declaration of the underlying type
3580- for CallExpr, the declaration of the callee
3581- for MemberExpr, the declaration of the referenced member
3582- for CXXConstructExpr, the declaration of the constructor
3583
3584Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3585function. e.g. various subtypes of clang::Type and various expressions.
3586FIXME: Add all node types for which this is matcher is usable due to
3587getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003588
3589Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, 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;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003590 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_1TypedefType.html">TypedefType</a>&gt;,
3591 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3592</pre></td></tr>
3593
3594
3595<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&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>
3596<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3597QualType-matcher matches.
3598</pre></td></tr>
3599
3600
3601<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>
Manuel Klimek03a83232013-06-10 08:52:15 +00003602<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
3603matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00003604
Manuel Klimek03a83232013-06-10 08:52:15 +00003605The associated declaration is:
3606- for type nodes, the declaration of the underlying type
3607- for CallExpr, the declaration of the callee
3608- for MemberExpr, the declaration of the referenced member
3609- for CXXConstructExpr, the declaration of the constructor
3610
3611Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3612function. e.g. various subtypes of clang::Type and various expressions.
3613FIXME: Add all node types for which this is matcher is usable due to
3614getDecl().
Edwin Vane3abf7782013-02-25 14:49:29 +00003615
3616Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, 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;,
3617 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_1TypedefType.html">TypedefType</a>&gt;,
3618 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003619</pre></td></tr>
3620
3621
Manuel Klimek67619ff2012-09-07 13:10:32 +00003622<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003623<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3624
3625Given
3626 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3627unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3628 matches sizeof(a) and alignof(c)
3629</pre></td></tr>
3630
3631
Manuel Klimek67619ff2012-09-07 13:10:32 +00003632<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003633<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3634
Daniel Jaspere0b89972012-12-04 12:08:08 +00003635Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003636 !true
3637</pre></td></tr>
3638
3639
Manuel Klimek67619ff2012-09-07 13:10:32 +00003640<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003641<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3642
3643Given
3644 namespace X { void b(); }
3645 using X::b;
3646usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3647 matches using X::b </pre></td></tr>
3648
3649
Manuel Klimek67619ff2012-09-07 13:10:32 +00003650<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003651<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3652matched by the given matcher.
3653
3654Given
3655 namespace X { int a; void b(); }
3656 using X::a;
3657 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003658usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003659 matches using X::b but not using X::a </pre></td></tr>
3660
3661
Manuel Klimek532870f2013-07-24 05:46:07 +00003662<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3663<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
Manuel Klimek1da79332012-08-20 20:54:03 +00003664declaration's type.
3665
3666In case of a value declaration (for example a variable declaration),
3667this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003668declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3669while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003670of x."
3671
Manuel Klimeke44a0062012-08-26 23:55:24 +00003672Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3673 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003674 class X {};
3675 void y(X &amp;x) { x; X z; }
3676
3677Usable 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;
3678</pre></td></tr>
3679
3680
Manuel Klimek67619ff2012-09-07 13:10:32 +00003681<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003682<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3683that matches the given matcher.
3684
Manuel Klimeke44a0062012-08-26 23:55:24 +00003685Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003686 bool y() { return true; }
3687 bool x = y();
3688</pre></td></tr>
3689
3690
Daniel Jaspere0b89972012-12-04 12:08:08 +00003691<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>
3692<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3693expression.
3694
3695Given
3696 void f(int b) {
3697 int a[b];
3698 }
3699variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3700 varDecl(hasName("b")))))))
3701 matches "int a[b]"
3702</pre></td></tr>
3703
3704
Manuel Klimek67619ff2012-09-07 13:10:32 +00003705<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003706<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3707a given body.
3708
3709Given
3710 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003711hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003712 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003713with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003714 matching '{}'
3715</pre></td></tr>
3716
3717
Manuel Klimek67619ff2012-09-07 13:10:32 +00003718<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>
Manuel Klimek1da79332012-08-20 20:54:03 +00003719<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3720or conditional operator.
3721
3722Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3723 if (true) {}
3724</pre></td></tr>
3725
3726<!--END_TRAVERSAL_MATCHERS -->
3727</table>
3728
3729</div>
3730</body>
3731</html>
3732
3733