blob: 8e31d583cb78215cc8731b73f38f2868411ba9be [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
60<!-- ======================================================================= -->
61<h2 id="decl-matchers">Node Matchers</h2>
62<!-- ======================================================================= -->
63
64<p>Node matchers are at the core of matcher expressions - they specify the type
65of node that is expected. Every match expression starts with a node matcher,
66which can then be further refined with a narrowing or traversal matcher. All
67traversal matchers take node matchers as their arguments.</p>
68
69<p>For convenience, all node matchers take an arbitrary number of arguments
70and implicitly act as allOf matchers.</p>
71
72<p>Node matchers are the only matchers that support the bind("id") call to
73bind the matched node to the given string, to be later retrieved from the
74match callback.</p>
75
76<table>
77<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
78<!-- START_DECL_MATCHERS -->
79
Daniel Jasperc7093d92013-02-25 12:39:41 +000080<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>
81<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
82
83Given
84 class C {
85 public:
86 int a;
87 };
88accessSpecDecl()
89 matches 'public:'
90</pre></td></tr>
91
92
Manuel Klimek67619ff2012-09-07 13:10:32 +000093<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 +000094<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +000095
96Example matches Z
97 template&lt;class T&gt; class Z {};
98</pre></td></tr>
99
100
Manuel Klimek67619ff2012-09-07 13:10:32 +0000101<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 +0000102<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000103
104Given
105 template&lt;typename T&gt; class A {};
106 template&lt;&gt; class A&lt;double&gt; {};
107 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000108classTemplateSpecializationDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000109 matches the specializations A&lt;int&gt; and A&lt;double&gt;
110</pre></td></tr>
111
112
Manuel Klimek67619ff2012-09-07 13:10:32 +0000113<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 +0000114<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000115
116Example matches Foo::Foo() and Foo::Foo(int)
117 class Foo {
118 public:
119 Foo();
120 Foo(int);
121 int DoSomething();
122 };
123</pre></td></tr>
124
125
Manuel Klimek67619ff2012-09-07 13:10:32 +0000126<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 +0000127<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
128
129Examples matches X, C, and the friend declaration inside C;
130 void X();
131 class C {
132 friend X;
133 };
134</pre></td></tr>
135
136
Manuel Klimek1a68afd2013-06-20 13:08:29 +0000137<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>
138<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
139and non-type template parameter declarations).
140
141Given
142 class X { int y; };
143declaratorDecl()
144 matches int y.
145</pre></td></tr>
146
147
Manuel Klimek67619ff2012-09-07 13:10:32 +0000148<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 +0000149<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000150
151Example matches Foo::~Foo()
152 class Foo {
153 public:
154 virtual ~Foo();
155 };
156</pre></td></tr>
157
158
Manuel Klimek67619ff2012-09-07 13:10:32 +0000159<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 +0000160<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000161
162Example matches A, B, C
163 enum X {
164 A, B, C
165 };
166</pre></td></tr>
167
168
Manuel Klimek67619ff2012-09-07 13:10:32 +0000169<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 +0000170<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
171
172Example matches X
173 enum X {
174 A, B, C
175 };
176</pre></td></tr>
177
178
Manuel Klimek67619ff2012-09-07 13:10:32 +0000179<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000180<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000181
182Given
183 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000184fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000185 matches 'm'.
186</pre></td></tr>
187
188
Manuel Klimek67619ff2012-09-07 13:10:32 +0000189<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 +0000190<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000191
192Example matches f
193 void f();
194</pre></td></tr>
195
196
Manuel Klimek67619ff2012-09-07 13:10:32 +0000197<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 +0000198<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000199
200Example matches f
201 template&lt;class T&gt; void f(T t) {}
202</pre></td></tr>
203
204
Manuel Klimek67619ff2012-09-07 13:10:32 +0000205<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 +0000206<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000207
208Example matches y
209 class X { void y() };
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('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 +0000214<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 +0000215
216Example matches X, S, the anonymous union type, i, and U;
217 typedef int X;
218 struct S {
219 union {
220 int i;
221 } U;
222 };
223</pre></td></tr>
224
225
Edwin Vane0332e0a2013-05-09 16:42:37 +0000226<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>
227<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
228
229Given
230 namespace {}
231 namespace test {}
232namespaceDecl()
233 matches "namespace {}" and "namespace test {}"
234</pre></td></tr>
235
236
Manuel Klimek1a68afd2013-06-20 13:08:29 +0000237<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>
238<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
239
240Given
241 void f(int x);
242parmVarDecl()
243 matches int x.
244</pre></td></tr>
245
246
Manuel Klimek67619ff2012-09-07 13:10:32 +0000247<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 +0000248<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000249
250Example matches X, Z
251 class X;
252 template&lt;class T&gt; class Z {};
253</pre></td></tr>
254
255
Manuel Klimek67619ff2012-09-07 13:10:32 +0000256<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 +0000257<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
258
259Given
260 namespace X { int x; }
261 using X::x;
262usingDecl()
263 matches using X::x </pre></td></tr>
264
265
Manuel Klimek67619ff2012-09-07 13:10:32 +0000266<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000267<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000268
269Note: this does not match declarations of member variables, which are
270"field" declarations in Clang parlance.
271
272Example matches a
273 int a;
274</pre></td></tr>
275
276
Manuel Klimek41df16e2013-01-09 09:38:21 +0000277<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>
278<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
279</pre></td></tr>
280
281
282<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>
283<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
284
285Given
286 namespace ns {
287 struct A { static void f(); };
288 void A::f() {}
289 void g() { A::f(); }
290 }
291 ns::A a;
292nestedNameSpecifier()
293 matches "ns::" and both "A::"
294</pre></td></tr>
295
296
297<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>
298<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
299</pre></td></tr>
300
301
Manuel Klimek67619ff2012-09-07 13:10:32 +0000302<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 +0000303<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
304
305Given
306 int i = a[1];
307arraySubscriptExpr()
308 matches "a[1]"
309</pre></td></tr>
310
311
Daniel Jaspere0b89972012-12-04 12:08:08 +0000312<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>
313<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
314
315 int i = 100;
316 __asm("mov al, 2");
317asmStmt()
318 matches '__asm("mov al, 2")'
319</pre></td></tr>
320
321
Manuel Klimek67619ff2012-09-07 13:10:32 +0000322<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +0000323<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
324
325Example matches a || b
326 !(a || b)
327</pre></td></tr>
328
329
Manuel Klimek67619ff2012-09-07 13:10:32 +0000330<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 +0000331<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000332
333Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000334 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000335 FunctionTakesString(GetStringByValue());
336 FunctionTakesStringByPointer(GetStringPointer());
337</pre></td></tr>
338
339
Daniel Jaspere0b89972012-12-04 12:08:08 +0000340<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>
341<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
342
343Example matches true
344 true
345</pre></td></tr>
346
347
348<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>
349<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
350
351Given
352 while (true) { break; }
353breakStmt()
354 matches 'break'
355</pre></td></tr>
356
357
358<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>
359<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
360
361Example: Matches (int*) 2.2f in
362 int i = (int) 2.2f;
363</pre></td></tr>
364
365
Manuel Klimek67619ff2012-09-07 13:10:32 +0000366<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 +0000367<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000368
369Example matches x.y() and y()
370 X x;
371 x.y();
372 y();
373</pre></td></tr>
374
375
Manuel Klimek03a83232013-06-10 08:52:15 +0000376<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>
377<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
378
379Given
380 switch(a) { case 42: break; default: break; }
381caseStmt()
382 matches 'case 42: break;'.
383</pre></td></tr>
384
385
Daniel Jaspere0b89972012-12-04 12:08:08 +0000386<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
387<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
388
389Example: castExpr() matches each of the following:
390 (int) 3;
391 const_cast&lt;Expr *&gt;(SubExpr);
392 char c = 0;
393but does not match
394 int i = (0);
395 int k = 0;
396</pre></td></tr>
397
398
399<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>
400<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
401
402 try {} catch(int i) {}
403catchStmt()
404 matches 'catch(int i)'
405</pre></td></tr>
406
407
408<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>
409<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
410
411Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
412though.
413
414Example matches 'a', L'a'
415 char ch = 'a'; wchar_t chw = L'a';
416</pre></td></tr>
417
418
Manuel Klimek415514d2013-02-06 20:36:22 +0000419<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>
420<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
421
422Example match: {1}, (1, 2)
423 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
424</pre></td></tr>
425
426
Manuel Klimek67619ff2012-09-07 13:10:32 +0000427<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 +0000428<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000429
430Example matches '{}' and '{{}}'in 'for (;;) {{}}'
431 for (;;) {{}}
432</pre></td></tr>
433
434
Manuel Klimek67619ff2012-09-07 13:10:32 +0000435<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 +0000436<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
437
438Example matches a ? b : c
439 (a ? b : c) + 42
440</pre></td></tr>
441
442
Daniel Jaspere0b89972012-12-04 12:08:08 +0000443<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>
444<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
445
446Example: Matches const_cast&lt;int*&gt;(&amp;r) in
447 int n = 42;
448 const int &amp;r(n);
449 int* p = const_cast&lt;int*&gt;(&amp;r);
450</pre></td></tr>
451
452
Manuel Klimek67619ff2012-09-07 13:10:32 +0000453<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 +0000454<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000455
456Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000457 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000458 void f(const string &amp;a, const string &amp;b);
459 char *ptr;
460 int n;
461 f(string(ptr, n), ptr);
462</pre></td></tr>
463
464
Daniel Jaspere0b89972012-12-04 12:08:08 +0000465<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>
466<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
467
468Given
469 while (true) { continue; }
470continueStmt()
471 matches 'continue'
472</pre></td></tr>
473
474
Manuel Klimek67619ff2012-09-07 13:10:32 +0000475<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000476<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000477
478Example matches x in if (x)
479 bool x;
480 if (x) {}
481</pre></td></tr>
482
483
Manuel Klimek67619ff2012-09-07 13:10:32 +0000484<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 +0000485<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000486
487Given
488 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000489declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000490 matches 'int a'.
491</pre></td></tr>
492
493
Manuel Klimek67619ff2012-09-07 13:10:32 +0000494<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 +0000495<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 +0000496
497Example matches the CXXDefaultArgExpr placeholder inserted for the
498 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000499 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000500 void f(int x, int y = 0);
501 f(42);
502</pre></td></tr>
503
504
Manuel Klimek03a83232013-06-10 08:52:15 +0000505<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>
506<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
507
508Given
509 switch(a) { case 42: break; default: break; }
510defaultStmt()
511 matches 'default: break;'.
512</pre></td></tr>
513
514
Manuel Klimek67619ff2012-09-07 13:10:32 +0000515<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 +0000516<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000517
518Given
519 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000520deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000521 matches 'delete X'.
522</pre></td></tr>
523
524
Manuel Klimek67619ff2012-09-07 13:10:32 +0000525<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 +0000526<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
527
528Given
529 do {} while (true);
530doStmt()
531 matches 'do {} while(true)'
532</pre></td></tr>
533
534
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
536<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
537
538Example:
539 dynamicCastExpr()
540matches
541 dynamic_cast&lt;D*&gt;(&amp;b);
542in
543 struct B { virtual ~B() {} }; struct D : B {};
544 B b;
545 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
546</pre></td></tr>
547
548
549<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>
550<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
551
552Matches any cast expression written in user code, whether it be a
553C-style cast, a functional-style cast, or a keyword cast.
554
555Does not match implicit conversions.
556
557Note: the name "explicitCast" is chosen to match Clang's terminology, as
558Clang uses the term "cast" to apply to implicit conversions as well as to
559actual cast expressions.
560
561hasDestinationType.
562
563Example: matches all five of the casts in
564 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
565but does not match the implicit conversion in
566 long ell = 42;
567</pre></td></tr>
568
569
Manuel Klimek67619ff2012-09-07 13:10:32 +0000570<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 +0000571<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000572
573Example matches x()
574 void f() { x(); }
575</pre></td></tr>
576
577
Daniel Jaspere0b89972012-12-04 12:08:08 +0000578<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>
579<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
580
581forRangeStmt() matches 'for (auto a : i)'
582 int i[] = {1, 2, 3}; for (auto a : i);
583 for(int j = 0; j &lt; 5; ++j);
584</pre></td></tr>
585
586
Manuel Klimek67619ff2012-09-07 13:10:32 +0000587<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 +0000588<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
589
590Example matches 'for (;;) {}'
591 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000592 int i[] = {1, 2, 3}; for (auto a : i);
593</pre></td></tr>
594
595
596<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>
597<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
598
599Example: Matches Foo(bar);
600 Foo f = bar;
601 Foo g = (Foo) bar;
602 Foo h = Foo(bar);
603</pre></td></tr>
604
605
606<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>
607<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
608
609Given
610 goto FOO;
611 FOO: bar();
612gotoStmt()
613 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000614</pre></td></tr>
615
616
Manuel Klimek67619ff2012-09-07 13:10:32 +0000617<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 +0000618<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
619
620Example matches 'if (x) {}'
621 if (x) {}
622</pre></td></tr>
623
624
Daniel Jaspere0b89972012-12-04 12:08:08 +0000625<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>
626<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
627
628This matches many different places, including function call return value
629eliding, as well as any type conversions.
630</pre></td></tr>
631
632
Manuel Klimek67619ff2012-09-07 13:10:32 +0000633<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 +0000634<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
635
636Given
637 int a[] = { 1, 2 };
638 struct B { int x, y; };
639 B b = { 5, 6 };
640initList()
641 matches "{ 1, 2 }" and "{ 5, 6 }"
642</pre></td></tr>
643
644
Daniel Jaspere0b89972012-12-04 12:08:08 +0000645<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>
646<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
647
648Not matching character-encoded integers such as L'a'.
649
650Example matches 1, 1L, 0x1, 1U
651</pre></td></tr>
652
653
654<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>
655<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
656
657Given
658 goto FOO;
659 FOO: bar();
660labelStmt()
661 matches 'FOO:'
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('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>
666<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
667
668Example matches [&amp;](){return 5;}
669 [&amp;](){return 5;}
670</pre></td></tr>
671
672
Manuel Klimek67619ff2012-09-07 13:10:32 +0000673<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000674<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
675
676Example: Given
677 struct T {void func()};
678 T f();
679 void g(T);
680materializeTemporaryExpr() matches 'f()' in these statements
681 T u(f());
682 g(f());
683but does not match
684 f();
685 f().func();
686</pre></td></tr>
687
688
Manuel Klimek67619ff2012-09-07 13:10:32 +0000689<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000690<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000691
692Example matches x.y()
693 X x;
694 x.y();
695</pre></td></tr>
696
697
Manuel Klimek67619ff2012-09-07 13:10:32 +0000698<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000699<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000700
701Given
702 class Y {
703 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
704 int a; static int b;
705 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000706memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000707 matches this-&gt;x, x, y.x, a, this-&gt;b
708</pre></td></tr>
709
710
Manuel Klimek67619ff2012-09-07 13:10:32 +0000711<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 +0000712<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000713
714Given
715 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000716newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000717 matches 'new X'.
718</pre></td></tr>
719
720
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
722<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
723</pre></td></tr>
724
725
726<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>
727<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
728
729 foo();;
730nullStmt()
731 matches the second ';'
732</pre></td></tr>
733
734
Manuel Klimek67619ff2012-09-07 13:10:32 +0000735<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000736<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000737
738Note that if an operator isn't overloaded, it won't match. Instead, use
739binaryOperator matcher.
740Currently it does not match operators such as new delete.
741FIXME: figure out why these do not match?
742
743Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000744 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000745 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
746 ostream &amp;o; int b = 1, c = 1;
747 o &lt;&lt; b &lt;&lt; c;
748</pre></td></tr>
749
750
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
752<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
753
754Either the source expression or the destination type can be matched
755using has(), but hasDestinationType() is more specific and can be
756more readable.
757
758Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
759 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
760</pre></td></tr>
761
762
763<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>
764<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
765
766Given
767 return 1;
768returnStmt()
769 matches 'return 1'
770</pre></td></tr>
771
772
773<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>
774<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
775
776hasDestinationType
777reinterpretCast
778
779Example:
780 staticCastExpr()
781matches
782 static_cast&lt;long&gt;(8)
783in
784 long eight(static_cast&lt;long&gt;(8));
785</pre></td></tr>
786
787
Manuel Klimek67619ff2012-09-07 13:10:32 +0000788<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 +0000789<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000790
791Given
792 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000793stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000794 matches both the compound statement '{ ++a; }' and '++a'.
795</pre></td></tr>
796
797
Daniel Jaspere0b89972012-12-04 12:08:08 +0000798<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>
799<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
800
801Example matches "abcd", L"abcd"
802 char *s = "abcd"; wchar_t *ws = L"abcd"
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('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 +0000807<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
808
809Given
810 switch(a) { case 42: break; default: break; }
811switchCase()
812 matches 'case 42: break;' and 'default: break;'.
813</pre></td></tr>
814
815
Daniel Jaspere0b89972012-12-04 12:08:08 +0000816<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>
817<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
818
819Given
820 switch(a) { case 42: break; default: break; }
821switchStmt()
822 matches 'switch(a)'.
823</pre></td></tr>
824
825
826<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>
827<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
828
829Example matches the implicit this expression in "return i".
830 (matcher = thisExpr())
831struct foo {
832 int i;
833 int f() { return i; }
834};
835</pre></td></tr>
836
837
838<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>
839<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
840
841 try { throw 5; } catch(int i) {}
842throwExpr()
843 matches 'throw 5'
844</pre></td></tr>
845
846
847<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>
848<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
849
850 try {} catch(int i) {}
851tryStmt()
852 matches 'try {}'
853</pre></td></tr>
854
855
Manuel Klimek67619ff2012-09-07 13:10:32 +0000856<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 +0000857<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
858
859Given
860 Foo x = bar;
861 int y = sizeof(x) + alignof(x);
862unaryExprOrTypeTraitExpr()
863 matches sizeof(x) and alignof(x)
864</pre></td></tr>
865
866
Manuel Klimek67619ff2012-09-07 13:10:32 +0000867<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 +0000868<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
869
870Example matches !a
871 !a || b
872</pre></td></tr>
873
874
Daniel Jaspere0b89972012-12-04 12:08:08 +0000875<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>
876<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
877
878Example match: "foo"_suffix
879</pre></td></tr>
880
881
Manuel Klimek67619ff2012-09-07 13:10:32 +0000882<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 +0000883<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
884
885Given
886 while (true) {}
887whileStmt()
888 matches 'while (true) {}'.
889</pre></td></tr>
890
Daniel Jaspere0b89972012-12-04 12:08:08 +0000891
Manuel Klimek41df16e2013-01-09 09:38:21 +0000892<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('arrayTypeLoc0')"><a name="arrayTypeLoc0Anchor">arrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;...</td></tr>
893<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
894
895Given
896 int a[] = { 2, 3 };
897 int b[4];
898 void f() { int c[a[0]]; }
899arrayType()
900 matches "int a[]", "int b[4]" and "int c[a[0]]";
901</pre></td></tr>
902
903
904<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('atomicTypeLoc0')"><a name="atomicTypeLoc0Anchor">atomicTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>&gt;...</td></tr>
905<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
906
907Given
908 _Atomic(int) i;
909atomicType()
910 matches "_Atomic(int) i"
911</pre></td></tr>
912
913
914<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('autoTypeLoc0')"><a name="autoTypeLoc0Anchor">autoTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoTypeLoc.html">AutoTypeLoc</a>&gt;...</td></tr>
915<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
916
917Given:
918 auto n = 4;
919 int v[] = { 2, 3 }
920 for (auto i : v) { }
921autoType()
922 matches "auto n" and "auto i"
923</pre></td></tr>
924
925
926<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('blockPointerTypeLoc0')"><a name="blockPointerTypeLoc0Anchor">blockPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;...</td></tr>
927<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
928"void (^)(int)".
929
930The pointee is always required to be a FunctionType.
931</pre></td></tr>
932
933
934<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('builtinTypeLoc0')"><a name="builtinTypeLoc0Anchor">builtinTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BuiltinTypeLoc.html">BuiltinTypeLoc</a>&gt;...</td></tr>
935<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
936
937Given
938 struct A {};
939 A a;
940 int b;
941 float c;
942 bool d;
943builtinType()
944 matches "int b", "float c" and "bool d"
945</pre></td></tr>
946
947
948<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('complexTypeLoc0')"><a name="complexTypeLoc0Anchor">complexTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;...</td></tr>
949<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
950
951Given
952 _Complex float f;
953complexType()
954 matches "_Complex float f"
955</pre></td></tr>
956
957
958<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('constantArrayTypeLoc0')"><a name="constantArrayTypeLoc0Anchor">constantArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayTypeLoc.html">ConstantArrayTypeLoc</a>&gt;...</td></tr>
959<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
960
961Given
962 void() {
963 int a[2];
964 int b[] = { 2, 3 };
965 int c[b[0]];
966 }
967constantArrayType()
968 matches "int a[2]"
969</pre></td></tr>
970
971
972<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayTypeLoc0')"><a name="dependentSizedArrayTypeLoc0Anchor">dependentSizedArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayTypeLoc.html">DependentSizedArrayTypeLoc</a>&gt;...</td></tr>
973<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
974
975Given
976 template&lt;typename T, int Size&gt;
977 class array {
978 T data[Size];
979 };
980dependentSizedArrayType
981 matches "T data[Size]"
982</pre></td></tr>
983
984
Edwin Vane742d9e72013-02-25 20:43:32 +0000985<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
986<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
987qualified name.
988
989Given
990 namespace N {
991 namespace M {
992 class D {};
993 }
994 }
995 class C {};
996
997 class C c;
998 N::M::D d;
999
1000elaboratedType() matches the type of the variable declarations of both
1001c and d.
1002</pre></td></tr>
1003
1004
Manuel Klimek41df16e2013-01-09 09:38:21 +00001005<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('functionTypeLoc0')"><a name="functionTypeLoc0Anchor">functionTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTypeLoc.html">FunctionTypeLoc</a>&gt;...</td></tr>
1006<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
1007
1008Given
1009 int (*f)(int);
1010 void g();
1011functionType()
1012 matches "int (*f)(int)" and the type of "g".
1013</pre></td></tr>
1014
1015
1016<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayTypeLoc0')"><a name="incompleteArrayTypeLoc0Anchor">incompleteArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayTypeLoc.html">IncompleteArrayTypeLoc</a>&gt;...</td></tr>
1017<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
1018
1019Given
1020 int a[] = { 2, 3 };
1021 int b[42];
1022 void f(int c[]) { int d[a[0]]; };
1023incompleteArrayType()
1024 matches "int a[]" and "int c[]"
1025</pre></td></tr>
1026
1027
Edwin Vane8203d9f2013-03-28 13:50:22 +00001028<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceTypeLoc0')"><a name="lValueReferenceTypeLoc0Anchor">lValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceTypeLoc.html">LValueReferenceTypeLoc</a>&gt;...</td></tr>
1029<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001030
1031Given:
1032 int *a;
1033 int &amp;b = *a;
1034 int &amp;&amp;c = 1;
1035 auto &amp;d = b;
1036 auto &amp;&amp;e = c;
1037 auto &amp;&amp;f = 2;
1038 int g = 5;
1039
Edwin Vane8203d9f2013-03-28 13:50:22 +00001040lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001041matched since the type is deduced as int&amp; by reference collapsing rules.
1042</pre></td></tr>
1043
1044
Manuel Klimek41df16e2013-01-09 09:38:21 +00001045<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('memberPointerTypeLoc0')"><a name="memberPointerTypeLoc0Anchor">memberPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;...</td></tr>
1046<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
1047Given
1048 struct A { int i; }
1049 A::* ptr = A::i;
1050memberPointerType()
1051 matches "A::* ptr"
1052</pre></td></tr>
1053
1054
Edwin Vane88be2fd2013-04-01 18:33:34 +00001055<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('parenTypeLoc0')"><a name="parenTypeLoc0Anchor">parenTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenTypeLoc.html">ParenTypeLoc</a>&gt;...</td></tr>
1056<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1057
1058Given
1059 int (*ptr_to_array)[4];
1060 int *array_of_ptrs[4];
1061
1062varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1063array_of_ptrs.
1064</pre></td></tr>
1065
1066
Manuel Klimek41df16e2013-01-09 09:38:21 +00001067<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
1068<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1069
1070Given
1071 int *a;
1072 int &amp;b = *a;
1073 int c = 5;
1074pointerType()
1075 matches "int *a"
1076</pre></td></tr>
1077
1078
Edwin Vane8203d9f2013-03-28 13:50:22 +00001079<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceTypeLoc0')"><a name="rValueReferenceTypeLoc0Anchor">rValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceTypeLoc.html">RValueReferenceTypeLoc</a>&gt;...</td></tr>
1080<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1081
1082Given:
1083 int *a;
1084 int &amp;b = *a;
1085 int &amp;&amp;c = 1;
1086 auto &amp;d = b;
1087 auto &amp;&amp;e = c;
1088 auto &amp;&amp;f = 2;
1089 int g = 5;
1090
1091rValueReferenceType() matches the types of c and f. e is not
1092matched as it is deduced to int&amp; by reference collapsing rules.
1093</pre></td></tr>
1094
1095
Edwin Vane742d9e72013-02-25 20:43:32 +00001096<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('recordTypeLoc0')"><a name="recordTypeLoc0Anchor">recordTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordTypeLoc.html">RecordTypeLoc</a>&gt;...</td></tr>
1097<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1098
1099Given
1100 class C {};
1101 struct S {};
1102
1103 C c;
1104 S s;
1105
1106recordType() matches the type of the variable declarations of both c
1107and s.
1108</pre></td></tr>
1109
1110
Manuel Klimek41df16e2013-01-09 09:38:21 +00001111<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
Edwin Vanef4b48042013-03-07 15:44:40 +00001112<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001113
1114Given
1115 int *a;
1116 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001117 int &amp;&amp;c = 1;
1118 auto &amp;d = b;
1119 auto &amp;&amp;e = c;
1120 auto &amp;&amp;f = 2;
1121 int g = 5;
1122
1123referenceType() matches the types of b, c, d, e, and f.
1124</pre></td></tr>
1125
1126
Edwin Vane3abf7782013-02-25 14:49:29 +00001127<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
1128<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1129
1130Given
1131 template &lt;typename T&gt;
1132 class C { };
1133
1134 template class C&lt;int&gt;; A
1135 C&lt;char&gt; var; B
1136
1137templateSpecializationType() matches the type of the explicit
1138instantiation in A and the type of the variable declaration in B.
1139</pre></td></tr>
1140
1141
Daniel Jaspere0b89972012-12-04 12:08:08 +00001142<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>
1143<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1144</pre></td></tr>
1145
1146
Manuel Klimek41df16e2013-01-09 09:38:21 +00001147<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typedefTypeLoc0')"><a name="typedefTypeLoc0Anchor">typedefTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefTypeLoc.html">TypedefTypeLoc</a>&gt;...</td></tr>
1148<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1149
1150Given
1151 typedef int X;
1152typedefType()
1153 matches "typedef int X"
1154</pre></td></tr>
1155
1156
1157<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('variableArrayTypeLoc0')"><a name="variableArrayTypeLoc0Anchor">variableArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayTypeLoc.html">VariableArrayTypeLoc</a>&gt;...</td></tr>
1158<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1159integer-constant-expression.
1160
1161Given
1162 void f() {
1163 int a[] = { 2, 3 }
1164 int b[42];
1165 int c[a[0]];
1166variableArrayType()
1167 matches "int c[a[0]]"
1168</pre></td></tr>
1169
1170
1171<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>
1172<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1173
1174Given
1175 int a[] = { 2, 3 };
1176 int b[4];
1177 void f() { int c[a[0]]; }
1178arrayType()
1179 matches "int a[]", "int b[4]" and "int c[a[0]]";
1180</pre></td></tr>
1181
1182
1183<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>
1184<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1185
1186Given
1187 _Atomic(int) i;
1188atomicType()
1189 matches "_Atomic(int) i"
1190</pre></td></tr>
1191
1192
1193<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>
1194<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1195
1196Given:
1197 auto n = 4;
1198 int v[] = { 2, 3 }
1199 for (auto i : v) { }
1200autoType()
1201 matches "auto n" and "auto i"
1202</pre></td></tr>
1203
1204
1205<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>
1206<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1207"void (^)(int)".
1208
1209The pointee is always required to be a FunctionType.
1210</pre></td></tr>
1211
1212
1213<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>
1214<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1215
1216Given
1217 struct A {};
1218 A a;
1219 int b;
1220 float c;
1221 bool d;
1222builtinType()
1223 matches "int b", "float c" and "bool d"
1224</pre></td></tr>
1225
1226
1227<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>
1228<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1229
1230Given
1231 _Complex float f;
1232complexType()
1233 matches "_Complex float f"
1234</pre></td></tr>
1235
1236
1237<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>
1238<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1239
1240Given
1241 void() {
1242 int a[2];
1243 int b[] = { 2, 3 };
1244 int c[b[0]];
1245 }
1246constantArrayType()
1247 matches "int a[2]"
1248</pre></td></tr>
1249
1250
1251<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>
1252<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1253
1254Given
1255 template&lt;typename T, int Size&gt;
1256 class array {
1257 T data[Size];
1258 };
1259dependentSizedArrayType
1260 matches "T data[Size]"
1261</pre></td></tr>
1262
1263
Edwin Vane742d9e72013-02-25 20:43:32 +00001264<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>
1265<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1266qualified name.
1267
1268Given
1269 namespace N {
1270 namespace M {
1271 class D {};
1272 }
1273 }
1274 class C {};
1275
1276 class C c;
1277 N::M::D d;
1278
1279elaboratedType() matches the type of the variable declarations of both
1280c and d.
1281</pre></td></tr>
1282
1283
Manuel Klimek41df16e2013-01-09 09:38:21 +00001284<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>
1285<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1286
1287Given
1288 int (*f)(int);
1289 void g();
1290functionType()
1291 matches "int (*f)(int)" and the type of "g".
1292</pre></td></tr>
1293
1294
1295<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>
1296<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1297
1298Given
1299 int a[] = { 2, 3 };
1300 int b[42];
1301 void f(int c[]) { int d[a[0]]; };
1302incompleteArrayType()
1303 matches "int a[]" and "int c[]"
1304</pre></td></tr>
1305
1306
Edwin Vane8203d9f2013-03-28 13:50:22 +00001307<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>
1308<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001309
1310Given:
1311 int *a;
1312 int &amp;b = *a;
1313 int &amp;&amp;c = 1;
1314 auto &amp;d = b;
1315 auto &amp;&amp;e = c;
1316 auto &amp;&amp;f = 2;
1317 int g = 5;
1318
Edwin Vane8203d9f2013-03-28 13:50:22 +00001319lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001320matched since the type is deduced as int&amp; by reference collapsing rules.
1321</pre></td></tr>
1322
1323
Manuel Klimek41df16e2013-01-09 09:38:21 +00001324<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>
1325<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1326Given
1327 struct A { int i; }
1328 A::* ptr = A::i;
1329memberPointerType()
1330 matches "A::* ptr"
1331</pre></td></tr>
1332
1333
Edwin Vane88be2fd2013-04-01 18:33:34 +00001334<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1335<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1336
1337Given
1338 int (*ptr_to_array)[4];
1339 int *array_of_ptrs[4];
1340
1341varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1342array_of_ptrs.
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('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>
1347<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1348
1349Given
1350 int *a;
1351 int &amp;b = *a;
1352 int c = 5;
1353pointerType()
1354 matches "int *a"
1355</pre></td></tr>
1356
1357
Edwin Vane8203d9f2013-03-28 13:50:22 +00001358<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1359<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1360
1361Given:
1362 int *a;
1363 int &amp;b = *a;
1364 int &amp;&amp;c = 1;
1365 auto &amp;d = b;
1366 auto &amp;&amp;e = c;
1367 auto &amp;&amp;f = 2;
1368 int g = 5;
1369
1370rValueReferenceType() matches the types of c and f. e is not
1371matched as it is deduced to int&amp; by reference collapsing rules.
1372</pre></td></tr>
1373
1374
Edwin Vane742d9e72013-02-25 20:43:32 +00001375<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1376<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1377
1378Given
1379 class C {};
1380 struct S {};
1381
1382 C c;
1383 S s;
1384
1385recordType() matches the type of the variable declarations of both c
1386and s.
1387</pre></td></tr>
1388
1389
Manuel Klimek41df16e2013-01-09 09:38:21 +00001390<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 +00001391<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001392
1393Given
1394 int *a;
1395 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001396 int &amp;&amp;c = 1;
1397 auto &amp;d = b;
1398 auto &amp;&amp;e = c;
1399 auto &amp;&amp;f = 2;
1400 int g = 5;
1401
1402referenceType() matches the types of b, c, d, e, and f.
1403</pre></td></tr>
1404
1405
Edwin Vane3abf7782013-02-25 14:49:29 +00001406<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>
1407<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1408
1409Given
1410 template &lt;typename T&gt;
1411 class C { };
1412
1413 template class C&lt;int&gt;; A
1414 C&lt;char&gt; var; B
1415
1416templateSpecializationType() matches the type of the explicit
1417instantiation in A and the type of the variable declaration in B.
1418</pre></td></tr>
1419
1420
Daniel Jaspere0b89972012-12-04 12:08:08 +00001421<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>
1422<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1423</pre></td></tr>
1424
Manuel Klimek41df16e2013-01-09 09:38:21 +00001425
1426<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>
1427<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1428
1429Given
1430 typedef int X;
1431typedefType()
1432 matches "typedef int X"
1433</pre></td></tr>
1434
1435
1436<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>
1437<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1438integer-constant-expression.
1439
1440Given
1441 void f() {
1442 int a[] = { 2, 3 }
1443 int b[42];
1444 int c[a[0]];
1445variableArrayType()
1446 matches "int c[a[0]]"
1447</pre></td></tr>
1448
Manuel Klimek1da79332012-08-20 20:54:03 +00001449<!--END_DECL_MATCHERS -->
1450</table>
1451
1452<!-- ======================================================================= -->
1453<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1454<!-- ======================================================================= -->
1455
1456<p>Narrowing matchers match certain attributes on the current node, thus
1457narrowing down the set of nodes of the current type to match on.</p>
1458
1459<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1460which allow users to create more powerful match expressions.</p>
1461
1462<table>
1463<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1464<!-- START_NARROWING_MATCHERS -->
1465
Manuel Klimek67619ff2012-09-07 13:10:32 +00001466<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001467<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1468
1469Usable as: Any Matcher
1470</pre></td></tr>
1471
1472
Manuel Klimek67619ff2012-09-07 13:10:32 +00001473<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001474<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1475
1476Usable as: Any Matcher
1477</pre></td></tr>
1478
1479
Manuel Klimek67619ff2012-09-07 13:10:32 +00001480<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 +00001481<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1482
1483Useful when another matcher requires a child matcher, but there's no
1484additional constraint. This will often be used with an explicit conversion
1485to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1486
1487Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1488"int* p" and "void f()" in
1489 int* p;
1490 void f();
1491
1492Usable as: Any Matcher
1493</pre></td></tr>
1494
1495
Manuel Klimek67619ff2012-09-07 13:10:32 +00001496<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001497<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1498
Manuel Klimeke44a0062012-08-26 23:55:24 +00001499Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001500 class X {};
1501 class Y {};
1502
1503Usable as: Any Matcher
1504</pre></td></tr>
1505
1506
Manuel Klimek67619ff2012-09-07 13:10:32 +00001507<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 +00001508<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1509unary).
1510
1511Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1512 !(a || b)
1513</pre></td></tr>
1514
1515
Manuel Klimek67619ff2012-09-07 13:10:32 +00001516<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 +00001517<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1518
1519Example matches true (matcher = boolLiteral(equals(true)))
1520 true
1521
1522Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1523 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;
1524</pre></td></tr>
1525
1526
Manuel Klimek67619ff2012-09-07 13:10:32 +00001527<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001528<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1529by the compiler (eg. implicit defaultcopy constructors).
1530</pre></td></tr>
1531
1532
Manuel Klimek67619ff2012-09-07 13:10:32 +00001533<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001534<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1535code (as opposed to implicitly added by the compiler).
1536
1537Given
1538 struct Foo {
1539 Foo() { }
1540 Foo(int) : foo_("A") { }
1541 string foo_;
1542 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001543constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001544 will match Foo(int), but not Foo()
1545</pre></td></tr>
1546
1547
Edwin Vane6a19a972013-03-06 17:02:57 +00001548<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001549<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1550
1551Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001552"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001553
Edwin Vane6a19a972013-03-06 17:02:57 +00001554Given:
1555 class A { int operator*(); };
1556 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1557 A a;
1558 a &lt;&lt; a; &lt;-- This matches
1559
1560operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1561line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1562the declaration of A.
1563
1564Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;
1565</pre></td></tr>
1566
1567
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001568<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>
1569<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1570
1571Given
1572struct A {
1573 void foo() const;
1574 void bar();
1575};
1576
1577methodDecl(isConst()) matches A::foo() but not A::bar()
1578</pre></td></tr>
1579
1580
Edwin Vane5771a2f2013-04-09 20:46:36 +00001581<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>
1582<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1583
1584Given
1585 class A {
1586 public:
1587 virtual void x();
1588 };
1589 class B : public A {
1590 public:
1591 virtual void x();
1592 };
1593 matches B::x
1594</pre></td></tr>
1595
1596
1597<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>
1598<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1599
1600Given
1601 class A {
1602 public:
1603 virtual void x();
1604 };
1605 matches A::x
1606</pre></td></tr>
1607
1608
Edwin Vane6a19a972013-03-06 17:02:57 +00001609<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>
1610<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1611
1612Matches overloaded operator names specified in strings without the
1613"operator" prefix: e.g. "&lt;&lt;".
1614
1615Given:
1616 class A { int operator*(); };
1617 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1618 A a;
1619 a &lt;&lt; a; &lt;-- This matches
1620
1621operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1622line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1623the declaration of A.
1624
1625Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00001626</pre></td></tr>
1627
1628
Manuel Klimek67619ff2012-09-07 13:10:32 +00001629<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>StringRef BaseName</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001630<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1631</pre></td></tr>
1632
1633
Manuel Klimek415514d2013-02-06 20:36:22 +00001634<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>
1635<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001636static member variable template instantiations.
1637
1638Given
1639 template&lt;typename T&gt; void A(T t) { }
1640 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001641functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001642 matches the specialization A&lt;int&gt;().
1643
1644Usable 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;
1645</pre></td></tr>
1646
1647
Daniel Jaspere0b89972012-12-04 12:08:08 +00001648<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>StringRef BaseName</td></tr>
1649<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1650isSameOrDerivedFrom(hasName(...)).
1651</pre></td></tr>
1652
1653
Manuel Klimek415514d2013-02-06 20:36:22 +00001654<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>
1655<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001656member variable template instantiations.
1657
1658Given
1659 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1660or
1661 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001662recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001663 matches the template instantiation of X&lt;A&gt;.
1664
1665But given
1666 template &lt;typename T&gt; class X {}; class A {};
1667 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001668recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001669 does not match, as X&lt;A&gt; is an explicit template specialization.
1670
1671Usable 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;
1672</pre></td></tr>
1673
1674
Manuel Klimek67619ff2012-09-07 13:10:32 +00001675<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 +00001676<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1677a specific number of arguments (including absent default arguments).
1678
Manuel Klimeke44a0062012-08-26 23:55:24 +00001679Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001680 void f(int x, int y);
1681 f(0, 0);
1682</pre></td></tr>
1683
1684
Manuel Klimek67619ff2012-09-07 13:10:32 +00001685<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 +00001686<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1687
1688Example matches true (matcher = boolLiteral(equals(true)))
1689 true
1690
1691Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1692 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;
1693</pre></td></tr>
1694
1695
Manuel Klimek67619ff2012-09-07 13:10:32 +00001696<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 +00001697<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1698child statements.
1699
1700Example: Given
1701 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001702compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001703 matches '{}'
1704 but does not match the outer compound statement.
1705</pre></td></tr>
1706
1707
Daniel Jaspere0b89972012-12-04 12:08:08 +00001708<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>
1709<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1710
1711Given
1712 int a[42];
1713 int b[2 * 21];
1714 int c[41], d[43];
1715constantArrayType(hasSize(42))
1716 matches "int a[42]" and "int b[2 * 21]"
1717</pre></td></tr>
1718
1719
Manuel Klimek67619ff2012-09-07 13:10:32 +00001720<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 +00001721<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1722declarations.
1723
1724Example: Given
1725 int a, b;
1726 int c;
1727 int d = 2, e;
1728declCountIs(2)
1729 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1730</pre></td></tr>
1731
1732
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001733<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>Decl* Other</td></tr>
1734<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1735
1736Decl has pointer identity in the AST.
1737</pre></td></tr>
1738
1739
Daniel Jasperc7093d92013-02-25 12:39:41 +00001740<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>
1741<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1742
1743Given
1744 class C {
1745 public: int a;
1746 protected: int b;
1747 private: int c;
1748 };
1749fieldDecl(isPrivate())
1750 matches 'int c;'
1751</pre></td></tr>
1752
1753
1754<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>
1755<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1756
1757Given
1758 class C {
1759 public: int a;
1760 protected: int b;
1761 private: int c;
1762 };
1763fieldDecl(isProtected())
1764 matches 'int b;'
1765</pre></td></tr>
1766
1767
1768<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>
1769<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1770
1771Given
1772 class C {
1773 public: int a;
1774 protected: int b;
1775 private: int c;
1776 };
1777fieldDecl(isPublic())
1778 matches 'int a;'
1779</pre></td></tr>
1780
1781
Manuel Klimek67619ff2012-09-07 13:10:32 +00001782<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 +00001783<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1784
1785Example matches true (matcher = boolLiteral(equals(true)))
1786 true
1787
1788Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1789 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;
1790</pre></td></tr>
1791
1792
Manuel Klimek415514d2013-02-06 20:36:22 +00001793<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>
1794<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001795
1796Example matches A, va, fa
1797 class A {};
1798 class B; Doesn't match, as it has no body.
1799 int va;
1800 extern int vb; Doesn't match, as it doesn't define the variable.
1801 void fa() {}
1802 void fb(); Doesn't match, as it has no body.
1803
1804Usable 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;
1805</pre></td></tr>
1806
1807
Manuel Klimek415514d2013-02-06 20:36:22 +00001808<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>
1809<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001810static member variable template instantiations.
1811
1812Given
1813 template&lt;typename T&gt; void A(T t) { }
1814 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001815functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001816 matches the specialization A&lt;int&gt;().
1817
1818Usable 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;
1819</pre></td></tr>
1820
1821
Manuel Klimek67619ff2012-09-07 13:10:32 +00001822<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 +00001823<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1824
1825Given:
1826 extern "C" void f() {}
1827 extern "C" { void g() {} }
1828 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001829functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001830 matches the declaration of f and g, but not the declaration h
1831</pre></td></tr>
1832
1833
Manuel Klimek415514d2013-02-06 20:36:22 +00001834<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>
1835<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001836member variable template instantiations.
1837
1838Given
1839 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1840or
1841 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001842recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001843 matches the template instantiation of X&lt;A&gt;.
1844
1845But given
1846 template &lt;typename T&gt; class X {}; class A {};
1847 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001848recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001849 does not match, as X&lt;A&gt; is an explicit template specialization.
1850
1851Usable 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;
1852</pre></td></tr>
1853
1854
Daniel Jaspere0b89972012-12-04 12:08:08 +00001855<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>
1856<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1857
1858Given
1859 void f(int i) {}
1860 void g(int i, int j) {}
1861functionDecl(parameterCountIs(2))
1862 matches g(int i, int j) {}
1863</pre></td></tr>
1864
1865
Manuel Klimek67619ff2012-09-07 13:10:32 +00001866<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 +00001867<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1868
1869Example matches true (matcher = boolLiteral(equals(true)))
1870 true
1871
1872Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1873 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;
1874</pre></td></tr>
1875
1876
Manuel Klimek67619ff2012-09-07 13:10:32 +00001877<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 +00001878<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1879to '.'.
1880
1881Member calls on the implicit this pointer match as called with '-&gt;'.
1882
1883Given
1884 class Y {
1885 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1886 int a;
1887 static int b;
1888 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001889memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001890 matches this-&gt;x, x, y.x, a, this-&gt;b
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_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 +00001895<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1896
1897Supports specifying enclosing namespaces or classes by prefixing the name
1898with '&lt;enclosing&gt;::'.
1899Does not match typedefs of an underlying type with the given name.
1900
1901Example matches X (Name == "X")
1902 class X;
1903
1904Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1905 namespace a { namespace b { class X; } }
1906</pre></td></tr>
1907
1908
Manuel Klimek67619ff2012-09-07 13:10:32 +00001909<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 +00001910<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1911a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001912
1913Supports specifying enclosing namespaces or classes by
1914prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1915of an underlying type with the given name.
1916
1917Example matches X (regexp == "::X")
1918 class X;
1919
1920Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1921 namespace foo { namespace bar { class X; } }
1922</pre></td></tr>
1923
1924
Manuel Klimek67619ff2012-09-07 13:10:32 +00001925<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 +00001926<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1927
1928Given
1929 class Y { public: void x(); };
1930 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001931callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001932 matches y-&gt;x()
1933</pre></td></tr>
1934
1935
Edwin Vane7b69cd02013-04-02 18:15:55 +00001936<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>
1937<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1938the node, not hidden within a typedef.
1939
1940Given
1941 typedef const int const_int;
1942 const_int i;
1943 int *const j;
1944 int *volatile k;
1945 int m;
1946varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1947i is const-qualified but the qualifier is not local.
1948</pre></td></tr>
1949
1950
Manuel Klimek67619ff2012-09-07 13:10:32 +00001951<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 +00001952<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1953include "top-level" const.
1954
1955Given
1956 void a(int);
1957 void b(int const);
1958 void c(const int);
1959 void d(const int*);
1960 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001961functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001962 matches "void b(int const)", "void c(const int)" and
1963 "void e(int const) {}". It does not match d as there
1964 is no top-level const on the parameter type "const int *".
1965</pre></td></tr>
1966
1967
Manuel Klimek67619ff2012-09-07 13:10:32 +00001968<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 +00001969<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1970
1971Given
1972 void a(int);
1973 void b(long);
1974 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001975functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001976matches "a(int)", "b(long)", but not "c(double)".
1977</pre></td></tr>
1978
1979
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001980<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>Stmt* Other</td></tr>
1981<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1982
1983Stmt has pointer identity in the AST.
1984
1985</pre></td></tr>
1986
1987
Manuel Klimek415514d2013-02-06 20:36:22 +00001988<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>
1989<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001990
1991Example matches A, va, fa
1992 class A {};
1993 class B; Doesn't match, as it has no body.
1994 int va;
1995 extern int vb; Doesn't match, as it doesn't define the variable.
1996 void fa() {}
1997 void fb(); Doesn't match, as it has no body.
1998
1999Usable 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;
2000</pre></td></tr>
2001
2002
Manuel Klimek67619ff2012-09-07 13:10:32 +00002003<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 +00002004<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2005
2006Given
2007 int x;
2008 int s = sizeof(x) + alignof(x)
2009unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2010 matches sizeof(x)
2011</pre></td></tr>
2012
2013
Manuel Klimek67619ff2012-09-07 13:10:32 +00002014<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 +00002015<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2016unary).
2017
2018Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2019 !(a || b)
2020</pre></td></tr>
2021
2022
Manuel Klimek67619ff2012-09-07 13:10:32 +00002023<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002024<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2025
2026Example matches A, va, fa
2027 class A {};
2028 class B; Doesn't match, as it has no body.
2029 int va;
2030 extern int vb; Doesn't match, as it doesn't define the variable.
2031 void fa() {}
2032 void fb(); Doesn't match, as it has no body.
2033
2034Usable 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;
2035</pre></td></tr>
2036
2037
Manuel Klimek67619ff2012-09-07 13:10:32 +00002038<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 +00002039<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2040static member variable template instantiations.
2041
2042Given
2043 template&lt;typename T&gt; void A(T t) { }
2044 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002045functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002046 matches the specialization A&lt;int&gt;().
2047
2048Usable 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;
2049</pre></td></tr>
2050
2051
Manuel Klimek67619ff2012-09-07 13:10:32 +00002052<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 +00002053<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2054member variable template instantiations.
2055
2056Given
2057 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2058or
2059 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002060recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002061 matches the template instantiation of X&lt;A&gt;.
2062
2063But given
2064 template &lt;typename T&gt; class X {}; class A {};
2065 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002066recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002067 does not match, as X&lt;A&gt; is an explicit template specialization.
2068
2069Usable 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;
2070</pre></td></tr>
2071
2072<!--END_NARROWING_MATCHERS -->
2073</table>
2074
2075<!-- ======================================================================= -->
2076<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2077<!-- ======================================================================= -->
2078
2079<p>Traversal matchers specify the relationship to other nodes that are
2080reachable from the current node.</p>
2081
2082<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2083forEachDescendant) which work on all nodes and allow users to write more generic
2084match expressions.</p>
2085
2086<table>
2087<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2088<!-- START_TRAVERSAL_MATCHERS -->
2089
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002090<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
2091<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2092
2093Unlike anyOf, eachOf will generate a match result for each
2094matching submatcher.
2095
2096For example, in:
2097 class A { int a; int b; };
2098The matcher:
2099 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2100 has(fieldDecl(hasName("b")).bind("v"))))
2101will generate two results binding "v", the first of which binds
2102the field declaration of a, the second the field declaration of
2103b.
2104
2105Usable as: Any Matcher
2106</pre></td></tr>
2107
2108
2109<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt; Matcher</td></tr>
2110<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2111
2112Generates results for each match.
2113
2114For example, in:
2115 class A { class B {}; class C {}; };
2116The matcher:
2117 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2118will generate results for A, B and C.
2119
2120Usable as: Any Matcher
2121</pre></td></tr>
2122
2123
Manuel Klimek67619ff2012-09-07 13:10:32 +00002124<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;ChildT&gt; ChildMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002125<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2126provided matcher.
2127
Manuel Klimeke44a0062012-08-26 23:55:24 +00002128Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002129 class X {}; Matches X, because X::X is a class of name X inside X.
2130 class Y { class X {}; };
2131 class Z { class Y { class X {}; }; }; Does not match Z.
2132
2133ChildT must be an AST base type.
2134
2135As opposed to 'has', 'forEach' will cause a match for each result that
2136matches instead of only on the first one.
2137
2138Usable as: Any Matcher
2139</pre></td></tr>
2140
2141
Manuel Klimek67619ff2012-09-07 13:10:32 +00002142<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;DescendantT&gt; DescendantMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002143<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2144provided matcher.
2145
2146Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002147 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002148 class X {}; Matches X, because X::X is a class of name X inside X.
2149 class A { class X {}; };
2150 class B { class C { class X {}; }; };
2151
2152DescendantT must be an AST base type.
2153
2154As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2155each result that matches instead of only on the first one.
2156
2157Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002158 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002159will match 10 times (plus injected class name matches) on:
2160 class A { class B { class C { class D { class E {}; }; }; }; };
2161
2162Usable as: Any Matcher
2163</pre></td></tr>
2164
2165
Manuel Klimek67619ff2012-09-07 13:10:32 +00002166<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;ChildT&gt; ChildMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002167<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2168provided matcher.
2169
Manuel Klimeke44a0062012-08-26 23:55:24 +00002170Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002171 class X {}; Matches X, because X::X is a class of name X inside X.
2172 class Y { class X {}; };
2173 class Z { class Y { class X {}; }; }; Does not match Z.
2174
2175ChildT must be an AST base type.
2176
2177Usable as: Any Matcher
2178</pre></td></tr>
2179
2180
Manuel Klimek67619ff2012-09-07 13:10:32 +00002181<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;AncestorT&gt; AncestorMatcher</td></tr>
2182<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2183matcher.
2184
2185Given
2186void f() { if (true) { int x = 42; } }
2187void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002188expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002189
2190Usable as: Any Matcher
2191</pre></td></tr>
2192
2193
2194<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;DescendantT&gt; DescendantMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002195<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2196provided matcher.
2197
2198Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002199 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002200 class X {}; Matches X, because X::X is a class of name X inside X.
2201 class Y { class X {}; };
2202 class Z { class Y { class X {}; }; };
2203
2204DescendantT must be an AST base type.
2205
2206Usable as: Any Matcher
2207</pre></td></tr>
2208
2209
Daniel Jaspere0b89972012-12-04 12:08:08 +00002210<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;ParentT&gt; ParentMatcher</td></tr>
2211<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2212matcher.
2213
2214Given
2215void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2216compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2217
2218Usable as: Any Matcher
2219</pre></td></tr>
2220
2221
Manuel Klimek67619ff2012-09-07 13:10:32 +00002222<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002223<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2224
2225Given
2226 int i[5];
2227 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002228arraySubscriptExpression(hasBase(implicitCastExpr(
2229 hasSourceExpression(declRefExpr()))))
2230 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002231</pre></td></tr>
2232
2233
Manuel Klimek67619ff2012-09-07 13:10:32 +00002234<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 +00002235<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2236
2237Given
2238 int i[5];
2239 void f() { i[1] = 42; }
2240arraySubscriptExpression(hasIndex(integerLiteral()))
2241 matches i[1] with the integerLiteral() matching 1
2242</pre></td></tr>
2243
2244
Manuel Klimek41df16e2013-01-09 09:38:21 +00002245<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</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>
2246<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2247type.
2248
2249Given
2250 struct A {};
2251 A a[7];
2252 int b[7];
2253arrayType(hasElementType(builtinType()))
2254 matches "int b[7]"
2255
2256Usable 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;
2257</pre></td></tr>
2258
2259
2260<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</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>
2261<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2262type.
2263
2264Given
2265 struct A {};
2266 A a[7];
2267 int b[7];
2268arrayType(hasElementType(builtinType()))
2269 matches "int b[7]"
2270
2271Usable 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;
2272</pre></td></tr>
2273
2274
2275<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>
2276<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2277
2278Given
2279 _Atomic(int) i;
2280 _Atomic(float) f;
2281atomicType(hasValueType(isInteger()))
2282 matches "_Atomic(int) i"
2283
2284Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2285</pre></td></tr>
2286
2287
2288<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>
2289<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2290
2291Given
2292 _Atomic(int) i;
2293 _Atomic(float) f;
2294atomicType(hasValueType(isInteger()))
2295 matches "_Atomic(int) i"
2296
2297Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2298</pre></td></tr>
2299
2300
2301<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>
2302<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2303
2304Note: There is no TypeLoc for the deduced type and thus no
2305getDeducedLoc() matcher.
2306
2307Given
2308 auto a = 1;
2309 auto b = 2.0;
2310autoType(hasDeducedType(isInteger()))
2311 matches "auto a"
2312
2313Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2314</pre></td></tr>
2315
2316
Manuel Klimek67619ff2012-09-07 13:10:32 +00002317<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 +00002318<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2319binary operator matches.
2320</pre></td></tr>
2321
2322
Manuel Klimek67619ff2012-09-07 13:10:32 +00002323<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 +00002324<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2325
2326Example matches a (matcher = binaryOperator(hasLHS()))
2327 a || b
2328</pre></td></tr>
2329
2330
Manuel Klimek67619ff2012-09-07 13:10:32 +00002331<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 +00002332<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2333
2334Example matches b (matcher = binaryOperator(hasRHS()))
2335 a || b
2336</pre></td></tr>
2337
2338
Manuel Klimek41df16e2013-01-09 09:38:21 +00002339<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</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>
2340<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
2341pointee matches a given matcher.
2342
2343Given
2344 int *a;
2345 int const *b;
2346 float const *f;
2347pointerType(pointee(isConstQualified(), isInteger()))
2348 matches "int const *b"
2349
2350Usable 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;,
2351 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;
2352</pre></td></tr>
2353
2354
2355<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</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>
2356<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
2357pointee matches a given matcher.
2358
2359Given
2360 int *a;
2361 int const *b;
2362 float const *f;
2363pointerType(pointee(isConstQualified(), isInteger()))
2364 matches "int const *b"
2365
2366Usable 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;,
2367 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;
2368</pre></td></tr>
2369
2370
Edwin Vane3abf7782013-02-25 14:49:29 +00002371<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00002372<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
2373matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002374
Manuel Klimek03a83232013-06-10 08:52:15 +00002375The associated declaration is:
2376- for type nodes, the declaration of the underlying type
2377- for CallExpr, the declaration of the callee
2378- for MemberExpr, the declaration of the referenced member
2379- for CXXConstructExpr, the declaration of the constructor
2380
2381Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2382function. e.g. various subtypes of clang::Type and various expressions.
2383FIXME: Add all node types for which this is matcher is usable due to
2384getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002385
Daniel Jaspere0b89972012-12-04 12:08:08 +00002386Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00002387 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
2388 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002389</pre></td></tr>
2390
2391
Manuel Klimek67619ff2012-09-07 13:10:32 +00002392<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002393<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2394
2395Given
2396 struct Foo {
2397 Foo() : foo_(1) { }
2398 int foo_;
2399 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002400recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002401 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2402</pre></td></tr>
2403
2404
Manuel Klimek67619ff2012-09-07 13:10:32 +00002405<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 +00002406<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2407
2408Given
2409 struct Foo {
2410 Foo() : foo_(1) { }
2411 int foo_;
2412 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002413recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002414 forField(hasName("foo_"))))))
2415 matches Foo
2416with forField matching foo_
2417</pre></td></tr>
2418
2419
Manuel Klimek67619ff2012-09-07 13:10:32 +00002420<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 +00002421<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2422
2423Given
2424 struct Foo {
2425 Foo() : foo_(1) { }
2426 int foo_;
2427 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002428recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002429 withInitializer(integerLiteral(equals(1)))))))
2430 matches Foo
2431with withInitializer matching (1)
2432</pre></td></tr>
2433
2434
Manuel Klimek67619ff2012-09-07 13:10:32 +00002435<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 +00002436<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2437
Manuel Klimeke44a0062012-08-26 23:55:24 +00002438Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002439 class Y { public: void x(); };
2440 void z() { Y y; y.x(); }",
2441
2442FIXME: Overload to allow directly matching types?
2443</pre></td></tr>
2444
2445
Manuel Klimek67619ff2012-09-07 13:10:32 +00002446<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002447<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2448
2449
Manuel Klimek67619ff2012-09-07 13:10:32 +00002450<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 +00002451<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2452</pre></td></tr>
2453
2454
Manuel Klimek67619ff2012-09-07 13:10:32 +00002455<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 +00002456<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2457belongs to.
2458
2459FIXME: Generalize this for other kinds of declarations.
2460FIXME: What other kind of declarations would we need to generalize
2461this to?
2462
2463Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002464 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002465 ofClass(hasName("A"))))))
2466 class A {
2467 public:
2468 A();
2469 };
2470 A a = A();
2471</pre></td></tr>
2472
2473
Edwin Vane6a19a972013-03-06 17:02:57 +00002474<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>
2475<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2476
2477Given:
2478 class A { void func(); };
2479 class B { void member(); };
2480
2481recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2482but not B.
2483</pre></td></tr>
2484
2485
Manuel Klimek67619ff2012-09-07 13:10:32 +00002486<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 +00002487<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2488a class matching Base.
2489
Manuel Klimek67619ff2012-09-07 13:10:32 +00002490Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002491
Manuel Klimek67619ff2012-09-07 13:10:32 +00002492Example matches Y, Z, C (Base == hasName("X"))
2493 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002494 class Y : public X {}; directly derived
2495 class Z : public Y {}; indirectly derived
2496 typedef X A;
2497 typedef A B;
2498 class C : public B {}; derived from a typedef of X
2499
2500In the following example, Bar matches isDerivedFrom(hasName("X")):
2501 class Foo;
2502 typedef Foo X;
2503 class Bar : public Foo {}; derived from a type that X is a typedef of
2504</pre></td></tr>
2505
2506
Daniel Jaspere0b89972012-12-04 12:08:08 +00002507<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>
2508<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2509match Base.
2510</pre></td></tr>
2511
2512
Manuel Klimek67619ff2012-09-07 13:10:32 +00002513<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 +00002514<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2515given matcher.
2516
Manuel Klimeke44a0062012-08-26 23:55:24 +00002517Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002518 class Y { public: void x(); };
2519 void z() { Y y; y.x();
2520</pre></td></tr>
2521
2522
Manuel Klimek67619ff2012-09-07 13:10:32 +00002523<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 +00002524<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2525expression.
2526
2527Given
2528 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002529callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002530 matches x(1, y, 42)
2531with hasAnyArgument(...)
2532 matching y
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002533
2534FIXME: Currently this will ignore parentheses and implicit casts on
2535the argument before applying the inner matcher. We'll want to remove
2536this to allow for greater control by the user once ignoreImplicit()
2537has been implemented.
Manuel Klimek1da79332012-08-20 20:54:03 +00002538</pre></td></tr>
2539
2540
Manuel Klimek67619ff2012-09-07 13:10:32 +00002541<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 +00002542<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2543call expression.
2544
2545Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002546 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002547 void x(int) { int y; x(y); }
2548</pre></td></tr>
2549
2550
Edwin Vane3abf7782013-02-25 14:49:29 +00002551<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00002552<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
2553matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002554
Manuel Klimek03a83232013-06-10 08:52:15 +00002555The associated declaration is:
2556- for type nodes, the declaration of the underlying type
2557- for CallExpr, the declaration of the callee
2558- for MemberExpr, the declaration of the referenced member
2559- for CXXConstructExpr, the declaration of the constructor
2560
2561Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2562function. e.g. various subtypes of clang::Type and various expressions.
2563FIXME: Add all node types for which this is matcher is usable due to
2564getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002565
Daniel Jaspere0b89972012-12-04 12:08:08 +00002566Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00002567 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
2568 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002569</pre></td></tr>
2570
2571
Manuel Klimek03a83232013-06-10 08:52:15 +00002572<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>
2573<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2574extension, matches the constant given in the statement.
2575
2576Given
2577 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2578caseStmt(hasCaseConstant(integerLiteral()))
2579 matches "case 1:"
2580</pre></td></tr>
2581
2582
Manuel Klimek67619ff2012-09-07 13:10:32 +00002583<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 +00002584<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2585
2586Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002587 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002588class URL { URL(string); };
2589URL url = "a string";
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_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 +00002594<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2595TemplateArgument matching the given InnerMatcher.
2596
2597Given
2598 template&lt;typename T&gt; class A {};
2599 template&lt;&gt; class A&lt;double&gt; {};
2600 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002601classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002602 refersToType(asString("int"))))
2603 matches the specialization A&lt;int&gt;
2604</pre></td></tr>
2605
2606
Manuel Klimek67619ff2012-09-07 13:10:32 +00002607<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 +00002608<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2609matches the given InnerMatcher.
2610
2611Given
2612 template&lt;typename T, typename U&gt; class A {};
2613 A&lt;bool, int&gt; b;
2614 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002615classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002616 1, refersToType(asString("int"))))
2617 matches the specialization A&lt;bool, int&gt;
2618</pre></td></tr>
2619
2620
Manuel Klimek41df16e2013-01-09 09:38:21 +00002621<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</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>
2622<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2623type.
2624
2625Given
2626 struct A {};
2627 A a[7];
2628 int b[7];
2629arrayType(hasElementType(builtinType()))
2630 matches "int b[7]"
2631
2632Usable 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;
2633</pre></td></tr>
2634
2635
2636<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</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>
2637<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2638type.
2639
2640Given
2641 struct A {};
2642 A a[7];
2643 int b[7];
2644arrayType(hasElementType(builtinType()))
2645 matches "int b[7]"
2646
2647Usable 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;
2648</pre></td></tr>
2649
2650
Manuel Klimek67619ff2012-09-07 13:10:32 +00002651<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 +00002652<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2653a given matcher.
2654
2655Given
2656 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002657hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002658 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002659with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002660 matching '{}'
2661</pre></td></tr>
2662
2663
Manuel Klimek67619ff2012-09-07 13:10:32 +00002664<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 +00002665<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2666or conditional operator.
2667
2668Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2669 if (true) {}
2670</pre></td></tr>
2671
2672
Manuel Klimek67619ff2012-09-07 13:10:32 +00002673<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 +00002674<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2675
2676Example matches b
2677 condition ? a : b
2678</pre></td></tr>
2679
2680
Manuel Klimek67619ff2012-09-07 13:10:32 +00002681<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002682<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2683
2684Example matches a
2685 condition ? a : b
2686</pre></td></tr>
2687
2688
Manuel Klimek67619ff2012-09-07 13:10:32 +00002689<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 +00002690<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2691specific using shadow declaration.
2692
2693FIXME: This currently only works for functions. Fix.
2694
2695Given
2696 namespace a { void f() {} }
2697 using a::f;
2698 void g() {
2699 f(); Matches this ..
2700 a::f(); .. but not this.
2701 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002702declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002703 matches f()
2704</pre></td></tr>
2705
2706
Manuel Klimek67619ff2012-09-07 13:10:32 +00002707<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 +00002708<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2709specified matcher.
2710
2711Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002712 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002713 bool x;
2714 if (x) {}
2715</pre></td></tr>
2716
2717
Manuel Klimek67619ff2012-09-07 13:10:32 +00002718<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 +00002719<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2720
2721Note that this does not work for global declarations because the AST
2722breaks up multiple-declaration DeclStmt's into multiple single-declaration
2723DeclStmt's.
2724Example: Given non-global declarations
2725 int a, b = 0;
2726 int c;
2727 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002728declStmt(containsDeclaration(
2729 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002730 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002731declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002732 matches 'int a, b = 0' as well as 'int d = 2, e;'
2733 but 'int c;' is not matched.
2734</pre></td></tr>
2735
2736
Manuel Klimek67619ff2012-09-07 13:10:32 +00002737<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 +00002738<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2739
2740Given
2741 int a, b;
2742 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002743declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002744 matches 'int c;' but not 'int a, b;'.
2745</pre></td></tr>
2746
2747
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002748<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>
2749<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
2750the inner matcher.
2751
2752Given
2753 int x;
2754declaratorDecl(hasTypeLoc(loc(asString("int"))))
2755 matches int x
2756</pre></td></tr>
2757
2758
Edwin Vane742d9e72013-02-25 20:43:32 +00002759<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>
2760<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2761Decl, matches InnerMatcher.
2762
2763Given
2764 namespace N {
2765 namespace M {
2766 class D {};
2767 }
2768 }
2769
2770recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2771declaration of class D.
2772</pre></td></tr>
2773
2774
Manuel Klimek67619ff2012-09-07 13:10:32 +00002775<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 +00002776<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2777a given body.
2778
2779Given
2780 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002781hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002782 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002783with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002784 matching '{}'
2785</pre></td></tr>
2786
2787
Manuel Klimek67619ff2012-09-07 13:10:32 +00002788<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 +00002789<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2790or conditional operator.
2791
2792Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2793 if (true) {}
2794</pre></td></tr>
2795
2796
Edwin Vane742d9e72013-02-25 20:43:32 +00002797<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>
2798<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002799matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002800
2801Given
2802 namespace N {
2803 namespace M {
2804 class D {};
2805 }
2806 }
2807 N::M::D d;
2808
2809elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2810matches the type of the variable declaration of d.
2811</pre></td></tr>
2812
2813
2814<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>
2815<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2816
2817Given
2818 namespace N {
2819 namespace M {
2820 class D {};
2821 }
2822 }
2823 N::M::D d;
2824
2825elaboratedType(namesType(recordType(
2826hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2827declaration of d.
2828</pre></td></tr>
2829
2830
Manuel Klimek67619ff2012-09-07 13:10:32 +00002831<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 +00002832<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2833
2834(Note: Clang's AST refers to other conversions as "casts" too, and calls
2835actual casts "explicit" casts.)
2836</pre></td></tr>
2837
2838
Manuel Klimek67619ff2012-09-07 13:10:32 +00002839<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00002840<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2841declaration's type.
2842
2843In case of a value declaration (for example a variable declaration),
2844this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002845declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2846while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002847of x."
2848
Manuel Klimeke44a0062012-08-26 23:55:24 +00002849Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2850 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002851 class X {};
2852 void y(X &amp;x) { x; X z; }
2853
2854Usable 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;
2855</pre></td></tr>
2856
2857
Manuel Klimek67619ff2012-09-07 13:10:32 +00002858<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 +00002859<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2860are stripped off.
2861
2862Parentheses and explicit casts are not discarded.
2863Given
2864 int arr[5];
2865 int a = 0;
2866 char b = 0;
2867 const int c = a;
2868 int *d = arr;
2869 long e = (long) 0l;
2870The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002871 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2872 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002873would match the declarations for a, b, c, and d, but not e.
2874While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002875 varDecl(hasInitializer(integerLiteral()))
2876 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002877only match the declarations for b, c, and d.
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_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 +00002882<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2883casts are stripped off.
2884
2885Implicit and non-C Style casts are also discarded.
2886Given
2887 int a = 0;
2888 char b = (0);
2889 void* c = reinterpret_cast&lt;char*&gt;(0);
2890 char d = char(0);
2891The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002892 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002893would match the declarations for a, b, c, and d.
2894while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002895 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002896only match the declaration for a.
2897</pre></td></tr>
2898
2899
Manuel Klimek67619ff2012-09-07 13:10:32 +00002900<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 +00002901<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2902parentheses are stripped off.
2903
2904Explicit casts are not discarded.
2905Given
2906 int arr[5];
2907 int a = 0;
2908 char b = (0);
2909 const int c = a;
2910 int *d = (arr);
2911 long e = ((long) 0l);
2912The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002913 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2914 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002915would match the declarations for a, b, c, and d, but not e.
2916while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002917 varDecl(hasInitializer(integerLiteral()))
2918 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002919would only match the declaration for a.
2920</pre></td></tr>
2921
2922
Manuel Klimek67619ff2012-09-07 13:10:32 +00002923<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 +00002924<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2925a given body.
2926
2927Given
2928 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002929hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002930 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002931with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002932 matching '{}'
2933</pre></td></tr>
2934
2935
Manuel Klimek67619ff2012-09-07 13:10:32 +00002936<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 +00002937<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2938or conditional operator.
2939
2940Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2941 if (true) {}
2942</pre></td></tr>
2943
2944
Manuel Klimek67619ff2012-09-07 13:10:32 +00002945<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 +00002946<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2947
2948Example:
2949 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2950matches '++x' in
2951 for (x; x &lt; N; ++x) { }
2952</pre></td></tr>
2953
2954
Manuel Klimek67619ff2012-09-07 13:10:32 +00002955<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 +00002956<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2957
2958Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002959 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002960matches 'int x = 0' in
2961 for (int x = 0; x &lt; N; ++x) { }
2962</pre></td></tr>
2963
2964
Manuel Klimek67619ff2012-09-07 13:10:32 +00002965<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 +00002966<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2967
2968Does not match the 'this' parameter of a method.
2969
2970Given
2971 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002972methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002973 matches f(int x, int y, int z) {}
2974with hasAnyParameter(...)
2975 matching int y
2976</pre></td></tr>
2977
2978
Manuel Klimek67619ff2012-09-07 13:10:32 +00002979<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 +00002980<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2981
2982Given
2983 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002984methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002985 matches f(int x) {}
2986with hasParameter(...)
2987 matching int x
2988</pre></td></tr>
2989
2990
Manuel Klimek67619ff2012-09-07 13:10:32 +00002991<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 +00002992<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2993
2994Given:
2995 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002996methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002997 matches int f() { return 1; }
2998</pre></td></tr>
2999
3000
Manuel Klimek67619ff2012-09-07 13:10:32 +00003001<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003002<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3003or conditional operator.
3004
3005Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3006 if (true) {}
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_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 +00003011<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3012
3013Given
3014 if (A* a = GetAPointer()) {}
3015hasConditionVariableStatment(...)
3016 matches 'A* a = GetAPointer()'.
3017</pre></td></tr>
3018
3019
Manuel Klimek67619ff2012-09-07 13:10:32 +00003020<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 +00003021<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3022matcher.
3023
3024FIXME: Unit test this matcher
3025</pre></td></tr>
3026
3027
Edwin Vane3abf7782013-02-25 14:49:29 +00003028<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003029<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3030matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00003031
Manuel Klimek03a83232013-06-10 08:52:15 +00003032The associated declaration is:
3033- for type nodes, the declaration of the underlying type
3034- for CallExpr, the declaration of the callee
3035- for MemberExpr, the declaration of the referenced member
3036- for CXXConstructExpr, the declaration of the constructor
3037
3038Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3039function. e.g. various subtypes of clang::Type and various expressions.
3040FIXME: Add all node types for which this is matcher is usable due to
3041getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003042
Daniel Jaspere0b89972012-12-04 12:08:08 +00003043Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003044 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3045 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003046</pre></td></tr>
3047
3048
Manuel Klimek67619ff2012-09-07 13:10:32 +00003049<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 +00003050<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3051matched by a given matcher.
3052
3053Given
3054 struct X { int m; };
3055 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003056memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003057 matches "x.m" and "m"
3058with hasObjectExpression(...)
3059 matching "x" and the implicit object expression of "m" which has type X*.
3060</pre></td></tr>
3061
3062
Manuel Klimek67619ff2012-09-07 13:10:32 +00003063<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003064<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3065given matcher.
3066
3067Given
3068 struct { int first, second; } first, second;
3069 int i(second.first);
3070 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003071memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003072 matches second.first
3073 but not first.second (because the member name there is "second").
3074</pre></td></tr>
3075
3076
Manuel Klimek41df16e2013-01-09 09:38:21 +00003077<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</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>
3078<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
3079pointee matches a given matcher.
3080
3081Given
3082 int *a;
3083 int const *b;
3084 float const *f;
3085pointerType(pointee(isConstQualified(), isInteger()))
3086 matches "int const *b"
3087
3088Usable 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;,
3089 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;
3090</pre></td></tr>
3091
3092
3093<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</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>
3094<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
3095pointee matches a given matcher.
3096
3097Given
3098 int *a;
3099 int const *b;
3100 float const *f;
3101pointerType(pointee(isConstQualified(), isInteger()))
3102 matches "int const *b"
3103
3104Usable 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;,
3105 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;
3106</pre></td></tr>
3107
3108
Manuel Klimek415514d2013-02-06 20:36:22 +00003109<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 +00003110<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3111
3112Given
3113 struct A { struct B { struct C {}; }; };
3114 A::B::C c;
3115nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3116 matches "A::"
3117</pre></td></tr>
3118
3119
Manuel Klimek41df16e2013-01-09 09:38:21 +00003120<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
3121<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3122NestedNameSpecifier-matcher matches.
3123</pre></td></tr>
3124
3125
Daniel Jaspere0b89972012-12-04 12:08:08 +00003126<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>
3127<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3128given TypeLoc.
3129
3130Given
3131 struct A { struct B { struct C {}; }; };
3132 A::B::C c;
3133nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3134 hasDeclaration(recordDecl(hasName("A")))))))
3135 matches "A::"
3136</pre></td></tr>
3137
3138
Manuel Klimek415514d2013-02-06 20:36:22 +00003139<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 +00003140<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3141
3142Given
3143 struct A { struct B { struct C {}; }; };
3144 A::B::C c;
3145nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3146 matches "A::"
3147</pre></td></tr>
3148
3149
3150<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>
3151<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3152given namespace matcher.
3153
3154Given
3155 namespace ns { struct A {}; }
3156 ns::A a;
3157nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3158 matches "ns::"
3159</pre></td></tr>
3160
3161
3162<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>
3163<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3164given QualType matcher without qualifiers.
3165
3166Given
3167 struct A { struct B { struct C {}; }; };
3168 A::B::C c;
3169nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3170 matches "A::"
3171</pre></td></tr>
3172
3173
Edwin Vane88be2fd2013-04-01 18:33:34 +00003174<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>
3175<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3176
3177Given
3178 int (*ptr_to_array)[4];
3179 int (*ptr_to_func)(int);
3180
3181varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3182ptr_to_func but not ptr_to_array.
3183
3184Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3185</pre></td></tr>
3186
3187
Manuel Klimek41df16e2013-01-09 09:38:21 +00003188<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</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>
3189<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3190pointee matches a given matcher.
3191
3192Given
3193 int *a;
3194 int const *b;
3195 float const *f;
3196pointerType(pointee(isConstQualified(), isInteger()))
3197 matches "int const *b"
3198
3199Usable 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;,
3200 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;
3201</pre></td></tr>
3202
3203
3204<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</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>
3205<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3206pointee matches a given matcher.
3207
3208Given
3209 int *a;
3210 int const *b;
3211 float const *f;
3212pointerType(pointee(isConstQualified(), isInteger()))
3213 matches "int const *b"
3214
3215Usable 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;,
3216 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;
3217</pre></td></tr>
3218
3219
Edwin Vane6a19a972013-03-06 17:02:57 +00003220<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>
3221<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3222
3223Given:
3224 typedef int &amp;int_ref;
3225 int a;
3226 int_ref b = a;
3227
3228varDecl(hasType(qualType(referenceType()))))) will not match the
3229declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3230</pre></td></tr>
3231
3232
Edwin Vane3abf7782013-02-25 14:49:29 +00003233<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003234<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3235matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003236
Manuel Klimek03a83232013-06-10 08:52:15 +00003237The associated declaration is:
3238- for type nodes, the declaration of the underlying type
3239- for CallExpr, the declaration of the callee
3240- for MemberExpr, the declaration of the referenced member
3241- for CXXConstructExpr, the declaration of the constructor
3242
3243Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3244function. e.g. various subtypes of clang::Type and various expressions.
3245FIXME: Add all node types for which this is matcher is usable due to
3246getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003247
Daniel Jaspere0b89972012-12-04 12:08:08 +00003248Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003249 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3250 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003251</pre></td></tr>
3252
3253
Manuel Klimek67619ff2012-09-07 13:10:32 +00003254<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00003255<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3256</pre></td></tr>
3257
3258
Manuel Klimek67619ff2012-09-07 13:10:32 +00003259<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00003260<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3261</pre></td></tr>
3262
3263
Manuel Klimek41df16e2013-01-09 09:38:21 +00003264<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</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>
3265<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3266pointee matches a given matcher.
3267
3268Given
3269 int *a;
3270 int const *b;
3271 float const *f;
3272pointerType(pointee(isConstQualified(), isInteger()))
3273 matches "int const *b"
3274
3275Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3276 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3277</pre></td></tr>
3278
3279
3280<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</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>
3281<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3282pointee matches a given matcher.
3283
3284Given
3285 int *a;
3286 int const *b;
3287 float const *f;
3288pointerType(pointee(isConstQualified(), isInteger()))
3289 matches "int const *b"
3290
3291Usable 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;,
3292 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;
3293</pre></td></tr>
3294
3295
Manuel Klimek67619ff2012-09-07 13:10:32 +00003296<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 +00003297<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3298alignof.
3299</pre></td></tr>
3300
3301
Manuel Klimek67619ff2012-09-07 13:10:32 +00003302<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 +00003303<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3304sizeof.
3305</pre></td></tr>
3306
3307
Manuel Klimek03a83232013-06-10 08:52:15 +00003308<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>
3309<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3310statement. This matcher may produce multiple matches.
3311
3312Given
3313 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3314switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3315 matches four times, with "c" binding each of "case 1:", "case 2:",
3316"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3317"switch (1)", "switch (2)" and "switch (2)".
3318</pre></td></tr>
3319
3320
Manuel Klimek67619ff2012-09-07 13:10:32 +00003321<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00003322<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3323
3324Given
3325 template&lt;typename T&gt; struct A {};
3326 struct B { B* next; };
3327 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003328classTemplateSpecializationDecl(hasAnyTemplateArgument(
3329 refersToDeclaration(fieldDecl(hasName("next"))))
3330 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003331 B::next
3332</pre></td></tr>
3333
3334
Manuel Klimek67619ff2012-09-07 13:10:32 +00003335<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 +00003336<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3337
3338Given
3339 struct X {};
3340 template&lt;typename T&gt; struct A {};
3341 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003342classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003343 refersToType(class(hasName("X")))))
3344 matches the specialization A&lt;X&gt;
3345</pre></td></tr>
3346
3347
Edwin Vane3abf7782013-02-25 14:49:29 +00003348<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003349<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
3350matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003351
Manuel Klimek03a83232013-06-10 08:52:15 +00003352The associated declaration is:
3353- for type nodes, the declaration of the underlying type
3354- for CallExpr, the declaration of the callee
3355- for MemberExpr, the declaration of the referenced member
3356- for CXXConstructExpr, the declaration of the constructor
3357
3358Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3359function. e.g. various subtypes of clang::Type and various expressions.
3360FIXME: Add all node types for which this is matcher is usable due to
3361getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003362
3363Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003364 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3365 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3366</pre></td></tr>
3367
3368
3369<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3370<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3371QualType-matcher matches.
3372</pre></td></tr>
3373
3374
3375<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 +00003376<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
3377matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00003378
Manuel Klimek03a83232013-06-10 08:52:15 +00003379The associated declaration is:
3380- for type nodes, the declaration of the underlying type
3381- for CallExpr, the declaration of the callee
3382- for MemberExpr, the declaration of the referenced member
3383- for CXXConstructExpr, the declaration of the constructor
3384
3385Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3386function. e.g. various subtypes of clang::Type and various expressions.
3387FIXME: Add all node types for which this is matcher is usable due to
3388getDecl().
Edwin Vane3abf7782013-02-25 14:49:29 +00003389
3390Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3391 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3392 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003393</pre></td></tr>
3394
3395
Manuel Klimek67619ff2012-09-07 13:10:32 +00003396<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 +00003397<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3398
3399Given
3400 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3401unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3402 matches sizeof(a) and alignof(c)
3403</pre></td></tr>
3404
3405
Manuel Klimek67619ff2012-09-07 13:10:32 +00003406<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 +00003407<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3408
Daniel Jaspere0b89972012-12-04 12:08:08 +00003409Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003410 !true
3411</pre></td></tr>
3412
3413
Manuel Klimek67619ff2012-09-07 13:10:32 +00003414<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 +00003415<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3416
3417Given
3418 namespace X { void b(); }
3419 using X::b;
3420usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3421 matches using X::b </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_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 +00003425<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3426matched by the given matcher.
3427
3428Given
3429 namespace X { int a; void b(); }
3430 using X::a;
3431 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003432usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003433 matches using X::b but not using X::a </pre></td></tr>
3434
3435
Manuel Klimek67619ff2012-09-07 13:10:32 +00003436<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00003437<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3438declaration's type.
3439
3440In case of a value declaration (for example a variable declaration),
3441this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003442declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3443while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003444of x."
3445
Manuel Klimeke44a0062012-08-26 23:55:24 +00003446Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3447 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003448 class X {};
3449 void y(X &amp;x) { x; X z; }
3450
3451Usable 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;
3452</pre></td></tr>
3453
3454
Manuel Klimek67619ff2012-09-07 13:10:32 +00003455<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 +00003456<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3457that matches the given matcher.
3458
Manuel Klimeke44a0062012-08-26 23:55:24 +00003459Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003460 bool y() { return true; }
3461 bool x = y();
3462</pre></td></tr>
3463
3464
Daniel Jaspere0b89972012-12-04 12:08:08 +00003465<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>
3466<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3467expression.
3468
3469Given
3470 void f(int b) {
3471 int a[b];
3472 }
3473variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3474 varDecl(hasName("b")))))))
3475 matches "int a[b]"
3476</pre></td></tr>
3477
3478
Manuel Klimek67619ff2012-09-07 13:10:32 +00003479<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 +00003480<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3481a given body.
3482
3483Given
3484 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003485hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003486 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003487with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003488 matching '{}'
3489</pre></td></tr>
3490
3491
Manuel Klimek67619ff2012-09-07 13:10:32 +00003492<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 +00003493<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3494or conditional operator.
3495
3496Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3497 if (true) {}
3498</pre></td></tr>
3499
3500<!--END_TRAVERSAL_MATCHERS -->
3501</table>
3502
3503</div>
3504</body>
3505</html>
3506
3507