blob: 49880539bc988196f46d23b09aadbc2db4dc6244 [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
Stephen Hines651f13c2014-04-23 16:59:28 -0700253 class X { void y(); };
Manuel Klimek1da79332012-08-20 20:54:03 +0000254</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
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700634<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
635<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
636of the sub-expression's evaluation.
637
638Example matches std::string()
639 const std::string str = std::string();
640</pre></td></tr>
641
642
Samuel Benzaquenee0da952013-08-16 16:19:42 +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('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>
644<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
6451.0, 1.0f, 1.0L and 1e10.
646
647Does not match implicit conversions such as
648 float a = 10;
649</pre></td></tr>
650
651
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
653<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
654
655forRangeStmt() matches 'for (auto a : i)'
656 int i[] = {1, 2, 3}; for (auto a : i);
657 for(int j = 0; j &lt; 5; ++j);
658</pre></td></tr>
659
660
Manuel Klimek67619ff2012-09-07 13:10:32 +0000661<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 +0000662<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
663
664Example matches 'for (;;) {}'
665 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000666 int i[] = {1, 2, 3}; for (auto a : i);
667</pre></td></tr>
668
669
670<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>
671<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
672
673Example: Matches Foo(bar);
674 Foo f = bar;
675 Foo g = (Foo) bar;
676 Foo h = Foo(bar);
677</pre></td></tr>
678
679
680<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>
681<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
682
683Given
684 goto FOO;
685 FOO: bar();
686gotoStmt()
687 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000688</pre></td></tr>
689
690
Manuel Klimek67619ff2012-09-07 13:10:32 +0000691<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 +0000692<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
693
694Example matches 'if (x) {}'
695 if (x) {}
696</pre></td></tr>
697
698
Daniel Jaspere0b89972012-12-04 12:08:08 +0000699<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>
700<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
701
702This matches many different places, including function call return value
703eliding, as well as any type conversions.
704</pre></td></tr>
705
706
Manuel Klimek67619ff2012-09-07 13:10:32 +0000707<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 +0000708<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
709
710Given
711 int a[] = { 1, 2 };
712 struct B { int x, y; };
713 B b = { 5, 6 };
714initList()
715 matches "{ 1, 2 }" and "{ 5, 6 }"
716</pre></td></tr>
717
718
Daniel Jaspere0b89972012-12-04 12:08:08 +0000719<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 +0000720<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
7211, 1L, 0x1 and 1U.
Daniel Jaspere0b89972012-12-04 12:08:08 +0000722
Samuel Benzaquenee0da952013-08-16 16:19:42 +0000723Does not match character-encoded integers such as L'a'.
Daniel Jaspere0b89972012-12-04 12:08:08 +0000724</pre></td></tr>
725
726
727<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>
728<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
729
730Given
731 goto FOO;
732 FOO: bar();
733labelStmt()
734 matches 'FOO:'
735</pre></td></tr>
736
737
738<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>
739<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
740
741Example matches [&amp;](){return 5;}
742 [&amp;](){return 5;}
743</pre></td></tr>
744
745
Manuel Klimek67619ff2012-09-07 13:10:32 +0000746<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 +0000747<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
748
749Example: Given
750 struct T {void func()};
751 T f();
752 void g(T);
753materializeTemporaryExpr() matches 'f()' in these statements
754 T u(f());
755 g(f());
756but does not match
757 f();
758 f().func();
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('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 +0000763<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000764
765Example matches x.y()
766 X x;
767 x.y();
768</pre></td></tr>
769
770
Manuel Klimek67619ff2012-09-07 13:10:32 +0000771<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 +0000772<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000773
774Given
775 class Y {
776 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
777 int a; static int b;
778 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000779memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000780 matches this-&gt;x, x, y.x, a, this-&gt;b
781</pre></td></tr>
782
783
Manuel Klimek67619ff2012-09-07 13:10:32 +0000784<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 +0000785<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000786
787Given
788 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000789newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000790 matches 'new X'.
791</pre></td></tr>
792
793
Daniel Jaspere0b89972012-12-04 12:08:08 +0000794<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>
795<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
796</pre></td></tr>
797
798
799<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>
800<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
801
802 foo();;
803nullStmt()
804 matches the second ';'
805</pre></td></tr>
806
807
Manuel Klimek67619ff2012-09-07 13:10:32 +0000808<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 +0000809<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000810
811Note that if an operator isn't overloaded, it won't match. Instead, use
812binaryOperator matcher.
813Currently it does not match operators such as new delete.
814FIXME: figure out why these do not match?
815
816Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000817 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000818 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
819 ostream &amp;o; int b = 1, c = 1;
820 o &lt;&lt; b &lt;&lt; c;
821</pre></td></tr>
822
823
Daniel Jaspere0b89972012-12-04 12:08:08 +0000824<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>
825<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
826
827Either the source expression or the destination type can be matched
828using has(), but hasDestinationType() is more specific and can be
829more readable.
830
831Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
832 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
833</pre></td></tr>
834
835
836<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>
837<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
838
839Given
840 return 1;
841returnStmt()
842 matches 'return 1'
843</pre></td></tr>
844
845
846<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>
847<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
848
849hasDestinationType
850reinterpretCast
851
852Example:
853 staticCastExpr()
854matches
855 static_cast&lt;long&gt;(8)
856in
857 long eight(static_cast&lt;long&gt;(8));
858</pre></td></tr>
859
860
Manuel Klimek67619ff2012-09-07 13:10:32 +0000861<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 +0000862<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000863
864Given
865 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000866stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000867 matches both the compound statement '{ ++a; }' and '++a'.
868</pre></td></tr>
869
870
Daniel Jaspere0b89972012-12-04 12:08:08 +0000871<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>
872<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
873
874Example matches "abcd", L"abcd"
875 char *s = "abcd"; wchar_t *ws = L"abcd"
876</pre></td></tr>
877
878
Manuel Klimek67619ff2012-09-07 13:10:32 +0000879<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000880<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
881
882Given
883 switch(a) { case 42: break; default: break; }
884switchCase()
885 matches 'case 42: break;' and 'default: break;'.
886</pre></td></tr>
887
888
Daniel Jaspere0b89972012-12-04 12:08:08 +0000889<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
890<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
891
892Given
893 switch(a) { case 42: break; default: break; }
894switchStmt()
895 matches 'switch(a)'.
896</pre></td></tr>
897
898
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +0000899<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>
900<tr><td colspan="4" class="doc" id="temporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
901
902Example: Matches Foo(bar, bar)
903 Foo h = Foo(bar, bar);
904</pre></td></tr>
905
906
Daniel Jaspere0b89972012-12-04 12:08:08 +0000907<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>
908<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
909
910Example matches the implicit this expression in "return i".
911 (matcher = thisExpr())
912struct foo {
913 int i;
914 int f() { return i; }
915};
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('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>
920<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
921
922 try { throw 5; } catch(int i) {}
923throwExpr()
924 matches 'throw 5'
925</pre></td></tr>
926
927
928<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>
929<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
930
931 try {} catch(int i) {}
932tryStmt()
933 matches 'try {}'
934</pre></td></tr>
935
936
Manuel Klimek67619ff2012-09-07 13:10:32 +0000937<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 +0000938<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
939
940Given
941 Foo x = bar;
942 int y = sizeof(x) + alignof(x);
943unaryExprOrTypeTraitExpr()
944 matches sizeof(x) and alignof(x)
945</pre></td></tr>
946
947
Manuel Klimek67619ff2012-09-07 13:10:32 +0000948<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000949<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
950
951Example matches !a
952 !a || b
953</pre></td></tr>
954
955
Manuel Klimek532870f2013-07-24 05:46:07 +0000956<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>
957<tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
958
959Example matches T(t) in return statement of f
960 (matcher = unresolvedConstructExpr())
961 template &lt;typename T&gt;
962 void f(const T&amp; t) { return T(t); }
963</pre></td></tr>
964
965
Daniel Jaspere0b89972012-12-04 12:08:08 +0000966<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>
967<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
968
969Example match: "foo"_suffix
970</pre></td></tr>
971
972
Manuel Klimek67619ff2012-09-07 13:10:32 +0000973<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 +0000974<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
975
976Given
977 while (true) {}
978whileStmt()
979 matches 'while (true) {}'.
980</pre></td></tr>
981
Daniel Jaspere0b89972012-12-04 12:08:08 +0000982
983<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>
984<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
985</pre></td></tr>
986
987
Manuel Klimek41df16e2013-01-09 09:38:21 +0000988<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>
989<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
990
991Given
992 int a[] = { 2, 3 };
993 int b[4];
994 void f() { int c[a[0]]; }
995arrayType()
996 matches "int a[]", "int b[4]" and "int c[a[0]]";
997</pre></td></tr>
998
999
1000<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>
1001<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1002
1003Given
1004 _Atomic(int) i;
1005atomicType()
1006 matches "_Atomic(int) i"
1007</pre></td></tr>
1008
1009
1010<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>
1011<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1012
1013Given:
1014 auto n = 4;
1015 int v[] = { 2, 3 }
1016 for (auto i : v) { }
1017autoType()
1018 matches "auto n" and "auto i"
1019</pre></td></tr>
1020
1021
1022<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>
1023<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1024"void (^)(int)".
1025
1026The pointee is always required to be a FunctionType.
1027</pre></td></tr>
1028
1029
1030<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>
1031<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1032
1033Given
1034 struct A {};
1035 A a;
1036 int b;
1037 float c;
1038 bool d;
1039builtinType()
1040 matches "int b", "float c" and "bool d"
1041</pre></td></tr>
1042
1043
1044<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>
1045<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1046
1047Given
1048 _Complex float f;
1049complexType()
1050 matches "_Complex float f"
1051</pre></td></tr>
1052
1053
1054<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>
1055<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1056
1057Given
1058 void() {
1059 int a[2];
1060 int b[] = { 2, 3 };
1061 int c[b[0]];
1062 }
1063constantArrayType()
1064 matches "int a[2]"
1065</pre></td></tr>
1066
1067
1068<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>
1069<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1070
1071Given
1072 template&lt;typename T, int Size&gt;
1073 class array {
1074 T data[Size];
1075 };
1076dependentSizedArrayType
1077 matches "T data[Size]"
1078</pre></td></tr>
1079
1080
Edwin Vane742d9e72013-02-25 20:43:32 +00001081<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>
1082<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1083qualified name.
1084
1085Given
1086 namespace N {
1087 namespace M {
1088 class D {};
1089 }
1090 }
1091 class C {};
1092
1093 class C c;
1094 N::M::D d;
1095
1096elaboratedType() matches the type of the variable declarations of both
1097c and d.
1098</pre></td></tr>
1099
1100
Manuel Klimek41df16e2013-01-09 09:38:21 +00001101<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>
1102<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1103
1104Given
1105 int (*f)(int);
1106 void g();
1107functionType()
1108 matches "int (*f)(int)" and the type of "g".
1109</pre></td></tr>
1110
1111
1112<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>
1113<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1114
1115Given
1116 int a[] = { 2, 3 };
1117 int b[42];
1118 void f(int c[]) { int d[a[0]]; };
1119incompleteArrayType()
1120 matches "int a[]" and "int c[]"
1121</pre></td></tr>
1122
1123
Edwin Vane8203d9f2013-03-28 13:50:22 +00001124<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>
1125<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001126
1127Given:
1128 int *a;
1129 int &amp;b = *a;
1130 int &amp;&amp;c = 1;
1131 auto &amp;d = b;
1132 auto &amp;&amp;e = c;
1133 auto &amp;&amp;f = 2;
1134 int g = 5;
1135
Edwin Vane8203d9f2013-03-28 13:50:22 +00001136lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001137matched since the type is deduced as int&amp; by reference collapsing rules.
1138</pre></td></tr>
1139
1140
Manuel Klimek41df16e2013-01-09 09:38:21 +00001141<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>
1142<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1143Given
1144 struct A { int i; }
1145 A::* ptr = A::i;
1146memberPointerType()
1147 matches "A::* ptr"
1148</pre></td></tr>
1149
1150
Edwin Vane88be2fd2013-04-01 18:33:34 +00001151<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>
1152<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1153
1154Given
1155 int (*ptr_to_array)[4];
1156 int *array_of_ptrs[4];
1157
1158varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1159array_of_ptrs.
1160</pre></td></tr>
1161
1162
Manuel Klimek41df16e2013-01-09 09:38:21 +00001163<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>
1164<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1165
1166Given
1167 int *a;
1168 int &amp;b = *a;
1169 int c = 5;
1170pointerType()
1171 matches "int *a"
1172</pre></td></tr>
1173
1174
Edwin Vane8203d9f2013-03-28 13:50:22 +00001175<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>
1176<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1177
1178Given:
1179 int *a;
1180 int &amp;b = *a;
1181 int &amp;&amp;c = 1;
1182 auto &amp;d = b;
1183 auto &amp;&amp;e = c;
1184 auto &amp;&amp;f = 2;
1185 int g = 5;
1186
1187rValueReferenceType() matches the types of c and f. e is not
1188matched as it is deduced to int&amp; by reference collapsing rules.
1189</pre></td></tr>
1190
1191
Edwin Vane742d9e72013-02-25 20:43:32 +00001192<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>
1193<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1194
1195Given
1196 class C {};
1197 struct S {};
1198
1199 C c;
1200 S s;
1201
1202recordType() matches the type of the variable declarations of both c
1203and s.
1204</pre></td></tr>
1205
1206
Manuel Klimek41df16e2013-01-09 09:38:21 +00001207<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 +00001208<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001209
1210Given
1211 int *a;
1212 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001213 int &amp;&amp;c = 1;
1214 auto &amp;d = b;
1215 auto &amp;&amp;e = c;
1216 auto &amp;&amp;f = 2;
1217 int g = 5;
1218
1219referenceType() matches the types of b, c, d, e, and f.
1220</pre></td></tr>
1221
1222
Edwin Vane3abf7782013-02-25 14:49:29 +00001223<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>
1224<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1225
1226Given
1227 template &lt;typename T&gt;
1228 class C { };
1229
1230 template class C&lt;int&gt;; A
1231 C&lt;char&gt; var; B
1232
1233templateSpecializationType() matches the type of the explicit
1234instantiation in A and the type of the variable declaration in B.
1235</pre></td></tr>
1236
1237
Daniel Jaspere0b89972012-12-04 12:08:08 +00001238<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>
1239<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1240</pre></td></tr>
1241
Manuel Klimek41df16e2013-01-09 09:38:21 +00001242
1243<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1244<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1245
1246Given
1247 typedef int X;
1248typedefType()
1249 matches "typedef int X"
1250</pre></td></tr>
1251
1252
Manuel Klimek532870f2013-07-24 05:46:07 +00001253<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>
1254<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1255
1256Given:
1257 typedef __underlying_type(T) type;
1258unaryTransformType()
1259 matches "__underlying_type(T)"
1260</pre></td></tr>
1261
1262
Manuel Klimek41df16e2013-01-09 09:38:21 +00001263<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>
1264<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1265integer-constant-expression.
1266
1267Given
1268 void f() {
1269 int a[] = { 2, 3 }
1270 int b[42];
1271 int c[a[0]];
1272variableArrayType()
1273 matches "int c[a[0]]"
1274</pre></td></tr>
1275
Manuel Klimek1da79332012-08-20 20:54:03 +00001276<!--END_DECL_MATCHERS -->
1277</table>
1278
1279<!-- ======================================================================= -->
1280<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1281<!-- ======================================================================= -->
1282
1283<p>Narrowing matchers match certain attributes on the current node, thus
1284narrowing down the set of nodes of the current type to match on.</p>
1285
1286<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1287which allow users to create more powerful match expressions.</p>
1288
1289<table>
1290<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1291<!-- START_NARROWING_MATCHERS -->
1292
Samuel Benzaquend36e4632013-08-27 15:11:16 +00001293<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 +00001294<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1295
1296Usable as: Any Matcher
1297</pre></td></tr>
1298
1299
Samuel Benzaquend36e4632013-08-27 15:11:16 +00001300<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 +00001301<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1302
1303Usable as: Any Matcher
1304</pre></td></tr>
1305
1306
Manuel Klimek67619ff2012-09-07 13:10:32 +00001307<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 +00001308<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1309
1310Useful when another matcher requires a child matcher, but there's no
1311additional constraint. This will often be used with an explicit conversion
1312to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1313
1314Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1315"int* p" and "void f()" in
1316 int* p;
1317 void f();
1318
1319Usable as: Any Matcher
1320</pre></td></tr>
1321
1322
Stephen Hines651f13c2014-04-23 16:59:28 -07001323<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001324<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1325
Manuel Klimeke44a0062012-08-26 23:55:24 +00001326Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001327 class X {};
1328 class Y {};
1329
1330Usable as: Any Matcher
1331</pre></td></tr>
1332
1333
Manuel Klimek67619ff2012-09-07 13:10:32 +00001334<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 +00001335<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1336unary).
1337
1338Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1339 !(a || b)
1340</pre></td></tr>
1341
1342
Manuel Klimek67619ff2012-09-07 13:10:32 +00001343<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 +00001344<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1345
1346Example matches true (matcher = boolLiteral(equals(true)))
1347 true
1348
1349Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1350 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;
1351</pre></td></tr>
1352
1353
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00001354<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>
1355<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1356a specific number of arguments (including absent default arguments).
1357
1358Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1359 void f(int x, int y);
1360 f(0, 0);
1361</pre></td></tr>
1362
1363
Stephen Hines651f13c2014-04-23 16:59:28 -07001364<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
1365<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1366</pre></td></tr>
1367
1368
Manuel Klimek67619ff2012-09-07 13:10:32 +00001369<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 +00001370<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 +00001371code (as opposed to implicitly added by the compiler).
1372
1373Given
1374 struct Foo {
1375 Foo() { }
1376 Foo(int) : foo_("A") { }
1377 string foo_;
1378 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001379constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001380 will match Foo(int), but not Foo()
1381</pre></td></tr>
1382
1383
Edwin Vane6a19a972013-03-06 17:02:57 +00001384<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 +00001385<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1386
1387Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001388"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001389
Edwin Vane6a19a972013-03-06 17:02:57 +00001390Given:
1391 class A { int operator*(); };
1392 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1393 A a;
1394 a &lt;&lt; a; &lt;-- This matches
1395
1396operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1397line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1398the declaration of A.
1399
1400Usable 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;
1401</pre></td></tr>
1402
1403
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001404<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>
1405<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1406
1407Given
1408struct A {
1409 void foo() const;
1410 void bar();
1411};
1412
1413methodDecl(isConst()) matches A::foo() but not A::bar()
1414</pre></td></tr>
1415
1416
Edwin Vane5771a2f2013-04-09 20:46:36 +00001417<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>
1418<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1419
1420Given
1421 class A {
1422 public:
1423 virtual void x();
1424 };
1425 class B : public A {
1426 public:
1427 virtual void x();
1428 };
1429 matches B::x
1430</pre></td></tr>
1431
1432
Stephen Hines651f13c2014-04-23 16:59:28 -07001433<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
1434<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
1435
1436Given
1437 class A {
1438 public:
1439 virtual void x() = 0;
1440 };
1441 matches A::x
1442</pre></td></tr>
1443
1444
Edwin Vane5771a2f2013-04-09 20:46:36 +00001445<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>
1446<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1447
1448Given
1449 class A {
1450 public:
1451 virtual void x();
1452 };
1453 matches A::x
1454</pre></td></tr>
1455
1456
Edwin Vane6a19a972013-03-06 17:02:57 +00001457<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>
1458<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1459
1460Matches overloaded operator names specified in strings without the
1461"operator" prefix: e.g. "&lt;&lt;".
1462
1463Given:
1464 class A { int operator*(); };
1465 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1466 A a;
1467 a &lt;&lt; a; &lt;-- This matches
1468
1469operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1470line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1471the declaration of A.
1472
1473Usable 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 +00001474</pre></td></tr>
1475
1476
Manuel Klimek67619ff2012-09-07 13:10:32 +00001477<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 +00001478<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(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('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
1483<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001484static member variable template instantiations.
1485
1486Given
1487 template&lt;typename T&gt; void A(T t) { }
1488 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001489functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001490 matches the specialization A&lt;int&gt;().
1491
1492Usable 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;
1493</pre></td></tr>
1494
1495
Daniel Jaspere0b89972012-12-04 12:08:08 +00001496<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>
1497<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1498isSameOrDerivedFrom(hasName(...)).
1499</pre></td></tr>
1500
1501
Manuel Klimek415514d2013-02-06 20:36:22 +00001502<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>
1503<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001504member variable template instantiations.
1505
1506Given
1507 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1508or
1509 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001510recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001511 matches the template instantiation of X&lt;A&gt;.
1512
1513But given
1514 template &lt;typename T&gt; class X {}; class A {};
1515 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001516recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001517 does not match, as X&lt;A&gt; is an explicit template specialization.
1518
1519Usable 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;
1520</pre></td></tr>
1521
1522
Manuel Klimek67619ff2012-09-07 13:10:32 +00001523<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 +00001524<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1525a specific number of arguments (including absent default arguments).
1526
Manuel Klimeke44a0062012-08-26 23:55:24 +00001527Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001528 void f(int x, int y);
1529 f(0, 0);
1530</pre></td></tr>
1531
1532
Manuel Klimek67619ff2012-09-07 13:10:32 +00001533<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 +00001534<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1535
1536Example matches true (matcher = boolLiteral(equals(true)))
1537 true
1538
1539Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1540 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;
1541</pre></td></tr>
1542
1543
Manuel Klimek67619ff2012-09-07 13:10:32 +00001544<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 +00001545<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1546child statements.
1547
1548Example: Given
1549 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001550compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001551 matches '{}'
1552 but does not match the outer compound statement.
1553</pre></td></tr>
1554
1555
Daniel Jaspere0b89972012-12-04 12:08:08 +00001556<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>
1557<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1558
1559Given
1560 int a[42];
1561 int b[2 * 21];
1562 int c[41], d[43];
1563constantArrayType(hasSize(42))
1564 matches "int a[42]" and "int b[2 * 21]"
1565</pre></td></tr>
1566
1567
Manuel Klimek67619ff2012-09-07 13:10:32 +00001568<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 +00001569<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1570declarations.
1571
1572Example: Given
1573 int a, b;
1574 int c;
1575 int d = 2, e;
1576declCountIs(2)
1577 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1578</pre></td></tr>
1579
1580
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001581<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>
1582<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1583
1584Matches a node if it equals the node previously bound to ID.
1585
1586Given
1587 class X { int a; int b; };
1588recordDecl(
1589 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1590 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1591 matches the class X, as a and b have the same type.
1592
1593Note that when multiple matches are involved via forEach* matchers,
1594equalsBoundNodes acts as a filter.
1595For example:
1596compoundStmt(
1597 forEachDescendant(varDecl().bind("d")),
1598 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1599will trigger a match for each combination of variable declaration
1600and reference to that variable declaration within a compound statement.
1601</pre></td></tr>
1602
1603
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001604<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 *Node</td></tr>
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001605<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1606
1607Decl has pointer identity in the AST.
1608</pre></td></tr>
1609
1610
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001611<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
1612<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
1613by the compiler (eg. implicit defaultcopy constructors).
1614</pre></td></tr>
1615
1616
Daniel Jasperc7093d92013-02-25 12:39:41 +00001617<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>
1618<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1619
1620Given
1621 class C {
1622 public: int a;
1623 protected: int b;
1624 private: int c;
1625 };
1626fieldDecl(isPrivate())
1627 matches 'int c;'
1628</pre></td></tr>
1629
1630
1631<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>
1632<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1633
1634Given
1635 class C {
1636 public: int a;
1637 protected: int b;
1638 private: int c;
1639 };
1640fieldDecl(isProtected())
1641 matches 'int b;'
1642</pre></td></tr>
1643
1644
1645<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>
1646<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1647
1648Given
1649 class C {
1650 public: int a;
1651 protected: int b;
1652 private: int c;
1653 };
1654fieldDecl(isPublic())
1655 matches 'int a;'
1656</pre></td></tr>
1657
1658
Manuel Klimek67619ff2012-09-07 13:10:32 +00001659<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 +00001660<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1661
1662Example matches true (matcher = boolLiteral(equals(true)))
1663 true
1664
1665Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1666 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;
1667</pre></td></tr>
1668
1669
Manuel Klimek415514d2013-02-06 20:36:22 +00001670<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>
1671<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001672
1673Example matches A, va, fa
1674 class A {};
1675 class B; Doesn't match, as it has no body.
1676 int va;
1677 extern int vb; Doesn't match, as it doesn't define the variable.
1678 void fa() {}
1679 void fb(); Doesn't match, as it has no body.
1680
1681Usable 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;
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('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
1686<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001687static member variable template instantiations.
1688
1689Given
1690 template&lt;typename T&gt; void A(T t) { }
1691 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001692functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001693 matches the specialization A&lt;int&gt;().
1694
1695Usable 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;
1696</pre></td></tr>
1697
1698
Manuel Klimek67619ff2012-09-07 13:10:32 +00001699<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 +00001700<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1701
1702Given:
1703 extern "C" void f() {}
1704 extern "C" { void g() {} }
1705 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001706functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001707 matches the declaration of f and g, but not the declaration h
1708</pre></td></tr>
1709
1710
Manuel Klimek415514d2013-02-06 20:36:22 +00001711<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>
1712<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001713member variable template instantiations.
1714
1715Given
1716 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1717or
1718 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001719recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001720 matches the template instantiation of X&lt;A&gt;.
1721
1722But given
1723 template &lt;typename T&gt; class X {}; class A {};
1724 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001725recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001726 does not match, as X&lt;A&gt; is an explicit template specialization.
1727
1728Usable 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;
1729</pre></td></tr>
1730
1731
Daniel Jaspere0b89972012-12-04 12:08:08 +00001732<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>
1733<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1734
1735Given
1736 void f(int i) {}
1737 void g(int i, int j) {}
1738functionDecl(parameterCountIs(2))
1739 matches g(int i, int j) {}
1740</pre></td></tr>
1741
1742
Manuel Klimek67619ff2012-09-07 13:10:32 +00001743<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 +00001744<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1745
1746Example matches true (matcher = boolLiteral(equals(true)))
1747 true
1748
1749Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1750 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;
1751</pre></td></tr>
1752
1753
Manuel Klimek67619ff2012-09-07 13:10:32 +00001754<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 +00001755<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1756to '.'.
1757
1758Member calls on the implicit this pointer match as called with '-&gt;'.
1759
1760Given
1761 class Y {
1762 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1763 int a;
1764 static int b;
1765 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001766memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001767 matches this-&gt;x, x, y.x, a, this-&gt;b
1768</pre></td></tr>
1769
1770
Manuel Klimek67619ff2012-09-07 13:10:32 +00001771<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001772<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1773
1774Supports specifying enclosing namespaces or classes by prefixing the name
1775with '&lt;enclosing&gt;::'.
1776Does not match typedefs of an underlying type with the given name.
1777
1778Example matches X (Name == "X")
1779 class X;
1780
1781Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1782 namespace a { namespace b { class X; } }
1783</pre></td></tr>
1784
1785
Manuel Klimek67619ff2012-09-07 13:10:32 +00001786<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 +00001787<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1788a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001789
1790Supports specifying enclosing namespaces or classes by
1791prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1792of an underlying type with the given name.
1793
1794Example matches X (regexp == "::X")
1795 class X;
1796
1797Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1798 namespace foo { namespace bar { class X; } }
1799</pre></td></tr>
1800
1801
Manuel Klimek67619ff2012-09-07 13:10:32 +00001802<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 +00001803<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1804
1805Given
1806 class Y { public: void x(); };
1807 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001808callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001809 matches y-&gt;x()
1810</pre></td></tr>
1811
1812
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001813<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>
1814<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
1815
1816Matches a node if it equals the node previously bound to ID.
1817
1818Given
1819 class X { int a; int b; };
1820recordDecl(
1821 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1822 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1823 matches the class X, as a and b have the same type.
1824
1825Note that when multiple matches are involved via forEach* matchers,
1826equalsBoundNodes acts as a filter.
1827For example:
1828compoundStmt(
1829 forEachDescendant(varDecl().bind("d")),
1830 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1831will trigger a match for each combination of variable declaration
1832and reference to that variable declaration within a compound statement.
1833</pre></td></tr>
1834
1835
Edwin Vane7b69cd02013-04-02 18:15:55 +00001836<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>
1837<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1838the node, not hidden within a typedef.
1839
1840Given
1841 typedef const int const_int;
1842 const_int i;
1843 int *const j;
1844 int *volatile k;
1845 int m;
1846varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1847i is const-qualified but the qualifier is not local.
1848</pre></td></tr>
1849
1850
Manuel Klimek67619ff2012-09-07 13:10:32 +00001851<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 +00001852<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1853include "top-level" const.
1854
1855Given
1856 void a(int);
1857 void b(int const);
1858 void c(const int);
1859 void d(const int*);
1860 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001861functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001862 matches "void b(int const)", "void c(const int)" and
1863 "void e(int const) {}". It does not match d as there
1864 is no top-level const on the parameter type "const int *".
1865</pre></td></tr>
1866
1867
Manuel Klimek67619ff2012-09-07 13:10:32 +00001868<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 +00001869<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1870
1871Given
1872 void a(int);
1873 void b(long);
1874 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001875functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001876matches "a(int)", "b(long)", but not "c(double)".
1877</pre></td></tr>
1878
1879
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001880<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>
1881<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
1882
1883Matches a node if it equals the node previously bound to ID.
1884
1885Given
1886 class X { int a; int b; };
1887recordDecl(
1888 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1889 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1890 matches the class X, as a and b have the same type.
1891
1892Note that when multiple matches are involved via forEach* matchers,
1893equalsBoundNodes acts as a filter.
1894For example:
1895compoundStmt(
1896 forEachDescendant(varDecl().bind("d")),
1897 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1898will trigger a match for each combination of variable declaration
1899and reference to that variable declaration within a compound statement.
1900</pre></td></tr>
1901
1902
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001903<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 *Node</td></tr>
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001904<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1905
1906Stmt has pointer identity in the AST.
1907
1908</pre></td></tr>
1909
1910
Manuel Klimek415514d2013-02-06 20:36:22 +00001911<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>
1912<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001913
1914Example matches A, va, fa
1915 class A {};
1916 class B; Doesn't match, as it has no body.
1917 int va;
1918 extern int vb; Doesn't match, as it doesn't define the variable.
1919 void fa() {}
1920 void fb(); Doesn't match, as it has no body.
1921
1922Usable 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;
1923</pre></td></tr>
1924
1925
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001926<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>
1927<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
1928
1929Matches a node if it equals the node previously bound to ID.
1930
1931Given
1932 class X { int a; int b; };
1933recordDecl(
1934 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1935 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1936 matches the class X, as a and b have the same type.
1937
1938Note that when multiple matches are involved via forEach* matchers,
1939equalsBoundNodes acts as a filter.
1940For example:
1941compoundStmt(
1942 forEachDescendant(varDecl().bind("d")),
1943 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1944will trigger a match for each combination of variable declaration
1945and reference to that variable declaration within a compound statement.
1946</pre></td></tr>
1947
1948
Manuel Klimek67619ff2012-09-07 13:10:32 +00001949<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 +00001950<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1951
1952Given
1953 int x;
1954 int s = sizeof(x) + alignof(x)
1955unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1956 matches sizeof(x)
1957</pre></td></tr>
1958
1959
Manuel Klimek67619ff2012-09-07 13:10:32 +00001960<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 +00001961<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1962unary).
1963
1964Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1965 !(a || b)
1966</pre></td></tr>
1967
1968
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001969<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
1970<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
1971
1972Example matches y and z (matcher = varDecl(hasGlobalStorage())
1973void f() {
1974 int x;
1975 static int y;
1976}
1977int z;
1978</pre></td></tr>
1979
1980
1981<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
1982<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
1983non-static local variable.
1984
1985Example matches x (matcher = varDecl(hasLocalStorage())
1986void f() {
1987 int x;
1988 static int y;
1989}
1990int z;
1991</pre></td></tr>
1992
1993
Manuel Klimek67619ff2012-09-07 13:10:32 +00001994<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 +00001995<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
1996
1997Example matches A, va, fa
1998 class A {};
1999 class B; Doesn't match, as it has no body.
2000 int va;
2001 extern int vb; Doesn't match, as it doesn't define the variable.
2002 void fa() {}
2003 void fb(); Doesn't match, as it has no body.
2004
2005Usable 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;
2006</pre></td></tr>
2007
2008
Manuel Klimek67619ff2012-09-07 13:10:32 +00002009<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 +00002010<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2011static member variable template instantiations.
2012
2013Given
2014 template&lt;typename T&gt; void A(T t) { }
2015 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002016functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002017 matches the specialization A&lt;int&gt;().
2018
2019Usable 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;
2020</pre></td></tr>
2021
2022
Manuel Klimek67619ff2012-09-07 13:10:32 +00002023<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 +00002024<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2025member variable template instantiations.
2026
2027Given
2028 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2029or
2030 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002031recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002032 matches the template instantiation of X&lt;A&gt;.
2033
2034But given
2035 template &lt;typename T&gt; class X {}; class A {};
2036 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002037recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002038 does not match, as X&lt;A&gt; is an explicit template specialization.
2039
2040Usable 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;
2041</pre></td></tr>
2042
2043<!--END_NARROWING_MATCHERS -->
2044</table>
2045
2046<!-- ======================================================================= -->
2047<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2048<!-- ======================================================================= -->
2049
2050<p>Traversal matchers specify the relationship to other nodes that are
2051reachable from the current node.</p>
2052
2053<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2054forEachDescendant) which work on all nodes and allow users to write more generic
2055match expressions.</p>
2056
2057<table>
2058<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2059<!-- START_TRAVERSAL_MATCHERS -->
2060
Samuel Benzaquend36e4632013-08-27 15:11:16 +00002061<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 +00002062<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2063
2064Unlike anyOf, eachOf will generate a match result for each
2065matching submatcher.
2066
2067For example, in:
2068 class A { int a; int b; };
2069The matcher:
2070 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2071 has(fieldDecl(hasName("b")).bind("v"))))
2072will generate two results binding "v", the first of which binds
2073the field declaration of a, the second the field declaration of
2074b.
2075
2076Usable as: Any Matcher
2077</pre></td></tr>
2078
2079
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002080<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 +00002081<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2082provided matcher.
2083
2084Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002085 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002086 class X {}; Matches X, because X::X is a class of name X inside X.
2087 class A { class X {}; };
2088 class B { class C { class X {}; }; };
2089
2090DescendantT must be an AST base type.
2091
2092As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2093each result that matches instead of only on the first one.
2094
2095Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002096 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002097will match 10 times (plus injected class name matches) on:
2098 class A { class B { class C { class D { class E {}; }; }; }; };
2099
2100Usable as: Any Matcher
2101</pre></td></tr>
2102
2103
Stephen Hines651f13c2014-04-23 16:59:28 -07002104<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
2105<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
Manuel Klimek1da79332012-08-20 20:54:03 +00002106provided matcher.
2107
Stephen Hines651f13c2014-04-23 16:59:28 -07002108Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002109 class X {}; Matches X, because X::X is a class of name X inside X.
2110 class Y { class X {}; };
2111 class Z { class Y { class X {}; }; }; Does not match Z.
2112
2113ChildT must be an AST base type.
2114
Stephen Hines651f13c2014-04-23 16:59:28 -07002115As opposed to 'has', 'forEach' will cause a match for each result that
2116matches instead of only on the first one.
2117
Manuel Klimek1da79332012-08-20 20:54:03 +00002118Usable as: Any Matcher
2119</pre></td></tr>
2120
2121
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002122<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 +00002123<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2124matcher.
2125
2126Given
2127void f() { if (true) { int x = 42; } }
2128void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002129expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002130
2131Usable as: Any Matcher
2132</pre></td></tr>
2133
2134
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002135<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 +00002136<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2137provided matcher.
2138
2139Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002140 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002141 class X {}; Matches X, because X::X is a class of name X inside X.
2142 class Y { class X {}; };
2143 class Z { class Y { class X {}; }; };
2144
2145DescendantT must be an AST base type.
2146
2147Usable as: Any Matcher
2148</pre></td></tr>
2149
2150
Stephen Hines651f13c2014-04-23 16:59:28 -07002151<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
2152<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2153provided matcher.
2154
2155Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
2156 class X {}; Matches X, because X::X is a class of name X inside X.
2157 class Y { class X {}; };
2158 class Z { class Y { class X {}; }; }; Does not match Z.
2159
2160ChildT must be an AST base type.
2161
2162Usable as: Any Matcher
2163</pre></td></tr>
2164
2165
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002166<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 +00002167<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2168matcher.
2169
2170Given
2171void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2172compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2173
2174Usable as: Any Matcher
2175</pre></td></tr>
2176
2177
Manuel Klimek67619ff2012-09-07 13:10:32 +00002178<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 +00002179<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2180
2181Given
2182 int i[5];
2183 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002184arraySubscriptExpression(hasBase(implicitCastExpr(
2185 hasSourceExpression(declRefExpr()))))
2186 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002187</pre></td></tr>
2188
2189
Manuel Klimek67619ff2012-09-07 13:10:32 +00002190<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 +00002191<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2192
2193Given
2194 int i[5];
2195 void f() { i[1] = 42; }
2196arraySubscriptExpression(hasIndex(integerLiteral()))
2197 matches i[1] with the integerLiteral() matching 1
2198</pre></td></tr>
2199
2200
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002201<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>
2202<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 +00002203type.
2204
2205Given
2206 struct A {};
2207 A a[7];
2208 int b[7];
2209arrayType(hasElementType(builtinType()))
2210 matches "int b[7]"
2211
2212Usable 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;
2213</pre></td></tr>
2214
2215
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002216<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>
2217<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 +00002218type.
2219
2220Given
2221 struct A {};
2222 A a[7];
2223 int b[7];
2224arrayType(hasElementType(builtinType()))
2225 matches "int b[7]"
2226
2227Usable 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;
2228</pre></td></tr>
2229
2230
2231<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>
2232<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2233
2234Given
2235 _Atomic(int) i;
2236 _Atomic(float) f;
2237atomicType(hasValueType(isInteger()))
2238 matches "_Atomic(int) i"
2239
2240Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2241</pre></td></tr>
2242
2243
2244<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>
2245<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2246
2247Given
2248 _Atomic(int) i;
2249 _Atomic(float) f;
2250atomicType(hasValueType(isInteger()))
2251 matches "_Atomic(int) i"
2252
2253Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2254</pre></td></tr>
2255
2256
2257<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>
2258<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2259
2260Note: There is no TypeLoc for the deduced type and thus no
2261getDeducedLoc() matcher.
2262
2263Given
2264 auto a = 1;
2265 auto b = 2.0;
2266autoType(hasDeducedType(isInteger()))
2267 matches "auto a"
2268
2269Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2270</pre></td></tr>
2271
2272
Manuel Klimek67619ff2012-09-07 13:10:32 +00002273<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 +00002274<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2275binary operator matches.
2276</pre></td></tr>
2277
2278
Manuel Klimek67619ff2012-09-07 13:10:32 +00002279<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 +00002280<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2281
2282Example matches a (matcher = binaryOperator(hasLHS()))
2283 a || b
2284</pre></td></tr>
2285
2286
Manuel Klimek67619ff2012-09-07 13:10:32 +00002287<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 +00002288<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2289
2290Example matches b (matcher = binaryOperator(hasRHS()))
2291 a || b
2292</pre></td></tr>
2293
2294
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002295<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>
2296<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 +00002297pointee matches a given matcher.
2298
2299Given
2300 int *a;
2301 int const *b;
2302 float const *f;
2303pointerType(pointee(isConstQualified(), isInteger()))
2304 matches "int const *b"
2305
2306Usable 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;,
2307 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;
2308</pre></td></tr>
2309
2310
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002311<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>
2312<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 +00002313pointee matches a given matcher.
2314
2315Given
2316 int *a;
2317 int const *b;
2318 float const *f;
2319pointerType(pointee(isConstQualified(), isInteger()))
2320 matches "int const *b"
2321
2322Usable 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;,
2323 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;
2324</pre></td></tr>
2325
2326
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00002327<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>
2328<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
2329expression.
2330
2331Given
2332 void x(int, int, int) { int y; x(1, y, 42); }
2333callExpr(hasAnyArgument(declRefExpr()))
2334 matches x(1, y, 42)
2335with hasAnyArgument(...)
2336 matching y
2337
2338FIXME: Currently this will ignore parentheses and implicit casts on
2339the argument before applying the inner matcher. We'll want to remove
2340this to allow for greater control by the user once ignoreImplicit()
2341has been implemented.
2342</pre></td></tr>
2343
2344
2345<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>
2346<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
2347call expression.
2348
2349Example matches y in x(y)
2350 (matcher = callExpr(hasArgument(0, declRefExpr())))
2351 void x(int) { int y; x(y); }
2352</pre></td></tr>
2353
2354
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002355<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>
2356<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 +00002357matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002358
Manuel Klimek03a83232013-06-10 08:52:15 +00002359The associated declaration is:
2360- for type nodes, the declaration of the underlying type
2361- for CallExpr, the declaration of the callee
2362- for MemberExpr, the declaration of the referenced member
2363- for CXXConstructExpr, the declaration of the constructor
2364
2365Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2366function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00002367
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002368Usable 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;,
2369 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;,
2370 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;,
2371 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;,
2372 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;,
2373 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 +00002374</pre></td></tr>
2375
2376
Manuel Klimek532870f2013-07-24 05:46:07 +00002377<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>
2378<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
2379
2380Given
2381 class A { A() : i(42), j(42) {} int i; int j; };
2382constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
2383 will trigger two matches, binding for 'i' and 'j' respectively.
2384</pre></td></tr>
2385
2386
Manuel Klimek67619ff2012-09-07 13:10:32 +00002387<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 +00002388<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2389
2390Given
2391 struct Foo {
2392 Foo() : foo_(1) { }
2393 int foo_;
2394 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002395recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002396 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2397</pre></td></tr>
2398
2399
Manuel Klimek67619ff2012-09-07 13:10:32 +00002400<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 +00002401<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2402
2403Given
2404 struct Foo {
2405 Foo() : foo_(1) { }
2406 int foo_;
2407 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002408recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002409 forField(hasName("foo_"))))))
2410 matches Foo
2411with forField matching foo_
2412</pre></td></tr>
2413
2414
Manuel Klimek67619ff2012-09-07 13:10:32 +00002415<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 +00002416<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2417
2418Given
2419 struct Foo {
2420 Foo() : foo_(1) { }
2421 int foo_;
2422 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002423recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002424 withInitializer(integerLiteral(equals(1)))))))
2425 matches Foo
2426with withInitializer matching (1)
2427</pre></td></tr>
2428
2429
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002430<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
2431<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', or 'do while' statement that has
2432a given body.
2433
2434Given
2435 for (;;) {}
2436hasBody(compoundStmt())
2437 matches 'for (;;) {}'
2438with compoundStmt()
2439 matching '{}'
2440</pre></td></tr>
2441
2442
Stephen Hines651f13c2014-04-23 16:59:28 -07002443<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
2444<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
2445
2446Example:
2447 forStmt(hasLoopVariable(anything()))
2448matches 'int x' in
2449 for (int x : a) { }
2450</pre></td></tr>
2451
2452
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002453<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2454<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
2455
2456Example:
2457 forStmt(hasRangeInit(anything()))
2458matches 'a' in
2459 for (int x : a) { }
2460</pre></td></tr>
2461
2462
Stephen Hines651f13c2014-04-23 16:59:28 -07002463<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>
2464<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2465
2466
Manuel Klimek67619ff2012-09-07 13:10:32 +00002467<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 +00002468<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2469
Manuel Klimeke44a0062012-08-26 23:55:24 +00002470Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002471 class Y { public: void x(); };
2472 void z() { Y y; y.x(); }",
2473
2474FIXME: Overload to allow directly matching types?
2475</pre></td></tr>
2476
2477
Manuel Klimek532870f2013-07-24 05:46:07 +00002478<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 +00002479<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2480</pre></td></tr>
2481
2482
Stephen Hines651f13c2014-04-23 16:59:28 -07002483<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
2484<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
2485matcher, or is a pointer to a type that matches the InnerMatcher.
2486</pre></td></tr>
2487
2488
Manuel Klimek67619ff2012-09-07 13:10:32 +00002489<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 +00002490<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2491belongs to.
2492
2493FIXME: Generalize this for other kinds of declarations.
2494FIXME: What other kind of declarations would we need to generalize
2495this to?
2496
2497Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002498 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002499 ofClass(hasName("A"))))))
2500 class A {
2501 public:
2502 A();
2503 };
2504 A a = A();
2505</pre></td></tr>
2506
2507
Edwin Vane6a19a972013-03-06 17:02:57 +00002508<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>
2509<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2510
2511Given:
2512 class A { void func(); };
2513 class B { void member(); };
2514
2515recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2516but not B.
2517</pre></td></tr>
2518
2519
Manuel Klimek67619ff2012-09-07 13:10:32 +00002520<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 +00002521<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2522a class matching Base.
2523
Manuel Klimek67619ff2012-09-07 13:10:32 +00002524Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002525
Manuel Klimek67619ff2012-09-07 13:10:32 +00002526Example matches Y, Z, C (Base == hasName("X"))
2527 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002528 class Y : public X {}; directly derived
2529 class Z : public Y {}; indirectly derived
2530 typedef X A;
2531 typedef A B;
2532 class C : public B {}; derived from a typedef of X
2533
2534In the following example, Bar matches isDerivedFrom(hasName("X")):
2535 class Foo;
2536 typedef Foo X;
2537 class Bar : public Foo {}; derived from a type that X is a typedef of
2538</pre></td></tr>
2539
2540
Daniel Jaspere0b89972012-12-04 12:08:08 +00002541<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>
2542<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2543match Base.
2544</pre></td></tr>
2545
2546
Manuel Klimek532870f2013-07-24 05:46:07 +00002547<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 +00002548<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2549given matcher.
2550
Manuel Klimeke44a0062012-08-26 23:55:24 +00002551Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002552 class Y { public: void x(); };
2553 void z() { Y y; y.x();
2554</pre></td></tr>
2555
2556
Stephen Hines651f13c2014-04-23 16:59:28 -07002557<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
2558<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
2559
2560Given
2561 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
2562 void f() { f(); }
2563callExpr(callee(expr()))
2564 matches this-&gt;x(), x(), y.x(), f()
2565with callee(...)
2566 matching this-&gt;x, x, y.x, f respectively
2567
2568Note: Callee cannot take the more general internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
2569because this introduces ambiguous overloads with calls to Callee taking a
2570internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
2571implemented in terms of implicit casts.
2572</pre></td></tr>
2573
2574
Manuel Klimek67619ff2012-09-07 13:10:32 +00002575<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 +00002576<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2577expression.
2578
2579Given
2580 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002581callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002582 matches x(1, y, 42)
2583with hasAnyArgument(...)
2584 matching y
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002585
2586FIXME: Currently this will ignore parentheses and implicit casts on
2587the argument before applying the inner matcher. We'll want to remove
2588this to allow for greater control by the user once ignoreImplicit()
2589has been implemented.
Manuel Klimek1da79332012-08-20 20:54:03 +00002590</pre></td></tr>
2591
2592
Manuel Klimek67619ff2012-09-07 13:10:32 +00002593<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 +00002594<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2595call expression.
2596
2597Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002598 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002599 void x(int) { int y; x(y); }
2600</pre></td></tr>
2601
2602
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002603<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>
2604<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 +00002605matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002606
Manuel Klimek03a83232013-06-10 08:52:15 +00002607The associated declaration is:
2608- for type nodes, the declaration of the underlying type
2609- for CallExpr, the declaration of the callee
2610- for MemberExpr, the declaration of the referenced member
2611- for CXXConstructExpr, the declaration of the constructor
2612
2613Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2614function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00002615
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002616Usable 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;,
2617 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;,
2618 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;,
2619 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;,
2620 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;,
2621 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 +00002622</pre></td></tr>
2623
2624
Manuel Klimek03a83232013-06-10 08:52:15 +00002625<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>
2626<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2627extension, matches the constant given in the statement.
2628
2629Given
2630 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2631caseStmt(hasCaseConstant(integerLiteral()))
2632 matches "case 1:"
2633</pre></td></tr>
2634
2635
Manuel Klimek67619ff2012-09-07 13:10:32 +00002636<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 +00002637<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2638
2639Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002640 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002641class URL { URL(string); };
2642URL url = "a string";
2643</pre></td></tr>
2644
2645
Manuel Klimek67619ff2012-09-07 13:10:32 +00002646<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002647<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2648TemplateArgument matching the given InnerMatcher.
2649
2650Given
2651 template&lt;typename T&gt; class A {};
2652 template&lt;&gt; class A&lt;double&gt; {};
2653 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002654classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002655 refersToType(asString("int"))))
2656 matches the specialization A&lt;int&gt;
2657</pre></td></tr>
2658
2659
Manuel Klimek67619ff2012-09-07 13:10:32 +00002660<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 +00002661<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2662matches the given InnerMatcher.
2663
2664Given
2665 template&lt;typename T, typename U&gt; class A {};
2666 A&lt;bool, int&gt; b;
2667 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002668classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002669 1, refersToType(asString("int"))))
2670 matches the specialization A&lt;bool, int&gt;
2671</pre></td></tr>
2672
2673
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002674<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>
2675<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 +00002676type.
2677
2678Given
2679 struct A {};
2680 A a[7];
2681 int b[7];
2682arrayType(hasElementType(builtinType()))
2683 matches "int b[7]"
2684
2685Usable 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;
2686</pre></td></tr>
2687
2688
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002689<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>
2690<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 +00002691type.
2692
2693Given
2694 struct A {};
2695 A a[7];
2696 int b[7];
2697arrayType(hasElementType(builtinType()))
2698 matches "int b[7]"
2699
2700Usable 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;
2701</pre></td></tr>
2702
2703
Manuel Klimek67619ff2012-09-07 13:10:32 +00002704<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 +00002705<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2706a given matcher.
2707
2708Given
2709 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002710hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002711 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002712with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002713 matching '{}'
2714</pre></td></tr>
2715
2716
Manuel Klimek67619ff2012-09-07 13:10:32 +00002717<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 +00002718<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2719or conditional operator.
2720
2721Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2722 if (true) {}
2723</pre></td></tr>
2724
2725
Manuel Klimek67619ff2012-09-07 13:10:32 +00002726<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 +00002727<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2728
2729Example matches b
2730 condition ? a : b
2731</pre></td></tr>
2732
2733
Manuel Klimek67619ff2012-09-07 13:10:32 +00002734<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 +00002735<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2736
2737Example matches a
2738 condition ? a : b
2739</pre></td></tr>
2740
2741
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002742<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>
2743<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
2744matches the given matcher.
2745
2746The associated declaration is:
2747- for type nodes, the declaration of the underlying type
2748- for CallExpr, the declaration of the callee
2749- for MemberExpr, the declaration of the referenced member
2750- for CXXConstructExpr, the declaration of the constructor
2751
2752Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2753function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002754
2755Usable 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;,
2756 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;,
2757 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;,
2758 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;,
2759 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;,
2760 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;
2761</pre></td></tr>
2762
2763
Manuel Klimek67619ff2012-09-07 13:10:32 +00002764<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 +00002765<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2766specific using shadow declaration.
2767
2768FIXME: This currently only works for functions. Fix.
2769
2770Given
2771 namespace a { void f() {} }
2772 using a::f;
2773 void g() {
2774 f(); Matches this ..
2775 a::f(); .. but not this.
2776 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002777declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002778 matches f()
2779</pre></td></tr>
2780
2781
Manuel Klimek67619ff2012-09-07 13:10:32 +00002782<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 +00002783<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2784specified matcher.
2785
2786Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002787 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002788 bool x;
2789 if (x) {}
2790</pre></td></tr>
2791
2792
Manuel Klimek67619ff2012-09-07 13:10:32 +00002793<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 +00002794<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2795
2796Note that this does not work for global declarations because the AST
2797breaks up multiple-declaration DeclStmt's into multiple single-declaration
2798DeclStmt's.
2799Example: Given non-global declarations
2800 int a, b = 0;
2801 int c;
2802 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002803declStmt(containsDeclaration(
2804 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002805 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002806declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002807 matches 'int a, b = 0' as well as 'int d = 2, e;'
2808 but 'int c;' is not matched.
2809</pre></td></tr>
2810
2811
Manuel Klimek67619ff2012-09-07 13:10:32 +00002812<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 +00002813<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2814
2815Given
2816 int a, b;
2817 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002818declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002819 matches 'int c;' but not 'int a, b;'.
2820</pre></td></tr>
2821
2822
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002823<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>
2824<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
2825the inner matcher.
2826
2827Given
2828 int x;
2829declaratorDecl(hasTypeLoc(loc(asString("int"))))
2830 matches int x
2831</pre></td></tr>
2832
2833
Edwin Vane742d9e72013-02-25 20:43:32 +00002834<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>
2835<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2836Decl, matches InnerMatcher.
2837
2838Given
2839 namespace N {
2840 namespace M {
2841 class D {};
2842 }
2843 }
2844
2845recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2846declaration of class D.
2847</pre></td></tr>
2848
2849
Manuel Klimek67619ff2012-09-07 13:10:32 +00002850<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 +00002851<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2852a given body.
2853
2854Given
2855 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002856hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002857 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002858with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002859 matching '{}'
2860</pre></td></tr>
2861
2862
Manuel Klimek67619ff2012-09-07 13:10:32 +00002863<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 +00002864<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2865or conditional operator.
2866
2867Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2868 if (true) {}
2869</pre></td></tr>
2870
2871
Edwin Vane742d9e72013-02-25 20:43:32 +00002872<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>
2873<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002874matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002875
2876Given
2877 namespace N {
2878 namespace M {
2879 class D {};
2880 }
2881 }
2882 N::M::D d;
2883
2884elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2885matches the type of the variable declaration of d.
2886</pre></td></tr>
2887
2888
2889<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>
2890<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2891
2892Given
2893 namespace N {
2894 namespace M {
2895 class D {};
2896 }
2897 }
2898 N::M::D d;
2899
2900elaboratedType(namesType(recordType(
2901hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2902declaration of d.
2903</pre></td></tr>
2904
2905
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002906<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>
2907<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
2908matches the given matcher.
2909
2910The associated declaration is:
2911- for type nodes, the declaration of the underlying type
2912- for CallExpr, the declaration of the callee
2913- for MemberExpr, the declaration of the referenced member
2914- for CXXConstructExpr, the declaration of the constructor
2915
2916Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2917function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002918
2919Usable 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;,
2920 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;,
2921 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;,
2922 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;,
2923 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;,
2924 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;
2925</pre></td></tr>
2926
2927
Manuel Klimek67619ff2012-09-07 13:10:32 +00002928<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 +00002929<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2930
2931(Note: Clang's AST refers to other conversions as "casts" too, and calls
2932actual casts "explicit" casts.)
2933</pre></td></tr>
2934
2935
Manuel Klimek532870f2013-07-24 05:46:07 +00002936<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>
2937<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 +00002938declaration's type.
2939
2940In case of a value declaration (for example a variable declaration),
2941this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002942declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2943while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002944of x."
2945
Manuel Klimeke44a0062012-08-26 23:55:24 +00002946Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2947 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002948 class X {};
2949 void y(X &amp;x) { x; X z; }
2950
2951Usable 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;
2952</pre></td></tr>
2953
2954
Stephen Hines651f13c2014-04-23 16:59:28 -07002955<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
2956<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
2957matcher.
2958
2959Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2960 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
2961 class X {};
2962 void y(X &amp;x) { x; X z; }
2963</pre></td></tr>
2964
2965
Manuel Klimek67619ff2012-09-07 13:10:32 +00002966<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 +00002967<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2968are stripped off.
2969
2970Parentheses and explicit casts are not discarded.
2971Given
2972 int arr[5];
2973 int a = 0;
2974 char b = 0;
2975 const int c = a;
2976 int *d = arr;
2977 long e = (long) 0l;
2978The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002979 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2980 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002981would match the declarations for a, b, c, and d, but not e.
2982While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002983 varDecl(hasInitializer(integerLiteral()))
2984 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002985only match the declarations for b, c, and d.
2986</pre></td></tr>
2987
2988
Manuel Klimek67619ff2012-09-07 13:10:32 +00002989<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 +00002990<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2991casts are stripped off.
2992
2993Implicit and non-C Style casts are also discarded.
2994Given
2995 int a = 0;
2996 char b = (0);
2997 void* c = reinterpret_cast&lt;char*&gt;(0);
2998 char d = char(0);
2999The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00003000 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003001would match the declarations for a, b, c, and d.
3002while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003003 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003004only match the declaration for a.
3005</pre></td></tr>
3006
3007
Manuel Klimek67619ff2012-09-07 13:10:32 +00003008<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 +00003009<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
3010parentheses are stripped off.
3011
3012Explicit casts are not discarded.
3013Given
3014 int arr[5];
3015 int a = 0;
3016 char b = (0);
3017 const int c = a;
3018 int *d = (arr);
3019 long e = ((long) 0l);
3020The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00003021 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3022 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003023would match the declarations for a, b, c, and d, but not e.
3024while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003025 varDecl(hasInitializer(integerLiteral()))
3026 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003027would only match the declaration for a.
3028</pre></td></tr>
3029
3030
Manuel Klimek67619ff2012-09-07 13:10:32 +00003031<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 +00003032<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3033a given body.
3034
3035Given
3036 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003037hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003038 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003039with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003040 matching '{}'
3041</pre></td></tr>
3042
3043
Manuel Klimek67619ff2012-09-07 13:10:32 +00003044<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 +00003045<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3046or conditional operator.
3047
3048Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3049 if (true) {}
3050</pre></td></tr>
3051
3052
Manuel Klimek67619ff2012-09-07 13:10:32 +00003053<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 +00003054<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3055
3056Example:
3057 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3058matches '++x' in
3059 for (x; x &lt; N; ++x) { }
3060</pre></td></tr>
3061
3062
Manuel Klimek67619ff2012-09-07 13:10:32 +00003063<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 +00003064<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3065
3066Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00003067 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003068matches 'int x = 0' in
3069 for (int x = 0; x &lt; N; ++x) { }
3070</pre></td></tr>
3071
3072
Manuel Klimek67619ff2012-09-07 13:10:32 +00003073<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 +00003074<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3075
3076Does not match the 'this' parameter of a method.
3077
3078Given
3079 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003080methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003081 matches f(int x, int y, int z) {}
3082with hasAnyParameter(...)
3083 matching int y
3084</pre></td></tr>
3085
3086
Manuel Klimek67619ff2012-09-07 13:10:32 +00003087<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 +00003088<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3089
3090Given
3091 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003092methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003093 matches f(int x) {}
3094with hasParameter(...)
3095 matching int x
3096</pre></td></tr>
3097
3098
Manuel Klimek67619ff2012-09-07 13:10:32 +00003099<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 +00003100<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3101
3102Given:
3103 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003104methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003105 matches int f() { return 1; }
3106</pre></td></tr>
3107
3108
Manuel Klimek67619ff2012-09-07 13:10:32 +00003109<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 +00003110<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3111or conditional operator.
3112
3113Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3114 if (true) {}
3115</pre></td></tr>
3116
3117
Manuel Klimek67619ff2012-09-07 13:10:32 +00003118<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 +00003119<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3120
3121Given
3122 if (A* a = GetAPointer()) {}
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003123hasConditionVariableStatement(...)
Manuel Klimek1da79332012-08-20 20:54:03 +00003124 matches 'A* a = GetAPointer()'.
3125</pre></td></tr>
3126
3127
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003128<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3129<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
3130
3131Examples matches the if statement
3132 (matcher = ifStmt(hasElse(boolLiteral(equals(true)))))
3133 if (false) false; else true;
3134</pre></td></tr>
3135
3136
3137<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3138<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
3139
3140Examples matches the if statement
3141 (matcher = ifStmt(hasThen(boolLiteral(equals(true)))))
3142 if (false) true; else false;
3143</pre></td></tr>
3144
3145
Manuel Klimek67619ff2012-09-07 13:10:32 +00003146<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 +00003147<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3148matcher.
3149
3150FIXME: Unit test this matcher
3151</pre></td></tr>
3152
3153
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003154<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>
3155<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 +00003156matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00003157
Manuel Klimek03a83232013-06-10 08:52:15 +00003158The associated declaration is:
3159- for type nodes, the declaration of the underlying type
3160- for CallExpr, the declaration of the callee
3161- for MemberExpr, the declaration of the referenced member
3162- for CXXConstructExpr, the declaration of the constructor
3163
3164Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3165function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00003166
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003167Usable 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;,
3168 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;,
3169 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;,
3170 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;,
3171 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;,
3172 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;
3173</pre></td></tr>
3174
3175
3176<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>
3177<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3178matches the given matcher.
3179
3180The associated declaration is:
3181- for type nodes, the declaration of the underlying type
3182- for CallExpr, the declaration of the callee
3183- for MemberExpr, the declaration of the referenced member
3184- for CXXConstructExpr, the declaration of the constructor
3185
3186Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3187function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003188
3189Usable 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;,
3190 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;,
3191 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;,
3192 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;,
3193 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;,
3194 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;
3195</pre></td></tr>
3196
3197
3198<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>
3199<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
3200matches the given matcher.
3201
3202The associated declaration is:
3203- for type nodes, the declaration of the underlying type
3204- for CallExpr, the declaration of the callee
3205- for MemberExpr, the declaration of the referenced member
3206- for CXXConstructExpr, the declaration of the constructor
3207
3208Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3209function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003210
3211Usable 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;,
3212 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;,
3213 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;,
3214 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;,
3215 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;,
3216 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 +00003217</pre></td></tr>
3218
3219
Manuel Klimek67619ff2012-09-07 13:10:32 +00003220<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 +00003221<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3222matched by a given matcher.
3223
3224Given
3225 struct X { int m; };
3226 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003227memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003228 matches "x.m" and "m"
3229with hasObjectExpression(...)
3230 matching "x" and the implicit object expression of "m" which has type X*.
3231</pre></td></tr>
3232
3233
Manuel Klimek67619ff2012-09-07 13:10:32 +00003234<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 +00003235<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3236given matcher.
3237
3238Given
3239 struct { int first, second; } first, second;
3240 int i(second.first);
3241 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003242memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003243 matches second.first
3244 but not first.second (because the member name there is "second").
3245</pre></td></tr>
3246
3247
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003248<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>
3249<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 +00003250pointee matches a given matcher.
3251
3252Given
3253 int *a;
3254 int const *b;
3255 float const *f;
3256pointerType(pointee(isConstQualified(), isInteger()))
3257 matches "int const *b"
3258
3259Usable 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;,
3260 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;
3261</pre></td></tr>
3262
3263
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003264<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>
3265<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 +00003266pointee matches a given matcher.
3267
3268Given
3269 int *a;
3270 int const *b;
3271 float const *f;
3272pointerType(pointee(isConstQualified(), isInteger()))
3273 matches "int const *b"
3274
3275Usable 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;,
3276 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;
3277</pre></td></tr>
3278
3279
Manuel Klimek415514d2013-02-06 20:36:22 +00003280<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 +00003281<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3282
3283Given
3284 struct A { struct B { struct C {}; }; };
3285 A::B::C c;
3286nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3287 matches "A::"
3288</pre></td></tr>
3289
3290
3291<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>
3292<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3293given TypeLoc.
3294
3295Given
3296 struct A { struct B { struct C {}; }; };
3297 A::B::C c;
3298nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3299 hasDeclaration(recordDecl(hasName("A")))))))
3300 matches "A::"
3301</pre></td></tr>
3302
3303
Manuel Klimek415514d2013-02-06 20:36:22 +00003304<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 +00003305<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3306
3307Given
3308 struct A { struct B { struct C {}; }; };
3309 A::B::C c;
3310nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3311 matches "A::"
3312</pre></td></tr>
3313
3314
3315<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>
3316<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3317given namespace matcher.
3318
3319Given
3320 namespace ns { struct A {}; }
3321 ns::A a;
3322nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3323 matches "ns::"
3324</pre></td></tr>
3325
3326
3327<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>
3328<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3329given QualType matcher without qualifiers.
3330
3331Given
3332 struct A { struct B { struct C {}; }; };
3333 A::B::C c;
3334nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3335 matches "A::"
3336</pre></td></tr>
3337
3338
Edwin Vane88be2fd2013-04-01 18:33:34 +00003339<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>
3340<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3341
3342Given
3343 int (*ptr_to_array)[4];
3344 int (*ptr_to_func)(int);
3345
3346varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3347ptr_to_func but not ptr_to_array.
3348
3349Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3350</pre></td></tr>
3351
3352
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003353<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>
3354<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 +00003355pointee matches a given matcher.
3356
3357Given
3358 int *a;
3359 int const *b;
3360 float const *f;
3361pointerType(pointee(isConstQualified(), isInteger()))
3362 matches "int const *b"
3363
3364Usable 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;,
3365 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;
3366</pre></td></tr>
3367
3368
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003369<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>
3370<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 +00003371pointee matches a given matcher.
3372
3373Given
3374 int *a;
3375 int const *b;
3376 float const *f;
3377pointerType(pointee(isConstQualified(), isInteger()))
3378 matches "int const *b"
3379
3380Usable 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;,
3381 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;
3382</pre></td></tr>
3383
3384
Edwin Vane6a19a972013-03-06 17:02:57 +00003385<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>
3386<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3387
3388Given:
3389 typedef int &amp;int_ref;
3390 int a;
3391 int_ref b = a;
3392
3393varDecl(hasType(qualType(referenceType()))))) will not match the
3394declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3395</pre></td></tr>
3396
3397
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003398<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>
3399<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
3400matches the given matcher.
3401
3402The associated declaration is:
3403- for type nodes, the declaration of the underlying type
3404- for CallExpr, the declaration of the callee
3405- for MemberExpr, the declaration of the referenced member
3406- for CXXConstructExpr, the declaration of the constructor
3407
3408Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3409function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003410
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
3420<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>
3421<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3422</pre></td></tr>
3423
3424
Stephen Hines651f13c2014-04-23 16:59:28 -07003425<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3426<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
3427matches the specified matcher.
3428
3429Example matches y-&gt;x()
3430 (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
3431 class Y { public: void x(); };
3432 void z() { Y *y; y-&gt;x(); }
3433</pre></td></tr>
3434
3435
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003436<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>
3437<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3438</pre></td></tr>
3439
3440
Stephen Hines651f13c2014-04-23 16:59:28 -07003441<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3442<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
3443type matches the specified matcher.
3444
3445Example matches X &amp;x and const X &amp;y
3446 (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
3447 class X {
3448 void a(X b) {
3449 X &amp;x = b;
3450 const X &amp;y = b;
3451 };
3452</pre></td></tr>
3453
3454
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003455<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 +00003456<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3457matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003458
Manuel Klimek03a83232013-06-10 08:52:15 +00003459The associated declaration is:
3460- for type nodes, the declaration of the underlying type
3461- for CallExpr, the declaration of the callee
3462- for MemberExpr, the declaration of the referenced member
3463- for CXXConstructExpr, the declaration of the constructor
3464
3465Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3466function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00003467
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003468Usable 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;,
3469 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;,
3470 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;,
3471 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;,
3472 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;,
3473 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 +00003474</pre></td></tr>
3475
3476
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003477<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>
3478<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 +00003479pointee matches a given matcher.
3480
3481Given
3482 int *a;
3483 int const *b;
3484 float const *f;
3485pointerType(pointee(isConstQualified(), isInteger()))
3486 matches "int const *b"
3487
3488Usable 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;,
3489 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;
3490</pre></td></tr>
3491
3492
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003493<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>
3494<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 +00003495pointee matches a given matcher.
3496
3497Given
3498 int *a;
3499 int const *b;
3500 float const *f;
3501pointerType(pointee(isConstQualified(), isInteger()))
3502 matches "int const *b"
3503
3504Usable 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;,
3505 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;
3506</pre></td></tr>
3507
3508
Manuel Klimek67619ff2012-09-07 13:10:32 +00003509<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 +00003510<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3511alignof.
3512</pre></td></tr>
3513
3514
Manuel Klimek67619ff2012-09-07 13:10:32 +00003515<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 +00003516<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3517sizeof.
3518</pre></td></tr>
3519
3520
Manuel Klimek03a83232013-06-10 08:52:15 +00003521<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>
3522<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3523statement. This matcher may produce multiple matches.
3524
3525Given
3526 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3527switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3528 matches four times, with "c" binding each of "case 1:", "case 2:",
3529"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3530"switch (1)", "switch (2)" and "switch (2)".
3531</pre></td></tr>
3532
3533
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003534<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>
3535<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
3536matches the given matcher.
3537
3538The associated declaration is:
3539- for type nodes, the declaration of the underlying type
3540- for CallExpr, the declaration of the callee
3541- for MemberExpr, the declaration of the referenced member
3542- for CXXConstructExpr, the declaration of the constructor
3543
3544Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3545function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003546
3547Usable 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;,
3548 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;,
3549 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;,
3550 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;,
3551 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;,
3552 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;
3553</pre></td></tr>
3554
3555
Stephen Hines651f13c2014-04-23 16:59:28 -07003556<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3557<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
3558
3559Given
3560 template&lt;typename T&gt; struct A {};
3561 struct B { B* next; };
3562 A&lt;&amp;B::next&gt; a;
3563templateSpecializationType(hasAnyTemplateArgument(
3564 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
3565 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
3566 B::next
3567</pre></td></tr>
3568
3569
Manuel Klimek67619ff2012-09-07 13:10:32 +00003570<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>
Stephen Hines651f13c2014-04-23 16:59:28 -07003571<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
3572declaration.
Manuel Klimek1da79332012-08-20 20:54:03 +00003573
3574Given
3575 template&lt;typename T&gt; struct A {};
3576 struct B { B* next; };
3577 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003578classTemplateSpecializationDecl(hasAnyTemplateArgument(
3579 refersToDeclaration(fieldDecl(hasName("next"))))
3580 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003581 B::next
3582</pre></td></tr>
3583
3584
Manuel Klimek67619ff2012-09-07 13:10:32 +00003585<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 +00003586<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3587
3588Given
3589 struct X {};
3590 template&lt;typename T&gt; struct A {};
3591 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003592classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003593 refersToType(class(hasName("X")))))
3594 matches the specialization A&lt;X&gt;
3595</pre></td></tr>
3596
3597
Stephen Hines651f13c2014-04-23 16:59:28 -07003598<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
3599<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
3600TemplateArgument matching the given InnerMatcher.
3601
3602Given
3603 template&lt;typename T&gt; class A {};
3604 template&lt;&gt; class A&lt;double&gt; {};
3605 A&lt;int&gt; a;
3606classTemplateSpecializationDecl(hasAnyTemplateArgument(
3607 refersToType(asString("int"))))
3608 matches the specialization A&lt;int&gt;
3609</pre></td></tr>
3610
3611
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003612<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>
3613<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 +00003614matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003615
Manuel Klimek03a83232013-06-10 08:52:15 +00003616The associated declaration is:
3617- for type nodes, the declaration of the underlying type
3618- for CallExpr, the declaration of the callee
3619- for MemberExpr, the declaration of the referenced member
3620- for CXXConstructExpr, the declaration of the constructor
3621
3622Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3623function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00003624
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003625Usable 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;,
3626 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;,
3627 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;,
3628 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;,
3629 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;,
3630 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;
3631</pre></td></tr>
3632
3633
Stephen Hines651f13c2014-04-23 16:59:28 -07003634<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
3635<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
3636matches the given InnerMatcher.
3637
3638Given
3639 template&lt;typename T, typename U&gt; class A {};
3640 A&lt;bool, int&gt; b;
3641 A&lt;int, bool&gt; c;
3642classTemplateSpecializationDecl(hasTemplateArgument(
3643 1, refersToType(asString("int"))))
3644 matches the specialization A&lt;bool, int&gt;
3645</pre></td></tr>
3646
3647
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003648<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>
3649<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3650matches the given matcher.
3651
3652The associated declaration is:
3653- for type nodes, the declaration of the underlying type
3654- for CallExpr, the declaration of the callee
3655- for MemberExpr, the declaration of the referenced member
3656- for CXXConstructExpr, the declaration of the constructor
3657
3658Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3659function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003660
3661Usable 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;,
3662 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;,
3663 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;,
3664 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;,
3665 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;,
3666 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 +00003667</pre></td></tr>
3668
3669
Samuel Benzaquend36e4632013-08-27 15:11:16 +00003670<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>
3671<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
3672
3673Generates results for each match.
3674
3675For example, in:
3676 class A { class B {}; class C {}; };
3677The matcher:
3678 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
3679will generate results for A, B and C.
3680
3681Usable as: Any Matcher
3682</pre></td></tr>
3683
3684
Edwin Vane3abf7782013-02-25 14:49:29 +00003685<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 +00003686<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
3687matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00003688
Manuel Klimek03a83232013-06-10 08:52:15 +00003689The associated declaration is:
3690- for type nodes, the declaration of the underlying type
3691- for CallExpr, the declaration of the callee
3692- for MemberExpr, the declaration of the referenced member
3693- for CXXConstructExpr, the declaration of the constructor
3694
3695Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3696function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane3abf7782013-02-25 14:49:29 +00003697
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003698Usable 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;,
3699 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;,
3700 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;,
3701 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;,
3702 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;,
3703 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 +00003704</pre></td></tr>
3705
3706
Manuel Klimek67619ff2012-09-07 13:10:32 +00003707<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 +00003708<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3709
3710Given
3711 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3712unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3713 matches sizeof(a) and alignof(c)
3714</pre></td></tr>
3715
3716
Manuel Klimek67619ff2012-09-07 13:10:32 +00003717<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 +00003718<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3719
Daniel Jaspere0b89972012-12-04 12:08:08 +00003720Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003721 !true
3722</pre></td></tr>
3723
3724
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003725<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>
3726<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
3727matches the given matcher.
3728
3729The associated declaration is:
3730- for type nodes, the declaration of the underlying type
3731- for CallExpr, the declaration of the callee
3732- for MemberExpr, the declaration of the referenced member
3733- for CXXConstructExpr, the declaration of the constructor
3734
3735Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3736function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003737
3738Usable 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;,
3739 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;,
3740 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;,
3741 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;,
3742 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;,
3743 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;
3744</pre></td></tr>
3745
3746
Manuel Klimek67619ff2012-09-07 13:10:32 +00003747<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 +00003748<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3749
3750Given
3751 namespace X { void b(); }
3752 using X::b;
3753usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3754 matches using X::b </pre></td></tr>
3755
3756
Manuel Klimek67619ff2012-09-07 13:10:32 +00003757<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 +00003758<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3759matched by the given matcher.
3760
3761Given
3762 namespace X { int a; void b(); }
3763 using X::a;
3764 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003765usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003766 matches using X::b but not using X::a </pre></td></tr>
3767
3768
Manuel Klimek532870f2013-07-24 05:46:07 +00003769<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>
3770<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 +00003771declaration's type.
3772
3773In case of a value declaration (for example a variable declaration),
3774this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003775declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3776while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003777of x."
3778
Manuel Klimeke44a0062012-08-26 23:55:24 +00003779Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3780 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003781 class X {};
3782 void y(X &amp;x) { x; X z; }
3783
3784Usable 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;
3785</pre></td></tr>
3786
3787
Stephen Hines651f13c2014-04-23 16:59:28 -07003788<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3789<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
3790matcher.
3791
3792Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3793 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3794 class X {};
3795 void y(X &amp;x) { x; X z; }
3796</pre></td></tr>
3797
3798
Manuel Klimek67619ff2012-09-07 13:10:32 +00003799<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 +00003800<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3801that matches the given matcher.
3802
Manuel Klimeke44a0062012-08-26 23:55:24 +00003803Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003804 bool y() { return true; }
3805 bool x = y();
3806</pre></td></tr>
3807
3808
Daniel Jaspere0b89972012-12-04 12:08:08 +00003809<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>
3810<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3811expression.
3812
3813Given
3814 void f(int b) {
3815 int a[b];
3816 }
3817variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3818 varDecl(hasName("b")))))))
3819 matches "int a[b]"
3820</pre></td></tr>
3821
3822
Manuel Klimek67619ff2012-09-07 13:10:32 +00003823<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 +00003824<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3825a given body.
3826
3827Given
3828 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003829hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003830 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003831with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003832 matching '{}'
3833</pre></td></tr>
3834
3835
Manuel Klimek67619ff2012-09-07 13:10:32 +00003836<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 +00003837<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3838or conditional operator.
3839
3840Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3841 if (true) {}
3842</pre></td></tr>
3843
Stephen Hines651f13c2014-04-23 16:59:28 -07003844
3845<tr><td>Matcher&lt;internal::BindableMatcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
3846<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3847NestedNameSpecifier-matcher matches.
3848</pre></td></tr>
3849
3850
3851<tr><td>Matcher&lt;internal::BindableMatcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3852<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3853QualType-matcher matches.
3854</pre></td></tr>
3855
Manuel Klimek1da79332012-08-20 20:54:03 +00003856<!--END_TRAVERSAL_MATCHERS -->
3857</table>
3858
3859</div>
3860</body>
3861</html>
3862
3863