blob: 2c9b3aae0a89ab5373fceffd7a8d291d48471adb [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
Samuel Benzaquenee0da952013-08-16 16:19:42 +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('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
635<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
6361.0, 1.0f, 1.0L and 1e10.
637
638Does not match implicit conversions such as
639 float a = 10;
640</pre></td></tr>
641
642
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
644<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
645
646forRangeStmt() matches 'for (auto a : i)'
647 int i[] = {1, 2, 3}; for (auto a : i);
648 for(int j = 0; j &lt; 5; ++j);
649</pre></td></tr>
650
651
Manuel Klimek67619ff2012-09-07 13:10:32 +0000652<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 +0000653<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
654
655Example matches 'for (;;) {}'
656 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000657 int i[] = {1, 2, 3}; for (auto a : i);
658</pre></td></tr>
659
660
661<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>
662<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
663
664Example: Matches Foo(bar);
665 Foo f = bar;
666 Foo g = (Foo) bar;
667 Foo h = Foo(bar);
668</pre></td></tr>
669
670
671<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>
672<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
673
674Given
675 goto FOO;
676 FOO: bar();
677gotoStmt()
678 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000679</pre></td></tr>
680
681
Manuel Klimek67619ff2012-09-07 13:10:32 +0000682<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 +0000683<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
684
685Example matches 'if (x) {}'
686 if (x) {}
687</pre></td></tr>
688
689
Daniel Jaspere0b89972012-12-04 12:08:08 +0000690<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>
691<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
692
693This matches many different places, including function call return value
694eliding, as well as any type conversions.
695</pre></td></tr>
696
697
Manuel Klimek67619ff2012-09-07 13:10:32 +0000698<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 +0000699<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
700
701Given
702 int a[] = { 1, 2 };
703 struct B { int x, y; };
704 B b = { 5, 6 };
705initList()
706 matches "{ 1, 2 }" and "{ 5, 6 }"
707</pre></td></tr>
708
709
Daniel Jaspere0b89972012-12-04 12:08:08 +0000710<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>
Samuel Benzaquenee0da952013-08-16 16:19:42 +0000711<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
7121, 1L, 0x1 and 1U.
Daniel Jaspere0b89972012-12-04 12:08:08 +0000713
Samuel Benzaquenee0da952013-08-16 16:19:42 +0000714Does not match character-encoded integers such as L'a'.
Daniel Jaspere0b89972012-12-04 12:08:08 +0000715</pre></td></tr>
716
717
718<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>
719<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
720
721Given
722 goto FOO;
723 FOO: bar();
724labelStmt()
725 matches 'FOO:'
726</pre></td></tr>
727
728
729<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>
730<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
731
732Example matches [&amp;](){return 5;}
733 [&amp;](){return 5;}
734</pre></td></tr>
735
736
Manuel Klimek67619ff2012-09-07 13:10:32 +0000737<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 +0000738<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
739
740Example: Given
741 struct T {void func()};
742 T f();
743 void g(T);
744materializeTemporaryExpr() matches 'f()' in these statements
745 T u(f());
746 g(f());
747but does not match
748 f();
749 f().func();
750</pre></td></tr>
751
752
Manuel Klimek67619ff2012-09-07 13:10:32 +0000753<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 +0000754<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000755
756Example matches x.y()
757 X x;
758 x.y();
759</pre></td></tr>
760
761
Manuel Klimek67619ff2012-09-07 13:10:32 +0000762<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 +0000763<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000764
765Given
766 class Y {
767 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
768 int a; static int b;
769 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000770memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000771 matches this-&gt;x, x, y.x, a, this-&gt;b
772</pre></td></tr>
773
774
Manuel Klimek67619ff2012-09-07 13:10:32 +0000775<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000776<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000777
778Given
779 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000780newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000781 matches 'new X'.
782</pre></td></tr>
783
784
Daniel Jaspere0b89972012-12-04 12:08:08 +0000785<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>
786<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
787</pre></td></tr>
788
789
790<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>
791<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
792
793 foo();;
794nullStmt()
795 matches the second ';'
796</pre></td></tr>
797
798
Manuel Klimek67619ff2012-09-07 13:10:32 +0000799<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 +0000800<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000801
802Note that if an operator isn't overloaded, it won't match. Instead, use
803binaryOperator matcher.
804Currently it does not match operators such as new delete.
805FIXME: figure out why these do not match?
806
807Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000808 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000809 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
810 ostream &amp;o; int b = 1, c = 1;
811 o &lt;&lt; b &lt;&lt; c;
812</pre></td></tr>
813
814
Daniel Jaspere0b89972012-12-04 12:08:08 +0000815<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>
816<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
817
818Either the source expression or the destination type can be matched
819using has(), but hasDestinationType() is more specific and can be
820more readable.
821
822Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
823 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
824</pre></td></tr>
825
826
827<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>
828<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
829
830Given
831 return 1;
832returnStmt()
833 matches 'return 1'
834</pre></td></tr>
835
836
837<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>
838<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
839
840hasDestinationType
841reinterpretCast
842
843Example:
844 staticCastExpr()
845matches
846 static_cast&lt;long&gt;(8)
847in
848 long eight(static_cast&lt;long&gt;(8));
849</pre></td></tr>
850
851
Manuel Klimek67619ff2012-09-07 13:10:32 +0000852<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 +0000853<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000854
855Given
856 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000857stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000858 matches both the compound statement '{ ++a; }' and '++a'.
859</pre></td></tr>
860
861
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
863<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
864
865Example matches "abcd", L"abcd"
866 char *s = "abcd"; wchar_t *ws = L"abcd"
867</pre></td></tr>
868
869
Manuel Klimek67619ff2012-09-07 13:10:32 +0000870<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 +0000871<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
872
873Given
874 switch(a) { case 42: break; default: break; }
875switchCase()
876 matches 'case 42: break;' and 'default: break;'.
877</pre></td></tr>
878
879
Daniel Jaspere0b89972012-12-04 12:08:08 +0000880<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>
881<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
882
883Given
884 switch(a) { case 42: break; default: break; }
885switchStmt()
886 matches 'switch(a)'.
887</pre></td></tr>
888
889
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +0000890<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('temporaryObjectExpr0')"><a name="temporaryObjectExpr0Anchor">temporaryObjectExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
891<tr><td colspan="4" class="doc" id="temporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
892
893Example: Matches Foo(bar, bar)
894 Foo h = Foo(bar, bar);
895</pre></td></tr>
896
897
Daniel Jaspere0b89972012-12-04 12:08:08 +0000898<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>
899<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
900
901Example matches the implicit this expression in "return i".
902 (matcher = thisExpr())
903struct foo {
904 int i;
905 int f() { return i; }
906};
907</pre></td></tr>
908
909
910<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
911<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
912
913 try { throw 5; } catch(int i) {}
914throwExpr()
915 matches 'throw 5'
916</pre></td></tr>
917
918
919<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>
920<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
921
922 try {} catch(int i) {}
923tryStmt()
924 matches 'try {}'
925</pre></td></tr>
926
927
Manuel Klimek67619ff2012-09-07 13:10:32 +0000928<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 +0000929<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
930
931Given
932 Foo x = bar;
933 int y = sizeof(x) + alignof(x);
934unaryExprOrTypeTraitExpr()
935 matches sizeof(x) and alignof(x)
936</pre></td></tr>
937
938
Manuel Klimek67619ff2012-09-07 13:10:32 +0000939<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 +0000940<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
941
942Example matches !a
943 !a || b
944</pre></td></tr>
945
946
Manuel Klimek532870f2013-07-24 05:46:07 +0000947<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>
948<tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
949
950Example matches T(t) in return statement of f
951 (matcher = unresolvedConstructExpr())
952 template &lt;typename T&gt;
953 void f(const T&amp; t) { return T(t); }
954</pre></td></tr>
955
956
Daniel Jaspere0b89972012-12-04 12:08:08 +0000957<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>
958<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
959
960Example match: "foo"_suffix
961</pre></td></tr>
962
963
Manuel Klimek67619ff2012-09-07 13:10:32 +0000964<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 +0000965<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
966
967Given
968 while (true) {}
969whileStmt()
970 matches 'while (true) {}'.
971</pre></td></tr>
972
Daniel Jaspere0b89972012-12-04 12:08:08 +0000973
974<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>
975<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
976</pre></td></tr>
977
978
Manuel Klimek41df16e2013-01-09 09:38:21 +0000979<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>
980<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
981
982Given
983 int a[] = { 2, 3 };
984 int b[4];
985 void f() { int c[a[0]]; }
986arrayType()
987 matches "int a[]", "int b[4]" and "int c[a[0]]";
988</pre></td></tr>
989
990
991<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>
992<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
993
994Given
995 _Atomic(int) i;
996atomicType()
997 matches "_Atomic(int) i"
998</pre></td></tr>
999
1000
1001<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>
1002<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1003
1004Given:
1005 auto n = 4;
1006 int v[] = { 2, 3 }
1007 for (auto i : v) { }
1008autoType()
1009 matches "auto n" and "auto i"
1010</pre></td></tr>
1011
1012
1013<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>
1014<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1015"void (^)(int)".
1016
1017The pointee is always required to be a FunctionType.
1018</pre></td></tr>
1019
1020
1021<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>
1022<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1023
1024Given
1025 struct A {};
1026 A a;
1027 int b;
1028 float c;
1029 bool d;
1030builtinType()
1031 matches "int b", "float c" and "bool d"
1032</pre></td></tr>
1033
1034
1035<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>
1036<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1037
1038Given
1039 _Complex float f;
1040complexType()
1041 matches "_Complex float f"
1042</pre></td></tr>
1043
1044
1045<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>
1046<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1047
1048Given
1049 void() {
1050 int a[2];
1051 int b[] = { 2, 3 };
1052 int c[b[0]];
1053 }
1054constantArrayType()
1055 matches "int a[2]"
1056</pre></td></tr>
1057
1058
1059<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>
1060<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1061
1062Given
1063 template&lt;typename T, int Size&gt;
1064 class array {
1065 T data[Size];
1066 };
1067dependentSizedArrayType
1068 matches "T data[Size]"
1069</pre></td></tr>
1070
1071
Edwin Vane742d9e72013-02-25 20:43:32 +00001072<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>
1073<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1074qualified name.
1075
1076Given
1077 namespace N {
1078 namespace M {
1079 class D {};
1080 }
1081 }
1082 class C {};
1083
1084 class C c;
1085 N::M::D d;
1086
1087elaboratedType() matches the type of the variable declarations of both
1088c and d.
1089</pre></td></tr>
1090
1091
Manuel Klimek41df16e2013-01-09 09:38:21 +00001092<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>
1093<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1094
1095Given
1096 int (*f)(int);
1097 void g();
1098functionType()
1099 matches "int (*f)(int)" and the type of "g".
1100</pre></td></tr>
1101
1102
1103<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>
1104<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1105
1106Given
1107 int a[] = { 2, 3 };
1108 int b[42];
1109 void f(int c[]) { int d[a[0]]; };
1110incompleteArrayType()
1111 matches "int a[]" and "int c[]"
1112</pre></td></tr>
1113
1114
Edwin Vane8203d9f2013-03-28 13:50:22 +00001115<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>
1116<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001117
1118Given:
1119 int *a;
1120 int &amp;b = *a;
1121 int &amp;&amp;c = 1;
1122 auto &amp;d = b;
1123 auto &amp;&amp;e = c;
1124 auto &amp;&amp;f = 2;
1125 int g = 5;
1126
Edwin Vane8203d9f2013-03-28 13:50:22 +00001127lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001128matched since the type is deduced as int&amp; by reference collapsing rules.
1129</pre></td></tr>
1130
1131
Manuel Klimek41df16e2013-01-09 09:38:21 +00001132<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>
1133<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1134Given
1135 struct A { int i; }
1136 A::* ptr = A::i;
1137memberPointerType()
1138 matches "A::* ptr"
1139</pre></td></tr>
1140
1141
Edwin Vane88be2fd2013-04-01 18:33:34 +00001142<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>
1143<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1144
1145Given
1146 int (*ptr_to_array)[4];
1147 int *array_of_ptrs[4];
1148
1149varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1150array_of_ptrs.
1151</pre></td></tr>
1152
1153
Manuel Klimek41df16e2013-01-09 09:38:21 +00001154<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>
1155<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1156
1157Given
1158 int *a;
1159 int &amp;b = *a;
1160 int c = 5;
1161pointerType()
1162 matches "int *a"
1163</pre></td></tr>
1164
1165
Edwin Vane8203d9f2013-03-28 13:50:22 +00001166<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>
1167<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1168
1169Given:
1170 int *a;
1171 int &amp;b = *a;
1172 int &amp;&amp;c = 1;
1173 auto &amp;d = b;
1174 auto &amp;&amp;e = c;
1175 auto &amp;&amp;f = 2;
1176 int g = 5;
1177
1178rValueReferenceType() matches the types of c and f. e is not
1179matched as it is deduced to int&amp; by reference collapsing rules.
1180</pre></td></tr>
1181
1182
Edwin Vane742d9e72013-02-25 20:43:32 +00001183<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>
1184<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1185
1186Given
1187 class C {};
1188 struct S {};
1189
1190 C c;
1191 S s;
1192
1193recordType() matches the type of the variable declarations of both c
1194and s.
1195</pre></td></tr>
1196
1197
Manuel Klimek41df16e2013-01-09 09:38:21 +00001198<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001199<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001200
1201Given
1202 int *a;
1203 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001204 int &amp;&amp;c = 1;
1205 auto &amp;d = b;
1206 auto &amp;&amp;e = c;
1207 auto &amp;&amp;f = 2;
1208 int g = 5;
1209
1210referenceType() matches the types of b, c, d, e, and f.
1211</pre></td></tr>
1212
1213
Edwin Vane3abf7782013-02-25 14:49:29 +00001214<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>
1215<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1216
1217Given
1218 template &lt;typename T&gt;
1219 class C { };
1220
1221 template class C&lt;int&gt;; A
1222 C&lt;char&gt; var; B
1223
1224templateSpecializationType() matches the type of the explicit
1225instantiation in A and the type of the variable declaration in B.
1226</pre></td></tr>
1227
1228
Daniel Jaspere0b89972012-12-04 12:08:08 +00001229<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>
1230<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1231</pre></td></tr>
1232
Manuel Klimek41df16e2013-01-09 09:38:21 +00001233
1234<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>
1235<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1236
1237Given
1238 typedef int X;
1239typedefType()
1240 matches "typedef int X"
1241</pre></td></tr>
1242
1243
Manuel Klimek532870f2013-07-24 05:46:07 +00001244<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>
1245<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1246
1247Given:
1248 typedef __underlying_type(T) type;
1249unaryTransformType()
1250 matches "__underlying_type(T)"
1251</pre></td></tr>
1252
1253
Manuel Klimek41df16e2013-01-09 09:38:21 +00001254<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>
1255<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1256integer-constant-expression.
1257
1258Given
1259 void f() {
1260 int a[] = { 2, 3 }
1261 int b[42];
1262 int c[a[0]];
1263variableArrayType()
1264 matches "int c[a[0]]"
1265</pre></td></tr>
1266
Manuel Klimek1da79332012-08-20 20:54:03 +00001267<!--END_DECL_MATCHERS -->
1268</table>
1269
1270<!-- ======================================================================= -->
1271<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1272<!-- ======================================================================= -->
1273
1274<p>Narrowing matchers match certain attributes on the current node, thus
1275narrowing down the set of nodes of the current type to match on.</p>
1276
1277<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1278which allow users to create more powerful match expressions.</p>
1279
1280<table>
1281<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1282<!-- START_NARROWING_MATCHERS -->
1283
Samuel Benzaquend36e4632013-08-27 15:11:16 +00001284<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001285<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1286
1287Usable as: Any Matcher
1288</pre></td></tr>
1289
1290
Samuel Benzaquend36e4632013-08-27 15:11:16 +00001291<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001292<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1293
1294Usable as: Any Matcher
1295</pre></td></tr>
1296
1297
Manuel Klimek67619ff2012-09-07 13:10:32 +00001298<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 +00001299<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1300
1301Useful when another matcher requires a child matcher, but there's no
1302additional constraint. This will often be used with an explicit conversion
1303to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1304
1305Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1306"int* p" and "void f()" in
1307 int* p;
1308 void f();
1309
1310Usable as: Any Matcher
1311</pre></td></tr>
1312
1313
Manuel Klimek67619ff2012-09-07 13:10:32 +00001314<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 +00001315<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1316
Manuel Klimeke44a0062012-08-26 23:55:24 +00001317Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001318 class X {};
1319 class Y {};
1320
1321Usable as: Any Matcher
1322</pre></td></tr>
1323
1324
Manuel Klimek67619ff2012-09-07 13:10:32 +00001325<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 +00001326<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1327unary).
1328
1329Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1330 !(a || b)
1331</pre></td></tr>
1332
1333
Manuel Klimek67619ff2012-09-07 13:10:32 +00001334<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 +00001335<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1336
1337Example matches true (matcher = boolLiteral(equals(true)))
1338 true
1339
1340Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1341 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;
1342</pre></td></tr>
1343
1344
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00001345<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>
1346<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1347a specific number of arguments (including absent default arguments).
1348
1349Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1350 void f(int x, int y);
1351 f(0, 0);
1352</pre></td></tr>
1353
1354
Manuel Klimek67619ff2012-09-07 13:10:32 +00001355<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 +00001356<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1357by the compiler (eg. implicit defaultcopy constructors).
1358</pre></td></tr>
1359
1360
Manuel Klimek67619ff2012-09-07 13:10:32 +00001361<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
Benjamin Kramere5753592013-09-09 14:48:42 +00001362<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
Manuel Klimek1da79332012-08-20 20:54:03 +00001363code (as opposed to implicitly added by the compiler).
1364
1365Given
1366 struct Foo {
1367 Foo() { }
1368 Foo(int) : foo_("A") { }
1369 string foo_;
1370 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001371constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001372 will match Foo(int), but not Foo()
1373</pre></td></tr>
1374
1375
Edwin Vane6a19a972013-03-06 17:02:57 +00001376<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 +00001377<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1378
1379Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001380"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001381
Edwin Vane6a19a972013-03-06 17:02:57 +00001382Given:
1383 class A { int operator*(); };
1384 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1385 A a;
1386 a &lt;&lt; a; &lt;-- This matches
1387
1388operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1389line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1390the declaration of A.
1391
1392Usable 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;
1393</pre></td></tr>
1394
1395
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001396<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>
1397<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1398
1399Given
1400struct A {
1401 void foo() const;
1402 void bar();
1403};
1404
1405methodDecl(isConst()) matches A::foo() but not A::bar()
1406</pre></td></tr>
1407
1408
Edwin Vane5771a2f2013-04-09 20:46:36 +00001409<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>
1410<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1411
1412Given
1413 class A {
1414 public:
1415 virtual void x();
1416 };
1417 class B : public A {
1418 public:
1419 virtual void x();
1420 };
1421 matches B::x
1422</pre></td></tr>
1423
1424
1425<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>
1426<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1427
1428Given
1429 class A {
1430 public:
1431 virtual void x();
1432 };
1433 matches A::x
1434</pre></td></tr>
1435
1436
Edwin Vane6a19a972013-03-06 17:02:57 +00001437<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>
1438<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1439
1440Matches overloaded operator names specified in strings without the
1441"operator" prefix: e.g. "&lt;&lt;".
1442
1443Given:
1444 class A { int operator*(); };
1445 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1446 A a;
1447 a &lt;&lt; a; &lt;-- This matches
1448
1449operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1450line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1451the declaration of A.
1452
1453Usable 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 +00001454</pre></td></tr>
1455
1456
Manuel Klimek67619ff2012-09-07 13:10:32 +00001457<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 +00001458<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1459</pre></td></tr>
1460
1461
Manuel Klimek415514d2013-02-06 20:36:22 +00001462<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>
1463<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001464static member variable template instantiations.
1465
1466Given
1467 template&lt;typename T&gt; void A(T t) { }
1468 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001469functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001470 matches the specialization A&lt;int&gt;().
1471
1472Usable 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;
1473</pre></td></tr>
1474
1475
Daniel Jaspere0b89972012-12-04 12:08:08 +00001476<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>
1477<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1478isSameOrDerivedFrom(hasName(...)).
1479</pre></td></tr>
1480
1481
Manuel Klimek415514d2013-02-06 20:36:22 +00001482<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>
1483<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001484member variable template instantiations.
1485
1486Given
1487 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1488or
1489 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001490recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001491 matches the template instantiation of X&lt;A&gt;.
1492
1493But given
1494 template &lt;typename T&gt; class X {}; class A {};
1495 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001496recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001497 does not match, as X&lt;A&gt; is an explicit template specialization.
1498
1499Usable 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;
1500</pre></td></tr>
1501
1502
Manuel Klimek67619ff2012-09-07 13:10:32 +00001503<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 +00001504<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1505a specific number of arguments (including absent default arguments).
1506
Manuel Klimeke44a0062012-08-26 23:55:24 +00001507Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001508 void f(int x, int y);
1509 f(0, 0);
1510</pre></td></tr>
1511
1512
Manuel Klimek67619ff2012-09-07 13:10:32 +00001513<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 +00001514<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1515
1516Example matches true (matcher = boolLiteral(equals(true)))
1517 true
1518
1519Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1520 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;
1521</pre></td></tr>
1522
1523
Manuel Klimek67619ff2012-09-07 13:10:32 +00001524<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 +00001525<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1526child statements.
1527
1528Example: Given
1529 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001530compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001531 matches '{}'
1532 but does not match the outer compound statement.
1533</pre></td></tr>
1534
1535
Daniel Jaspere0b89972012-12-04 12:08:08 +00001536<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>
1537<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1538
1539Given
1540 int a[42];
1541 int b[2 * 21];
1542 int c[41], d[43];
1543constantArrayType(hasSize(42))
1544 matches "int a[42]" and "int b[2 * 21]"
1545</pre></td></tr>
1546
1547
Manuel Klimek67619ff2012-09-07 13:10:32 +00001548<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 +00001549<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1550declarations.
1551
1552Example: Given
1553 int a, b;
1554 int c;
1555 int d = 2, e;
1556declCountIs(2)
1557 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1558</pre></td></tr>
1559
1560
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001561<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>
1562<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1563
1564Matches a node if it equals the node previously bound to ID.
1565
1566Given
1567 class X { int a; int b; };
1568recordDecl(
1569 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1570 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1571 matches the class X, as a and b have the same type.
1572
1573Note that when multiple matches are involved via forEach* matchers,
1574equalsBoundNodes acts as a filter.
1575For example:
1576compoundStmt(
1577 forEachDescendant(varDecl().bind("d")),
1578 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1579will trigger a match for each combination of variable declaration
1580and reference to that variable declaration within a compound statement.
1581</pre></td></tr>
1582
1583
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001584<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>
1585<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1586
1587Decl has pointer identity in the AST.
1588</pre></td></tr>
1589
1590
Daniel Jasperc7093d92013-02-25 12:39:41 +00001591<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>
1592<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1593
1594Given
1595 class C {
1596 public: int a;
1597 protected: int b;
1598 private: int c;
1599 };
1600fieldDecl(isPrivate())
1601 matches 'int c;'
1602</pre></td></tr>
1603
1604
1605<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>
1606<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1607
1608Given
1609 class C {
1610 public: int a;
1611 protected: int b;
1612 private: int c;
1613 };
1614fieldDecl(isProtected())
1615 matches 'int b;'
1616</pre></td></tr>
1617
1618
1619<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>
1620<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1621
1622Given
1623 class C {
1624 public: int a;
1625 protected: int b;
1626 private: int c;
1627 };
1628fieldDecl(isPublic())
1629 matches 'int a;'
1630</pre></td></tr>
1631
1632
Manuel Klimek67619ff2012-09-07 13:10:32 +00001633<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 +00001634<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1635
1636Example matches true (matcher = boolLiteral(equals(true)))
1637 true
1638
1639Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1640 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;
1641</pre></td></tr>
1642
1643
Manuel Klimek415514d2013-02-06 20:36:22 +00001644<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>
1645<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001646
1647Example matches A, va, fa
1648 class A {};
1649 class B; Doesn't match, as it has no body.
1650 int va;
1651 extern int vb; Doesn't match, as it doesn't define the variable.
1652 void fa() {}
1653 void fb(); Doesn't match, as it has no body.
1654
1655Usable 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;
1656</pre></td></tr>
1657
1658
Manuel Klimek415514d2013-02-06 20:36:22 +00001659<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>
1660<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001661static member variable template instantiations.
1662
1663Given
1664 template&lt;typename T&gt; void A(T t) { }
1665 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001666functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001667 matches the specialization A&lt;int&gt;().
1668
1669Usable 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;
1670</pre></td></tr>
1671
1672
Manuel Klimek67619ff2012-09-07 13:10:32 +00001673<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 +00001674<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1675
1676Given:
1677 extern "C" void f() {}
1678 extern "C" { void g() {} }
1679 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001680functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001681 matches the declaration of f and g, but not the declaration h
1682</pre></td></tr>
1683
1684
Manuel Klimek415514d2013-02-06 20:36:22 +00001685<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>
1686<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001687member variable template instantiations.
1688
1689Given
1690 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1691or
1692 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001693recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001694 matches the template instantiation of X&lt;A&gt;.
1695
1696But given
1697 template &lt;typename T&gt; class X {}; class A {};
1698 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001699recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001700 does not match, as X&lt;A&gt; is an explicit template specialization.
1701
1702Usable 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;
1703</pre></td></tr>
1704
1705
Daniel Jaspere0b89972012-12-04 12:08:08 +00001706<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>
1707<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1708
1709Given
1710 void f(int i) {}
1711 void g(int i, int j) {}
1712functionDecl(parameterCountIs(2))
1713 matches g(int i, int j) {}
1714</pre></td></tr>
1715
1716
Manuel Klimek67619ff2012-09-07 13:10:32 +00001717<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 +00001718<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1719
1720Example matches true (matcher = boolLiteral(equals(true)))
1721 true
1722
1723Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1724 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;
1725</pre></td></tr>
1726
1727
Manuel Klimek67619ff2012-09-07 13:10:32 +00001728<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 +00001729<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1730to '.'.
1731
1732Member calls on the implicit this pointer match as called with '-&gt;'.
1733
1734Given
1735 class Y {
1736 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1737 int a;
1738 static int b;
1739 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001740memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001741 matches this-&gt;x, x, y.x, a, this-&gt;b
1742</pre></td></tr>
1743
1744
Manuel Klimek67619ff2012-09-07 13:10:32 +00001745<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 +00001746<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1747
1748Supports specifying enclosing namespaces or classes by prefixing the name
1749with '&lt;enclosing&gt;::'.
1750Does not match typedefs of an underlying type with the given name.
1751
1752Example matches X (Name == "X")
1753 class X;
1754
1755Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1756 namespace a { namespace b { class X; } }
1757</pre></td></tr>
1758
1759
Manuel Klimek67619ff2012-09-07 13:10:32 +00001760<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 +00001761<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1762a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001763
1764Supports specifying enclosing namespaces or classes by
1765prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1766of an underlying type with the given name.
1767
1768Example matches X (regexp == "::X")
1769 class X;
1770
1771Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1772 namespace foo { namespace bar { class X; } }
1773</pre></td></tr>
1774
1775
Manuel Klimek67619ff2012-09-07 13:10:32 +00001776<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 +00001777<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1778
1779Given
1780 class Y { public: void x(); };
1781 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001782callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001783 matches y-&gt;x()
1784</pre></td></tr>
1785
1786
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001787<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>
1788<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
1789
1790Matches a node if it equals the node previously bound to ID.
1791
1792Given
1793 class X { int a; int b; };
1794recordDecl(
1795 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1796 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1797 matches the class X, as a and b have the same type.
1798
1799Note that when multiple matches are involved via forEach* matchers,
1800equalsBoundNodes acts as a filter.
1801For example:
1802compoundStmt(
1803 forEachDescendant(varDecl().bind("d")),
1804 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1805will trigger a match for each combination of variable declaration
1806and reference to that variable declaration within a compound statement.
1807</pre></td></tr>
1808
1809
Edwin Vane7b69cd02013-04-02 18:15:55 +00001810<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>
1811<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1812the node, not hidden within a typedef.
1813
1814Given
1815 typedef const int const_int;
1816 const_int i;
1817 int *const j;
1818 int *volatile k;
1819 int m;
1820varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1821i is const-qualified but the qualifier is not local.
1822</pre></td></tr>
1823
1824
Manuel Klimek67619ff2012-09-07 13:10:32 +00001825<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 +00001826<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1827include "top-level" const.
1828
1829Given
1830 void a(int);
1831 void b(int const);
1832 void c(const int);
1833 void d(const int*);
1834 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001835functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001836 matches "void b(int const)", "void c(const int)" and
1837 "void e(int const) {}". It does not match d as there
1838 is no top-level const on the parameter type "const int *".
1839</pre></td></tr>
1840
1841
Manuel Klimek67619ff2012-09-07 13:10:32 +00001842<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 +00001843<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1844
1845Given
1846 void a(int);
1847 void b(long);
1848 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001849functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001850matches "a(int)", "b(long)", but not "c(double)".
1851</pre></td></tr>
1852
1853
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001854<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>
1855<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
1856
1857Matches a node if it equals the node previously bound to ID.
1858
1859Given
1860 class X { int a; int b; };
1861recordDecl(
1862 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1863 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1864 matches the class X, as a and b have the same type.
1865
1866Note that when multiple matches are involved via forEach* matchers,
1867equalsBoundNodes acts as a filter.
1868For example:
1869compoundStmt(
1870 forEachDescendant(varDecl().bind("d")),
1871 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1872will trigger a match for each combination of variable declaration
1873and reference to that variable declaration within a compound statement.
1874</pre></td></tr>
1875
1876
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001877<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>
1878<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1879
1880Stmt has pointer identity in the AST.
1881
1882</pre></td></tr>
1883
1884
Manuel Klimek415514d2013-02-06 20:36:22 +00001885<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>
1886<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001887
1888Example matches A, va, fa
1889 class A {};
1890 class B; Doesn't match, as it has no body.
1891 int va;
1892 extern int vb; Doesn't match, as it doesn't define the variable.
1893 void fa() {}
1894 void fb(); Doesn't match, as it has no body.
1895
1896Usable 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;
1897</pre></td></tr>
1898
1899
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001900<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>
1901<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
1902
1903Matches a node if it equals the node previously bound to ID.
1904
1905Given
1906 class X { int a; int b; };
1907recordDecl(
1908 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1909 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1910 matches the class X, as a and b have the same type.
1911
1912Note that when multiple matches are involved via forEach* matchers,
1913equalsBoundNodes acts as a filter.
1914For example:
1915compoundStmt(
1916 forEachDescendant(varDecl().bind("d")),
1917 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1918will trigger a match for each combination of variable declaration
1919and reference to that variable declaration within a compound statement.
1920</pre></td></tr>
1921
1922
Manuel Klimek67619ff2012-09-07 13:10:32 +00001923<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 +00001924<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1925
1926Given
1927 int x;
1928 int s = sizeof(x) + alignof(x)
1929unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1930 matches sizeof(x)
1931</pre></td></tr>
1932
1933
Manuel Klimek67619ff2012-09-07 13:10:32 +00001934<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 +00001935<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1936unary).
1937
1938Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1939 !(a || b)
1940</pre></td></tr>
1941
1942
Manuel Klimek67619ff2012-09-07 13:10:32 +00001943<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 +00001944<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
1945
1946Example matches A, va, fa
1947 class A {};
1948 class B; Doesn't match, as it has no body.
1949 int va;
1950 extern int vb; Doesn't match, as it doesn't define the variable.
1951 void fa() {}
1952 void fb(); Doesn't match, as it has no body.
1953
1954Usable 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;
1955</pre></td></tr>
1956
1957
Manuel Klimek67619ff2012-09-07 13:10:32 +00001958<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 +00001959<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
1960static member variable template instantiations.
1961
1962Given
1963 template&lt;typename T&gt; void A(T t) { }
1964 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001965functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001966 matches the specialization A&lt;int&gt;().
1967
1968Usable 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;
1969</pre></td></tr>
1970
1971
Manuel Klimek67619ff2012-09-07 13:10:32 +00001972<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 +00001973<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
1974member variable template instantiations.
1975
1976Given
1977 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1978or
1979 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001980recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001981 matches the template instantiation of X&lt;A&gt;.
1982
1983But given
1984 template &lt;typename T&gt; class X {}; class A {};
1985 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001986recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001987 does not match, as X&lt;A&gt; is an explicit template specialization.
1988
1989Usable 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;
1990</pre></td></tr>
1991
1992<!--END_NARROWING_MATCHERS -->
1993</table>
1994
1995<!-- ======================================================================= -->
1996<h2 id="traversal-matchers">AST Traversal Matchers</h2>
1997<!-- ======================================================================= -->
1998
1999<p>Traversal matchers specify the relationship to other nodes that are
2000reachable from the current node.</p>
2001
2002<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2003forEachDescendant) which work on all nodes and allow users to write more generic
2004match expressions.</p>
2005
2006<table>
2007<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2008<!-- START_TRAVERSAL_MATCHERS -->
2009
Samuel Benzaquend36e4632013-08-27 15:11:16 +00002010<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002011<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2012
2013Unlike anyOf, eachOf will generate a match result for each
2014matching submatcher.
2015
2016For example, in:
2017 class A { int a; int b; };
2018The matcher:
2019 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2020 has(fieldDecl(hasName("b")).bind("v"))))
2021will generate two results binding "v", the first of which binds
2022the field declaration of a, the second the field declaration of
2023b.
2024
2025Usable as: Any Matcher
2026</pre></td></tr>
2027
2028
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002029<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002030<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2031provided matcher.
2032
Manuel Klimeke44a0062012-08-26 23:55:24 +00002033Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002034 class X {}; Matches X, because X::X is a class of name X inside X.
2035 class Y { class X {}; };
2036 class Z { class Y { class X {}; }; }; Does not match Z.
2037
2038ChildT must be an AST base type.
2039
2040As opposed to 'has', 'forEach' will cause a match for each result that
2041matches instead of only on the first one.
2042
2043Usable as: Any Matcher
2044</pre></td></tr>
2045
2046
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002047<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002048<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2049provided matcher.
2050
2051Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002052 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002053 class X {}; Matches X, because X::X is a class of name X inside X.
2054 class A { class X {}; };
2055 class B { class C { class X {}; }; };
2056
2057DescendantT must be an AST base type.
2058
2059As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2060each result that matches instead of only on the first one.
2061
2062Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002063 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002064will match 10 times (plus injected class name matches) on:
2065 class A { class B { class C { class D { class E {}; }; }; }; };
2066
2067Usable as: Any Matcher
2068</pre></td></tr>
2069
2070
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002071<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002072<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2073provided matcher.
2074
Manuel Klimeke44a0062012-08-26 23:55:24 +00002075Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002076 class X {}; Matches X, because X::X is a class of name X inside X.
2077 class Y { class X {}; };
2078 class Z { class Y { class X {}; }; }; Does not match Z.
2079
2080ChildT must be an AST base type.
2081
2082Usable as: Any Matcher
2083</pre></td></tr>
2084
2085
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002086<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
Manuel Klimek67619ff2012-09-07 13:10:32 +00002087<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2088matcher.
2089
2090Given
2091void f() { if (true) { int x = 42; } }
2092void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002093expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002094
2095Usable as: Any Matcher
2096</pre></td></tr>
2097
2098
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002099<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002100<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2101provided matcher.
2102
2103Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002104 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002105 class X {}; Matches X, because X::X is a class of name X inside X.
2106 class Y { class X {}; };
2107 class Z { class Y { class X {}; }; };
2108
2109DescendantT must be an AST base type.
2110
2111Usable as: Any Matcher
2112</pre></td></tr>
2113
2114
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002115<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
Daniel Jaspere0b89972012-12-04 12:08:08 +00002116<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2117matcher.
2118
2119Given
2120void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2121compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2122
2123Usable as: Any Matcher
2124</pre></td></tr>
2125
2126
Manuel Klimek67619ff2012-09-07 13:10:32 +00002127<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 +00002128<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2129
2130Given
2131 int i[5];
2132 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002133arraySubscriptExpression(hasBase(implicitCastExpr(
2134 hasSourceExpression(declRefExpr()))))
2135 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002136</pre></td></tr>
2137
2138
Manuel Klimek67619ff2012-09-07 13:10:32 +00002139<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 +00002140<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2141
2142Given
2143 int i[5];
2144 void f() { i[1] = 42; }
2145arraySubscriptExpression(hasIndex(integerLiteral()))
2146 matches i[1] with the integerLiteral() matching 1
2147</pre></td></tr>
2148
2149
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002150<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>
2151<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 +00002152type.
2153
2154Given
2155 struct A {};
2156 A a[7];
2157 int b[7];
2158arrayType(hasElementType(builtinType()))
2159 matches "int b[7]"
2160
2161Usable 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;
2162</pre></td></tr>
2163
2164
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002165<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>
2166<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 +00002167type.
2168
2169Given
2170 struct A {};
2171 A a[7];
2172 int b[7];
2173arrayType(hasElementType(builtinType()))
2174 matches "int b[7]"
2175
2176Usable 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;
2177</pre></td></tr>
2178
2179
2180<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>
2181<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2182
2183Given
2184 _Atomic(int) i;
2185 _Atomic(float) f;
2186atomicType(hasValueType(isInteger()))
2187 matches "_Atomic(int) i"
2188
2189Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2190</pre></td></tr>
2191
2192
2193<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>
2194<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2195
2196Given
2197 _Atomic(int) i;
2198 _Atomic(float) f;
2199atomicType(hasValueType(isInteger()))
2200 matches "_Atomic(int) i"
2201
2202Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2203</pre></td></tr>
2204
2205
2206<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>
2207<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2208
2209Note: There is no TypeLoc for the deduced type and thus no
2210getDeducedLoc() matcher.
2211
2212Given
2213 auto a = 1;
2214 auto b = 2.0;
2215autoType(hasDeducedType(isInteger()))
2216 matches "auto a"
2217
2218Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2219</pre></td></tr>
2220
2221
Manuel Klimek67619ff2012-09-07 13:10:32 +00002222<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 +00002223<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2224binary operator matches.
2225</pre></td></tr>
2226
2227
Manuel Klimek67619ff2012-09-07 13:10:32 +00002228<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 +00002229<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2230
2231Example matches a (matcher = binaryOperator(hasLHS()))
2232 a || b
2233</pre></td></tr>
2234
2235
Manuel Klimek67619ff2012-09-07 13:10:32 +00002236<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 +00002237<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2238
2239Example matches b (matcher = binaryOperator(hasRHS()))
2240 a || b
2241</pre></td></tr>
2242
2243
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002244<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>
2245<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 +00002246pointee matches a given matcher.
2247
2248Given
2249 int *a;
2250 int const *b;
2251 float const *f;
2252pointerType(pointee(isConstQualified(), isInteger()))
2253 matches "int const *b"
2254
2255Usable 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;,
2256 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;
2257</pre></td></tr>
2258
2259
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002260<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>
2261<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 +00002262pointee matches a given matcher.
2263
2264Given
2265 int *a;
2266 int const *b;
2267 float const *f;
2268pointerType(pointee(isConstQualified(), isInteger()))
2269 matches "int const *b"
2270
2271Usable 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;,
2272 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;
2273</pre></td></tr>
2274
2275
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00002276<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>
2277<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
2278expression.
2279
2280Given
2281 void x(int, int, int) { int y; x(1, y, 42); }
2282callExpr(hasAnyArgument(declRefExpr()))
2283 matches x(1, y, 42)
2284with hasAnyArgument(...)
2285 matching y
2286
2287FIXME: Currently this will ignore parentheses and implicit casts on
2288the argument before applying the inner matcher. We'll want to remove
2289this to allow for greater control by the user once ignoreImplicit()
2290has been implemented.
2291</pre></td></tr>
2292
2293
2294<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>
2295<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
2296call expression.
2297
2298Example matches y in x(y)
2299 (matcher = callExpr(hasArgument(0, declRefExpr())))
2300 void x(int) { int y; x(y); }
2301</pre></td></tr>
2302
2303
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002304<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2305<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
Manuel Klimek03a83232013-06-10 08:52:15 +00002306matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002307
Manuel Klimek03a83232013-06-10 08:52:15 +00002308The associated declaration is:
2309- for type nodes, the declaration of the underlying type
2310- for CallExpr, the declaration of the callee
2311- for MemberExpr, the declaration of the referenced member
2312- for CXXConstructExpr, the declaration of the constructor
2313
2314Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2315function. e.g. various subtypes of clang::Type and various expressions.
2316FIXME: Add all node types for which this is matcher is usable due to
2317getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002318
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002319Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2320 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
2321 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
2322 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
2323 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
2324 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002325</pre></td></tr>
2326
2327
Manuel Klimek532870f2013-07-24 05:46:07 +00002328<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>
2329<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
2330
2331Given
2332 class A { A() : i(42), j(42) {} int i; int j; };
2333constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
2334 will trigger two matches, binding for 'i' and 'j' respectively.
2335</pre></td></tr>
2336
2337
Manuel Klimek67619ff2012-09-07 13:10:32 +00002338<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 +00002339<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2340
2341Given
2342 struct Foo {
2343 Foo() : foo_(1) { }
2344 int foo_;
2345 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002346recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002347 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2348</pre></td></tr>
2349
2350
Manuel Klimek67619ff2012-09-07 13:10:32 +00002351<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 +00002352<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2353
2354Given
2355 struct Foo {
2356 Foo() : foo_(1) { }
2357 int foo_;
2358 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002359recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002360 forField(hasName("foo_"))))))
2361 matches Foo
2362with forField matching foo_
2363</pre></td></tr>
2364
2365
Manuel Klimek67619ff2012-09-07 13:10:32 +00002366<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 +00002367<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2368
2369Given
2370 struct Foo {
2371 Foo() : foo_(1) { }
2372 int foo_;
2373 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002374recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002375 withInitializer(integerLiteral(equals(1)))))))
2376 matches Foo
2377with withInitializer matching (1)
2378</pre></td></tr>
2379
2380
Manuel Klimek67619ff2012-09-07 13:10:32 +00002381<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 +00002382<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2383
Manuel Klimeke44a0062012-08-26 23:55:24 +00002384Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002385 class Y { public: void x(); };
2386 void z() { Y y; y.x(); }",
2387
2388FIXME: Overload to allow directly matching types?
2389</pre></td></tr>
2390
2391
Manuel Klimek67619ff2012-09-07 13:10:32 +00002392<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 +00002393<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2394
2395
Manuel Klimek532870f2013-07-24 05:46:07 +00002396<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 +00002397<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2398</pre></td></tr>
2399
2400
Manuel Klimek67619ff2012-09-07 13:10:32 +00002401<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 +00002402<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2403belongs to.
2404
2405FIXME: Generalize this for other kinds of declarations.
2406FIXME: What other kind of declarations would we need to generalize
2407this to?
2408
2409Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002410 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002411 ofClass(hasName("A"))))))
2412 class A {
2413 public:
2414 A();
2415 };
2416 A a = A();
2417</pre></td></tr>
2418
2419
Edwin Vane6a19a972013-03-06 17:02:57 +00002420<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>
2421<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2422
2423Given:
2424 class A { void func(); };
2425 class B { void member(); };
2426
2427recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2428but not B.
2429</pre></td></tr>
2430
2431
Manuel Klimek67619ff2012-09-07 13:10:32 +00002432<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 +00002433<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2434a class matching Base.
2435
Manuel Klimek67619ff2012-09-07 13:10:32 +00002436Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002437
Manuel Klimek67619ff2012-09-07 13:10:32 +00002438Example matches Y, Z, C (Base == hasName("X"))
2439 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002440 class Y : public X {}; directly derived
2441 class Z : public Y {}; indirectly derived
2442 typedef X A;
2443 typedef A B;
2444 class C : public B {}; derived from a typedef of X
2445
2446In the following example, Bar matches isDerivedFrom(hasName("X")):
2447 class Foo;
2448 typedef Foo X;
2449 class Bar : public Foo {}; derived from a type that X is a typedef of
2450</pre></td></tr>
2451
2452
Daniel Jaspere0b89972012-12-04 12:08:08 +00002453<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>
2454<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2455match Base.
2456</pre></td></tr>
2457
2458
Manuel Klimek532870f2013-07-24 05:46:07 +00002459<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 +00002460<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2461given matcher.
2462
Manuel Klimeke44a0062012-08-26 23:55:24 +00002463Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002464 class Y { public: void x(); };
2465 void z() { Y y; y.x();
2466</pre></td></tr>
2467
2468
Manuel Klimek67619ff2012-09-07 13:10:32 +00002469<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 +00002470<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2471expression.
2472
2473Given
2474 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002475callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002476 matches x(1, y, 42)
2477with hasAnyArgument(...)
2478 matching y
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002479
2480FIXME: Currently this will ignore parentheses and implicit casts on
2481the argument before applying the inner matcher. We'll want to remove
2482this to allow for greater control by the user once ignoreImplicit()
2483has been implemented.
Manuel Klimek1da79332012-08-20 20:54:03 +00002484</pre></td></tr>
2485
2486
Manuel Klimek67619ff2012-09-07 13:10:32 +00002487<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 +00002488<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2489call expression.
2490
2491Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002492 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002493 void x(int) { int y; x(y); }
2494</pre></td></tr>
2495
2496
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002497<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2498<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
Manuel Klimek03a83232013-06-10 08:52:15 +00002499matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002500
Manuel Klimek03a83232013-06-10 08:52:15 +00002501The associated declaration is:
2502- for type nodes, the declaration of the underlying type
2503- for CallExpr, the declaration of the callee
2504- for MemberExpr, the declaration of the referenced member
2505- for CXXConstructExpr, the declaration of the constructor
2506
2507Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2508function. e.g. various subtypes of clang::Type and various expressions.
2509FIXME: Add all node types for which this is matcher is usable due to
2510getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002511
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002512Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2513 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
2514 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
2515 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
2516 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
2517 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002518</pre></td></tr>
2519
2520
Manuel Klimek03a83232013-06-10 08:52:15 +00002521<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>
2522<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2523extension, matches the constant given in the statement.
2524
2525Given
2526 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2527caseStmt(hasCaseConstant(integerLiteral()))
2528 matches "case 1:"
2529</pre></td></tr>
2530
2531
Manuel Klimek67619ff2012-09-07 13:10:32 +00002532<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 +00002533<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2534
2535Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002536 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002537class URL { URL(string); };
2538URL url = "a string";
2539</pre></td></tr>
2540
2541
Manuel Klimek67619ff2012-09-07 13:10:32 +00002542<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 +00002543<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2544TemplateArgument matching the given InnerMatcher.
2545
2546Given
2547 template&lt;typename T&gt; class A {};
2548 template&lt;&gt; class A&lt;double&gt; {};
2549 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002550classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002551 refersToType(asString("int"))))
2552 matches the specialization A&lt;int&gt;
2553</pre></td></tr>
2554
2555
Manuel Klimek67619ff2012-09-07 13:10:32 +00002556<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 +00002557<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2558matches the given InnerMatcher.
2559
2560Given
2561 template&lt;typename T, typename U&gt; class A {};
2562 A&lt;bool, int&gt; b;
2563 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002564classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002565 1, refersToType(asString("int"))))
2566 matches the specialization A&lt;bool, int&gt;
2567</pre></td></tr>
2568
2569
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002570<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>
2571<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 +00002572type.
2573
2574Given
2575 struct A {};
2576 A a[7];
2577 int b[7];
2578arrayType(hasElementType(builtinType()))
2579 matches "int b[7]"
2580
2581Usable 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;
2582</pre></td></tr>
2583
2584
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002585<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>
2586<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 +00002587type.
2588
2589Given
2590 struct A {};
2591 A a[7];
2592 int b[7];
2593arrayType(hasElementType(builtinType()))
2594 matches "int b[7]"
2595
2596Usable 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;
2597</pre></td></tr>
2598
2599
Manuel Klimek67619ff2012-09-07 13:10:32 +00002600<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 +00002601<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2602a given matcher.
2603
2604Given
2605 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002606hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002607 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002608with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002609 matching '{}'
2610</pre></td></tr>
2611
2612
Manuel Klimek67619ff2012-09-07 13:10:32 +00002613<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 +00002614<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2615or conditional operator.
2616
2617Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2618 if (true) {}
2619</pre></td></tr>
2620
2621
Manuel Klimek67619ff2012-09-07 13:10:32 +00002622<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 +00002623<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2624
2625Example matches b
2626 condition ? a : b
2627</pre></td></tr>
2628
2629
Manuel Klimek67619ff2012-09-07 13:10:32 +00002630<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 +00002631<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2632
2633Example matches a
2634 condition ? a : b
2635</pre></td></tr>
2636
2637
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002638<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2639<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
2640matches the given matcher.
2641
2642The associated declaration is:
2643- for type nodes, the declaration of the underlying type
2644- for CallExpr, the declaration of the callee
2645- for MemberExpr, the declaration of the referenced member
2646- for CXXConstructExpr, the declaration of the constructor
2647
2648Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2649function. e.g. various subtypes of clang::Type and various expressions.
2650FIXME: Add all node types for which this is matcher is usable due to
2651getDecl().
2652
2653Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2654 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
2655 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
2656 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
2657 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
2658 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
2659</pre></td></tr>
2660
2661
Manuel Klimek67619ff2012-09-07 13:10:32 +00002662<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 +00002663<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2664specific using shadow declaration.
2665
2666FIXME: This currently only works for functions. Fix.
2667
2668Given
2669 namespace a { void f() {} }
2670 using a::f;
2671 void g() {
2672 f(); Matches this ..
2673 a::f(); .. but not this.
2674 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002675declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002676 matches f()
2677</pre></td></tr>
2678
2679
Manuel Klimek67619ff2012-09-07 13:10:32 +00002680<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 +00002681<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2682specified matcher.
2683
2684Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002685 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002686 bool x;
2687 if (x) {}
2688</pre></td></tr>
2689
2690
Manuel Klimek67619ff2012-09-07 13:10:32 +00002691<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 +00002692<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2693
2694Note that this does not work for global declarations because the AST
2695breaks up multiple-declaration DeclStmt's into multiple single-declaration
2696DeclStmt's.
2697Example: Given non-global declarations
2698 int a, b = 0;
2699 int c;
2700 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002701declStmt(containsDeclaration(
2702 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002703 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002704declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002705 matches 'int a, b = 0' as well as 'int d = 2, e;'
2706 but 'int c;' is not matched.
2707</pre></td></tr>
2708
2709
Manuel Klimek67619ff2012-09-07 13:10:32 +00002710<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 +00002711<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2712
2713Given
2714 int a, b;
2715 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002716declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002717 matches 'int c;' but not 'int a, b;'.
2718</pre></td></tr>
2719
2720
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002721<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>
2722<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
2723the inner matcher.
2724
2725Given
2726 int x;
2727declaratorDecl(hasTypeLoc(loc(asString("int"))))
2728 matches int x
2729</pre></td></tr>
2730
2731
Edwin Vane742d9e72013-02-25 20:43:32 +00002732<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>
2733<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2734Decl, matches InnerMatcher.
2735
2736Given
2737 namespace N {
2738 namespace M {
2739 class D {};
2740 }
2741 }
2742
2743recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2744declaration of class D.
2745</pre></td></tr>
2746
2747
Manuel Klimek67619ff2012-09-07 13:10:32 +00002748<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 +00002749<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2750a given body.
2751
2752Given
2753 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002754hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002755 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002756with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002757 matching '{}'
2758</pre></td></tr>
2759
2760
Manuel Klimek67619ff2012-09-07 13:10:32 +00002761<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 +00002762<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2763or conditional operator.
2764
2765Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2766 if (true) {}
2767</pre></td></tr>
2768
2769
Edwin Vane742d9e72013-02-25 20:43:32 +00002770<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>
2771<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002772matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002773
2774Given
2775 namespace N {
2776 namespace M {
2777 class D {};
2778 }
2779 }
2780 N::M::D d;
2781
2782elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2783matches the type of the variable declaration of d.
2784</pre></td></tr>
2785
2786
2787<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>
2788<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2789
2790Given
2791 namespace N {
2792 namespace M {
2793 class D {};
2794 }
2795 }
2796 N::M::D d;
2797
2798elaboratedType(namesType(recordType(
2799hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2800declaration of d.
2801</pre></td></tr>
2802
2803
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002804<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2805<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
2806matches the given matcher.
2807
2808The associated declaration is:
2809- for type nodes, the declaration of the underlying type
2810- for CallExpr, the declaration of the callee
2811- for MemberExpr, the declaration of the referenced member
2812- for CXXConstructExpr, the declaration of the constructor
2813
2814Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2815function. e.g. various subtypes of clang::Type and various expressions.
2816FIXME: Add all node types for which this is matcher is usable due to
2817getDecl().
2818
2819Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2820 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
2821 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
2822 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
2823 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
2824 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
2825</pre></td></tr>
2826
2827
Manuel Klimek67619ff2012-09-07 13:10:32 +00002828<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 +00002829<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2830
2831(Note: Clang's AST refers to other conversions as "casts" too, and calls
2832actual casts "explicit" casts.)
2833</pre></td></tr>
2834
2835
Manuel Klimek532870f2013-07-24 05:46:07 +00002836<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>
2837<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 +00002838declaration's type.
2839
2840In case of a value declaration (for example a variable declaration),
2841this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002842declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2843while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002844of x."
2845
Manuel Klimeke44a0062012-08-26 23:55:24 +00002846Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2847 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002848 class X {};
2849 void y(X &amp;x) { x; X z; }
2850
2851Usable 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;
2852</pre></td></tr>
2853
2854
Manuel Klimek67619ff2012-09-07 13:10:32 +00002855<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 +00002856<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2857are stripped off.
2858
2859Parentheses and explicit casts are not discarded.
2860Given
2861 int arr[5];
2862 int a = 0;
2863 char b = 0;
2864 const int c = a;
2865 int *d = arr;
2866 long e = (long) 0l;
2867The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002868 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2869 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002870would match the declarations for a, b, c, and d, but not e.
2871While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002872 varDecl(hasInitializer(integerLiteral()))
2873 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002874only match the declarations for b, c, and d.
2875</pre></td></tr>
2876
2877
Manuel Klimek67619ff2012-09-07 13:10:32 +00002878<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 +00002879<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2880casts are stripped off.
2881
2882Implicit and non-C Style casts are also discarded.
2883Given
2884 int a = 0;
2885 char b = (0);
2886 void* c = reinterpret_cast&lt;char*&gt;(0);
2887 char d = char(0);
2888The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002889 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002890would match the declarations for a, b, c, and d.
2891while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002892 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002893only match the declaration for a.
2894</pre></td></tr>
2895
2896
Manuel Klimek67619ff2012-09-07 13:10:32 +00002897<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 +00002898<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2899parentheses are stripped off.
2900
2901Explicit casts are not discarded.
2902Given
2903 int arr[5];
2904 int a = 0;
2905 char b = (0);
2906 const int c = a;
2907 int *d = (arr);
2908 long e = ((long) 0l);
2909The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002910 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2911 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002912would match the declarations for a, b, c, and d, but not e.
2913while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002914 varDecl(hasInitializer(integerLiteral()))
2915 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002916would only match the declaration for a.
2917</pre></td></tr>
2918
2919
Manuel Klimek67619ff2012-09-07 13:10:32 +00002920<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 +00002921<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2922a given body.
2923
2924Given
2925 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002926hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002927 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002928with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002929 matching '{}'
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_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 +00002934<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2935or conditional operator.
2936
2937Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2938 if (true) {}
2939</pre></td></tr>
2940
2941
Manuel Klimek67619ff2012-09-07 13:10:32 +00002942<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 +00002943<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2944
2945Example:
2946 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2947matches '++x' in
2948 for (x; x &lt; N; ++x) { }
2949</pre></td></tr>
2950
2951
Manuel Klimek67619ff2012-09-07 13:10:32 +00002952<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 +00002953<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2954
2955Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002956 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002957matches 'int x = 0' in
2958 for (int x = 0; x &lt; N; ++x) { }
2959</pre></td></tr>
2960
2961
Manuel Klimek67619ff2012-09-07 13:10:32 +00002962<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 +00002963<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2964
2965Does not match the 'this' parameter of a method.
2966
2967Given
2968 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002969methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002970 matches f(int x, int y, int z) {}
2971with hasAnyParameter(...)
2972 matching int y
2973</pre></td></tr>
2974
2975
Manuel Klimek67619ff2012-09-07 13:10:32 +00002976<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 +00002977<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2978
2979Given
2980 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002981methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002982 matches f(int x) {}
2983with hasParameter(...)
2984 matching int x
2985</pre></td></tr>
2986
2987
Manuel Klimek67619ff2012-09-07 13:10:32 +00002988<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 +00002989<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2990
2991Given:
2992 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002993methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002994 matches int f() { return 1; }
2995</pre></td></tr>
2996
2997
Manuel Klimek67619ff2012-09-07 13:10:32 +00002998<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 +00002999<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3000or conditional operator.
3001
3002Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3003 if (true) {}
3004</pre></td></tr>
3005
3006
Manuel Klimek67619ff2012-09-07 13:10:32 +00003007<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 +00003008<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3009
3010Given
3011 if (A* a = GetAPointer()) {}
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003012hasConditionVariableStatement(...)
Manuel Klimek1da79332012-08-20 20:54:03 +00003013 matches 'A* a = GetAPointer()'.
3014</pre></td></tr>
3015
3016
Manuel Klimek67619ff2012-09-07 13:10:32 +00003017<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 +00003018<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3019matcher.
3020
3021FIXME: Unit test this matcher
3022</pre></td></tr>
3023
3024
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003025<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3026<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
Manuel Klimek03a83232013-06-10 08:52:15 +00003027matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00003028
Manuel Klimek03a83232013-06-10 08:52:15 +00003029The associated declaration is:
3030- for type nodes, the declaration of the underlying type
3031- for CallExpr, the declaration of the callee
3032- for MemberExpr, the declaration of the referenced member
3033- for CXXConstructExpr, the declaration of the constructor
3034
3035Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3036function. e.g. various subtypes of clang::Type and various expressions.
3037FIXME: Add all node types for which this is matcher is usable due to
3038getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003039
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003040Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3041 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3042 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3043 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3044 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3045 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3046</pre></td></tr>
3047
3048
3049<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3050<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3051matches the given matcher.
3052
3053The associated declaration is:
3054- for type nodes, the declaration of the underlying type
3055- for CallExpr, the declaration of the callee
3056- for MemberExpr, the declaration of the referenced member
3057- for CXXConstructExpr, the declaration of the constructor
3058
3059Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3060function. e.g. various subtypes of clang::Type and various expressions.
3061FIXME: Add all node types for which this is matcher is usable due to
3062getDecl().
3063
3064Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3065 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3066 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3067 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3068 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3069 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3070</pre></td></tr>
3071
3072
3073<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3074<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
3075matches the given matcher.
3076
3077The associated declaration is:
3078- for type nodes, the declaration of the underlying type
3079- for CallExpr, the declaration of the callee
3080- for MemberExpr, the declaration of the referenced member
3081- for CXXConstructExpr, the declaration of the constructor
3082
3083Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3084function. e.g. various subtypes of clang::Type and various expressions.
3085FIXME: Add all node types for which this is matcher is usable due to
3086getDecl().
3087
3088Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3089 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3090 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3091 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3092 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3093 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003094</pre></td></tr>
3095
3096
Manuel Klimek67619ff2012-09-07 13:10:32 +00003097<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 +00003098<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3099matched by a given matcher.
3100
3101Given
3102 struct X { int m; };
3103 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003104memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003105 matches "x.m" and "m"
3106with hasObjectExpression(...)
3107 matching "x" and the implicit object expression of "m" which has type X*.
3108</pre></td></tr>
3109
3110
Manuel Klimek67619ff2012-09-07 13:10:32 +00003111<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 +00003112<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3113given matcher.
3114
3115Given
3116 struct { int first, second; } first, second;
3117 int i(second.first);
3118 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003119memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003120 matches second.first
3121 but not first.second (because the member name there is "second").
3122</pre></td></tr>
3123
3124
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003125<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>
3126<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 +00003127pointee matches a given matcher.
3128
3129Given
3130 int *a;
3131 int const *b;
3132 float const *f;
3133pointerType(pointee(isConstQualified(), isInteger()))
3134 matches "int const *b"
3135
3136Usable 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;,
3137 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;
3138</pre></td></tr>
3139
3140
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003141<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>
3142<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 +00003143pointee matches a given matcher.
3144
3145Given
3146 int *a;
3147 int const *b;
3148 float const *f;
3149pointerType(pointee(isConstQualified(), isInteger()))
3150 matches "int const *b"
3151
3152Usable 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;,
3153 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;
3154</pre></td></tr>
3155
3156
Manuel Klimek415514d2013-02-06 20:36:22 +00003157<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 +00003158<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3159
3160Given
3161 struct A { struct B { struct C {}; }; };
3162 A::B::C c;
3163nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3164 matches "A::"
3165</pre></td></tr>
3166
3167
Manuel Klimek41df16e2013-01-09 09:38:21 +00003168<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>
3169<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3170NestedNameSpecifier-matcher matches.
3171</pre></td></tr>
3172
3173
Daniel Jaspere0b89972012-12-04 12:08:08 +00003174<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>
3175<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3176given TypeLoc.
3177
3178Given
3179 struct A { struct B { struct C {}; }; };
3180 A::B::C c;
3181nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3182 hasDeclaration(recordDecl(hasName("A")))))))
3183 matches "A::"
3184</pre></td></tr>
3185
3186
Manuel Klimek415514d2013-02-06 20:36:22 +00003187<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 +00003188<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3189
3190Given
3191 struct A { struct B { struct C {}; }; };
3192 A::B::C c;
3193nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3194 matches "A::"
3195</pre></td></tr>
3196
3197
3198<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>
3199<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3200given namespace matcher.
3201
3202Given
3203 namespace ns { struct A {}; }
3204 ns::A a;
3205nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3206 matches "ns::"
3207</pre></td></tr>
3208
3209
3210<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>
3211<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3212given QualType matcher without qualifiers.
3213
3214Given
3215 struct A { struct B { struct C {}; }; };
3216 A::B::C c;
3217nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3218 matches "A::"
3219</pre></td></tr>
3220
3221
Edwin Vane88be2fd2013-04-01 18:33:34 +00003222<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>
3223<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3224
3225Given
3226 int (*ptr_to_array)[4];
3227 int (*ptr_to_func)(int);
3228
3229varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3230ptr_to_func but not ptr_to_array.
3231
3232Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3233</pre></td></tr>
3234
3235
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003236<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>
3237<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 +00003238pointee matches a given matcher.
3239
3240Given
3241 int *a;
3242 int const *b;
3243 float const *f;
3244pointerType(pointee(isConstQualified(), isInteger()))
3245 matches "int const *b"
3246
3247Usable 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;,
3248 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;
3249</pre></td></tr>
3250
3251
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003252<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>
3253<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 +00003254pointee matches a given matcher.
3255
3256Given
3257 int *a;
3258 int const *b;
3259 float const *f;
3260pointerType(pointee(isConstQualified(), isInteger()))
3261 matches "int const *b"
3262
3263Usable 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;,
3264 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;
3265</pre></td></tr>
3266
3267
Edwin Vane6a19a972013-03-06 17:02:57 +00003268<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>
3269<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3270
3271Given:
3272 typedef int &amp;int_ref;
3273 int a;
3274 int_ref b = a;
3275
3276varDecl(hasType(qualType(referenceType()))))) will not match the
3277declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3278</pre></td></tr>
3279
3280
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003281<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3282<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
3283matches the given matcher.
3284
3285The associated declaration is:
3286- for type nodes, the declaration of the underlying type
3287- for CallExpr, the declaration of the callee
3288- for MemberExpr, the declaration of the referenced member
3289- for CXXConstructExpr, the declaration of the constructor
3290
3291Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3292function. e.g. various subtypes of clang::Type and various expressions.
3293FIXME: Add all node types for which this is matcher is usable due to
3294getDecl().
3295
3296Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3297 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3298 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3299 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3300 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3301 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3302</pre></td></tr>
3303
3304
3305<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>
3306<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3307</pre></td></tr>
3308
3309
3310<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>
3311<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3312</pre></td></tr>
3313
3314
3315<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003316<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3317matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003318
Manuel Klimek03a83232013-06-10 08:52:15 +00003319The associated declaration is:
3320- for type nodes, the declaration of the underlying type
3321- for CallExpr, the declaration of the callee
3322- for MemberExpr, the declaration of the referenced member
3323- for CXXConstructExpr, the declaration of the constructor
3324
3325Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3326function. e.g. various subtypes of clang::Type and various expressions.
3327FIXME: Add all node types for which this is matcher is usable due to
3328getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003329
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003330Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3331 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3332 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3333 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3334 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3335 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003336</pre></td></tr>
3337
3338
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003339<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>
3340<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 +00003341pointee matches a given matcher.
3342
3343Given
3344 int *a;
3345 int const *b;
3346 float const *f;
3347pointerType(pointee(isConstQualified(), isInteger()))
3348 matches "int const *b"
3349
3350Usable 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;,
3351 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;
3352</pre></td></tr>
3353
3354
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003355<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>
3356<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 +00003357pointee matches a given matcher.
3358
3359Given
3360 int *a;
3361 int const *b;
3362 float const *f;
3363pointerType(pointee(isConstQualified(), isInteger()))
3364 matches "int const *b"
3365
3366Usable 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;,
3367 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;
3368</pre></td></tr>
3369
3370
Manuel Klimek67619ff2012-09-07 13:10:32 +00003371<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 +00003372<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3373alignof.
3374</pre></td></tr>
3375
3376
Manuel Klimek67619ff2012-09-07 13:10:32 +00003377<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 +00003378<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3379sizeof.
3380</pre></td></tr>
3381
3382
Manuel Klimek03a83232013-06-10 08:52:15 +00003383<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>
3384<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3385statement. This matcher may produce multiple matches.
3386
3387Given
3388 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3389switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3390 matches four times, with "c" binding each of "case 1:", "case 2:",
3391"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3392"switch (1)", "switch (2)" and "switch (2)".
3393</pre></td></tr>
3394
3395
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003396<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3397<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
3398matches the given matcher.
3399
3400The associated declaration is:
3401- for type nodes, the declaration of the underlying type
3402- for CallExpr, the declaration of the callee
3403- for MemberExpr, the declaration of the referenced member
3404- for CXXConstructExpr, the declaration of the constructor
3405
3406Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3407function. e.g. various subtypes of clang::Type and various expressions.
3408FIXME: Add all node types for which this is matcher is usable due to
3409getDecl().
3410
3411Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3412 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3413 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3414 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3415 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3416 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3417</pre></td></tr>
3418
3419
Manuel Klimek67619ff2012-09-07 13:10:32 +00003420<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 +00003421<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3422
3423Given
3424 template&lt;typename T&gt; struct A {};
3425 struct B { B* next; };
3426 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003427classTemplateSpecializationDecl(hasAnyTemplateArgument(
3428 refersToDeclaration(fieldDecl(hasName("next"))))
3429 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003430 B::next
3431</pre></td></tr>
3432
3433
Manuel Klimek67619ff2012-09-07 13:10:32 +00003434<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 +00003435<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3436
3437Given
3438 struct X {};
3439 template&lt;typename T&gt; struct A {};
3440 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003441classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003442 refersToType(class(hasName("X")))))
3443 matches the specialization A&lt;X&gt;
3444</pre></td></tr>
3445
3446
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003447<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3448<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
Manuel Klimek03a83232013-06-10 08:52:15 +00003449matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003450
Manuel Klimek03a83232013-06-10 08:52:15 +00003451The associated declaration is:
3452- for type nodes, the declaration of the underlying type
3453- for CallExpr, the declaration of the callee
3454- for MemberExpr, the declaration of the referenced member
3455- for CXXConstructExpr, the declaration of the constructor
3456
3457Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3458function. e.g. various subtypes of clang::Type and various expressions.
3459FIXME: Add all node types for which this is matcher is usable due to
3460getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003461
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003462Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3463 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3464 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3465 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3466 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3467 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3468</pre></td></tr>
3469
3470
3471<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3472<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3473matches the given matcher.
3474
3475The associated declaration is:
3476- for type nodes, the declaration of the underlying type
3477- for CallExpr, the declaration of the callee
3478- for MemberExpr, the declaration of the referenced member
3479- for CXXConstructExpr, the declaration of the constructor
3480
3481Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3482function. e.g. various subtypes of clang::Type and various expressions.
3483FIXME: Add all node types for which this is matcher is usable due to
3484getDecl().
3485
3486Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3487 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3488 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3489 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3490 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3491 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Edwin Vane3abf7782013-02-25 14:49:29 +00003492</pre></td></tr>
3493
3494
Samuel Benzaquend36e4632013-08-27 15:11:16 +00003495<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt; Matcher</td></tr>
3496<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
3497
3498Generates results for each match.
3499
3500For example, in:
3501 class A { class B {}; class C {}; };
3502The matcher:
3503 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
3504will generate results for A, B and C.
3505
3506Usable as: Any Matcher
3507</pre></td></tr>
3508
3509
Edwin Vane3abf7782013-02-25 14:49:29 +00003510<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>
3511<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3512QualType-matcher matches.
3513</pre></td></tr>
3514
3515
3516<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 +00003517<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
3518matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00003519
Manuel Klimek03a83232013-06-10 08:52:15 +00003520The associated declaration is:
3521- for type nodes, the declaration of the underlying type
3522- for CallExpr, the declaration of the callee
3523- for MemberExpr, the declaration of the referenced member
3524- for CXXConstructExpr, the declaration of the constructor
3525
3526Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3527function. e.g. various subtypes of clang::Type and various expressions.
3528FIXME: Add all node types for which this is matcher is usable due to
3529getDecl().
Edwin Vane3abf7782013-02-25 14:49:29 +00003530
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003531Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3532 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3533 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3534 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3535 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3536 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003537</pre></td></tr>
3538
3539
Manuel Klimek67619ff2012-09-07 13:10:32 +00003540<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 +00003541<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3542
3543Given
3544 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3545unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3546 matches sizeof(a) and alignof(c)
3547</pre></td></tr>
3548
3549
Manuel Klimek67619ff2012-09-07 13:10:32 +00003550<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 +00003551<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3552
Daniel Jaspere0b89972012-12-04 12:08:08 +00003553Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003554 !true
3555</pre></td></tr>
3556
3557
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003558<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3559<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
3560matches the given matcher.
3561
3562The associated declaration is:
3563- for type nodes, the declaration of the underlying type
3564- for CallExpr, the declaration of the callee
3565- for MemberExpr, the declaration of the referenced member
3566- for CXXConstructExpr, the declaration of the constructor
3567
3568Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3569function. e.g. various subtypes of clang::Type and various expressions.
3570FIXME: Add all node types for which this is matcher is usable due to
3571getDecl().
3572
3573Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3574 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3575 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3576 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3577 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3578 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3579</pre></td></tr>
3580
3581
Manuel Klimek67619ff2012-09-07 13:10:32 +00003582<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 +00003583<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3584
3585Given
3586 namespace X { void b(); }
3587 using X::b;
3588usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3589 matches using X::b </pre></td></tr>
3590
3591
Manuel Klimek67619ff2012-09-07 13:10:32 +00003592<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 +00003593<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3594matched by the given matcher.
3595
3596Given
3597 namespace X { int a; void b(); }
3598 using X::a;
3599 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003600usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003601 matches using X::b but not using X::a </pre></td></tr>
3602
3603
Manuel Klimek532870f2013-07-24 05:46:07 +00003604<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>
3605<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 +00003606declaration's type.
3607
3608In case of a value declaration (for example a variable declaration),
3609this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003610declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3611while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003612of x."
3613
Manuel Klimeke44a0062012-08-26 23:55:24 +00003614Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3615 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003616 class X {};
3617 void y(X &amp;x) { x; X z; }
3618
3619Usable 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;
3620</pre></td></tr>
3621
3622
Manuel Klimek67619ff2012-09-07 13:10:32 +00003623<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 +00003624<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3625that matches the given matcher.
3626
Manuel Klimeke44a0062012-08-26 23:55:24 +00003627Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003628 bool y() { return true; }
3629 bool x = y();
3630</pre></td></tr>
3631
3632
Daniel Jaspere0b89972012-12-04 12:08:08 +00003633<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>
3634<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3635expression.
3636
3637Given
3638 void f(int b) {
3639 int a[b];
3640 }
3641variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3642 varDecl(hasName("b")))))))
3643 matches "int a[b]"
3644</pre></td></tr>
3645
3646
Manuel Klimek67619ff2012-09-07 13:10:32 +00003647<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 +00003648<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3649a given body.
3650
3651Given
3652 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003653hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003654 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003655with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003656 matching '{}'
3657</pre></td></tr>
3658
3659
Manuel Klimek67619ff2012-09-07 13:10:32 +00003660<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 +00003661<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3662or conditional operator.
3663
3664Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3665 if (true) {}
3666</pre></td></tr>
3667
3668<!--END_TRAVERSAL_MATCHERS -->
3669</table>
3670
3671</div>
3672</body>
3673</html>
3674
3675