blob: 74bbf9e47334cacb073733616f79b811b6f1ad1c [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
Stephen Hines176edba2014-12-01 14:53:08 -0800249<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
250<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
251
252Given
253 extern "C" {}
254linkageSpecDecl()
255 matches "extern "C" {}"
256</pre></td></tr>
257
258
Manuel Klimek67619ff2012-09-07 13:10:32 +0000259<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 +0000260<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000261
262Example matches y
Stephen Hines651f13c2014-04-23 16:59:28 -0700263 class X { void y(); };
Manuel Klimek1da79332012-08-20 20:54:03 +0000264</pre></td></tr>
265
266
Manuel Klimek67619ff2012-09-07 13:10:32 +0000267<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 +0000268<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 +0000269
270Example matches X, S, the anonymous union type, i, and U;
271 typedef int X;
272 struct S {
273 union {
274 int i;
275 } U;
276 };
277</pre></td></tr>
278
279
Edwin Vane0332e0a2013-05-09 16:42:37 +0000280<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>
281<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
282
283Given
284 namespace {}
285 namespace test {}
286namespaceDecl()
287 matches "namespace {}" and "namespace test {}"
288</pre></td></tr>
289
290
Manuel Klimek1a68afd2013-06-20 13:08:29 +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('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>
292<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
293
294Given
295 void f(int x);
296parmVarDecl()
297 matches int x.
298</pre></td></tr>
299
300
Manuel Klimek67619ff2012-09-07 13:10:32 +0000301<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 +0000302<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000303
304Example matches X, Z
305 class X;
306 template&lt;class T&gt; class Z {};
307</pre></td></tr>
308
309
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700310<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
311<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
312
313Given
314 int X;
315 namespace NS {
316 int Y;
317 } namespace NS
318decl(hasDeclContext(translationUnitDecl()))
319 matches "int X", but not "int Y".
320</pre></td></tr>
321
322
323<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
324<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
325
326Given
327 typedef int X;
328typedefDecl()
329 matches "typedef int X"
330</pre></td></tr>
331
332
Manuel Klimek532870f2013-07-24 05:46:07 +0000333<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>
334<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
335
336Given
337 template&lt;typename X&gt;
338 class C : private X {
339 using X::x;
340 };
341unresolvedUsingValueDecl()
342 matches using X::x </pre></td></tr>
343
344
Manuel Klimek67619ff2012-09-07 13:10:32 +0000345<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 +0000346<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
347
348Given
349 namespace X { int x; }
350 using X::x;
351usingDecl()
352 matches using X::x </pre></td></tr>
353
354
Stephen Hines176edba2014-12-01 14:53:08 -0800355<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
356<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
357
358Given
359 namespace X { int x; }
360 using namespace X;
361usingDirectiveDecl()
362 matches using namespace X </pre></td></tr>
363
364
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700365<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
366<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
367
368Example matches A, B, C and F
369 enum X { A, B, C };
370 void F();
371</pre></td></tr>
372
373
Manuel Klimek67619ff2012-09-07 13:10:32 +0000374<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000375<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000376
377Note: this does not match declarations of member variables, which are
378"field" declarations in Clang parlance.
379
380Example matches a
381 int a;
382</pre></td></tr>
383
384
Manuel Klimek41df16e2013-01-09 09:38:21 +0000385<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>
386<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
387</pre></td></tr>
388
389
390<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>
391<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
392
393Given
394 namespace ns {
395 struct A { static void f(); };
396 void A::f() {}
397 void g() { A::f(); }
398 }
399 ns::A a;
400nestedNameSpecifier()
401 matches "ns::" and both "A::"
402</pre></td></tr>
403
404
405<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>
406<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
407</pre></td></tr>
408
409
Stephen Hines176edba2014-12-01 14:53:08 -0800410<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('CUDAKernelCallExpr0')"><a name="CUDAKernelCallExpr0Anchor">CUDAKernelCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
411<tr><td colspan="4" class="doc" id="CUDAKernelCallExpr0"><pre>Matches CUDA kernel call expression.
412
413Example matches,
414 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
415</pre></td></tr>
416
417
Manuel Klimek67619ff2012-09-07 13:10:32 +0000418<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 +0000419<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
420
421Given
422 int i = a[1];
423arraySubscriptExpr()
424 matches "a[1]"
425</pre></td></tr>
426
427
Daniel Jaspere0b89972012-12-04 12:08:08 +0000428<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>
429<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
430
431 int i = 100;
432 __asm("mov al, 2");
433asmStmt()
434 matches '__asm("mov al, 2")'
435</pre></td></tr>
436
437
Manuel Klimek67619ff2012-09-07 13:10:32 +0000438<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 +0000439<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
440
441Example matches a || b
442 !(a || b)
443</pre></td></tr>
444
445
Manuel Klimek67619ff2012-09-07 13:10:32 +0000446<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 +0000447<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000448
449Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000450 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000451 FunctionTakesString(GetStringByValue());
452 FunctionTakesStringByPointer(GetStringPointer());
453</pre></td></tr>
454
455
Daniel Jaspere0b89972012-12-04 12:08:08 +0000456<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>
457<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
458
459Example matches true
460 true
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('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>
465<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
466
467Given
468 while (true) { break; }
469breakStmt()
470 matches 'break'
471</pre></td></tr>
472
473
474<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>
475<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
476
477Example: Matches (int*) 2.2f in
478 int i = (int) 2.2f;
479</pre></td></tr>
480
481
Manuel Klimek67619ff2012-09-07 13:10:32 +0000482<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 +0000483<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000484
485Example matches x.y() and y()
486 X x;
487 x.y();
488 y();
489</pre></td></tr>
490
491
Manuel Klimek03a83232013-06-10 08:52:15 +0000492<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>
493<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
494
495Given
496 switch(a) { case 42: break; default: break; }
497caseStmt()
498 matches 'case 42: break;'.
499</pre></td></tr>
500
501
Daniel Jaspere0b89972012-12-04 12:08:08 +0000502<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>
503<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
504
505Example: castExpr() matches each of the following:
506 (int) 3;
507 const_cast&lt;Expr *&gt;(SubExpr);
508 char c = 0;
509but does not match
510 int i = (0);
511 int k = 0;
512</pre></td></tr>
513
514
515<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>
516<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
517
518 try {} catch(int i) {}
519catchStmt()
520 matches 'catch(int i)'
521</pre></td></tr>
522
523
524<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>
525<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
526
527Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
528though.
529
530Example matches 'a', L'a'
531 char ch = 'a'; wchar_t chw = L'a';
532</pre></td></tr>
533
534
Manuel Klimek415514d2013-02-06 20:36:22 +0000535<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>
536<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
537
538Example match: {1}, (1, 2)
539 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
540</pre></td></tr>
541
542
Manuel Klimek67619ff2012-09-07 13:10:32 +0000543<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 +0000544<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000545
546Example matches '{}' and '{{}}'in 'for (;;) {{}}'
547 for (;;) {{}}
548</pre></td></tr>
549
550
Manuel Klimek67619ff2012-09-07 13:10:32 +0000551<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 +0000552<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
553
554Example matches a ? b : c
555 (a ? b : c) + 42
556</pre></td></tr>
557
558
Daniel Jaspere0b89972012-12-04 12:08:08 +0000559<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>
560<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
561
562Example: Matches const_cast&lt;int*&gt;(&amp;r) in
563 int n = 42;
564 const int &amp;r(n);
565 int* p = const_cast&lt;int*&gt;(&amp;r);
566</pre></td></tr>
567
568
Manuel Klimek67619ff2012-09-07 13:10:32 +0000569<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000570<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000571
572Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000573 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000574 void f(const string &amp;a, const string &amp;b);
575 char *ptr;
576 int n;
577 f(string(ptr, n), ptr);
578</pre></td></tr>
579
580
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
582<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
583
584Given
585 while (true) { continue; }
586continueStmt()
587 matches 'continue'
588</pre></td></tr>
589
590
Manuel Klimek67619ff2012-09-07 13:10:32 +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('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 +0000592<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000593
594Example matches x in if (x)
595 bool x;
596 if (x) {}
597</pre></td></tr>
598
599
Manuel Klimek67619ff2012-09-07 13:10:32 +0000600<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 +0000601<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000602
603Given
604 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000605declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000606 matches 'int a'.
607</pre></td></tr>
608
609
Manuel Klimek67619ff2012-09-07 13:10:32 +0000610<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 +0000611<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 +0000612
613Example matches the CXXDefaultArgExpr placeholder inserted for the
614 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000615 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000616 void f(int x, int y = 0);
617 f(42);
618</pre></td></tr>
619
620
Manuel Klimek03a83232013-06-10 08:52:15 +0000621<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>
622<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
623
624Given
625 switch(a) { case 42: break; default: break; }
626defaultStmt()
627 matches 'default: break;'.
628</pre></td></tr>
629
630
Manuel Klimek67619ff2012-09-07 13:10:32 +0000631<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 +0000632<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000633
634Given
635 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000636deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000637 matches 'delete X'.
638</pre></td></tr>
639
640
Manuel Klimek67619ff2012-09-07 13:10:32 +0000641<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 +0000642<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
643
644Given
645 do {} while (true);
646doStmt()
647 matches 'do {} while(true)'
648</pre></td></tr>
649
650
Daniel Jaspere0b89972012-12-04 12:08:08 +0000651<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>
652<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
653
654Example:
655 dynamicCastExpr()
656matches
657 dynamic_cast&lt;D*&gt;(&amp;b);
658in
659 struct B { virtual ~B() {} }; struct D : B {};
660 B b;
661 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
662</pre></td></tr>
663
664
665<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>
666<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
667
668Matches any cast expression written in user code, whether it be a
669C-style cast, a functional-style cast, or a keyword cast.
670
671Does not match implicit conversions.
672
673Note: the name "explicitCast" is chosen to match Clang's terminology, as
674Clang uses the term "cast" to apply to implicit conversions as well as to
675actual cast expressions.
676
677hasDestinationType.
678
679Example: matches all five of the casts in
680 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
681but does not match the implicit conversion in
682 long ell = 42;
683</pre></td></tr>
684
685
Manuel Klimek67619ff2012-09-07 13:10:32 +0000686<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 +0000687<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000688
689Example matches x()
690 void f() { x(); }
691</pre></td></tr>
692
693
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700694<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>
695<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
696of the sub-expression's evaluation.
697
698Example matches std::string()
699 const std::string str = std::string();
700</pre></td></tr>
701
702
Samuel Benzaquenee0da952013-08-16 16:19:42 +0000703<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>
704<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
7051.0, 1.0f, 1.0L and 1e10.
706
707Does not match implicit conversions such as
708 float a = 10;
709</pre></td></tr>
710
711
Daniel Jaspere0b89972012-12-04 12:08:08 +0000712<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>
713<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
714
715forRangeStmt() matches 'for (auto a : i)'
716 int i[] = {1, 2, 3}; for (auto a : i);
717 for(int j = 0; j &lt; 5; ++j);
718</pre></td></tr>
719
720
Manuel Klimek67619ff2012-09-07 13:10:32 +0000721<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 +0000722<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
723
724Example matches 'for (;;) {}'
725 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000726 int i[] = {1, 2, 3}; for (auto a : i);
727</pre></td></tr>
728
729
730<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>
731<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
732
733Example: Matches Foo(bar);
734 Foo f = bar;
735 Foo g = (Foo) bar;
736 Foo h = Foo(bar);
737</pre></td></tr>
738
739
740<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>
741<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
742
743Given
744 goto FOO;
745 FOO: bar();
746gotoStmt()
747 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000748</pre></td></tr>
749
750
Manuel Klimek67619ff2012-09-07 13:10:32 +0000751<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 +0000752<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
753
754Example matches 'if (x) {}'
755 if (x) {}
756</pre></td></tr>
757
758
Daniel Jaspere0b89972012-12-04 12:08:08 +0000759<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
760<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
761
762This matches many different places, including function call return value
763eliding, as well as any type conversions.
764</pre></td></tr>
765
766
Manuel Klimek67619ff2012-09-07 13:10:32 +0000767<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000768<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
769
770Given
771 int a[] = { 1, 2 };
772 struct B { int x, y; };
773 B b = { 5, 6 };
Stephen Hines176edba2014-12-01 14:53:08 -0800774initListExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000775 matches "{ 1, 2 }" and "{ 5, 6 }"
776</pre></td></tr>
777
778
Daniel Jaspere0b89972012-12-04 12:08:08 +0000779<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 +0000780<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
7811, 1L, 0x1 and 1U.
Daniel Jaspere0b89972012-12-04 12:08:08 +0000782
Samuel Benzaquenee0da952013-08-16 16:19:42 +0000783Does not match character-encoded integers such as L'a'.
Daniel Jaspere0b89972012-12-04 12:08:08 +0000784</pre></td></tr>
785
786
787<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>
788<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
789
790Given
791 goto FOO;
792 FOO: bar();
793labelStmt()
794 matches 'FOO:'
795</pre></td></tr>
796
797
798<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>
799<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
800
801Example matches [&amp;](){return 5;}
802 [&amp;](){return 5;}
803</pre></td></tr>
804
805
Manuel Klimek67619ff2012-09-07 13:10:32 +0000806<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 +0000807<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
808
809Example: Given
810 struct T {void func()};
811 T f();
812 void g(T);
813materializeTemporaryExpr() matches 'f()' in these statements
814 T u(f());
815 g(f());
816but does not match
817 f();
818 f().func();
819</pre></td></tr>
820
821
Manuel Klimek67619ff2012-09-07 13:10:32 +0000822<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000823<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000824
825Example matches x.y()
826 X x;
827 x.y();
828</pre></td></tr>
829
830
Manuel Klimek67619ff2012-09-07 13:10:32 +0000831<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000832<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000833
834Given
835 class Y {
836 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
837 int a; static int b;
838 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000839memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000840 matches this-&gt;x, x, y.x, a, this-&gt;b
841</pre></td></tr>
842
843
Manuel Klimek67619ff2012-09-07 13:10:32 +0000844<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000845<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000846
847Given
848 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000849newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000850 matches 'new X'.
851</pre></td></tr>
852
853
Daniel Jaspere0b89972012-12-04 12:08:08 +0000854<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
855<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
856</pre></td></tr>
857
858
859<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>
860<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
861
862 foo();;
863nullStmt()
864 matches the second ';'
865</pre></td></tr>
866
867
Manuel Klimek67619ff2012-09-07 13:10:32 +0000868<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 +0000869<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000870
871Note that if an operator isn't overloaded, it won't match. Instead, use
872binaryOperator matcher.
873Currently it does not match operators such as new delete.
874FIXME: figure out why these do not match?
875
876Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000877 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000878 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
879 ostream &amp;o; int b = 1, c = 1;
880 o &lt;&lt; b &lt;&lt; c;
881</pre></td></tr>
882
883
Daniel Jaspere0b89972012-12-04 12:08:08 +0000884<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>
885<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
886
887Either the source expression or the destination type can be matched
888using has(), but hasDestinationType() is more specific and can be
889more readable.
890
891Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
892 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
893</pre></td></tr>
894
895
896<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>
897<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
898
899Given
900 return 1;
901returnStmt()
902 matches 'return 1'
903</pre></td></tr>
904
905
906<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>
907<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
908
909hasDestinationType
910reinterpretCast
911
912Example:
913 staticCastExpr()
914matches
915 static_cast&lt;long&gt;(8)
916in
917 long eight(static_cast&lt;long&gt;(8));
918</pre></td></tr>
919
920
Manuel Klimek67619ff2012-09-07 13:10:32 +0000921<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 +0000922<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000923
924Given
925 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000926stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000927 matches both the compound statement '{ ++a; }' and '++a'.
928</pre></td></tr>
929
930
Daniel Jaspere0b89972012-12-04 12:08:08 +0000931<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
932<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
933
934Example matches "abcd", L"abcd"
935 char *s = "abcd"; wchar_t *ws = L"abcd"
936</pre></td></tr>
937
938
Stephen Hines176edba2014-12-01 14:53:08 -0800939<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
940<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
941
942Given
943 template &lt;int N&gt;
944 struct A { static const int n = N; };
945 struct B : public A&lt;42&gt; {};
946substNonTypeTemplateParmExpr()
947 matches "N" in the right-hand side of "static const int n = N;"
948</pre></td></tr>
949
950
Manuel Klimek67619ff2012-09-07 13:10:32 +0000951<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 +0000952<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
953
954Given
955 switch(a) { case 42: break; default: break; }
956switchCase()
957 matches 'case 42: break;' and 'default: break;'.
958</pre></td></tr>
959
960
Daniel Jaspere0b89972012-12-04 12:08:08 +0000961<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
962<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
963
964Given
965 switch(a) { case 42: break; default: break; }
966switchStmt()
967 matches 'switch(a)'.
968</pre></td></tr>
969
970
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +0000971<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>
972<tr><td colspan="4" class="doc" id="temporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
973
974Example: Matches Foo(bar, bar)
975 Foo h = Foo(bar, bar);
976</pre></td></tr>
977
978
Daniel Jaspere0b89972012-12-04 12:08:08 +0000979<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>
980<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
981
982Example matches the implicit this expression in "return i".
983 (matcher = thisExpr())
984struct foo {
985 int i;
986 int f() { return i; }
987};
988</pre></td></tr>
989
990
991<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>
992<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
993
994 try { throw 5; } catch(int i) {}
995throwExpr()
996 matches 'throw 5'
997</pre></td></tr>
998
999
1000<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>
1001<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
1002
1003 try {} catch(int i) {}
1004tryStmt()
1005 matches 'try {}'
1006</pre></td></tr>
1007
1008
Manuel Klimek67619ff2012-09-07 13:10:32 +00001009<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 +00001010<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1011
1012Given
1013 Foo x = bar;
1014 int y = sizeof(x) + alignof(x);
1015unaryExprOrTypeTraitExpr()
1016 matches sizeof(x) and alignof(x)
1017</pre></td></tr>
1018
1019
Manuel Klimek67619ff2012-09-07 13:10:32 +00001020<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 +00001021<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1022
1023Example matches !a
1024 !a || b
1025</pre></td></tr>
1026
1027
Manuel Klimek532870f2013-07-24 05:46:07 +00001028<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>
1029<tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1030
1031Example matches T(t) in return statement of f
1032 (matcher = unresolvedConstructExpr())
1033 template &lt;typename T&gt;
1034 void f(const T&amp; t) { return T(t); }
1035</pre></td></tr>
1036
1037
Daniel Jaspere0b89972012-12-04 12:08:08 +00001038<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>
1039<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1040
1041Example match: "foo"_suffix
1042</pre></td></tr>
1043
1044
Manuel Klimek67619ff2012-09-07 13:10:32 +00001045<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001046<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1047
1048Given
1049 while (true) {}
1050whileStmt()
1051 matches 'while (true) {}'.
1052</pre></td></tr>
1053
Daniel Jaspere0b89972012-12-04 12:08:08 +00001054
Stephen Hines176edba2014-12-01 14:53:08 -08001055<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
1056<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1057
1058Given
1059 template &lt;typename T&gt; struct C {};
1060 C&lt;int&gt; c;
1061templateArgument()
1062 matches 'int' in C&lt;int&gt;.
1063</pre></td></tr>
1064
1065
Daniel Jaspere0b89972012-12-04 12:08:08 +00001066<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>
1067<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1068</pre></td></tr>
1069
1070
Manuel Klimek41df16e2013-01-09 09:38:21 +00001071<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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>
1072<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1073
1074Given
1075 int a[] = { 2, 3 };
1076 int b[4];
1077 void f() { int c[a[0]]; }
1078arrayType()
1079 matches "int a[]", "int b[4]" and "int c[a[0]]";
1080</pre></td></tr>
1081
1082
1083<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>
1084<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1085
1086Given
1087 _Atomic(int) i;
1088atomicType()
1089 matches "_Atomic(int) i"
1090</pre></td></tr>
1091
1092
1093<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>
1094<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1095
1096Given:
1097 auto n = 4;
1098 int v[] = { 2, 3 }
1099 for (auto i : v) { }
1100autoType()
1101 matches "auto n" and "auto i"
1102</pre></td></tr>
1103
1104
1105<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>
1106<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1107"void (^)(int)".
1108
1109The pointee is always required to be a FunctionType.
1110</pre></td></tr>
1111
1112
1113<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>
1114<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1115
1116Given
1117 struct A {};
1118 A a;
1119 int b;
1120 float c;
1121 bool d;
1122builtinType()
1123 matches "int b", "float c" and "bool d"
1124</pre></td></tr>
1125
1126
1127<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>
1128<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1129
1130Given
1131 _Complex float f;
1132complexType()
1133 matches "_Complex float f"
1134</pre></td></tr>
1135
1136
1137<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>
1138<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1139
1140Given
1141 void() {
1142 int a[2];
1143 int b[] = { 2, 3 };
1144 int c[b[0]];
1145 }
1146constantArrayType()
1147 matches "int a[2]"
1148</pre></td></tr>
1149
1150
1151<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>
1152<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1153
1154Given
1155 template&lt;typename T, int Size&gt;
1156 class array {
1157 T data[Size];
1158 };
1159dependentSizedArrayType
1160 matches "T data[Size]"
1161</pre></td></tr>
1162
1163
Edwin Vane742d9e72013-02-25 20:43:32 +00001164<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>
1165<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1166qualified name.
1167
1168Given
1169 namespace N {
1170 namespace M {
1171 class D {};
1172 }
1173 }
1174 class C {};
1175
1176 class C c;
1177 N::M::D d;
1178
1179elaboratedType() matches the type of the variable declarations of both
1180c and d.
1181</pre></td></tr>
1182
1183
Manuel Klimek41df16e2013-01-09 09:38:21 +00001184<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>
1185<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1186
1187Given
1188 int (*f)(int);
1189 void g();
1190functionType()
1191 matches "int (*f)(int)" and the type of "g".
1192</pre></td></tr>
1193
1194
1195<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>
1196<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1197
1198Given
1199 int a[] = { 2, 3 };
1200 int b[42];
1201 void f(int c[]) { int d[a[0]]; };
1202incompleteArrayType()
1203 matches "int a[]" and "int c[]"
1204</pre></td></tr>
1205
1206
Edwin Vane8203d9f2013-03-28 13:50:22 +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('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>
1208<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001209
1210Given:
1211 int *a;
1212 int &amp;b = *a;
1213 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
Edwin Vane8203d9f2013-03-28 13:50:22 +00001219lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001220matched since the type is deduced as int&amp; by reference collapsing rules.
1221</pre></td></tr>
1222
1223
Manuel Klimek41df16e2013-01-09 09:38:21 +00001224<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>
1225<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1226Given
1227 struct A { int i; }
1228 A::* ptr = A::i;
1229memberPointerType()
1230 matches "A::* ptr"
1231</pre></td></tr>
1232
1233
Edwin Vane88be2fd2013-04-01 18:33:34 +00001234<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>
1235<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1236
1237Given
1238 int (*ptr_to_array)[4];
1239 int *array_of_ptrs[4];
1240
1241varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1242array_of_ptrs.
1243</pre></td></tr>
1244
1245
Manuel Klimek41df16e2013-01-09 09:38:21 +00001246<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>
1247<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1248
1249Given
1250 int *a;
1251 int &amp;b = *a;
1252 int c = 5;
1253pointerType()
1254 matches "int *a"
1255</pre></td></tr>
1256
1257
Edwin Vane8203d9f2013-03-28 13:50:22 +00001258<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>
1259<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1260
1261Given:
1262 int *a;
1263 int &amp;b = *a;
1264 int &amp;&amp;c = 1;
1265 auto &amp;d = b;
1266 auto &amp;&amp;e = c;
1267 auto &amp;&amp;f = 2;
1268 int g = 5;
1269
1270rValueReferenceType() matches the types of c and f. e is not
1271matched as it is deduced to int&amp; by reference collapsing rules.
1272</pre></td></tr>
1273
1274
Edwin Vane742d9e72013-02-25 20:43:32 +00001275<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>
1276<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1277
1278Given
1279 class C {};
1280 struct S {};
1281
1282 C c;
1283 S s;
1284
1285recordType() matches the type of the variable declarations of both c
1286and s.
1287</pre></td></tr>
1288
1289
Manuel Klimek41df16e2013-01-09 09:38:21 +00001290<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 +00001291<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001292
1293Given
1294 int *a;
1295 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001296 int &amp;&amp;c = 1;
1297 auto &amp;d = b;
1298 auto &amp;&amp;e = c;
1299 auto &amp;&amp;f = 2;
1300 int g = 5;
1301
1302referenceType() matches the types of b, c, d, e, and f.
1303</pre></td></tr>
1304
1305
Edwin Vane3abf7782013-02-25 14:49:29 +00001306<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>
1307<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1308
1309Given
1310 template &lt;typename T&gt;
1311 class C { };
1312
1313 template class C&lt;int&gt;; A
1314 C&lt;char&gt; var; B
1315
1316templateSpecializationType() matches the type of the explicit
1317instantiation in A and the type of the variable declaration in B.
1318</pre></td></tr>
1319
1320
Daniel Jaspere0b89972012-12-04 12:08:08 +00001321<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>
1322<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1323</pre></td></tr>
1324
Manuel Klimek41df16e2013-01-09 09:38:21 +00001325
1326<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>
1327<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1328
1329Given
1330 typedef int X;
1331typedefType()
1332 matches "typedef int X"
1333</pre></td></tr>
1334
1335
Manuel Klimek532870f2013-07-24 05:46:07 +00001336<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>
1337<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1338
1339Given:
1340 typedef __underlying_type(T) type;
1341unaryTransformType()
1342 matches "__underlying_type(T)"
1343</pre></td></tr>
1344
1345
Manuel Klimek41df16e2013-01-09 09:38:21 +00001346<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1347<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1348integer-constant-expression.
1349
1350Given
1351 void f() {
1352 int a[] = { 2, 3 }
1353 int b[42];
1354 int c[a[0]];
Stephen Hines176edba2014-12-01 14:53:08 -08001355 }
Manuel Klimek41df16e2013-01-09 09:38:21 +00001356variableArrayType()
1357 matches "int c[a[0]]"
1358</pre></td></tr>
1359
Manuel Klimek1da79332012-08-20 20:54:03 +00001360<!--END_DECL_MATCHERS -->
1361</table>
1362
1363<!-- ======================================================================= -->
1364<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1365<!-- ======================================================================= -->
1366
1367<p>Narrowing matchers match certain attributes on the current node, thus
1368narrowing down the set of nodes of the current type to match on.</p>
1369
1370<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1371which allow users to create more powerful match expressions.</p>
1372
1373<table>
1374<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1375<!-- START_NARROWING_MATCHERS -->
1376
Samuel Benzaquend36e4632013-08-27 15:11:16 +00001377<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 +00001378<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1379
1380Usable as: Any Matcher
1381</pre></td></tr>
1382
1383
Samuel Benzaquend36e4632013-08-27 15:11:16 +00001384<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 +00001385<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1386
1387Usable as: Any Matcher
1388</pre></td></tr>
1389
1390
Manuel Klimek67619ff2012-09-07 13:10:32 +00001391<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 +00001392<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1393
1394Useful when another matcher requires a child matcher, but there's no
1395additional constraint. This will often be used with an explicit conversion
1396to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1397
1398Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1399"int* p" and "void f()" in
1400 int* p;
1401 void f();
1402
1403Usable as: Any Matcher
1404</pre></td></tr>
1405
1406
Stephen Hines651f13c2014-04-23 16:59:28 -07001407<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 +00001408<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1409
Manuel Klimeke44a0062012-08-26 23:55:24 +00001410Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001411 class X {};
1412 class Y {};
1413
1414Usable as: Any Matcher
1415</pre></td></tr>
1416
1417
Manuel Klimek67619ff2012-09-07 13:10:32 +00001418<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 +00001419<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1420unary).
1421
1422Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1423 !(a || b)
1424</pre></td></tr>
1425
1426
Manuel Klimek67619ff2012-09-07 13:10:32 +00001427<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 +00001428<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1429
1430Example matches true (matcher = boolLiteral(equals(true)))
1431 true
1432
1433Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1434 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;
1435</pre></td></tr>
1436
1437
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00001438<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>
1439<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1440a specific number of arguments (including absent default arguments).
1441
1442Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1443 void f(int x, int y);
1444 f(0, 0);
1445</pre></td></tr>
1446
1447
Stephen Hines651f13c2014-04-23 16:59:28 -07001448<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>
1449<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1450</pre></td></tr>
1451
1452
Manuel Klimek67619ff2012-09-07 13:10:32 +00001453<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 +00001454<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 +00001455code (as opposed to implicitly added by the compiler).
1456
1457Given
1458 struct Foo {
1459 Foo() { }
1460 Foo(int) : foo_("A") { }
1461 string foo_;
1462 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001463constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001464 will match Foo(int), but not Foo()
1465</pre></td></tr>
1466
1467
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001468<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>
1469<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1470
1471Given
1472struct A {
1473 void foo() const;
1474 void bar();
1475};
1476
1477methodDecl(isConst()) matches A::foo() but not A::bar()
1478</pre></td></tr>
1479
1480
Edwin Vane5771a2f2013-04-09 20:46:36 +00001481<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>
1482<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1483
1484Given
1485 class A {
1486 public:
1487 virtual void x();
1488 };
1489 class B : public A {
1490 public:
1491 virtual void x();
1492 };
1493 matches B::x
1494</pre></td></tr>
1495
1496
Stephen Hines651f13c2014-04-23 16:59:28 -07001497<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>
1498<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
1499
1500Given
1501 class A {
1502 public:
1503 virtual void x() = 0;
1504 };
1505 matches A::x
1506</pre></td></tr>
1507
1508
Edwin Vane5771a2f2013-04-09 20:46:36 +00001509<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>
1510<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1511
1512Given
1513 class A {
1514 public:
1515 virtual void x();
1516 };
1517 matches A::x
1518</pre></td></tr>
1519
1520
Edwin Vane6a19a972013-03-06 17:02:57 +00001521<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>
1522<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1523
1524Matches overloaded operator names specified in strings without the
1525"operator" prefix: e.g. "&lt;&lt;".
1526
1527Given:
1528 class A { int operator*(); };
1529 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1530 A a;
1531 a &lt;&lt; a; &lt;-- This matches
1532
1533operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1534line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1535the declaration of A.
1536
Stephen Hines176edba2014-12-01 14:53:08 -08001537Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00001538</pre></td></tr>
1539
1540
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001541<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001542<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1543</pre></td></tr>
1544
1545
Manuel Klimek415514d2013-02-06 20:36:22 +00001546<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>
1547<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001548static member variable template instantiations.
1549
1550Given
1551 template&lt;typename T&gt; void A(T t) { }
1552 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001553functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001554 matches the specialization A&lt;int&gt;().
1555
1556Usable 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;
1557</pre></td></tr>
1558
1559
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001560<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
Daniel Jaspere0b89972012-12-04 12:08:08 +00001561<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1562isSameOrDerivedFrom(hasName(...)).
1563</pre></td></tr>
1564
1565
Manuel Klimek415514d2013-02-06 20:36:22 +00001566<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>
1567<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001568member variable template instantiations.
1569
1570Given
1571 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1572or
1573 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001574recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001575 matches the template instantiation of X&lt;A&gt;.
1576
1577But given
1578 template &lt;typename T&gt; class X {}; class A {};
1579 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001580recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001581 does not match, as X&lt;A&gt; is an explicit template specialization.
1582
1583Usable 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;
1584</pre></td></tr>
1585
1586
Manuel Klimek67619ff2012-09-07 13:10:32 +00001587<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 +00001588<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1589a specific number of arguments (including absent default arguments).
1590
Manuel Klimeke44a0062012-08-26 23:55:24 +00001591Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001592 void f(int x, int y);
1593 f(0, 0);
1594</pre></td></tr>
1595
1596
Manuel Klimek67619ff2012-09-07 13:10:32 +00001597<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 +00001598<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1599
1600Example matches true (matcher = boolLiteral(equals(true)))
1601 true
1602
1603Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1604 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;
1605</pre></td></tr>
1606
1607
Stephen Hines176edba2014-12-01 14:53:08 -08001608<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
1609<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
1610
1611Given
1612 template&lt;typename T&gt; struct C {};
1613 C&lt;int&gt; c;
1614classTemplateSpecializationDecl(templateArgumentCountIs(1))
1615 matches C&lt;int&gt;.
1616</pre></td></tr>
1617
1618
Manuel Klimek67619ff2012-09-07 13:10:32 +00001619<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 +00001620<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1621child statements.
1622
1623Example: Given
1624 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001625compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001626 matches '{}'
1627 but does not match the outer compound statement.
1628</pre></td></tr>
1629
1630
Daniel Jaspere0b89972012-12-04 12:08:08 +00001631<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>
1632<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1633
1634Given
1635 int a[42];
1636 int b[2 * 21];
1637 int c[41], d[43];
1638constantArrayType(hasSize(42))
1639 matches "int a[42]" and "int b[2 * 21]"
1640</pre></td></tr>
1641
1642
Manuel Klimek67619ff2012-09-07 13:10:32 +00001643<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 +00001644<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1645declarations.
1646
1647Example: Given
1648 int a, b;
1649 int c;
1650 int d = 2, e;
1651declCountIs(2)
1652 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1653</pre></td></tr>
1654
1655
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001656<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>
1657<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1658
1659Matches a node if it equals the node previously bound to ID.
1660
1661Given
1662 class X { int a; int b; };
1663recordDecl(
1664 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1665 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1666 matches the class X, as a and b have the same type.
1667
1668Note that when multiple matches are involved via forEach* matchers,
1669equalsBoundNodes acts as a filter.
1670For example:
1671compoundStmt(
1672 forEachDescendant(varDecl().bind("d")),
1673 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1674will trigger a match for each combination of variable declaration
1675and reference to that variable declaration within a compound statement.
1676</pre></td></tr>
1677
1678
Stephen Hines176edba2014-12-01 14:53:08 -08001679<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
1680<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001681
Stephen Hines176edba2014-12-01 14:53:08 -08001682Given
1683 __attribute__((device)) void f() { ... }
1684decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
1685f.
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001686</pre></td></tr>
1687
1688
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001689<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
1690<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
1691partially matching a given regex.
1692
1693Example matches Y but not X
1694 (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
1695 #include "ASTMatcher.h"
1696 class X {};
1697ASTMatcher.h:
1698 class Y {};
1699
1700Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001701</pre></td></tr>
1702
1703
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001704<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
1705<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
Stephen Hines176edba2014-12-01 14:53:08 -08001706
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001707Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
1708 #include &lt;Y.h&gt;
1709 class X {};
1710Y.h:
1711 class Y {};
1712
1713Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1714</pre></td></tr>
1715
1716
1717<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
1718<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
1719
1720Example matches Y but not X
1721 (matcher = recordDecl(isExpansionInSystemHeader())
1722 #include &lt;SystemHeader.h&gt;
1723 class X {};
1724SystemHeader.h:
1725 class Y {};
1726
1727Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1728</pre></td></tr>
1729
1730
1731<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>
1732<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
1733by the compiler (eg. implicit defaultcopy constructors).
Stephen Hines176edba2014-12-01 14:53:08 -08001734</pre></td></tr>
1735
1736
Daniel Jasperc7093d92013-02-25 12:39:41 +00001737<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>
1738<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1739
1740Given
1741 class C {
1742 public: int a;
1743 protected: int b;
1744 private: int c;
1745 };
1746fieldDecl(isPrivate())
1747 matches 'int c;'
1748</pre></td></tr>
1749
1750
1751<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>
1752<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1753
1754Given
1755 class C {
1756 public: int a;
1757 protected: int b;
1758 private: int c;
1759 };
1760fieldDecl(isProtected())
1761 matches 'int b;'
1762</pre></td></tr>
1763
1764
1765<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>
1766<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1767
1768Given
1769 class C {
1770 public: int a;
1771 protected: int b;
1772 private: int c;
1773 };
1774fieldDecl(isPublic())
1775 matches 'int a;'
1776</pre></td></tr>
1777
1778
Manuel Klimek67619ff2012-09-07 13:10:32 +00001779<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 +00001780<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1781
1782Example matches true (matcher = boolLiteral(equals(true)))
1783 true
1784
1785Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1786 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;
1787</pre></td></tr>
1788
1789
Stephen Hines176edba2014-12-01 14:53:08 -08001790<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
1791<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1792
1793Matches overloaded operator names specified in strings without the
1794"operator" prefix: e.g. "&lt;&lt;".
1795
1796Given:
1797 class A { int operator*(); };
1798 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1799 A a;
1800 a &lt;&lt; a; &lt;-- This matches
1801
1802operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1803line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1804the declaration of A.
1805
1806Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
1807</pre></td></tr>
1808
1809
Manuel Klimek415514d2013-02-06 20:36:22 +00001810<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>
1811<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001812
1813Example matches A, va, fa
1814 class A {};
1815 class B; Doesn't match, as it has no body.
1816 int va;
1817 extern int vb; Doesn't match, as it doesn't define the variable.
1818 void fa() {}
1819 void fb(); Doesn't match, as it has no body.
1820
1821Usable 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;
1822</pre></td></tr>
1823
1824
Stephen Hines176edba2014-12-01 14:53:08 -08001825<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
1826<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
1827
1828Given:
1829 void Func();
1830 void DeletedFunc() = delete;
1831functionDecl(isDeleted())
1832 matches the declaration of DeletedFunc, but not Func.
1833</pre></td></tr>
1834
1835
Manuel Klimek415514d2013-02-06 20:36:22 +00001836<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>
1837<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001838static member variable template instantiations.
1839
1840Given
1841 template&lt;typename T&gt; void A(T t) { }
1842 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001843functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001844 matches the specialization A&lt;int&gt;().
1845
1846Usable 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;
1847</pre></td></tr>
1848
1849
Manuel Klimek67619ff2012-09-07 13:10:32 +00001850<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 +00001851<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1852
1853Given:
1854 extern "C" void f() {}
1855 extern "C" { void g() {} }
1856 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001857functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001858 matches the declaration of f and g, but not the declaration h
1859</pre></td></tr>
1860
1861
Manuel Klimek415514d2013-02-06 20:36:22 +00001862<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>
1863<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001864member variable template instantiations.
1865
1866Given
1867 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1868or
1869 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001870recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001871 matches the template instantiation of X&lt;A&gt;.
1872
1873But given
1874 template &lt;typename T&gt; class X {}; class A {};
1875 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001876recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001877 does not match, as X&lt;A&gt; is an explicit template specialization.
1878
1879Usable 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;
1880</pre></td></tr>
1881
1882
Daniel Jaspere0b89972012-12-04 12:08:08 +00001883<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>
1884<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1885
1886Given
1887 void f(int i) {}
1888 void g(int i, int j) {}
1889functionDecl(parameterCountIs(2))
1890 matches g(int i, int j) {}
1891</pre></td></tr>
1892
1893
Manuel Klimek67619ff2012-09-07 13:10:32 +00001894<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 +00001895<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1896
1897Example matches true (matcher = boolLiteral(equals(true)))
1898 true
1899
1900Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1901 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;
1902</pre></td></tr>
1903
1904
Manuel Klimek67619ff2012-09-07 13:10:32 +00001905<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 +00001906<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1907to '.'.
1908
1909Member calls on the implicit this pointer match as called with '-&gt;'.
1910
1911Given
1912 class Y {
1913 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1914 int a;
1915 static int b;
1916 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001917memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001918 matches this-&gt;x, x, y.x, a, this-&gt;b
1919</pre></td></tr>
1920
1921
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001922<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 +00001923<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1924
1925Supports specifying enclosing namespaces or classes by prefixing the name
1926with '&lt;enclosing&gt;::'.
1927Does not match typedefs of an underlying type with the given name.
1928
1929Example matches X (Name == "X")
1930 class X;
1931
1932Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1933 namespace a { namespace b { class X; } }
1934</pre></td></tr>
1935
1936
Manuel Klimek67619ff2012-09-07 13:10:32 +00001937<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 +00001938<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1939a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001940
1941Supports specifying enclosing namespaces or classes by
1942prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1943of an underlying type with the given name.
1944
1945Example matches X (regexp == "::X")
1946 class X;
1947
1948Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1949 namespace foo { namespace bar { class X; } }
1950</pre></td></tr>
1951
1952
Manuel Klimek67619ff2012-09-07 13:10:32 +00001953<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 +00001954<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1955
1956Given
1957 class Y { public: void x(); };
1958 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001959callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001960 matches y-&gt;x()
1961</pre></td></tr>
1962
1963
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001964<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>
1965<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
1966
1967Matches a node if it equals the node previously bound to ID.
1968
1969Given
1970 class X { int a; int b; };
1971recordDecl(
1972 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1973 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1974 matches the class X, as a and b have the same type.
1975
1976Note that when multiple matches are involved via forEach* matchers,
1977equalsBoundNodes acts as a filter.
1978For example:
1979compoundStmt(
1980 forEachDescendant(varDecl().bind("d")),
1981 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1982will trigger a match for each combination of variable declaration
1983and reference to that variable declaration within a compound statement.
1984</pre></td></tr>
1985
1986
Edwin Vane7b69cd02013-04-02 18:15:55 +00001987<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>
1988<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1989the node, not hidden within a typedef.
1990
1991Given
1992 typedef const int const_int;
1993 const_int i;
1994 int *const j;
1995 int *volatile k;
1996 int m;
1997varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1998i is const-qualified but the qualifier is not local.
1999</pre></td></tr>
2000
2001
Manuel Klimek67619ff2012-09-07 13:10:32 +00002002<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 +00002003<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2004include "top-level" const.
2005
2006Given
2007 void a(int);
2008 void b(int const);
2009 void c(const int);
2010 void d(const int*);
2011 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00002012functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002013 matches "void b(int const)", "void c(const int)" and
2014 "void e(int const) {}". It does not match d as there
2015 is no top-level const on the parameter type "const int *".
2016</pre></td></tr>
2017
2018
Manuel Klimek67619ff2012-09-07 13:10:32 +00002019<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 +00002020<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2021
2022Given
2023 void a(int);
2024 void b(long);
2025 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002026functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002027matches "a(int)", "b(long)", but not "c(double)".
2028</pre></td></tr>
2029
2030
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002031<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>
2032<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2033
2034Matches a node if it equals the node previously bound to ID.
2035
2036Given
2037 class X { int a; int b; };
2038recordDecl(
2039 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2040 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2041 matches the class X, as a and b have the same type.
2042
2043Note that when multiple matches are involved via forEach* matchers,
2044equalsBoundNodes acts as a filter.
2045For example:
2046compoundStmt(
2047 forEachDescendant(varDecl().bind("d")),
2048 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2049will trigger a match for each combination of variable declaration
2050and reference to that variable declaration within a compound statement.
2051</pre></td></tr>
2052
2053
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002054<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
2055<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
2056partially matching a given regex.
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00002057
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002058Example matches Y but not X
2059 (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2060 #include "ASTMatcher.h"
2061 class X {};
2062ASTMatcher.h:
2063 class Y {};
2064
2065Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2066</pre></td></tr>
2067
2068
2069<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
2070<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
2071
2072Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2073 #include &lt;Y.h&gt;
2074 class X {};
2075Y.h:
2076 class Y {};
2077
2078Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2079</pre></td></tr>
2080
2081
2082<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
2083<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
2084
2085Example matches Y but not X
2086 (matcher = recordDecl(isExpansionInSystemHeader())
2087 #include &lt;SystemHeader.h&gt;
2088 class X {};
2089SystemHeader.h:
2090 class Y {};
2091
2092Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00002093</pre></td></tr>
2094
2095
Manuel Klimek415514d2013-02-06 20:36:22 +00002096<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>
2097<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00002098
2099Example matches A, va, fa
2100 class A {};
2101 class B; Doesn't match, as it has no body.
2102 int va;
2103 extern int vb; Doesn't match, as it doesn't define the variable.
2104 void fa() {}
2105 void fb(); Doesn't match, as it has no body.
2106
2107Usable 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;
2108</pre></td></tr>
2109
2110
Stephen Hines176edba2014-12-01 14:53:08 -08002111<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
2112<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
2113
2114Note that 'Value' is a string as the template argument's value is
2115an arbitrary precision integer. 'Value' must be euqal to the canonical
2116representation of that integral value in base 10.
2117
2118Given
2119 template&lt;int T&gt; struct A {};
2120 C&lt;42&gt; c;
2121classTemplateSpecializationDecl(
2122 hasAnyTemplateArgument(equalsIntegralValue("42")))
2123 matches the implicit instantiation of C in C&lt;42&gt;.
2124</pre></td></tr>
2125
2126
2127<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
2128<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
2129
2130Given
2131 template&lt;int T&gt; struct A {};
2132 C&lt;42&gt; c;
2133classTemplateSpecializationDecl(
2134 hasAnyTemplateArgument(isIntegral()))
2135 matches the implicit instantiation of C in C&lt;42&gt;
2136 with isIntegral() matching 42.
2137</pre></td></tr>
2138
2139
2140<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
2141<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
2142
2143Given
2144 template&lt;typename T&gt; struct C {};
2145 C&lt;int&gt; c;
2146classTemplateSpecializationDecl(templateArgumentCountIs(1))
2147 matches C&lt;int&gt;.
2148</pre></td></tr>
2149
2150
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002151<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
2152<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
2153partially matching a given regex.
2154
2155Example matches Y but not X
2156 (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2157 #include "ASTMatcher.h"
2158 class X {};
2159ASTMatcher.h:
2160 class Y {};
2161
2162Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2163</pre></td></tr>
2164
2165
2166<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
2167<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
2168
2169Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2170 #include &lt;Y.h&gt;
2171 class X {};
2172Y.h:
2173 class Y {};
2174
2175Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2176</pre></td></tr>
2177
2178
2179<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
2180<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
2181
2182Example matches Y but not X
2183 (matcher = recordDecl(isExpansionInSystemHeader())
2184 #include &lt;SystemHeader.h&gt;
2185 class X {};
2186SystemHeader.h:
2187 class Y {};
2188
2189Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2190</pre></td></tr>
2191
2192
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002193<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>
2194<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2195
2196Matches a node if it equals the node previously bound to ID.
2197
2198Given
2199 class X { int a; int b; };
2200recordDecl(
2201 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2202 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2203 matches the class X, as a and b have the same type.
2204
2205Note that when multiple matches are involved via forEach* matchers,
2206equalsBoundNodes acts as a filter.
2207For example:
2208compoundStmt(
2209 forEachDescendant(varDecl().bind("d")),
2210 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2211will trigger a match for each combination of variable declaration
2212and reference to that variable declaration within a compound statement.
2213</pre></td></tr>
2214
2215
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002216<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
2217<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
2218
2219Given
2220 struct S { void func(); };
2221functionDecl(returns(voidType()))
2222 matches "void func();"
2223</pre></td></tr>
2224
2225
Manuel Klimek67619ff2012-09-07 13:10:32 +00002226<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002227<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2228
2229Given
2230 int x;
2231 int s = sizeof(x) + alignof(x)
2232unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2233 matches sizeof(x)
2234</pre></td></tr>
2235
2236
Manuel Klimek67619ff2012-09-07 13:10:32 +00002237<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 +00002238<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2239unary).
2240
2241Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2242 !(a || b)
2243</pre></td></tr>
2244
2245
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002246<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>
2247<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
2248
2249Example matches y and z (matcher = varDecl(hasGlobalStorage())
2250void f() {
2251 int x;
2252 static int y;
2253}
2254int z;
2255</pre></td></tr>
2256
2257
2258<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>
2259<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
2260non-static local variable.
2261
2262Example matches x (matcher = varDecl(hasLocalStorage())
2263void f() {
2264 int x;
2265 static int y;
2266}
2267int z;
2268</pre></td></tr>
2269
2270
Manuel Klimek67619ff2012-09-07 13:10:32 +00002271<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 +00002272<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2273
2274Example matches A, va, fa
2275 class A {};
2276 class B; Doesn't match, as it has no body.
2277 int va;
2278 extern int vb; Doesn't match, as it doesn't define the variable.
2279 void fa() {}
2280 void fb(); Doesn't match, as it has no body.
2281
2282Usable 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;
2283</pre></td></tr>
2284
2285
Manuel Klimek67619ff2012-09-07 13:10:32 +00002286<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 +00002287<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2288static member variable template instantiations.
2289
2290Given
2291 template&lt;typename T&gt; void A(T t) { }
2292 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002293functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002294 matches the specialization A&lt;int&gt;().
2295
2296Usable 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;
2297</pre></td></tr>
2298
2299
Manuel Klimek67619ff2012-09-07 13:10:32 +00002300<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 +00002301<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2302member variable template instantiations.
2303
2304Given
2305 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2306or
2307 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002308recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002309 matches the template instantiation of X&lt;A&gt;.
2310
2311But given
2312 template &lt;typename T&gt; class X {}; class A {};
2313 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002314recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002315 does not match, as X&lt;A&gt; is an explicit template specialization.
2316
2317Usable 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;
2318</pre></td></tr>
2319
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002320
2321<tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
2322<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
2323template instantiations.
2324
2325Given
2326 template&lt;typename T&gt; void A(T t) { T i; }
2327 A(0);
2328 A(0U);
2329functionDecl(isInstantiated())
2330 matches 'A(int) {...};' and 'A(unsigned) {...}'.
2331</pre></td></tr>
2332
2333
2334<tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
2335<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
2336
2337Given
2338 int j;
2339 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
2340 A(0);
2341 A(0U);
2342declStmt(isInTemplateInstantiation())
2343 matches 'int i;' and 'unsigned i'.
2344unless(stmt(isInTemplateInstantiation()))
2345 will NOT match j += 42; as it's shared between the template definition and
2346 instantiation.
2347</pre></td></tr>
2348
Manuel Klimek1da79332012-08-20 20:54:03 +00002349<!--END_NARROWING_MATCHERS -->
2350</table>
2351
2352<!-- ======================================================================= -->
2353<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2354<!-- ======================================================================= -->
2355
2356<p>Traversal matchers specify the relationship to other nodes that are
2357reachable from the current node.</p>
2358
2359<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2360forEachDescendant) which work on all nodes and allow users to write more generic
2361match expressions.</p>
2362
2363<table>
2364<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2365<!-- START_TRAVERSAL_MATCHERS -->
2366
Samuel Benzaquend36e4632013-08-27 15:11:16 +00002367<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 +00002368<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2369
2370Unlike anyOf, eachOf will generate a match result for each
2371matching submatcher.
2372
2373For example, in:
2374 class A { int a; int b; };
2375The matcher:
2376 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2377 has(fieldDecl(hasName("b")).bind("v"))))
2378will generate two results binding "v", the first of which binds
2379the field declaration of a, the second the field declaration of
2380b.
2381
2382Usable as: Any Matcher
2383</pre></td></tr>
2384
2385
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002386<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 +00002387<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2388provided matcher.
2389
2390Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002391 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002392 class X {}; Matches X, because X::X is a class of name X inside X.
2393 class A { class X {}; };
2394 class B { class C { class X {}; }; };
2395
2396DescendantT must be an AST base type.
2397
2398As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2399each result that matches instead of only on the first one.
2400
2401Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002402 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002403will match 10 times (plus injected class name matches) on:
2404 class A { class B { class C { class D { class E {}; }; }; }; };
2405
2406Usable as: Any Matcher
2407</pre></td></tr>
2408
2409
Stephen Hines651f13c2014-04-23 16:59:28 -07002410<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
2411<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 +00002412provided matcher.
2413
Stephen Hines651f13c2014-04-23 16:59:28 -07002414Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002415 class X {}; Matches X, because X::X is a class of name X inside X.
2416 class Y { class X {}; };
2417 class Z { class Y { class X {}; }; }; Does not match Z.
2418
2419ChildT must be an AST base type.
2420
Stephen Hines651f13c2014-04-23 16:59:28 -07002421As opposed to 'has', 'forEach' will cause a match for each result that
2422matches instead of only on the first one.
2423
Manuel Klimek1da79332012-08-20 20:54:03 +00002424Usable as: Any Matcher
2425</pre></td></tr>
2426
2427
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002428<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 +00002429<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2430matcher.
2431
2432Given
2433void f() { if (true) { int x = 42; } }
2434void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002435expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002436
2437Usable as: Any Matcher
2438</pre></td></tr>
2439
2440
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002441<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 +00002442<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2443provided matcher.
2444
2445Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002446 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002447 class X {}; Matches X, because X::X is a class of name X inside X.
2448 class Y { class X {}; };
2449 class Z { class Y { class X {}; }; };
2450
2451DescendantT must be an AST base type.
2452
2453Usable as: Any Matcher
2454</pre></td></tr>
2455
2456
Stephen Hines651f13c2014-04-23 16:59:28 -07002457<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
2458<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2459provided matcher.
2460
2461Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
2462 class X {}; Matches X, because X::X is a class of name X inside X.
2463 class Y { class X {}; };
2464 class Z { class Y { class X {}; }; }; Does not match Z.
2465
2466ChildT must be an AST base type.
2467
2468Usable as: Any Matcher
2469</pre></td></tr>
2470
2471
Samuel Benzaquenee0da952013-08-16 16:19:42 +00002472<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 +00002473<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2474matcher.
2475
2476Given
2477void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2478compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2479
2480Usable as: Any Matcher
2481</pre></td></tr>
2482
2483
Manuel Klimek67619ff2012-09-07 13:10:32 +00002484<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 +00002485<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2486
2487Given
2488 int i[5];
2489 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002490arraySubscriptExpression(hasBase(implicitCastExpr(
2491 hasSourceExpression(declRefExpr()))))
2492 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002493</pre></td></tr>
2494
2495
Manuel Klimek67619ff2012-09-07 13:10:32 +00002496<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 +00002497<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2498
2499Given
2500 int i[5];
2501 void f() { i[1] = 42; }
2502arraySubscriptExpression(hasIndex(integerLiteral()))
2503 matches i[1] with the integerLiteral() matching 1
2504</pre></td></tr>
2505
2506
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002507<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>
2508<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 +00002509type.
2510
2511Given
2512 struct A {};
2513 A a[7];
2514 int b[7];
2515arrayType(hasElementType(builtinType()))
2516 matches "int b[7]"
2517
2518Usable 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;
2519</pre></td></tr>
2520
2521
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002522<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>
2523<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 +00002524type.
2525
2526Given
2527 struct A {};
2528 A a[7];
2529 int b[7];
2530arrayType(hasElementType(builtinType()))
2531 matches "int b[7]"
2532
2533Usable 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;
2534</pre></td></tr>
2535
2536
2537<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>
2538<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2539
2540Given
2541 _Atomic(int) i;
2542 _Atomic(float) f;
2543atomicType(hasValueType(isInteger()))
2544 matches "_Atomic(int) i"
2545
2546Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2547</pre></td></tr>
2548
2549
2550<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>
2551<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2552
2553Given
2554 _Atomic(int) i;
2555 _Atomic(float) f;
2556atomicType(hasValueType(isInteger()))
2557 matches "_Atomic(int) i"
2558
2559Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2560</pre></td></tr>
2561
2562
2563<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>
2564<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2565
2566Note: There is no TypeLoc for the deduced type and thus no
2567getDeducedLoc() matcher.
2568
2569Given
2570 auto a = 1;
2571 auto b = 2.0;
2572autoType(hasDeducedType(isInteger()))
2573 matches "auto a"
2574
2575Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2576</pre></td></tr>
2577
2578
Manuel Klimek67619ff2012-09-07 13:10:32 +00002579<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 +00002580<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2581binary operator matches.
2582</pre></td></tr>
2583
2584
Manuel Klimek67619ff2012-09-07 13:10:32 +00002585<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 +00002586<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2587
2588Example matches a (matcher = binaryOperator(hasLHS()))
2589 a || b
2590</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_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 +00002594<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2595
2596Example matches b (matcher = binaryOperator(hasRHS()))
2597 a || b
2598</pre></td></tr>
2599
2600
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002601<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>
2602<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 +00002603pointee matches a given matcher.
2604
2605Given
2606 int *a;
2607 int const *b;
2608 float const *f;
2609pointerType(pointee(isConstQualified(), isInteger()))
2610 matches "int const *b"
2611
2612Usable 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;,
2613 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;
2614</pre></td></tr>
2615
2616
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002617<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>
2618<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 +00002619pointee matches a given matcher.
2620
2621Given
2622 int *a;
2623 int const *b;
2624 float const *f;
2625pointerType(pointee(isConstQualified(), isInteger()))
2626 matches "int const *b"
2627
2628Usable 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;,
2629 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;
2630</pre></td></tr>
2631
2632
Samuel Benzaquenef7eb022013-06-21 15:51:31 +00002633<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>
2634<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
2635expression.
2636
2637Given
2638 void x(int, int, int) { int y; x(1, y, 42); }
2639callExpr(hasAnyArgument(declRefExpr()))
2640 matches x(1, y, 42)
2641with hasAnyArgument(...)
2642 matching y
2643
2644FIXME: Currently this will ignore parentheses and implicit casts on
2645the argument before applying the inner matcher. We'll want to remove
2646this to allow for greater control by the user once ignoreImplicit()
2647has been implemented.
2648</pre></td></tr>
2649
2650
2651<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>
2652<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
2653call expression.
2654
2655Example matches y in x(y)
2656 (matcher = callExpr(hasArgument(0, declRefExpr())))
2657 void x(int) { int y; x(y); }
2658</pre></td></tr>
2659
2660
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002661<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>
2662<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 +00002663matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002664
Manuel Klimek03a83232013-06-10 08:52:15 +00002665The associated declaration is:
2666- for type nodes, the declaration of the underlying type
2667- for CallExpr, the declaration of the callee
2668- for MemberExpr, the declaration of the referenced member
2669- for CXXConstructExpr, the declaration of the constructor
2670
2671Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2672function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00002673
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002674Usable 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;,
2675 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;,
2676 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;,
2677 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;,
2678 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;,
2679 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 +00002680</pre></td></tr>
2681
2682
Manuel Klimek532870f2013-07-24 05:46:07 +00002683<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>
2684<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
2685
2686Given
2687 class A { A() : i(42), j(42) {} int i; int j; };
2688constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
2689 will trigger two matches, binding for 'i' and 'j' respectively.
2690</pre></td></tr>
2691
2692
Manuel Klimek67619ff2012-09-07 13:10:32 +00002693<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 +00002694<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2695
2696Given
2697 struct Foo {
2698 Foo() : foo_(1) { }
2699 int foo_;
2700 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002701recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002702 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2703</pre></td></tr>
2704
2705
Manuel Klimek67619ff2012-09-07 13:10:32 +00002706<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 +00002707<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2708
2709Given
2710 struct Foo {
2711 Foo() : foo_(1) { }
2712 int foo_;
2713 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002714recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002715 forField(hasName("foo_"))))))
2716 matches Foo
2717with forField matching foo_
2718</pre></td></tr>
2719
2720
Manuel Klimek67619ff2012-09-07 13:10:32 +00002721<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 +00002722<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2723
2724Given
2725 struct Foo {
2726 Foo() : foo_(1) { }
2727 int foo_;
2728 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002729recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002730 withInitializer(integerLiteral(equals(1)))))))
2731 matches Foo
2732with withInitializer matching (1)
2733</pre></td></tr>
2734
2735
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002736<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>
2737<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', or 'do while' statement that has
2738a given body.
2739
2740Given
2741 for (;;) {}
2742hasBody(compoundStmt())
2743 matches 'for (;;) {}'
2744with compoundStmt()
2745 matching '{}'
2746</pre></td></tr>
2747
2748
Stephen Hines651f13c2014-04-23 16:59:28 -07002749<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>
2750<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
2751
2752Example:
2753 forStmt(hasLoopVariable(anything()))
2754matches 'int x' in
2755 for (int x : a) { }
2756</pre></td></tr>
2757
2758
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002759<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>
2760<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
2761
2762Example:
2763 forStmt(hasRangeInit(anything()))
2764matches 'a' in
2765 for (int x : a) { }
2766</pre></td></tr>
2767
2768
Stephen Hines651f13c2014-04-23 16:59:28 -07002769<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>
2770<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2771
2772
Manuel Klimek67619ff2012-09-07 13:10:32 +00002773<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 +00002774<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2775
Manuel Klimeke44a0062012-08-26 23:55:24 +00002776Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002777 class Y { public: void x(); };
2778 void z() { Y y; y.x(); }",
2779
2780FIXME: Overload to allow directly matching types?
2781</pre></td></tr>
2782
2783
Manuel Klimek532870f2013-07-24 05:46:07 +00002784<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 +00002785<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2786</pre></td></tr>
2787
2788
Stephen Hines651f13c2014-04-23 16:59:28 -07002789<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>
2790<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
2791matcher, or is a pointer to a type that matches the InnerMatcher.
2792</pre></td></tr>
2793
2794
Manuel Klimek67619ff2012-09-07 13:10:32 +00002795<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 +00002796<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2797belongs to.
2798
2799FIXME: Generalize this for other kinds of declarations.
2800FIXME: What other kind of declarations would we need to generalize
2801this to?
2802
2803Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002804 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002805 ofClass(hasName("A"))))))
2806 class A {
2807 public:
2808 A();
2809 };
2810 A a = A();
2811</pre></td></tr>
2812
2813
Edwin Vane6a19a972013-03-06 17:02:57 +00002814<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>
2815<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2816
2817Given:
2818 class A { void func(); };
2819 class B { void member(); };
2820
2821recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2822but not B.
2823</pre></td></tr>
2824
2825
Manuel Klimek67619ff2012-09-07 13:10:32 +00002826<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 +00002827<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2828a class matching Base.
2829
Manuel Klimek67619ff2012-09-07 13:10:32 +00002830Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002831
Manuel Klimek67619ff2012-09-07 13:10:32 +00002832Example matches Y, Z, C (Base == hasName("X"))
2833 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002834 class Y : public X {}; directly derived
2835 class Z : public Y {}; indirectly derived
2836 typedef X A;
2837 typedef A B;
2838 class C : public B {}; derived from a typedef of X
2839
2840In the following example, Bar matches isDerivedFrom(hasName("X")):
2841 class Foo;
2842 typedef Foo X;
2843 class Bar : public Foo {}; derived from a type that X is a typedef of
2844</pre></td></tr>
2845
2846
Daniel Jaspere0b89972012-12-04 12:08:08 +00002847<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>
2848<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2849match Base.
2850</pre></td></tr>
2851
2852
Manuel Klimek532870f2013-07-24 05:46:07 +00002853<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 +00002854<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2855given matcher.
2856
Manuel Klimeke44a0062012-08-26 23:55:24 +00002857Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002858 class Y { public: void x(); };
Stephen Hines176edba2014-12-01 14:53:08 -08002859 void z() { Y y; y.x(); }
Manuel Klimek1da79332012-08-20 20:54:03 +00002860</pre></td></tr>
2861
2862
Stephen Hines651f13c2014-04-23 16:59:28 -07002863<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>
2864<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
2865
2866Given
2867 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
2868 void f() { f(); }
2869callExpr(callee(expr()))
2870 matches this-&gt;x(), x(), y.x(), f()
2871with callee(...)
2872 matching this-&gt;x, x, y.x, f respectively
2873
2874Note: Callee cannot take the more general internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
2875because this introduces ambiguous overloads with calls to Callee taking a
2876internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
2877implemented in terms of implicit casts.
2878</pre></td></tr>
2879
2880
Manuel Klimek67619ff2012-09-07 13:10:32 +00002881<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 +00002882<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2883expression.
2884
2885Given
2886 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002887callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002888 matches x(1, y, 42)
2889with hasAnyArgument(...)
2890 matching y
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002891
2892FIXME: Currently this will ignore parentheses and implicit casts on
2893the argument before applying the inner matcher. We'll want to remove
2894this to allow for greater control by the user once ignoreImplicit()
2895has been implemented.
Manuel Klimek1da79332012-08-20 20:54:03 +00002896</pre></td></tr>
2897
2898
Manuel Klimek67619ff2012-09-07 13:10:32 +00002899<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002900<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2901call expression.
2902
2903Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002904 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002905 void x(int) { int y; x(y); }
2906</pre></td></tr>
2907
2908
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002909<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>
2910<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 +00002911matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002912
Manuel Klimek03a83232013-06-10 08:52:15 +00002913The associated declaration is:
2914- for type nodes, the declaration of the underlying type
2915- for CallExpr, the declaration of the callee
2916- for MemberExpr, the declaration of the referenced member
2917- for CXXConstructExpr, the declaration of the constructor
2918
2919Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2920function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00002921
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00002922Usable 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;,
2923 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;,
2924 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;,
2925 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;,
2926 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;,
2927 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 +00002928</pre></td></tr>
2929
2930
Manuel Klimek03a83232013-06-10 08:52:15 +00002931<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>
2932<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2933extension, matches the constant given in the statement.
2934
2935Given
2936 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2937caseStmt(hasCaseConstant(integerLiteral()))
2938 matches "case 1:"
2939</pre></td></tr>
2940
2941
Manuel Klimek67619ff2012-09-07 13:10:32 +00002942<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002943<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2944
2945Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002946 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002947class URL { URL(string); };
2948URL url = "a string";
2949</pre></td></tr>
2950
2951
Manuel Klimek67619ff2012-09-07 13:10:32 +00002952<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002953<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2954TemplateArgument matching the given InnerMatcher.
2955
2956Given
2957 template&lt;typename T&gt; class A {};
2958 template&lt;&gt; class A&lt;double&gt; {};
2959 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002960classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002961 refersToType(asString("int"))))
2962 matches the specialization A&lt;int&gt;
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_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 +00002967<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2968matches the given InnerMatcher.
2969
2970Given
2971 template&lt;typename T, typename U&gt; class A {};
2972 A&lt;bool, int&gt; b;
2973 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002974classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002975 1, refersToType(asString("int"))))
2976 matches the specialization A&lt;bool, int&gt;
2977</pre></td></tr>
2978
2979
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002980<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>
2981<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 +00002982type.
2983
2984Given
2985 struct A {};
2986 A a[7];
2987 int b[7];
2988arrayType(hasElementType(builtinType()))
2989 matches "int b[7]"
2990
2991Usable 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;
2992</pre></td></tr>
2993
2994
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00002995<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>
2996<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 +00002997type.
2998
2999Given
3000 struct A {};
3001 A a[7];
3002 int b[7];
3003arrayType(hasElementType(builtinType()))
3004 matches "int b[7]"
3005
3006Usable 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;
3007</pre></td></tr>
3008
3009
Manuel Klimek67619ff2012-09-07 13:10:32 +00003010<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 +00003011<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
3012a given matcher.
3013
3014Given
3015 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003016hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003017 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003018with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003019 matching '{}'
3020</pre></td></tr>
3021
3022
Manuel Klimek67619ff2012-09-07 13:10:32 +00003023<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 +00003024<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
3025or conditional operator.
3026
3027Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3028 if (true) {}
3029</pre></td></tr>
3030
3031
Manuel Klimek67619ff2012-09-07 13:10:32 +00003032<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 +00003033<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
3034
3035Example matches b
3036 condition ? a : b
3037</pre></td></tr>
3038
3039
Manuel Klimek67619ff2012-09-07 13:10:32 +00003040<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 +00003041<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3042
3043Example matches a
3044 condition ? a : b
3045</pre></td></tr>
3046
3047
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003048<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>
3049<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
3050matches the given matcher.
3051
3052The associated declaration is:
3053- for type nodes, the declaration of the underlying type
3054- for CallExpr, the declaration of the callee
3055- for MemberExpr, the declaration of the referenced member
3056- for CXXConstructExpr, the declaration of the constructor
3057
3058Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3059function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003060
3061Usable 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;,
3062 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;,
3063 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;,
3064 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;,
3065 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;,
3066 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;
3067</pre></td></tr>
3068
3069
Manuel Klimek67619ff2012-09-07 13:10:32 +00003070<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 +00003071<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
3072specific using shadow declaration.
3073
3074FIXME: This currently only works for functions. Fix.
3075
3076Given
3077 namespace a { void f() {} }
3078 using a::f;
3079 void g() {
3080 f(); Matches this ..
3081 a::f(); .. but not this.
3082 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003083declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003084 matches f()
3085</pre></td></tr>
3086
3087
Manuel Klimek67619ff2012-09-07 13:10:32 +00003088<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 +00003089<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
3090specified matcher.
3091
3092Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00003093 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003094 bool x;
3095 if (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_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 +00003100<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
3101
3102Note that this does not work for global declarations because the AST
3103breaks up multiple-declaration DeclStmt's into multiple single-declaration
3104DeclStmt's.
3105Example: Given non-global declarations
3106 int a, b = 0;
3107 int c;
3108 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003109declStmt(containsDeclaration(
3110 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003111 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00003112declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003113 matches 'int a, b = 0' as well as 'int d = 2, e;'
3114 but 'int c;' is not matched.
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_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 +00003119<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
3120
3121Given
3122 int a, b;
3123 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003124declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003125 matches 'int c;' but not 'int a, b;'.
3126</pre></td></tr>
3127
3128
Manuel Klimek1a68afd2013-06-20 13:08:29 +00003129<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>
3130<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
3131the inner matcher.
3132
3133Given
3134 int x;
3135declaratorDecl(hasTypeLoc(loc(asString("int"))))
3136 matches int x
3137</pre></td></tr>
3138
3139
Edwin Vane742d9e72013-02-25 20:43:32 +00003140<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>
3141<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
3142Decl, matches InnerMatcher.
3143
3144Given
3145 namespace N {
3146 namespace M {
3147 class D {};
3148 }
3149 }
3150
3151recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3152declaration of class D.
3153</pre></td></tr>
3154
3155
Manuel Klimek67619ff2012-09-07 13:10:32 +00003156<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 +00003157<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
3158a given body.
3159
3160Given
3161 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003162hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003163 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003164with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003165 matching '{}'
3166</pre></td></tr>
3167
3168
Manuel Klimek67619ff2012-09-07 13:10:32 +00003169<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 +00003170<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
3171or conditional operator.
3172
3173Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3174 if (true) {}
3175</pre></td></tr>
3176
3177
Edwin Vane742d9e72013-02-25 20:43:32 +00003178<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>
3179<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00003180matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00003181
3182Given
3183 namespace N {
3184 namespace M {
3185 class D {};
3186 }
3187 }
3188 N::M::D d;
3189
3190elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3191matches the type of the variable declaration of d.
3192</pre></td></tr>
3193
3194
3195<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>
3196<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
3197
3198Given
3199 namespace N {
3200 namespace M {
3201 class D {};
3202 }
3203 }
3204 N::M::D d;
3205
3206elaboratedType(namesType(recordType(
3207hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3208declaration of d.
3209</pre></td></tr>
3210
3211
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003212<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>
3213<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
3214matches the given matcher.
3215
3216The associated declaration is:
3217- for type nodes, the declaration of the underlying type
3218- for CallExpr, the declaration of the callee
3219- for MemberExpr, the declaration of the referenced member
3220- for CXXConstructExpr, the declaration of the constructor
3221
3222Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3223function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003224
3225Usable 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;,
3226 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;,
3227 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;,
3228 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;,
3229 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;,
3230 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;
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_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 +00003235<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
3236
3237(Note: Clang's AST refers to other conversions as "casts" too, and calls
3238actual casts "explicit" casts.)
3239</pre></td></tr>
3240
3241
Manuel Klimek532870f2013-07-24 05:46:07 +00003242<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>
3243<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 +00003244declaration's type.
3245
3246In case of a value declaration (for example a variable declaration),
3247this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003248declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3249while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003250of x."
3251
Manuel Klimeke44a0062012-08-26 23:55:24 +00003252Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3253 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003254 class X {};
3255 void y(X &amp;x) { x; X z; }
3256
3257Usable 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;
3258</pre></td></tr>
3259
3260
Stephen Hines651f13c2014-04-23 16:59:28 -07003261<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>
3262<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
3263matcher.
3264
3265Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3266 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3267 class X {};
3268 void y(X &amp;x) { x; X z; }
3269</pre></td></tr>
3270
3271
Manuel Klimek67619ff2012-09-07 13:10:32 +00003272<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 +00003273<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
3274are stripped off.
3275
3276Parentheses and explicit casts are not discarded.
3277Given
3278 int arr[5];
3279 int a = 0;
3280 char b = 0;
3281 const int c = a;
3282 int *d = arr;
3283 long e = (long) 0l;
3284The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00003285 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
3286 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003287would match the declarations for a, b, c, and d, but not e.
3288While
Manuel Klimeke44a0062012-08-26 23:55:24 +00003289 varDecl(hasInitializer(integerLiteral()))
3290 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003291only match the declarations for b, c, and d.
3292</pre></td></tr>
3293
3294
Manuel Klimek67619ff2012-09-07 13:10:32 +00003295<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 +00003296<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
3297casts are stripped off.
3298
3299Implicit and non-C Style casts are also discarded.
3300Given
3301 int a = 0;
3302 char b = (0);
3303 void* c = reinterpret_cast&lt;char*&gt;(0);
3304 char d = char(0);
3305The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00003306 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003307would match the declarations for a, b, c, and d.
3308while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003309 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003310only match the declaration for a.
3311</pre></td></tr>
3312
3313
Manuel Klimek67619ff2012-09-07 13:10:32 +00003314<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 +00003315<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
3316parentheses are stripped off.
3317
3318Explicit casts are not discarded.
3319Given
3320 int arr[5];
3321 int a = 0;
3322 char b = (0);
3323 const int c = a;
3324 int *d = (arr);
3325 long e = ((long) 0l);
3326The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00003327 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3328 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003329would match the declarations for a, b, c, and d, but not e.
3330while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003331 varDecl(hasInitializer(integerLiteral()))
3332 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003333would only match the declaration for a.
3334</pre></td></tr>
3335
3336
Manuel Klimek67619ff2012-09-07 13:10:32 +00003337<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 +00003338<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3339a given body.
3340
3341Given
3342 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003343hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003344 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003345with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003346 matching '{}'
3347</pre></td></tr>
3348
3349
Manuel Klimek67619ff2012-09-07 13:10:32 +00003350<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 +00003351<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3352or conditional operator.
3353
3354Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3355 if (true) {}
3356</pre></td></tr>
3357
3358
Manuel Klimek67619ff2012-09-07 13:10:32 +00003359<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 +00003360<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3361
3362Example:
3363 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3364matches '++x' in
3365 for (x; x &lt; N; ++x) { }
3366</pre></td></tr>
3367
3368
Manuel Klimek67619ff2012-09-07 13:10:32 +00003369<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 +00003370<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3371
3372Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00003373 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003374matches 'int x = 0' in
3375 for (int x = 0; x &lt; N; ++x) { }
3376</pre></td></tr>
3377
3378
Manuel Klimek67619ff2012-09-07 13:10:32 +00003379<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 +00003380<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3381
3382Does not match the 'this' parameter of a method.
3383
3384Given
3385 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003386methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003387 matches f(int x, int y, int z) {}
3388with hasAnyParameter(...)
3389 matching int y
3390</pre></td></tr>
3391
3392
Manuel Klimek67619ff2012-09-07 13:10:32 +00003393<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 +00003394<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3395
3396Given
3397 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003398methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003399 matches f(int x) {}
3400with hasParameter(...)
3401 matching int x
3402</pre></td></tr>
3403
3404
Manuel Klimek67619ff2012-09-07 13:10:32 +00003405<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 +00003406<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3407
3408Given:
3409 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003410methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003411 matches int f() { return 1; }
3412</pre></td></tr>
3413
3414
Manuel Klimek67619ff2012-09-07 13:10:32 +00003415<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 +00003416<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3417or conditional operator.
3418
3419Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3420 if (true) {}
3421</pre></td></tr>
3422
3423
Manuel Klimek67619ff2012-09-07 13:10:32 +00003424<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 +00003425<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3426
3427Given
3428 if (A* a = GetAPointer()) {}
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003429hasConditionVariableStatement(...)
Manuel Klimek1da79332012-08-20 20:54:03 +00003430 matches 'A* a = GetAPointer()'.
3431</pre></td></tr>
3432
3433
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003434<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>
3435<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
3436
3437Examples matches the if statement
3438 (matcher = ifStmt(hasElse(boolLiteral(equals(true)))))
3439 if (false) false; else true;
3440</pre></td></tr>
3441
3442
3443<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>
3444<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
3445
3446Examples matches the if statement
3447 (matcher = ifStmt(hasThen(boolLiteral(equals(true)))))
3448 if (false) true; else false;
3449</pre></td></tr>
3450
3451
Manuel Klimek67619ff2012-09-07 13:10:32 +00003452<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 +00003453<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3454matcher.
3455
3456FIXME: Unit test this matcher
3457</pre></td></tr>
3458
3459
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003460<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>
3461<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 +00003462matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00003463
Manuel Klimek03a83232013-06-10 08:52:15 +00003464The associated declaration is:
3465- for type nodes, the declaration of the underlying type
3466- for CallExpr, the declaration of the callee
3467- for MemberExpr, the declaration of the referenced member
3468- for CXXConstructExpr, the declaration of the constructor
3469
3470Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3471function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00003472
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003473Usable 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;,
3474 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;,
3475 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;,
3476 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;,
3477 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;,
3478 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;
3479</pre></td></tr>
3480
3481
3482<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>
3483<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3484matches the given matcher.
3485
3486The associated declaration is:
3487- for type nodes, the declaration of the underlying type
3488- for CallExpr, the declaration of the callee
3489- for MemberExpr, the declaration of the referenced member
3490- for CXXConstructExpr, the declaration of the constructor
3491
3492Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3493function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003494
3495Usable 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;,
3496 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;,
3497 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;,
3498 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;,
3499 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;,
3500 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;
3501</pre></td></tr>
3502
3503
3504<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>
3505<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
3506matches the given matcher.
3507
3508The associated declaration is:
3509- for type nodes, the declaration of the underlying type
3510- for CallExpr, the declaration of the callee
3511- for MemberExpr, the declaration of the referenced member
3512- for CXXConstructExpr, the declaration of the constructor
3513
3514Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3515function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003516
3517Usable 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;,
3518 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;,
3519 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;,
3520 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;,
3521 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;,
3522 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 +00003523</pre></td></tr>
3524
3525
Manuel Klimek67619ff2012-09-07 13:10:32 +00003526<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 +00003527<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3528matched by a given matcher.
3529
3530Given
3531 struct X { int m; };
3532 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003533memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003534 matches "x.m" and "m"
3535with hasObjectExpression(...)
3536 matching "x" and the implicit object expression of "m" which has type X*.
3537</pre></td></tr>
3538
3539
Manuel Klimek67619ff2012-09-07 13:10:32 +00003540<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003541<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3542given matcher.
3543
3544Given
3545 struct { int first, second; } first, second;
3546 int i(second.first);
3547 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003548memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003549 matches second.first
3550 but not first.second (because the member name there is "second").
3551</pre></td></tr>
3552
3553
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003554<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>
3555<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 +00003556pointee matches a given matcher.
3557
3558Given
3559 int *a;
3560 int const *b;
3561 float const *f;
3562pointerType(pointee(isConstQualified(), isInteger()))
3563 matches "int const *b"
3564
3565Usable 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;,
3566 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;
3567</pre></td></tr>
3568
3569
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003570<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>
3571<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 +00003572pointee matches a given matcher.
3573
3574Given
3575 int *a;
3576 int const *b;
3577 float const *f;
3578pointerType(pointee(isConstQualified(), isInteger()))
3579 matches "int const *b"
3580
3581Usable 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;,
3582 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;
3583</pre></td></tr>
3584
3585
Manuel Klimek415514d2013-02-06 20:36:22 +00003586<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 +00003587<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3588
3589Given
3590 struct A { struct B { struct C {}; }; };
3591 A::B::C c;
3592nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3593 matches "A::"
3594</pre></td></tr>
3595
3596
3597<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>
3598<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3599given TypeLoc.
3600
3601Given
3602 struct A { struct B { struct C {}; }; };
3603 A::B::C c;
3604nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3605 hasDeclaration(recordDecl(hasName("A")))))))
3606 matches "A::"
3607</pre></td></tr>
3608
3609
Manuel Klimek415514d2013-02-06 20:36:22 +00003610<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 +00003611<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3612
3613Given
3614 struct A { struct B { struct C {}; }; };
3615 A::B::C c;
3616nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3617 matches "A::"
3618</pre></td></tr>
3619
3620
3621<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>
3622<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3623given namespace matcher.
3624
3625Given
3626 namespace ns { struct A {}; }
3627 ns::A a;
3628nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3629 matches "ns::"
3630</pre></td></tr>
3631
3632
3633<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>
3634<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3635given QualType matcher without qualifiers.
3636
3637Given
3638 struct A { struct B { struct C {}; }; };
3639 A::B::C c;
3640nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3641 matches "A::"
3642</pre></td></tr>
3643
3644
Edwin Vane88be2fd2013-04-01 18:33:34 +00003645<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>
3646<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3647
3648Given
3649 int (*ptr_to_array)[4];
3650 int (*ptr_to_func)(int);
3651
3652varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3653ptr_to_func but not ptr_to_array.
3654
3655Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3656</pre></td></tr>
3657
3658
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003659<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>
3660<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 +00003661pointee matches a given matcher.
3662
3663Given
3664 int *a;
3665 int const *b;
3666 float const *f;
3667pointerType(pointee(isConstQualified(), isInteger()))
3668 matches "int const *b"
3669
3670Usable 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;,
3671 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;
3672</pre></td></tr>
3673
3674
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003675<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>
3676<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 +00003677pointee matches a given matcher.
3678
3679Given
3680 int *a;
3681 int const *b;
3682 float const *f;
3683pointerType(pointee(isConstQualified(), isInteger()))
3684 matches "int const *b"
3685
3686Usable 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;,
3687 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;
3688</pre></td></tr>
3689
3690
Edwin Vane6a19a972013-03-06 17:02:57 +00003691<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>
3692<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3693
3694Given:
3695 typedef int &amp;int_ref;
3696 int a;
3697 int_ref b = a;
3698
3699varDecl(hasType(qualType(referenceType()))))) will not match the
3700declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3701</pre></td></tr>
3702
3703
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003704<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>
3705<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
3706matches the given matcher.
3707
3708The associated declaration is:
3709- for type nodes, the declaration of the underlying type
3710- for CallExpr, the declaration of the callee
3711- for MemberExpr, the declaration of the referenced member
3712- for CXXConstructExpr, the declaration of the constructor
3713
3714Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3715function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003716
3717Usable 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;,
3718 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;,
3719 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;,
3720 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;,
3721 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;,
3722 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;
3723</pre></td></tr>
3724
3725
3726<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>
3727<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3728</pre></td></tr>
3729
3730
Stephen Hines651f13c2014-04-23 16:59:28 -07003731<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>
3732<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
3733matches the specified matcher.
3734
3735Example matches y-&gt;x()
3736 (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
3737 class Y { public: void x(); };
3738 void z() { Y *y; y-&gt;x(); }
3739</pre></td></tr>
3740
3741
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003742<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>
3743<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3744</pre></td></tr>
3745
3746
Stephen Hines651f13c2014-04-23 16:59:28 -07003747<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>
3748<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
3749type matches the specified matcher.
3750
3751Example matches X &amp;x and const X &amp;y
3752 (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
3753 class X {
3754 void a(X b) {
3755 X &amp;x = b;
3756 const X &amp;y = b;
Stephen Hines176edba2014-12-01 14:53:08 -08003757 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003758 };
3759</pre></td></tr>
3760
3761
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003762<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 +00003763<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3764matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003765
Manuel Klimek03a83232013-06-10 08:52:15 +00003766The associated declaration is:
3767- for type nodes, the declaration of the underlying type
3768- for CallExpr, the declaration of the callee
3769- for MemberExpr, the declaration of the referenced member
3770- for CXXConstructExpr, the declaration of the constructor
3771
3772Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3773function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00003774
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003775Usable 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;,
3776 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;,
3777 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;,
3778 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;,
3779 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;,
3780 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 +00003781</pre></td></tr>
3782
3783
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003784<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>
3785<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 +00003786pointee matches a given matcher.
3787
3788Given
3789 int *a;
3790 int const *b;
3791 float const *f;
3792pointerType(pointee(isConstQualified(), isInteger()))
3793 matches "int const *b"
3794
3795Usable 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;,
3796 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;
3797</pre></td></tr>
3798
3799
Samuel Benzaquen3f84bb32013-07-15 19:25:06 +00003800<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>
3801<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 +00003802pointee matches a given matcher.
3803
3804Given
3805 int *a;
3806 int const *b;
3807 float const *f;
3808pointerType(pointee(isConstQualified(), isInteger()))
3809 matches "int const *b"
3810
3811Usable 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;,
3812 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;
3813</pre></td></tr>
3814
3815
Manuel Klimek67619ff2012-09-07 13:10:32 +00003816<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 +00003817<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3818alignof.
3819</pre></td></tr>
3820
3821
Manuel Klimek67619ff2012-09-07 13:10:32 +00003822<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 +00003823<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3824sizeof.
3825</pre></td></tr>
3826
3827
Manuel Klimek03a83232013-06-10 08:52:15 +00003828<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>
3829<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3830statement. This matcher may produce multiple matches.
3831
3832Given
3833 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3834switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3835 matches four times, with "c" binding each of "case 1:", "case 2:",
3836"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3837"switch (1)", "switch (2)" and "switch (2)".
3838</pre></td></tr>
3839
3840
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003841<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>
3842<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
3843matches the given matcher.
3844
3845The associated declaration is:
3846- for type nodes, the declaration of the underlying type
3847- for CallExpr, the declaration of the callee
3848- for MemberExpr, the declaration of the referenced member
3849- for CXXConstructExpr, the declaration of the constructor
3850
3851Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3852function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003853
3854Usable 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;,
3855 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;,
3856 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;,
3857 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;,
3858 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;,
3859 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;
3860</pre></td></tr>
3861
3862
Stephen Hines651f13c2014-04-23 16:59:28 -07003863<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>
3864<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
3865
3866Given
3867 template&lt;typename T&gt; struct A {};
3868 struct B { B* next; };
3869 A&lt;&amp;B::next&gt; a;
3870templateSpecializationType(hasAnyTemplateArgument(
3871 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
3872 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
3873 B::next
3874</pre></td></tr>
3875
3876
Manuel Klimek67619ff2012-09-07 13:10:32 +00003877<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 -07003878<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
3879declaration.
Manuel Klimek1da79332012-08-20 20:54:03 +00003880
3881Given
3882 template&lt;typename T&gt; struct A {};
3883 struct B { B* next; };
3884 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003885classTemplateSpecializationDecl(hasAnyTemplateArgument(
3886 refersToDeclaration(fieldDecl(hasName("next"))))
3887 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003888 B::next
3889</pre></td></tr>
3890
3891
Stephen Hines176edba2014-12-01 14:53:08 -08003892<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3893<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
3894
3895Given
3896 template&lt;int T&gt; struct A {};
3897 C&lt;42&gt; c;
3898classTemplateSpecializationDecl(
3899 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
3900 matches the implicit instantiation of C in C&lt;42&gt;.
3901</pre></td></tr>
3902
3903
Manuel Klimek67619ff2012-09-07 13:10:32 +00003904<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 +00003905<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3906
3907Given
3908 struct X {};
3909 template&lt;typename T&gt; struct A {};
3910 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003911classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003912 refersToType(class(hasName("X")))))
3913 matches the specialization A&lt;X&gt;
3914</pre></td></tr>
3915
3916
Stephen Hines651f13c2014-04-23 16:59:28 -07003917<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>
3918<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
3919TemplateArgument matching the given InnerMatcher.
3920
3921Given
3922 template&lt;typename T&gt; class A {};
3923 template&lt;&gt; class A&lt;double&gt; {};
3924 A&lt;int&gt; a;
3925classTemplateSpecializationDecl(hasAnyTemplateArgument(
3926 refersToType(asString("int"))))
3927 matches the specialization A&lt;int&gt;
3928</pre></td></tr>
3929
3930
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003931<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>
3932<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 +00003933matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003934
Manuel Klimek03a83232013-06-10 08:52:15 +00003935The associated declaration is:
3936- for type nodes, the declaration of the underlying type
3937- for CallExpr, the declaration of the callee
3938- for MemberExpr, the declaration of the referenced member
3939- for CXXConstructExpr, the declaration of the constructor
3940
3941Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3942function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane52380602013-02-19 17:14:34 +00003943
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003944Usable 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;,
3945 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;,
3946 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;,
3947 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;,
3948 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;,
3949 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;
3950</pre></td></tr>
3951
3952
Stephen Hines651f13c2014-04-23 16:59:28 -07003953<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>
3954<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
3955matches the given InnerMatcher.
3956
3957Given
3958 template&lt;typename T, typename U&gt; class A {};
3959 A&lt;bool, int&gt; b;
3960 A&lt;int, bool&gt; c;
3961classTemplateSpecializationDecl(hasTemplateArgument(
3962 1, refersToType(asString("int"))))
3963 matches the specialization A&lt;bool, int&gt;
3964</pre></td></tr>
3965
3966
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003967<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>
3968<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3969matches the given matcher.
3970
3971The associated declaration is:
3972- for type nodes, the declaration of the underlying type
3973- for CallExpr, the declaration of the callee
3974- for MemberExpr, the declaration of the referenced member
3975- for CXXConstructExpr, the declaration of the constructor
3976
3977Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3978function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00003979
3980Usable 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;,
3981 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;,
3982 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;,
3983 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;,
3984 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;,
3985 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 +00003986</pre></td></tr>
3987
3988
Samuel Benzaquend36e4632013-08-27 15:11:16 +00003989<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>
3990<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
3991
3992Generates results for each match.
3993
3994For example, in:
3995 class A { class B {}; class C {}; };
3996The matcher:
3997 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
3998will generate results for A, B and C.
3999
4000Usable as: Any Matcher
4001</pre></td></tr>
4002
4003
Edwin Vane3abf7782013-02-25 14:49:29 +00004004<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 +00004005<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
4006matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00004007
Manuel Klimek03a83232013-06-10 08:52:15 +00004008The associated declaration is:
4009- for type nodes, the declaration of the underlying type
4010- for CallExpr, the declaration of the callee
4011- for MemberExpr, the declaration of the referenced member
4012- for CXXConstructExpr, the declaration of the constructor
4013
4014Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4015function. e.g. various subtypes of clang::Type and various expressions.
Edwin Vane3abf7782013-02-25 14:49:29 +00004016
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00004017Usable 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;,
4018 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;,
4019 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;,
4020 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;,
4021 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;,
4022 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 +00004023</pre></td></tr>
4024
4025
Manuel Klimek67619ff2012-09-07 13:10:32 +00004026<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 +00004027<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
4028
4029Given
4030 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
4031unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
4032 matches sizeof(a) and alignof(c)
4033</pre></td></tr>
4034
4035
Manuel Klimek67619ff2012-09-07 13:10:32 +00004036<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 +00004037<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
4038
Daniel Jaspere0b89972012-12-04 12:08:08 +00004039Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00004040 !true
4041</pre></td></tr>
4042
4043
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00004044<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>
4045<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
4046matches the given matcher.
4047
4048The associated declaration is:
4049- for type nodes, the declaration of the underlying type
4050- for CallExpr, the declaration of the callee
4051- for MemberExpr, the declaration of the referenced member
4052- for CXXConstructExpr, the declaration of the constructor
4053
4054Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4055function. e.g. various subtypes of clang::Type and various expressions.
Samuel Benzaquen6c1dc782013-11-18 14:53:42 +00004056
4057Usable 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;,
4058 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;,
4059 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;,
4060 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;,
4061 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;,
4062 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;
4063</pre></td></tr>
4064
4065
Manuel Klimek67619ff2012-09-07 13:10:32 +00004066<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 +00004067<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
4068
4069Given
4070 namespace X { void b(); }
4071 using X::b;
4072usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
4073 matches using X::b </pre></td></tr>
4074
4075
Manuel Klimek67619ff2012-09-07 13:10:32 +00004076<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 +00004077<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
4078matched by the given matcher.
4079
4080Given
4081 namespace X { int a; void b(); }
4082 using X::a;
4083 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00004084usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00004085 matches using X::b but not using X::a </pre></td></tr>
4086
4087
Manuel Klimek532870f2013-07-24 05:46:07 +00004088<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>
4089<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 +00004090declaration's type.
4091
4092In case of a value declaration (for example a variable declaration),
4093this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00004094declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
4095while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00004096of x."
4097
Manuel Klimeke44a0062012-08-26 23:55:24 +00004098Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4099 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00004100 class X {};
4101 void y(X &amp;x) { x; X z; }
4102
4103Usable 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;
4104</pre></td></tr>
4105
4106
Stephen Hines651f13c2014-04-23 16:59:28 -07004107<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>
4108<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
4109matcher.
4110
4111Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4112 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
4113 class X {};
4114 void y(X &amp;x) { x; X z; }
4115</pre></td></tr>
4116
4117
Manuel Klimek67619ff2012-09-07 13:10:32 +00004118<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 +00004119<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
4120that matches the given matcher.
4121
Manuel Klimeke44a0062012-08-26 23:55:24 +00004122Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00004123 bool y() { return true; }
4124 bool x = y();
4125</pre></td></tr>
4126
4127
Daniel Jaspere0b89972012-12-04 12:08:08 +00004128<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>
4129<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
4130expression.
4131
4132Given
4133 void f(int b) {
4134 int a[b];
4135 }
4136variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
4137 varDecl(hasName("b")))))))
4138 matches "int a[b]"
4139</pre></td></tr>
4140
4141
Manuel Klimek67619ff2012-09-07 13:10:32 +00004142<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 +00004143<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
4144a given body.
4145
4146Given
4147 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00004148hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00004149 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00004150with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00004151 matching '{}'
4152</pre></td></tr>
4153
4154
Manuel Klimek67619ff2012-09-07 13:10:32 +00004155<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 +00004156<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
4157or conditional operator.
4158
4159Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
4160 if (true) {}
4161</pre></td></tr>
4162
Stephen Hines651f13c2014-04-23 16:59:28 -07004163
4164<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>
4165<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
4166NestedNameSpecifier-matcher matches.
4167</pre></td></tr>
4168
4169
4170<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>
4171<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
4172QualType-matcher matches.
4173</pre></td></tr>
4174
Manuel Klimek1da79332012-08-20 20:54:03 +00004175<!--END_TRAVERSAL_MATCHERS -->
4176</table>
4177
4178</div>
4179</body>
4180</html>
4181
4182