blob: e571c0780c3397877d73b986f05f86c490adac32 [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 Klimek67619ff2012-09-07 13:10:32 +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('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 +0000138<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000139
140Example matches Foo::~Foo()
141 class Foo {
142 public:
143 virtual ~Foo();
144 };
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('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 +0000149<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000150
151Example matches A, B, C
152 enum X {
153 A, B, C
154 };
155</pre></td></tr>
156
157
Manuel Klimek67619ff2012-09-07 13:10:32 +0000158<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 +0000159<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
160
161Example matches X
162 enum X {
163 A, B, C
164 };
165</pre></td></tr>
166
167
Manuel Klimek67619ff2012-09-07 13:10:32 +0000168<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 +0000169<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000170
171Given
172 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000173fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000174 matches 'm'.
175</pre></td></tr>
176
177
Manuel Klimek67619ff2012-09-07 13:10:32 +0000178<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 +0000179<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000180
181Example matches f
182 void f();
183</pre></td></tr>
184
185
Manuel Klimek67619ff2012-09-07 13:10:32 +0000186<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 +0000187<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000188
189Example matches f
190 template&lt;class T&gt; void f(T t) {}
191</pre></td></tr>
192
193
Manuel Klimek67619ff2012-09-07 13:10:32 +0000194<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 +0000195<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000196
197Example matches y
198 class X { void y() };
199</pre></td></tr>
200
201
Manuel Klimek67619ff2012-09-07 13:10:32 +0000202<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 +0000203<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 +0000204
205Example matches X, S, the anonymous union type, i, and U;
206 typedef int X;
207 struct S {
208 union {
209 int i;
210 } U;
211 };
212</pre></td></tr>
213
214
Edwin Vane0332e0a2013-05-09 16:42:37 +0000215<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>
216<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
217
218Given
219 namespace {}
220 namespace test {}
221namespaceDecl()
222 matches "namespace {}" and "namespace test {}"
223</pre></td></tr>
224
225
Manuel Klimek67619ff2012-09-07 13:10:32 +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('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 +0000227<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000228
229Example matches X, Z
230 class X;
231 template&lt;class T&gt; class Z {};
232</pre></td></tr>
233
234
Manuel Klimek67619ff2012-09-07 13:10:32 +0000235<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 +0000236<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
237
238Given
239 namespace X { int x; }
240 using X::x;
241usingDecl()
242 matches using X::x </pre></td></tr>
243
244
Manuel Klimek67619ff2012-09-07 13:10:32 +0000245<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 +0000246<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000247
248Note: this does not match declarations of member variables, which are
249"field" declarations in Clang parlance.
250
251Example matches a
252 int a;
253</pre></td></tr>
254
255
Manuel Klimek41df16e2013-01-09 09:38:21 +0000256<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>
257<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
258</pre></td></tr>
259
260
261<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>
262<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
263
264Given
265 namespace ns {
266 struct A { static void f(); };
267 void A::f() {}
268 void g() { A::f(); }
269 }
270 ns::A a;
271nestedNameSpecifier()
272 matches "ns::" and both "A::"
273</pre></td></tr>
274
275
276<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>
277<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
278</pre></td></tr>
279
280
Manuel Klimek67619ff2012-09-07 13:10:32 +0000281<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 +0000282<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
283
284Given
285 int i = a[1];
286arraySubscriptExpr()
287 matches "a[1]"
288</pre></td></tr>
289
290
Daniel Jaspere0b89972012-12-04 12:08:08 +0000291<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>
292<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
293
294 int i = 100;
295 __asm("mov al, 2");
296asmStmt()
297 matches '__asm("mov al, 2")'
298</pre></td></tr>
299
300
Manuel Klimek67619ff2012-09-07 13:10:32 +0000301<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +0000302<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
303
304Example matches a || b
305 !(a || b)
306</pre></td></tr>
307
308
Manuel Klimek67619ff2012-09-07 13:10:32 +0000309<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 +0000310<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000311
312Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000313 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000314 FunctionTakesString(GetStringByValue());
315 FunctionTakesStringByPointer(GetStringPointer());
316</pre></td></tr>
317
318
Daniel Jaspere0b89972012-12-04 12:08:08 +0000319<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>
320<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
321
322Example matches true
323 true
324</pre></td></tr>
325
326
327<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>
328<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
329
330Given
331 while (true) { break; }
332breakStmt()
333 matches 'break'
334</pre></td></tr>
335
336
337<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>
338<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
339
340Example: Matches (int*) 2.2f in
341 int i = (int) 2.2f;
342</pre></td></tr>
343
344
Manuel Klimek67619ff2012-09-07 13:10:32 +0000345<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +0000346<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000347
348Example matches x.y() and y()
349 X x;
350 x.y();
351 y();
352</pre></td></tr>
353
354
Daniel Jaspere0b89972012-12-04 12:08:08 +0000355<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>
356<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
357
358Example: castExpr() matches each of the following:
359 (int) 3;
360 const_cast&lt;Expr *&gt;(SubExpr);
361 char c = 0;
362but does not match
363 int i = (0);
364 int k = 0;
365</pre></td></tr>
366
367
368<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>
369<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
370
371 try {} catch(int i) {}
372catchStmt()
373 matches 'catch(int i)'
374</pre></td></tr>
375
376
377<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>
378<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
379
380Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
381though.
382
383Example matches 'a', L'a'
384 char ch = 'a'; wchar_t chw = L'a';
385</pre></td></tr>
386
387
Manuel Klimek415514d2013-02-06 20:36:22 +0000388<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>
389<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
390
391Example match: {1}, (1, 2)
392 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
393</pre></td></tr>
394
395
Manuel Klimek67619ff2012-09-07 13:10:32 +0000396<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000397<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000398
399Example matches '{}' and '{{}}'in 'for (;;) {{}}'
400 for (;;) {{}}
401</pre></td></tr>
402
403
Manuel Klimek67619ff2012-09-07 13:10:32 +0000404<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 +0000405<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
406
407Example matches a ? b : c
408 (a ? b : c) + 42
409</pre></td></tr>
410
411
Daniel Jaspere0b89972012-12-04 12:08:08 +0000412<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>
413<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
414
415Example: Matches const_cast&lt;int*&gt;(&amp;r) in
416 int n = 42;
417 const int &amp;r(n);
418 int* p = const_cast&lt;int*&gt;(&amp;r);
419</pre></td></tr>
420
421
Manuel Klimek67619ff2012-09-07 13:10:32 +0000422<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000423<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000424
425Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000426 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000427 void f(const string &amp;a, const string &amp;b);
428 char *ptr;
429 int n;
430 f(string(ptr, n), ptr);
431</pre></td></tr>
432
433
Daniel Jaspere0b89972012-12-04 12:08:08 +0000434<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>
435<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
436
437Given
438 while (true) { continue; }
439continueStmt()
440 matches 'continue'
441</pre></td></tr>
442
443
Manuel Klimek67619ff2012-09-07 13:10:32 +0000444<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 +0000445<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000446
447Example matches x in if (x)
448 bool x;
449 if (x) {}
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('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 +0000454<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000455
456Given
457 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000458declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000459 matches 'int a'.
460</pre></td></tr>
461
462
Manuel Klimek67619ff2012-09-07 13:10:32 +0000463<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 +0000464<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 +0000465
466Example matches the CXXDefaultArgExpr placeholder inserted for the
467 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000468 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000469 void f(int x, int y = 0);
470 f(42);
471</pre></td></tr>
472
473
Manuel Klimek67619ff2012-09-07 13:10:32 +0000474<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 +0000475<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000476
477Given
478 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000479deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000480 matches 'delete 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('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 +0000485<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
486
487Given
488 do {} while (true);
489doStmt()
490 matches 'do {} while(true)'
491</pre></td></tr>
492
493
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
495<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
496
497Example:
498 dynamicCastExpr()
499matches
500 dynamic_cast&lt;D*&gt;(&amp;b);
501in
502 struct B { virtual ~B() {} }; struct D : B {};
503 B b;
504 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
505</pre></td></tr>
506
507
508<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>
509<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
510
511Matches any cast expression written in user code, whether it be a
512C-style cast, a functional-style cast, or a keyword cast.
513
514Does not match implicit conversions.
515
516Note: the name "explicitCast" is chosen to match Clang's terminology, as
517Clang uses the term "cast" to apply to implicit conversions as well as to
518actual cast expressions.
519
520hasDestinationType.
521
522Example: matches all five of the casts in
523 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
524but does not match the implicit conversion in
525 long ell = 42;
526</pre></td></tr>
527
528
Manuel Klimek67619ff2012-09-07 13:10:32 +0000529<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 +0000530<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000531
532Example matches x()
533 void f() { x(); }
534</pre></td></tr>
535
536
Daniel Jaspere0b89972012-12-04 12:08:08 +0000537<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>
538<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
539
540forRangeStmt() matches 'for (auto a : i)'
541 int i[] = {1, 2, 3}; for (auto a : i);
542 for(int j = 0; j &lt; 5; ++j);
543</pre></td></tr>
544
545
Manuel Klimek67619ff2012-09-07 13:10:32 +0000546<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 +0000547<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
548
549Example matches 'for (;;) {}'
550 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000551 int i[] = {1, 2, 3}; for (auto a : i);
552</pre></td></tr>
553
554
555<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>
556<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
557
558Example: Matches Foo(bar);
559 Foo f = bar;
560 Foo g = (Foo) bar;
561 Foo h = Foo(bar);
562</pre></td></tr>
563
564
565<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>
566<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
567
568Given
569 goto FOO;
570 FOO: bar();
571gotoStmt()
572 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000573</pre></td></tr>
574
575
Manuel Klimek67619ff2012-09-07 13:10:32 +0000576<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 +0000577<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
578
579Example matches 'if (x) {}'
580 if (x) {}
581</pre></td></tr>
582
583
Daniel Jaspere0b89972012-12-04 12:08:08 +0000584<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>
585<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
586
587This matches many different places, including function call return value
588eliding, as well as any type conversions.
589</pre></td></tr>
590
591
Manuel Klimek67619ff2012-09-07 13:10:32 +0000592<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 +0000593<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
594
595Given
596 int a[] = { 1, 2 };
597 struct B { int x, y; };
598 B b = { 5, 6 };
599initList()
600 matches "{ 1, 2 }" and "{ 5, 6 }"
601</pre></td></tr>
602
603
Daniel Jaspere0b89972012-12-04 12:08:08 +0000604<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>
605<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
606
607Not matching character-encoded integers such as L'a'.
608
609Example matches 1, 1L, 0x1, 1U
610</pre></td></tr>
611
612
613<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>
614<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
615
616Given
617 goto FOO;
618 FOO: bar();
619labelStmt()
620 matches 'FOO:'
621</pre></td></tr>
622
623
624<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>
625<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
626
627Example matches [&amp;](){return 5;}
628 [&amp;](){return 5;}
629</pre></td></tr>
630
631
Manuel Klimek67619ff2012-09-07 13:10:32 +0000632<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 +0000633<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
634
635Example: Given
636 struct T {void func()};
637 T f();
638 void g(T);
639materializeTemporaryExpr() matches 'f()' in these statements
640 T u(f());
641 g(f());
642but does not match
643 f();
644 f().func();
645</pre></td></tr>
646
647
Manuel Klimek67619ff2012-09-07 13:10:32 +0000648<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 +0000649<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000650
651Example matches x.y()
652 X x;
653 x.y();
654</pre></td></tr>
655
656
Manuel Klimek67619ff2012-09-07 13:10:32 +0000657<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 +0000658<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000659
660Given
661 class Y {
662 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
663 int a; static int b;
664 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000665memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000666 matches this-&gt;x, x, y.x, a, this-&gt;b
667</pre></td></tr>
668
669
Manuel Klimek67619ff2012-09-07 13:10:32 +0000670<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 +0000671<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000672
673Given
674 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000675newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000676 matches 'new X'.
677</pre></td></tr>
678
679
Daniel Jaspere0b89972012-12-04 12:08:08 +0000680<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>
681<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
682</pre></td></tr>
683
684
685<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>
686<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
687
688 foo();;
689nullStmt()
690 matches the second ';'
691</pre></td></tr>
692
693
Manuel Klimek67619ff2012-09-07 13:10:32 +0000694<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 +0000695<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000696
697Note that if an operator isn't overloaded, it won't match. Instead, use
698binaryOperator matcher.
699Currently it does not match operators such as new delete.
700FIXME: figure out why these do not match?
701
702Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000703 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000704 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
705 ostream &amp;o; int b = 1, c = 1;
706 o &lt;&lt; b &lt;&lt; c;
707</pre></td></tr>
708
709
Daniel Jaspere0b89972012-12-04 12:08:08 +0000710<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
711<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
712
713Either the source expression or the destination type can be matched
714using has(), but hasDestinationType() is more specific and can be
715more readable.
716
717Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
718 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
719</pre></td></tr>
720
721
722<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>
723<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
724
725Given
726 return 1;
727returnStmt()
728 matches 'return 1'
729</pre></td></tr>
730
731
732<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>
733<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
734
735hasDestinationType
736reinterpretCast
737
738Example:
739 staticCastExpr()
740matches
741 static_cast&lt;long&gt;(8)
742in
743 long eight(static_cast&lt;long&gt;(8));
744</pre></td></tr>
745
746
Manuel Klimek67619ff2012-09-07 13:10:32 +0000747<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 +0000748<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000749
750Given
751 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000752stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000753 matches both the compound statement '{ ++a; }' and '++a'.
754</pre></td></tr>
755
756
Daniel Jaspere0b89972012-12-04 12:08:08 +0000757<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>
758<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
759
760Example matches "abcd", L"abcd"
761 char *s = "abcd"; wchar_t *ws = L"abcd"
762</pre></td></tr>
763
764
Manuel Klimek67619ff2012-09-07 13:10:32 +0000765<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 +0000766<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
767
768Given
769 switch(a) { case 42: break; default: break; }
770switchCase()
771 matches 'case 42: break;' and 'default: break;'.
772</pre></td></tr>
773
774
Daniel Jaspere0b89972012-12-04 12:08:08 +0000775<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
776<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
777
778Given
779 switch(a) { case 42: break; default: break; }
780switchStmt()
781 matches 'switch(a)'.
782</pre></td></tr>
783
784
785<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>
786<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
787
788Example matches the implicit this expression in "return i".
789 (matcher = thisExpr())
790struct foo {
791 int i;
792 int f() { return i; }
793};
794</pre></td></tr>
795
796
797<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>
798<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
799
800 try { throw 5; } catch(int i) {}
801throwExpr()
802 matches 'throw 5'
803</pre></td></tr>
804
805
806<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>
807<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
808
809 try {} catch(int i) {}
810tryStmt()
811 matches 'try {}'
812</pre></td></tr>
813
814
Manuel Klimek67619ff2012-09-07 13:10:32 +0000815<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000816<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
817
818Given
819 Foo x = bar;
820 int y = sizeof(x) + alignof(x);
821unaryExprOrTypeTraitExpr()
822 matches sizeof(x) and alignof(x)
823</pre></td></tr>
824
825
Manuel Klimek67619ff2012-09-07 13:10:32 +0000826<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 +0000827<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
828
829Example matches !a
830 !a || b
831</pre></td></tr>
832
833
Daniel Jaspere0b89972012-12-04 12:08:08 +0000834<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>
835<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
836
837Example match: "foo"_suffix
838</pre></td></tr>
839
840
Manuel Klimek67619ff2012-09-07 13:10:32 +0000841<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 +0000842<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
843
844Given
845 while (true) {}
846whileStmt()
847 matches 'while (true) {}'.
848</pre></td></tr>
849
Daniel Jaspere0b89972012-12-04 12:08:08 +0000850
Manuel Klimek41df16e2013-01-09 09:38:21 +0000851<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>
852<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
853
854Given
855 int a[] = { 2, 3 };
856 int b[4];
857 void f() { int c[a[0]]; }
858arrayType()
859 matches "int a[]", "int b[4]" and "int c[a[0]]";
860</pre></td></tr>
861
862
863<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>
864<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
865
866Given
867 _Atomic(int) i;
868atomicType()
869 matches "_Atomic(int) i"
870</pre></td></tr>
871
872
873<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>
874<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
875
876Given:
877 auto n = 4;
878 int v[] = { 2, 3 }
879 for (auto i : v) { }
880autoType()
881 matches "auto n" and "auto i"
882</pre></td></tr>
883
884
885<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>
886<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
887"void (^)(int)".
888
889The pointee is always required to be a FunctionType.
890</pre></td></tr>
891
892
893<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>
894<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
895
896Given
897 struct A {};
898 A a;
899 int b;
900 float c;
901 bool d;
902builtinType()
903 matches "int b", "float c" and "bool d"
904</pre></td></tr>
905
906
907<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>
908<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
909
910Given
911 _Complex float f;
912complexType()
913 matches "_Complex float f"
914</pre></td></tr>
915
916
917<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>
918<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
919
920Given
921 void() {
922 int a[2];
923 int b[] = { 2, 3 };
924 int c[b[0]];
925 }
926constantArrayType()
927 matches "int a[2]"
928</pre></td></tr>
929
930
931<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>
932<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
933
934Given
935 template&lt;typename T, int Size&gt;
936 class array {
937 T data[Size];
938 };
939dependentSizedArrayType
940 matches "T data[Size]"
941</pre></td></tr>
942
943
Edwin Vane742d9e72013-02-25 20:43:32 +0000944<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>
945<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
946qualified name.
947
948Given
949 namespace N {
950 namespace M {
951 class D {};
952 }
953 }
954 class C {};
955
956 class C c;
957 N::M::D d;
958
959elaboratedType() matches the type of the variable declarations of both
960c and d.
961</pre></td></tr>
962
963
Manuel Klimek41df16e2013-01-09 09:38:21 +0000964<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>
965<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
966
967Given
968 int (*f)(int);
969 void g();
970functionType()
971 matches "int (*f)(int)" and the type of "g".
972</pre></td></tr>
973
974
975<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>
976<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
977
978Given
979 int a[] = { 2, 3 };
980 int b[42];
981 void f(int c[]) { int d[a[0]]; };
982incompleteArrayType()
983 matches "int a[]" and "int c[]"
984</pre></td></tr>
985
986
Edwin Vane8203d9f2013-03-28 13:50:22 +0000987<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>
988<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +0000989
990Given:
991 int *a;
992 int &amp;b = *a;
993 int &amp;&amp;c = 1;
994 auto &amp;d = b;
995 auto &amp;&amp;e = c;
996 auto &amp;&amp;f = 2;
997 int g = 5;
998
Edwin Vane8203d9f2013-03-28 13:50:22 +0000999lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001000matched since the type is deduced as int&amp; by reference collapsing rules.
1001</pre></td></tr>
1002
1003
Manuel Klimek41df16e2013-01-09 09:38:21 +00001004<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>
1005<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
1006Given
1007 struct A { int i; }
1008 A::* ptr = A::i;
1009memberPointerType()
1010 matches "A::* ptr"
1011</pre></td></tr>
1012
1013
Edwin Vane88be2fd2013-04-01 18:33:34 +00001014<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>
1015<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1016
1017Given
1018 int (*ptr_to_array)[4];
1019 int *array_of_ptrs[4];
1020
1021varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1022array_of_ptrs.
1023</pre></td></tr>
1024
1025
Manuel Klimek41df16e2013-01-09 09:38:21 +00001026<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>
1027<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1028
1029Given
1030 int *a;
1031 int &amp;b = *a;
1032 int c = 5;
1033pointerType()
1034 matches "int *a"
1035</pre></td></tr>
1036
1037
Edwin Vane8203d9f2013-03-28 13:50:22 +00001038<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>
1039<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1040
1041Given:
1042 int *a;
1043 int &amp;b = *a;
1044 int &amp;&amp;c = 1;
1045 auto &amp;d = b;
1046 auto &amp;&amp;e = c;
1047 auto &amp;&amp;f = 2;
1048 int g = 5;
1049
1050rValueReferenceType() matches the types of c and f. e is not
1051matched as it is deduced to int&amp; by reference collapsing rules.
1052</pre></td></tr>
1053
1054
Edwin Vane742d9e72013-02-25 20:43:32 +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('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>
1056<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1057
1058Given
1059 class C {};
1060 struct S {};
1061
1062 C c;
1063 S s;
1064
1065recordType() matches the type of the variable declarations of both c
1066and s.
1067</pre></td></tr>
1068
1069
Manuel Klimek41df16e2013-01-09 09:38:21 +00001070<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 +00001071<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001072
1073Given
1074 int *a;
1075 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001076 int &amp;&amp;c = 1;
1077 auto &amp;d = b;
1078 auto &amp;&amp;e = c;
1079 auto &amp;&amp;f = 2;
1080 int g = 5;
1081
1082referenceType() matches the types of b, c, d, e, and f.
1083</pre></td></tr>
1084
1085
Edwin Vane3abf7782013-02-25 14:49:29 +00001086<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>
1087<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1088
1089Given
1090 template &lt;typename T&gt;
1091 class C { };
1092
1093 template class C&lt;int&gt;; A
1094 C&lt;char&gt; var; B
1095
1096templateSpecializationType() matches the type of the explicit
1097instantiation in A and the type of the variable declaration in B.
1098</pre></td></tr>
1099
1100
Daniel Jaspere0b89972012-12-04 12:08:08 +00001101<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>
1102<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1103</pre></td></tr>
1104
1105
Manuel Klimek41df16e2013-01-09 09:38:21 +00001106<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>
1107<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1108
1109Given
1110 typedef int X;
1111typedefType()
1112 matches "typedef int X"
1113</pre></td></tr>
1114
1115
1116<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>
1117<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1118integer-constant-expression.
1119
1120Given
1121 void f() {
1122 int a[] = { 2, 3 }
1123 int b[42];
1124 int c[a[0]];
1125variableArrayType()
1126 matches "int c[a[0]]"
1127</pre></td></tr>
1128
1129
1130<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>
1131<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1132
1133Given
1134 int a[] = { 2, 3 };
1135 int b[4];
1136 void f() { int c[a[0]]; }
1137arrayType()
1138 matches "int a[]", "int b[4]" and "int c[a[0]]";
1139</pre></td></tr>
1140
1141
1142<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>
1143<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1144
1145Given
1146 _Atomic(int) i;
1147atomicType()
1148 matches "_Atomic(int) i"
1149</pre></td></tr>
1150
1151
1152<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>
1153<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1154
1155Given:
1156 auto n = 4;
1157 int v[] = { 2, 3 }
1158 for (auto i : v) { }
1159autoType()
1160 matches "auto n" and "auto i"
1161</pre></td></tr>
1162
1163
1164<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>
1165<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1166"void (^)(int)".
1167
1168The pointee is always required to be a FunctionType.
1169</pre></td></tr>
1170
1171
1172<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>
1173<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1174
1175Given
1176 struct A {};
1177 A a;
1178 int b;
1179 float c;
1180 bool d;
1181builtinType()
1182 matches "int b", "float c" and "bool d"
1183</pre></td></tr>
1184
1185
1186<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>
1187<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1188
1189Given
1190 _Complex float f;
1191complexType()
1192 matches "_Complex float f"
1193</pre></td></tr>
1194
1195
1196<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>
1197<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1198
1199Given
1200 void() {
1201 int a[2];
1202 int b[] = { 2, 3 };
1203 int c[b[0]];
1204 }
1205constantArrayType()
1206 matches "int a[2]"
1207</pre></td></tr>
1208
1209
1210<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>
1211<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1212
1213Given
1214 template&lt;typename T, int Size&gt;
1215 class array {
1216 T data[Size];
1217 };
1218dependentSizedArrayType
1219 matches "T data[Size]"
1220</pre></td></tr>
1221
1222
Edwin Vane742d9e72013-02-25 20:43:32 +00001223<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1224<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1225qualified name.
1226
1227Given
1228 namespace N {
1229 namespace M {
1230 class D {};
1231 }
1232 }
1233 class C {};
1234
1235 class C c;
1236 N::M::D d;
1237
1238elaboratedType() matches the type of the variable declarations of both
1239c and d.
1240</pre></td></tr>
1241
1242
Manuel Klimek41df16e2013-01-09 09:38:21 +00001243<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>
1244<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1245
1246Given
1247 int (*f)(int);
1248 void g();
1249functionType()
1250 matches "int (*f)(int)" and the type of "g".
1251</pre></td></tr>
1252
1253
1254<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>
1255<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1256
1257Given
1258 int a[] = { 2, 3 };
1259 int b[42];
1260 void f(int c[]) { int d[a[0]]; };
1261incompleteArrayType()
1262 matches "int a[]" and "int c[]"
1263</pre></td></tr>
1264
1265
Edwin Vane8203d9f2013-03-28 13:50:22 +00001266<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>
1267<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001268
1269Given:
1270 int *a;
1271 int &amp;b = *a;
1272 int &amp;&amp;c = 1;
1273 auto &amp;d = b;
1274 auto &amp;&amp;e = c;
1275 auto &amp;&amp;f = 2;
1276 int g = 5;
1277
Edwin Vane8203d9f2013-03-28 13:50:22 +00001278lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001279matched since the type is deduced as int&amp; by reference collapsing rules.
1280</pre></td></tr>
1281
1282
Manuel Klimek41df16e2013-01-09 09:38:21 +00001283<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>
1284<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1285Given
1286 struct A { int i; }
1287 A::* ptr = A::i;
1288memberPointerType()
1289 matches "A::* ptr"
1290</pre></td></tr>
1291
1292
Edwin Vane88be2fd2013-04-01 18:33:34 +00001293<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>
1294<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1295
1296Given
1297 int (*ptr_to_array)[4];
1298 int *array_of_ptrs[4];
1299
1300varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1301array_of_ptrs.
1302</pre></td></tr>
1303
1304
Manuel Klimek41df16e2013-01-09 09:38:21 +00001305<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>
1306<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1307
1308Given
1309 int *a;
1310 int &amp;b = *a;
1311 int c = 5;
1312pointerType()
1313 matches "int *a"
1314</pre></td></tr>
1315
1316
Edwin Vane8203d9f2013-03-28 13:50:22 +00001317<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>
1318<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1319
1320Given:
1321 int *a;
1322 int &amp;b = *a;
1323 int &amp;&amp;c = 1;
1324 auto &amp;d = b;
1325 auto &amp;&amp;e = c;
1326 auto &amp;&amp;f = 2;
1327 int g = 5;
1328
1329rValueReferenceType() matches the types of c and f. e is not
1330matched as it is deduced to int&amp; by reference collapsing rules.
1331</pre></td></tr>
1332
1333
Edwin Vane742d9e72013-02-25 20:43:32 +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('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>
1335<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1336
1337Given
1338 class C {};
1339 struct S {};
1340
1341 C c;
1342 S s;
1343
1344recordType() matches the type of the variable declarations of both c
1345and s.
1346</pre></td></tr>
1347
1348
Manuel Klimek41df16e2013-01-09 09:38:21 +00001349<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 +00001350<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001351
1352Given
1353 int *a;
1354 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001355 int &amp;&amp;c = 1;
1356 auto &amp;d = b;
1357 auto &amp;&amp;e = c;
1358 auto &amp;&amp;f = 2;
1359 int g = 5;
1360
1361referenceType() matches the types of b, c, d, e, and f.
1362</pre></td></tr>
1363
1364
Edwin Vane3abf7782013-02-25 14:49:29 +00001365<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>
1366<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1367
1368Given
1369 template &lt;typename T&gt;
1370 class C { };
1371
1372 template class C&lt;int&gt;; A
1373 C&lt;char&gt; var; B
1374
1375templateSpecializationType() matches the type of the explicit
1376instantiation in A and the type of the variable declaration in B.
1377</pre></td></tr>
1378
1379
Daniel Jaspere0b89972012-12-04 12:08:08 +00001380<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>
1381<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1382</pre></td></tr>
1383
Manuel Klimek41df16e2013-01-09 09:38:21 +00001384
1385<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>
1386<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1387
1388Given
1389 typedef int X;
1390typedefType()
1391 matches "typedef int X"
1392</pre></td></tr>
1393
1394
1395<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>
1396<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1397integer-constant-expression.
1398
1399Given
1400 void f() {
1401 int a[] = { 2, 3 }
1402 int b[42];
1403 int c[a[0]];
1404variableArrayType()
1405 matches "int c[a[0]]"
1406</pre></td></tr>
1407
Manuel Klimek1da79332012-08-20 20:54:03 +00001408<!--END_DECL_MATCHERS -->
1409</table>
1410
1411<!-- ======================================================================= -->
1412<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1413<!-- ======================================================================= -->
1414
1415<p>Narrowing matchers match certain attributes on the current node, thus
1416narrowing down the set of nodes of the current type to match on.</p>
1417
1418<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1419which allow users to create more powerful match expressions.</p>
1420
1421<table>
1422<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1423<!-- START_NARROWING_MATCHERS -->
1424
Manuel Klimek67619ff2012-09-07 13:10:32 +00001425<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 +00001426<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1427
1428Usable as: Any Matcher
1429</pre></td></tr>
1430
1431
Manuel Klimek67619ff2012-09-07 13:10:32 +00001432<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 +00001433<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1434
1435Usable as: Any Matcher
1436</pre></td></tr>
1437
1438
Manuel Klimek67619ff2012-09-07 13:10:32 +00001439<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 +00001440<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1441
1442Useful when another matcher requires a child matcher, but there's no
1443additional constraint. This will often be used with an explicit conversion
1444to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1445
1446Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1447"int* p" and "void f()" in
1448 int* p;
1449 void f();
1450
1451Usable as: Any Matcher
1452</pre></td></tr>
1453
1454
Manuel Klimek67619ff2012-09-07 13:10:32 +00001455<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 +00001456<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1457
Manuel Klimeke44a0062012-08-26 23:55:24 +00001458Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001459 class X {};
1460 class Y {};
1461
1462Usable as: Any Matcher
1463</pre></td></tr>
1464
1465
Manuel Klimek67619ff2012-09-07 13:10:32 +00001466<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 +00001467<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1468unary).
1469
1470Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1471 !(a || b)
1472</pre></td></tr>
1473
1474
Manuel Klimek67619ff2012-09-07 13:10:32 +00001475<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 +00001476<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1477
1478Example matches true (matcher = boolLiteral(equals(true)))
1479 true
1480
1481Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1482 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;
1483</pre></td></tr>
1484
1485
Manuel Klimek67619ff2012-09-07 13:10:32 +00001486<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 +00001487<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1488by the compiler (eg. implicit defaultcopy constructors).
1489</pre></td></tr>
1490
1491
Manuel Klimek67619ff2012-09-07 13:10:32 +00001492<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 +00001493<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1494code (as opposed to implicitly added by the compiler).
1495
1496Given
1497 struct Foo {
1498 Foo() { }
1499 Foo(int) : foo_("A") { }
1500 string foo_;
1501 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001502constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001503 will match Foo(int), but not Foo()
1504</pre></td></tr>
1505
1506
Edwin Vane6a19a972013-03-06 17:02:57 +00001507<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 +00001508<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1509
1510Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001511"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001512
Edwin Vane6a19a972013-03-06 17:02:57 +00001513Given:
1514 class A { int operator*(); };
1515 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1516 A a;
1517 a &lt;&lt; a; &lt;-- This matches
1518
1519operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1520line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1521the declaration of A.
1522
1523Usable 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;
1524</pre></td></tr>
1525
1526
Edwin Vane5771a2f2013-04-09 20:46:36 +00001527<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>
1528<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1529
1530Given
1531 class A {
1532 public:
1533 virtual void x();
1534 };
1535 class B : public A {
1536 public:
1537 virtual void x();
1538 };
1539 matches B::x
1540</pre></td></tr>
1541
1542
1543<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>
1544<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1545
1546Given
1547 class A {
1548 public:
1549 virtual void x();
1550 };
1551 matches A::x
1552</pre></td></tr>
1553
1554
Edwin Vane6a19a972013-03-06 17:02:57 +00001555<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>
1556<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1557
1558Matches overloaded operator names specified in strings without the
1559"operator" prefix: e.g. "&lt;&lt;".
1560
1561Given:
1562 class A { int operator*(); };
1563 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1564 A a;
1565 a &lt;&lt; a; &lt;-- This matches
1566
1567operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1568line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1569the declaration of A.
1570
1571Usable 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 +00001572</pre></td></tr>
1573
1574
Manuel Klimek67619ff2012-09-07 13:10:32 +00001575<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 +00001576<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1577</pre></td></tr>
1578
1579
Manuel Klimek415514d2013-02-06 20:36:22 +00001580<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>
1581<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001582static member variable template instantiations.
1583
1584Given
1585 template&lt;typename T&gt; void A(T t) { }
1586 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001587functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001588 matches the specialization A&lt;int&gt;().
1589
1590Usable 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;
1591</pre></td></tr>
1592
1593
Daniel Jaspere0b89972012-12-04 12:08:08 +00001594<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>
1595<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1596isSameOrDerivedFrom(hasName(...)).
1597</pre></td></tr>
1598
1599
Manuel Klimek415514d2013-02-06 20:36:22 +00001600<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>
1601<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001602member variable template instantiations.
1603
1604Given
1605 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1606or
1607 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001608recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001609 matches the template instantiation of X&lt;A&gt;.
1610
1611But given
1612 template &lt;typename T&gt; class X {}; class A {};
1613 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001614recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001615 does not match, as X&lt;A&gt; is an explicit template specialization.
1616
1617Usable 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;
1618</pre></td></tr>
1619
1620
Manuel Klimek67619ff2012-09-07 13:10:32 +00001621<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 +00001622<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1623a specific number of arguments (including absent default arguments).
1624
Manuel Klimeke44a0062012-08-26 23:55:24 +00001625Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001626 void f(int x, int y);
1627 f(0, 0);
1628</pre></td></tr>
1629
1630
Manuel Klimek67619ff2012-09-07 13:10:32 +00001631<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 +00001632<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1633
1634Example matches true (matcher = boolLiteral(equals(true)))
1635 true
1636
1637Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1638 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;
1639</pre></td></tr>
1640
1641
Manuel Klimek67619ff2012-09-07 13:10:32 +00001642<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 +00001643<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1644child statements.
1645
1646Example: Given
1647 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001648compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001649 matches '{}'
1650 but does not match the outer compound statement.
1651</pre></td></tr>
1652
1653
Daniel Jaspere0b89972012-12-04 12:08:08 +00001654<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>
1655<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1656
1657Given
1658 int a[42];
1659 int b[2 * 21];
1660 int c[41], d[43];
1661constantArrayType(hasSize(42))
1662 matches "int a[42]" and "int b[2 * 21]"
1663</pre></td></tr>
1664
1665
Manuel Klimek67619ff2012-09-07 13:10:32 +00001666<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 +00001667<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1668declarations.
1669
1670Example: Given
1671 int a, b;
1672 int c;
1673 int d = 2, e;
1674declCountIs(2)
1675 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1676</pre></td></tr>
1677
1678
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001679<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>
1680<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1681
1682Decl has pointer identity in the AST.
1683</pre></td></tr>
1684
1685
Daniel Jasperc7093d92013-02-25 12:39:41 +00001686<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>
1687<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1688
1689Given
1690 class C {
1691 public: int a;
1692 protected: int b;
1693 private: int c;
1694 };
1695fieldDecl(isPrivate())
1696 matches 'int c;'
1697</pre></td></tr>
1698
1699
1700<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>
1701<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1702
1703Given
1704 class C {
1705 public: int a;
1706 protected: int b;
1707 private: int c;
1708 };
1709fieldDecl(isProtected())
1710 matches 'int b;'
1711</pre></td></tr>
1712
1713
1714<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>
1715<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1716
1717Given
1718 class C {
1719 public: int a;
1720 protected: int b;
1721 private: int c;
1722 };
1723fieldDecl(isPublic())
1724 matches 'int a;'
1725</pre></td></tr>
1726
1727
Manuel Klimek67619ff2012-09-07 13:10:32 +00001728<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001729<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1730
1731Example matches true (matcher = boolLiteral(equals(true)))
1732 true
1733
1734Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1735 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;
1736</pre></td></tr>
1737
1738
Manuel Klimek415514d2013-02-06 20:36:22 +00001739<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>
1740<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001741
1742Example matches A, va, fa
1743 class A {};
1744 class B; Doesn't match, as it has no body.
1745 int va;
1746 extern int vb; Doesn't match, as it doesn't define the variable.
1747 void fa() {}
1748 void fb(); Doesn't match, as it has no body.
1749
1750Usable 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;
1751</pre></td></tr>
1752
1753
Manuel Klimek415514d2013-02-06 20:36:22 +00001754<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>
1755<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001756static member variable template instantiations.
1757
1758Given
1759 template&lt;typename T&gt; void A(T t) { }
1760 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001761functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001762 matches the specialization A&lt;int&gt;().
1763
1764Usable 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;
1765</pre></td></tr>
1766
1767
Manuel Klimek67619ff2012-09-07 13:10:32 +00001768<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 +00001769<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1770
1771Given:
1772 extern "C" void f() {}
1773 extern "C" { void g() {} }
1774 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001775functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001776 matches the declaration of f and g, but not the declaration h
1777</pre></td></tr>
1778
1779
Manuel Klimek415514d2013-02-06 20:36:22 +00001780<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>
1781<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001782member variable template instantiations.
1783
1784Given
1785 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1786or
1787 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001788recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001789 matches the template instantiation of X&lt;A&gt;.
1790
1791But given
1792 template &lt;typename T&gt; class X {}; class A {};
1793 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001794recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001795 does not match, as X&lt;A&gt; is an explicit template specialization.
1796
1797Usable 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;
1798</pre></td></tr>
1799
1800
Daniel Jaspere0b89972012-12-04 12:08:08 +00001801<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>
1802<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1803
1804Given
1805 void f(int i) {}
1806 void g(int i, int j) {}
1807functionDecl(parameterCountIs(2))
1808 matches g(int i, int j) {}
1809</pre></td></tr>
1810
1811
Manuel Klimek67619ff2012-09-07 13:10:32 +00001812<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 +00001813<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1814
1815Example matches true (matcher = boolLiteral(equals(true)))
1816 true
1817
1818Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1819 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;
1820</pre></td></tr>
1821
1822
Manuel Klimek67619ff2012-09-07 13:10:32 +00001823<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 +00001824<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1825to '.'.
1826
1827Member calls on the implicit this pointer match as called with '-&gt;'.
1828
1829Given
1830 class Y {
1831 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1832 int a;
1833 static int b;
1834 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001835memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001836 matches this-&gt;x, x, y.x, a, this-&gt;b
1837</pre></td></tr>
1838
1839
Manuel Klimek67619ff2012-09-07 13:10:32 +00001840<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 +00001841<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1842
1843Supports specifying enclosing namespaces or classes by prefixing the name
1844with '&lt;enclosing&gt;::'.
1845Does not match typedefs of an underlying type with the given name.
1846
1847Example matches X (Name == "X")
1848 class X;
1849
1850Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1851 namespace a { namespace b { class X; } }
1852</pre></td></tr>
1853
1854
Manuel Klimek67619ff2012-09-07 13:10:32 +00001855<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 +00001856<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1857a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001858
1859Supports specifying enclosing namespaces or classes by
1860prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1861of an underlying type with the given name.
1862
1863Example matches X (regexp == "::X")
1864 class X;
1865
1866Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1867 namespace foo { namespace bar { class X; } }
1868</pre></td></tr>
1869
1870
Manuel Klimek67619ff2012-09-07 13:10:32 +00001871<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 +00001872<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1873
1874Given
1875 class Y { public: void x(); };
1876 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001877callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001878 matches y-&gt;x()
1879</pre></td></tr>
1880
1881
Edwin Vane7b69cd02013-04-02 18:15:55 +00001882<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>
1883<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1884the node, not hidden within a typedef.
1885
1886Given
1887 typedef const int const_int;
1888 const_int i;
1889 int *const j;
1890 int *volatile k;
1891 int m;
1892varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1893i is const-qualified but the qualifier is not local.
1894</pre></td></tr>
1895
1896
Manuel Klimek67619ff2012-09-07 13:10:32 +00001897<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 +00001898<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1899include "top-level" const.
1900
1901Given
1902 void a(int);
1903 void b(int const);
1904 void c(const int);
1905 void d(const int*);
1906 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001907functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001908 matches "void b(int const)", "void c(const int)" and
1909 "void e(int const) {}". It does not match d as there
1910 is no top-level const on the parameter type "const int *".
1911</pre></td></tr>
1912
1913
Manuel Klimek67619ff2012-09-07 13:10:32 +00001914<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 +00001915<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1916
1917Given
1918 void a(int);
1919 void b(long);
1920 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001921functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001922matches "a(int)", "b(long)", but not "c(double)".
1923</pre></td></tr>
1924
1925
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001926<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>
1927<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1928
1929Stmt has pointer identity in the AST.
1930
1931</pre></td></tr>
1932
1933
Manuel Klimek415514d2013-02-06 20:36:22 +00001934<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>
1935<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001936
1937Example matches A, va, fa
1938 class A {};
1939 class B; Doesn't match, as it has no body.
1940 int va;
1941 extern int vb; Doesn't match, as it doesn't define the variable.
1942 void fa() {}
1943 void fb(); Doesn't match, as it has no body.
1944
1945Usable 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;
1946</pre></td></tr>
1947
1948
Manuel Klimek67619ff2012-09-07 13:10:32 +00001949<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001950<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1951
1952Given
1953 int x;
1954 int s = sizeof(x) + alignof(x)
1955unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1956 matches sizeof(x)
1957</pre></td></tr>
1958
1959
Manuel Klimek67619ff2012-09-07 13:10:32 +00001960<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001961<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1962unary).
1963
1964Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1965 !(a || b)
1966</pre></td></tr>
1967
1968
Manuel Klimek67619ff2012-09-07 13:10:32 +00001969<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 +00001970<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
1971
1972Example matches A, va, fa
1973 class A {};
1974 class B; Doesn't match, as it has no body.
1975 int va;
1976 extern int vb; Doesn't match, as it doesn't define the variable.
1977 void fa() {}
1978 void fb(); Doesn't match, as it has no body.
1979
1980Usable 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;
1981</pre></td></tr>
1982
1983
Manuel Klimek67619ff2012-09-07 13:10:32 +00001984<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 +00001985<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
1986static member variable template instantiations.
1987
1988Given
1989 template&lt;typename T&gt; void A(T t) { }
1990 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001991functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001992 matches the specialization A&lt;int&gt;().
1993
1994Usable 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;
1995</pre></td></tr>
1996
1997
Manuel Klimek67619ff2012-09-07 13:10:32 +00001998<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 +00001999<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2000member variable template instantiations.
2001
2002Given
2003 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2004or
2005 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002006recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002007 matches the template instantiation of X&lt;A&gt;.
2008
2009But given
2010 template &lt;typename T&gt; class X {}; class A {};
2011 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002012recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002013 does not match, as X&lt;A&gt; is an explicit template specialization.
2014
2015Usable 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;
2016</pre></td></tr>
2017
2018<!--END_NARROWING_MATCHERS -->
2019</table>
2020
2021<!-- ======================================================================= -->
2022<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2023<!-- ======================================================================= -->
2024
2025<p>Traversal matchers specify the relationship to other nodes that are
2026reachable from the current node.</p>
2027
2028<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2029forEachDescendant) which work on all nodes and allow users to write more generic
2030match expressions.</p>
2031
2032<table>
2033<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2034<!-- START_TRAVERSAL_MATCHERS -->
2035
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002036<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>
2037<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2038
2039Unlike anyOf, eachOf will generate a match result for each
2040matching submatcher.
2041
2042For example, in:
2043 class A { int a; int b; };
2044The matcher:
2045 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2046 has(fieldDecl(hasName("b")).bind("v"))))
2047will generate two results binding "v", the first of which binds
2048the field declaration of a, the second the field declaration of
2049b.
2050
2051Usable as: Any Matcher
2052</pre></td></tr>
2053
2054
2055<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>
2056<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2057
2058Generates results for each match.
2059
2060For example, in:
2061 class A { class B {}; class C {}; };
2062The matcher:
2063 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2064will generate results for A, B and C.
2065
2066Usable as: Any Matcher
2067</pre></td></tr>
2068
2069
Manuel Klimek67619ff2012-09-07 13:10:32 +00002070<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 +00002071<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2072provided matcher.
2073
Manuel Klimeke44a0062012-08-26 23:55:24 +00002074Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002075 class X {}; Matches X, because X::X is a class of name X inside X.
2076 class Y { class X {}; };
2077 class Z { class Y { class X {}; }; }; Does not match Z.
2078
2079ChildT must be an AST base type.
2080
2081As opposed to 'has', 'forEach' will cause a match for each result that
2082matches instead of only on the first one.
2083
2084Usable as: Any Matcher
2085</pre></td></tr>
2086
2087
Manuel Klimek67619ff2012-09-07 13:10:32 +00002088<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 +00002089<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2090provided matcher.
2091
2092Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002093 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002094 class X {}; Matches X, because X::X is a class of name X inside X.
2095 class A { class X {}; };
2096 class B { class C { class X {}; }; };
2097
2098DescendantT must be an AST base type.
2099
2100As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2101each result that matches instead of only on the first one.
2102
2103Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002104 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002105will match 10 times (plus injected class name matches) on:
2106 class A { class B { class C { class D { class E {}; }; }; }; };
2107
2108Usable as: Any Matcher
2109</pre></td></tr>
2110
2111
Manuel Klimek67619ff2012-09-07 13:10:32 +00002112<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 +00002113<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2114provided matcher.
2115
Manuel Klimeke44a0062012-08-26 23:55:24 +00002116Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002117 class X {}; Matches X, because X::X is a class of name X inside X.
2118 class Y { class X {}; };
2119 class Z { class Y { class X {}; }; }; Does not match Z.
2120
2121ChildT must be an AST base type.
2122
2123Usable as: Any Matcher
2124</pre></td></tr>
2125
2126
Manuel Klimek67619ff2012-09-07 13:10:32 +00002127<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>
2128<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2129matcher.
2130
2131Given
2132void f() { if (true) { int x = 42; } }
2133void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002134expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002135
2136Usable as: Any Matcher
2137</pre></td></tr>
2138
2139
2140<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 +00002141<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2142provided matcher.
2143
2144Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002145 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002146 class X {}; Matches X, because X::X is a class of name X inside X.
2147 class Y { class X {}; };
2148 class Z { class Y { class X {}; }; };
2149
2150DescendantT must be an AST base type.
2151
2152Usable as: Any Matcher
2153</pre></td></tr>
2154
2155
Daniel Jaspere0b89972012-12-04 12:08:08 +00002156<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>
2157<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2158matcher.
2159
2160Given
2161void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2162compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2163
2164Usable as: Any Matcher
2165</pre></td></tr>
2166
2167
Manuel Klimek67619ff2012-09-07 13:10:32 +00002168<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 +00002169<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2170
2171Given
2172 int i[5];
2173 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002174arraySubscriptExpression(hasBase(implicitCastExpr(
2175 hasSourceExpression(declRefExpr()))))
2176 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002177</pre></td></tr>
2178
2179
Manuel Klimek67619ff2012-09-07 13:10:32 +00002180<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 +00002181<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2182
2183Given
2184 int i[5];
2185 void f() { i[1] = 42; }
2186arraySubscriptExpression(hasIndex(integerLiteral()))
2187 matches i[1] with the integerLiteral() matching 1
2188</pre></td></tr>
2189
2190
Manuel Klimek41df16e2013-01-09 09:38:21 +00002191<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>
2192<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2193type.
2194
2195Given
2196 struct A {};
2197 A a[7];
2198 int b[7];
2199arrayType(hasElementType(builtinType()))
2200 matches "int b[7]"
2201
2202Usable 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;
2203</pre></td></tr>
2204
2205
2206<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>
2207<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2208type.
2209
2210Given
2211 struct A {};
2212 A a[7];
2213 int b[7];
2214arrayType(hasElementType(builtinType()))
2215 matches "int b[7]"
2216
2217Usable 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;
2218</pre></td></tr>
2219
2220
2221<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>
2222<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2223
2224Given
2225 _Atomic(int) i;
2226 _Atomic(float) f;
2227atomicType(hasValueType(isInteger()))
2228 matches "_Atomic(int) i"
2229
2230Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2231</pre></td></tr>
2232
2233
2234<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>
2235<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2236
2237Given
2238 _Atomic(int) i;
2239 _Atomic(float) f;
2240atomicType(hasValueType(isInteger()))
2241 matches "_Atomic(int) i"
2242
2243Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2244</pre></td></tr>
2245
2246
2247<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>
2248<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2249
2250Note: There is no TypeLoc for the deduced type and thus no
2251getDeducedLoc() matcher.
2252
2253Given
2254 auto a = 1;
2255 auto b = 2.0;
2256autoType(hasDeducedType(isInteger()))
2257 matches "auto a"
2258
2259Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2260</pre></td></tr>
2261
2262
Manuel Klimek67619ff2012-09-07 13:10:32 +00002263<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 +00002264<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2265binary operator matches.
2266</pre></td></tr>
2267
2268
Manuel Klimek67619ff2012-09-07 13:10:32 +00002269<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 +00002270<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2271
2272Example matches a (matcher = binaryOperator(hasLHS()))
2273 a || b
2274</pre></td></tr>
2275
2276
Manuel Klimek67619ff2012-09-07 13:10:32 +00002277<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 +00002278<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2279
2280Example matches b (matcher = binaryOperator(hasRHS()))
2281 a || b
2282</pre></td></tr>
2283
2284
Manuel Klimek41df16e2013-01-09 09:38:21 +00002285<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>
2286<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
2287pointee matches a given matcher.
2288
2289Given
2290 int *a;
2291 int const *b;
2292 float const *f;
2293pointerType(pointee(isConstQualified(), isInteger()))
2294 matches "int const *b"
2295
2296Usable 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;,
2297 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;
2298</pre></td></tr>
2299
2300
2301<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>
2302<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
2303pointee matches a given matcher.
2304
2305Given
2306 int *a;
2307 int const *b;
2308 float const *f;
2309pointerType(pointee(isConstQualified(), isInteger()))
2310 matches "int const *b"
2311
2312Usable 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;,
2313 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;
2314</pre></td></tr>
2315
2316
Edwin Vane3abf7782013-02-25 14:49:29 +00002317<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>
2318<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00002319matcher.
2320
Edwin Vane52380602013-02-19 17:14:34 +00002321In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2322Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2323subtypes of clang::Type.
2324
Daniel Jaspere0b89972012-12-04 12:08:08 +00002325Usable 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 +00002326 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;,
2327 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002328</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_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 +00002332<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2333
2334Given
2335 struct Foo {
2336 Foo() : foo_(1) { }
2337 int foo_;
2338 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002339recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002340 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2341</pre></td></tr>
2342
2343
Manuel Klimek67619ff2012-09-07 13:10:32 +00002344<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 +00002345<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2346
2347Given
2348 struct Foo {
2349 Foo() : foo_(1) { }
2350 int foo_;
2351 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002352recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002353 forField(hasName("foo_"))))))
2354 matches Foo
2355with forField matching foo_
2356</pre></td></tr>
2357
2358
Manuel Klimek67619ff2012-09-07 13:10:32 +00002359<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 +00002360<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2361
2362Given
2363 struct Foo {
2364 Foo() : foo_(1) { }
2365 int foo_;
2366 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002367recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002368 withInitializer(integerLiteral(equals(1)))))))
2369 matches Foo
2370with withInitializer matching (1)
2371</pre></td></tr>
2372
2373
Manuel Klimek67619ff2012-09-07 13:10:32 +00002374<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 +00002375<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2376
Manuel Klimeke44a0062012-08-26 23:55:24 +00002377Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002378 class Y { public: void x(); };
2379 void z() { Y y; y.x(); }",
2380
2381FIXME: Overload to allow directly matching types?
2382</pre></td></tr>
2383
2384
Manuel Klimek67619ff2012-09-07 13:10:32 +00002385<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 +00002386<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2387
2388
Manuel Klimek67619ff2012-09-07 13:10:32 +00002389<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 +00002390<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2391</pre></td></tr>
2392
2393
Manuel Klimek67619ff2012-09-07 13:10:32 +00002394<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 +00002395<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2396belongs to.
2397
2398FIXME: Generalize this for other kinds of declarations.
2399FIXME: What other kind of declarations would we need to generalize
2400this to?
2401
2402Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002403 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002404 ofClass(hasName("A"))))))
2405 class A {
2406 public:
2407 A();
2408 };
2409 A a = A();
2410</pre></td></tr>
2411
2412
Edwin Vane6a19a972013-03-06 17:02:57 +00002413<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>
2414<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2415
2416Given:
2417 class A { void func(); };
2418 class B { void member(); };
2419
2420recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2421but not B.
2422</pre></td></tr>
2423
2424
Manuel Klimek67619ff2012-09-07 13:10:32 +00002425<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 +00002426<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2427a class matching Base.
2428
Manuel Klimek67619ff2012-09-07 13:10:32 +00002429Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002430
Manuel Klimek67619ff2012-09-07 13:10:32 +00002431Example matches Y, Z, C (Base == hasName("X"))
2432 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002433 class Y : public X {}; directly derived
2434 class Z : public Y {}; indirectly derived
2435 typedef X A;
2436 typedef A B;
2437 class C : public B {}; derived from a typedef of X
2438
2439In the following example, Bar matches isDerivedFrom(hasName("X")):
2440 class Foo;
2441 typedef Foo X;
2442 class Bar : public Foo {}; derived from a type that X is a typedef of
2443</pre></td></tr>
2444
2445
Daniel Jaspere0b89972012-12-04 12:08:08 +00002446<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>
2447<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2448match Base.
2449</pre></td></tr>
2450
2451
Manuel Klimek67619ff2012-09-07 13:10:32 +00002452<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 +00002453<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2454given matcher.
2455
Manuel Klimeke44a0062012-08-26 23:55:24 +00002456Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002457 class Y { public: void x(); };
2458 void z() { Y y; y.x();
2459</pre></td></tr>
2460
2461
Manuel Klimek67619ff2012-09-07 13:10:32 +00002462<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 +00002463<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2464expression.
2465
2466Given
2467 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002468callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002469 matches x(1, y, 42)
2470with hasAnyArgument(...)
2471 matching y
2472</pre></td></tr>
2473
2474
Manuel Klimek67619ff2012-09-07 13:10:32 +00002475<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 +00002476<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2477call expression.
2478
2479Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002480 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002481 void x(int) { int y; x(y); }
2482</pre></td></tr>
2483
2484
Edwin Vane3abf7782013-02-25 14:49:29 +00002485<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>
2486<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00002487matcher.
2488
Edwin Vane52380602013-02-19 17:14:34 +00002489In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2490Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2491subtypes of clang::Type.
2492
Daniel Jaspere0b89972012-12-04 12:08:08 +00002493Usable 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 +00002494 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;,
2495 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002496</pre></td></tr>
2497
2498
Manuel Klimek67619ff2012-09-07 13:10:32 +00002499<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 +00002500<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2501
2502Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002503 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002504class URL { URL(string); };
2505URL url = "a string";
2506</pre></td></tr>
2507
2508
Manuel Klimek67619ff2012-09-07 13:10:32 +00002509<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 +00002510<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2511TemplateArgument matching the given InnerMatcher.
2512
2513Given
2514 template&lt;typename T&gt; class A {};
2515 template&lt;&gt; class A&lt;double&gt; {};
2516 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002517classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002518 refersToType(asString("int"))))
2519 matches the specialization A&lt;int&gt;
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_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 +00002524<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2525matches the given InnerMatcher.
2526
2527Given
2528 template&lt;typename T, typename U&gt; class A {};
2529 A&lt;bool, int&gt; b;
2530 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002531classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002532 1, refersToType(asString("int"))))
2533 matches the specialization A&lt;bool, int&gt;
2534</pre></td></tr>
2535
2536
Manuel Klimek41df16e2013-01-09 09:38:21 +00002537<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>
2538<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2539type.
2540
2541Given
2542 struct A {};
2543 A a[7];
2544 int b[7];
2545arrayType(hasElementType(builtinType()))
2546 matches "int b[7]"
2547
2548Usable 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;
2549</pre></td></tr>
2550
2551
2552<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>
2553<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2554type.
2555
2556Given
2557 struct A {};
2558 A a[7];
2559 int b[7];
2560arrayType(hasElementType(builtinType()))
2561 matches "int b[7]"
2562
2563Usable 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;
2564</pre></td></tr>
2565
2566
Manuel Klimek67619ff2012-09-07 13:10:32 +00002567<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 +00002568<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2569a given matcher.
2570
2571Given
2572 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002573hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002574 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002575with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002576 matching '{}'
2577</pre></td></tr>
2578
2579
Manuel Klimek67619ff2012-09-07 13:10:32 +00002580<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 +00002581<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2582or conditional operator.
2583
2584Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2585 if (true) {}
2586</pre></td></tr>
2587
2588
Manuel Klimek67619ff2012-09-07 13:10:32 +00002589<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 +00002590<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2591
2592Example matches b
2593 condition ? a : b
2594</pre></td></tr>
2595
2596
Manuel Klimek67619ff2012-09-07 13:10:32 +00002597<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 +00002598<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2599
2600Example matches a
2601 condition ? a : b
2602</pre></td></tr>
2603
2604
Manuel Klimek67619ff2012-09-07 13:10:32 +00002605<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 +00002606<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2607specific using shadow declaration.
2608
2609FIXME: This currently only works for functions. Fix.
2610
2611Given
2612 namespace a { void f() {} }
2613 using a::f;
2614 void g() {
2615 f(); Matches this ..
2616 a::f(); .. but not this.
2617 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002618declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002619 matches f()
2620</pre></td></tr>
2621
2622
Manuel Klimek67619ff2012-09-07 13:10:32 +00002623<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 +00002624<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2625specified matcher.
2626
2627Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002628 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002629 bool x;
2630 if (x) {}
2631</pre></td></tr>
2632
2633
Manuel Klimek67619ff2012-09-07 13:10:32 +00002634<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 +00002635<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2636
2637Note that this does not work for global declarations because the AST
2638breaks up multiple-declaration DeclStmt's into multiple single-declaration
2639DeclStmt's.
2640Example: Given non-global declarations
2641 int a, b = 0;
2642 int c;
2643 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002644declStmt(containsDeclaration(
2645 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002646 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002647declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002648 matches 'int a, b = 0' as well as 'int d = 2, e;'
2649 but 'int c;' is not matched.
2650</pre></td></tr>
2651
2652
Manuel Klimek67619ff2012-09-07 13:10:32 +00002653<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 +00002654<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2655
2656Given
2657 int a, b;
2658 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002659declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002660 matches 'int c;' but not 'int a, b;'.
2661</pre></td></tr>
2662
2663
Edwin Vane742d9e72013-02-25 20:43:32 +00002664<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>
2665<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2666Decl, matches InnerMatcher.
2667
2668Given
2669 namespace N {
2670 namespace M {
2671 class D {};
2672 }
2673 }
2674
2675recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2676declaration of class D.
2677</pre></td></tr>
2678
2679
Manuel Klimek67619ff2012-09-07 13:10:32 +00002680<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002681<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2682a given body.
2683
2684Given
2685 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002686hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002687 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002688with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002689 matching '{}'
2690</pre></td></tr>
2691
2692
Manuel Klimek67619ff2012-09-07 13:10:32 +00002693<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002694<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2695or conditional operator.
2696
2697Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2698 if (true) {}
2699</pre></td></tr>
2700
2701
Edwin Vane742d9e72013-02-25 20:43:32 +00002702<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>
2703<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002704matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002705
2706Given
2707 namespace N {
2708 namespace M {
2709 class D {};
2710 }
2711 }
2712 N::M::D d;
2713
2714elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2715matches the type of the variable declaration of d.
2716</pre></td></tr>
2717
2718
2719<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>
2720<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2721
2722Given
2723 namespace N {
2724 namespace M {
2725 class D {};
2726 }
2727 }
2728 N::M::D d;
2729
2730elaboratedType(namesType(recordType(
2731hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2732declaration of d.
2733</pre></td></tr>
2734
2735
Manuel Klimek67619ff2012-09-07 13:10:32 +00002736<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 +00002737<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2738
2739(Note: Clang's AST refers to other conversions as "casts" too, and calls
2740actual casts "explicit" casts.)
2741</pre></td></tr>
2742
2743
Manuel Klimek67619ff2012-09-07 13:10:32 +00002744<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 +00002745<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2746declaration's type.
2747
2748In case of a value declaration (for example a variable declaration),
2749this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002750declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2751while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002752of x."
2753
Manuel Klimeke44a0062012-08-26 23:55:24 +00002754Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2755 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002756 class X {};
2757 void y(X &amp;x) { x; X z; }
2758
2759Usable 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;
2760</pre></td></tr>
2761
2762
Manuel Klimek67619ff2012-09-07 13:10:32 +00002763<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 +00002764<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2765are stripped off.
2766
2767Parentheses and explicit casts are not discarded.
2768Given
2769 int arr[5];
2770 int a = 0;
2771 char b = 0;
2772 const int c = a;
2773 int *d = arr;
2774 long e = (long) 0l;
2775The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002776 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2777 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002778would match the declarations for a, b, c, and d, but not e.
2779While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002780 varDecl(hasInitializer(integerLiteral()))
2781 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002782only match the declarations for b, c, and d.
2783</pre></td></tr>
2784
2785
Manuel Klimek67619ff2012-09-07 13:10:32 +00002786<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 +00002787<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2788casts are stripped off.
2789
2790Implicit and non-C Style casts are also discarded.
2791Given
2792 int a = 0;
2793 char b = (0);
2794 void* c = reinterpret_cast&lt;char*&gt;(0);
2795 char d = char(0);
2796The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002797 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002798would match the declarations for a, b, c, and d.
2799while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002800 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002801only match the declaration for a.
2802</pre></td></tr>
2803
2804
Manuel Klimek67619ff2012-09-07 13:10:32 +00002805<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 +00002806<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2807parentheses are stripped off.
2808
2809Explicit casts are not discarded.
2810Given
2811 int arr[5];
2812 int a = 0;
2813 char b = (0);
2814 const int c = a;
2815 int *d = (arr);
2816 long e = ((long) 0l);
2817The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002818 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2819 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002820would match the declarations for a, b, c, and d, but not e.
2821while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002822 varDecl(hasInitializer(integerLiteral()))
2823 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002824would only match the declaration for a.
2825</pre></td></tr>
2826
2827
Manuel Klimek67619ff2012-09-07 13:10:32 +00002828<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002829<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2830a given body.
2831
2832Given
2833 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002834hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002835 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002836with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002837 matching '{}'
2838</pre></td></tr>
2839
2840
Manuel Klimek67619ff2012-09-07 13:10:32 +00002841<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 +00002842<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2843or conditional operator.
2844
2845Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2846 if (true) {}
2847</pre></td></tr>
2848
2849
Manuel Klimek67619ff2012-09-07 13:10:32 +00002850<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002851<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2852
2853Example:
2854 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2855matches '++x' in
2856 for (x; x &lt; N; ++x) { }
2857</pre></td></tr>
2858
2859
Manuel Klimek67619ff2012-09-07 13:10:32 +00002860<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 +00002861<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2862
2863Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002864 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002865matches 'int x = 0' in
2866 for (int x = 0; x &lt; N; ++x) { }
2867</pre></td></tr>
2868
2869
Manuel Klimek67619ff2012-09-07 13:10:32 +00002870<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 +00002871<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2872
2873Does not match the 'this' parameter of a method.
2874
2875Given
2876 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002877methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002878 matches f(int x, int y, int z) {}
2879with hasAnyParameter(...)
2880 matching int y
2881</pre></td></tr>
2882
2883
Manuel Klimek67619ff2012-09-07 13:10:32 +00002884<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 +00002885<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2886
2887Given
2888 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002889methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002890 matches f(int x) {}
2891with hasParameter(...)
2892 matching int x
2893</pre></td></tr>
2894
2895
Manuel Klimek67619ff2012-09-07 13:10:32 +00002896<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 +00002897<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2898
2899Given:
2900 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002901methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002902 matches int f() { return 1; }
2903</pre></td></tr>
2904
2905
Manuel Klimek67619ff2012-09-07 13:10:32 +00002906<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 +00002907<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
2908or conditional operator.
2909
2910Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2911 if (true) {}
2912</pre></td></tr>
2913
2914
Manuel Klimek67619ff2012-09-07 13:10:32 +00002915<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002916<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
2917
2918Given
2919 if (A* a = GetAPointer()) {}
2920hasConditionVariableStatment(...)
2921 matches 'A* a = GetAPointer()'.
2922</pre></td></tr>
2923
2924
Manuel Klimek67619ff2012-09-07 13:10:32 +00002925<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 +00002926<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
2927matcher.
2928
2929FIXME: Unit test this matcher
2930</pre></td></tr>
2931
2932
Edwin Vane3abf7782013-02-25 14:49:29 +00002933<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>
2934<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if the declaration of the type matches the given
Daniel Jaspere0b89972012-12-04 12:08:08 +00002935matcher.
2936
Edwin Vane52380602013-02-19 17:14:34 +00002937In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2938Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2939subtypes of clang::Type.
2940
Daniel Jaspere0b89972012-12-04 12:08:08 +00002941Usable 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 +00002942 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;,
2943 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00002944</pre></td></tr>
2945
2946
Manuel Klimek67619ff2012-09-07 13:10:32 +00002947<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 +00002948<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
2949matched by a given matcher.
2950
2951Given
2952 struct X { int m; };
2953 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002954memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002955 matches "x.m" and "m"
2956with hasObjectExpression(...)
2957 matching "x" and the implicit object expression of "m" which has type X*.
2958</pre></td></tr>
2959
2960
Manuel Klimek67619ff2012-09-07 13:10:32 +00002961<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 +00002962<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
2963given matcher.
2964
2965Given
2966 struct { int first, second; } first, second;
2967 int i(second.first);
2968 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002969memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002970 matches second.first
2971 but not first.second (because the member name there is "second").
2972</pre></td></tr>
2973
2974
Manuel Klimek41df16e2013-01-09 09:38:21 +00002975<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>
2976<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
2977pointee matches a given matcher.
2978
2979Given
2980 int *a;
2981 int const *b;
2982 float const *f;
2983pointerType(pointee(isConstQualified(), isInteger()))
2984 matches "int const *b"
2985
2986Usable 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;,
2987 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;
2988</pre></td></tr>
2989
2990
2991<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>
2992<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
2993pointee matches a given matcher.
2994
2995Given
2996 int *a;
2997 int const *b;
2998 float const *f;
2999pointerType(pointee(isConstQualified(), isInteger()))
3000 matches "int const *b"
3001
3002Usable 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;,
3003 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;
3004</pre></td></tr>
3005
3006
Manuel Klimek415514d2013-02-06 20:36:22 +00003007<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 +00003008<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3009
3010Given
3011 struct A { struct B { struct C {}; }; };
3012 A::B::C c;
3013nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3014 matches "A::"
3015</pre></td></tr>
3016
3017
Manuel Klimek41df16e2013-01-09 09:38:21 +00003018<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>
3019<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3020NestedNameSpecifier-matcher matches.
3021</pre></td></tr>
3022
3023
Daniel Jaspere0b89972012-12-04 12:08:08 +00003024<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>
3025<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3026given TypeLoc.
3027
3028Given
3029 struct A { struct B { struct C {}; }; };
3030 A::B::C c;
3031nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3032 hasDeclaration(recordDecl(hasName("A")))))))
3033 matches "A::"
3034</pre></td></tr>
3035
3036
Manuel Klimek415514d2013-02-06 20:36:22 +00003037<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 +00003038<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3039
3040Given
3041 struct A { struct B { struct C {}; }; };
3042 A::B::C c;
3043nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3044 matches "A::"
3045</pre></td></tr>
3046
3047
3048<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>
3049<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3050given namespace matcher.
3051
3052Given
3053 namespace ns { struct A {}; }
3054 ns::A a;
3055nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3056 matches "ns::"
3057</pre></td></tr>
3058
3059
3060<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>
3061<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3062given QualType matcher without qualifiers.
3063
3064Given
3065 struct A { struct B { struct C {}; }; };
3066 A::B::C c;
3067nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3068 matches "A::"
3069</pre></td></tr>
3070
3071
Edwin Vane88be2fd2013-04-01 18:33:34 +00003072<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>
3073<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3074
3075Given
3076 int (*ptr_to_array)[4];
3077 int (*ptr_to_func)(int);
3078
3079varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3080ptr_to_func but not ptr_to_array.
3081
3082Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3083</pre></td></tr>
3084
3085
Manuel Klimek41df16e2013-01-09 09:38:21 +00003086<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>
3087<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3088pointee matches a given matcher.
3089
3090Given
3091 int *a;
3092 int const *b;
3093 float const *f;
3094pointerType(pointee(isConstQualified(), isInteger()))
3095 matches "int const *b"
3096
3097Usable 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;,
3098 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;
3099</pre></td></tr>
3100
3101
3102<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>
3103<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3104pointee matches a given matcher.
3105
3106Given
3107 int *a;
3108 int const *b;
3109 float const *f;
3110pointerType(pointee(isConstQualified(), isInteger()))
3111 matches "int const *b"
3112
3113Usable 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;,
3114 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;
3115</pre></td></tr>
3116
3117
Edwin Vane6a19a972013-03-06 17:02:57 +00003118<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>
3119<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3120
3121Given:
3122 typedef int &amp;int_ref;
3123 int a;
3124 int_ref b = a;
3125
3126varDecl(hasType(qualType(referenceType()))))) will not match the
3127declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3128</pre></td></tr>
3129
3130
Edwin Vane3abf7782013-02-25 14:49:29 +00003131<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>
3132<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00003133matcher.
3134
Edwin Vane52380602013-02-19 17:14:34 +00003135In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3136Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3137subtypes of clang::Type.
3138
Daniel Jaspere0b89972012-12-04 12:08:08 +00003139Usable 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 +00003140 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;,
3141 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003142</pre></td></tr>
3143
3144
Manuel Klimek67619ff2012-09-07 13:10:32 +00003145<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 +00003146<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3147</pre></td></tr>
3148
3149
Manuel Klimek67619ff2012-09-07 13:10:32 +00003150<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 +00003151<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3152</pre></td></tr>
3153
3154
Manuel Klimek41df16e2013-01-09 09:38:21 +00003155<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>
3156<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3157pointee matches a given matcher.
3158
3159Given
3160 int *a;
3161 int const *b;
3162 float const *f;
3163pointerType(pointee(isConstQualified(), isInteger()))
3164 matches "int const *b"
3165
3166Usable 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;,
3167 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;
3168</pre></td></tr>
3169
3170
3171<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>
3172<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3173pointee matches a given matcher.
3174
3175Given
3176 int *a;
3177 int const *b;
3178 float const *f;
3179pointerType(pointee(isConstQualified(), isInteger()))
3180 matches "int const *b"
3181
3182Usable 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;,
3183 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;
3184</pre></td></tr>
3185
3186
Manuel Klimek67619ff2012-09-07 13:10:32 +00003187<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 +00003188<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3189alignof.
3190</pre></td></tr>
3191
3192
Manuel Klimek67619ff2012-09-07 13:10:32 +00003193<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 +00003194<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3195sizeof.
3196</pre></td></tr>
3197
3198
Manuel Klimek67619ff2012-09-07 13:10:32 +00003199<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 +00003200<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3201
3202Given
3203 template&lt;typename T&gt; struct A {};
3204 struct B { B* next; };
3205 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003206classTemplateSpecializationDecl(hasAnyTemplateArgument(
3207 refersToDeclaration(fieldDecl(hasName("next"))))
3208 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003209 B::next
3210</pre></td></tr>
3211
3212
Manuel Klimek67619ff2012-09-07 13:10:32 +00003213<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 +00003214<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3215
3216Given
3217 struct X {};
3218 template&lt;typename T&gt; struct A {};
3219 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003220classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003221 refersToType(class(hasName("X")))))
3222 matches the specialization A&lt;X&gt;
3223</pre></td></tr>
3224
3225
Edwin Vane3abf7782013-02-25 14:49:29 +00003226<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>
Edwin Vane52380602013-02-19 17:14:34 +00003227<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if the declaration of the type matches the given
3228matcher.
3229
3230In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3231Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3232subtypes of clang::Type.
3233
3234Usable 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 +00003235 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;,
3236 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3237</pre></td></tr>
3238
3239
3240<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>
3241<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3242QualType-matcher matches.
3243</pre></td></tr>
3244
3245
3246<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>
3247<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if the declaration of the type matches the given
3248matcher.
3249
3250In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3251Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3252subtypes of clang::Type.
3253
3254Usable 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;,
3255 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;,
3256 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003257</pre></td></tr>
3258
3259
Manuel Klimek67619ff2012-09-07 13:10:32 +00003260<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 +00003261<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3262
3263Given
3264 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3265unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3266 matches sizeof(a) and alignof(c)
3267</pre></td></tr>
3268
3269
Manuel Klimek67619ff2012-09-07 13:10:32 +00003270<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 +00003271<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3272
Daniel Jaspere0b89972012-12-04 12:08:08 +00003273Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003274 !true
3275</pre></td></tr>
3276
3277
Manuel Klimek67619ff2012-09-07 13:10:32 +00003278<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 +00003279<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3280
3281Given
3282 namespace X { void b(); }
3283 using X::b;
3284usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3285 matches using X::b </pre></td></tr>
3286
3287
Manuel Klimek67619ff2012-09-07 13:10:32 +00003288<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 +00003289<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3290matched by the given matcher.
3291
3292Given
3293 namespace X { int a; void b(); }
3294 using X::a;
3295 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003296usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003297 matches using X::b but not using X::a </pre></td></tr>
3298
3299
Manuel Klimek67619ff2012-09-07 13:10:32 +00003300<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 +00003301<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3302declaration's type.
3303
3304In case of a value declaration (for example a variable declaration),
3305this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003306declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3307while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003308of x."
3309
Manuel Klimeke44a0062012-08-26 23:55:24 +00003310Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3311 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003312 class X {};
3313 void y(X &amp;x) { x; X z; }
3314
3315Usable 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;
3316</pre></td></tr>
3317
3318
Manuel Klimek67619ff2012-09-07 13:10:32 +00003319<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 +00003320<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3321that matches the given matcher.
3322
Manuel Klimeke44a0062012-08-26 23:55:24 +00003323Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003324 bool y() { return true; }
3325 bool x = y();
3326</pre></td></tr>
3327
3328
Daniel Jaspere0b89972012-12-04 12:08:08 +00003329<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>
3330<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3331expression.
3332
3333Given
3334 void f(int b) {
3335 int a[b];
3336 }
3337variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3338 varDecl(hasName("b")))))))
3339 matches "int a[b]"
3340</pre></td></tr>
3341
3342
Manuel Klimek67619ff2012-09-07 13:10:32 +00003343<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 +00003344<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3345a given body.
3346
3347Given
3348 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003349hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003350 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003351with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003352 matching '{}'
3353</pre></td></tr>
3354
3355
Manuel Klimek67619ff2012-09-07 13:10:32 +00003356<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 +00003357<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3358or conditional operator.
3359
3360Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3361 if (true) {}
3362</pre></td></tr>
3363
3364<!--END_TRAVERSAL_MATCHERS -->
3365</table>
3366
3367</div>
3368</body>
3369</html>
3370
3371