blob: c80a749df28430651d497a74044bbf49bdd1a9cb [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
Manuel Klimek03a83232013-06-10 08:52:15 +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('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
356<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
357
358Given
359 switch(a) { case 42: break; default: break; }
360caseStmt()
361 matches 'case 42: break;'.
362</pre></td></tr>
363
364
Daniel Jaspere0b89972012-12-04 12:08:08 +0000365<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>
366<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
367
368Example: castExpr() matches each of the following:
369 (int) 3;
370 const_cast&lt;Expr *&gt;(SubExpr);
371 char c = 0;
372but does not match
373 int i = (0);
374 int k = 0;
375</pre></td></tr>
376
377
378<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>
379<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
380
381 try {} catch(int i) {}
382catchStmt()
383 matches 'catch(int i)'
384</pre></td></tr>
385
386
387<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>
388<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
389
390Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
391though.
392
393Example matches 'a', L'a'
394 char ch = 'a'; wchar_t chw = L'a';
395</pre></td></tr>
396
397
Manuel Klimek415514d2013-02-06 20:36:22 +0000398<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>
399<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
400
401Example match: {1}, (1, 2)
402 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
403</pre></td></tr>
404
405
Manuel Klimek67619ff2012-09-07 13:10:32 +0000406<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 +0000407<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000408
409Example matches '{}' and '{{}}'in 'for (;;) {{}}'
410 for (;;) {{}}
411</pre></td></tr>
412
413
Manuel Klimek67619ff2012-09-07 13:10:32 +0000414<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 +0000415<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
416
417Example matches a ? b : c
418 (a ? b : c) + 42
419</pre></td></tr>
420
421
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
423<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
424
425Example: Matches const_cast&lt;int*&gt;(&amp;r) in
426 int n = 42;
427 const int &amp;r(n);
428 int* p = const_cast&lt;int*&gt;(&amp;r);
429</pre></td></tr>
430
431
Manuel Klimek67619ff2012-09-07 13:10:32 +0000432<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000433<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000434
435Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000436 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000437 void f(const string &amp;a, const string &amp;b);
438 char *ptr;
439 int n;
440 f(string(ptr, n), ptr);
441</pre></td></tr>
442
443
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
445<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
446
447Given
448 while (true) { continue; }
449continueStmt()
450 matches 'continue'
451</pre></td></tr>
452
453
Manuel Klimek67619ff2012-09-07 13:10:32 +0000454<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 +0000455<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000456
457Example matches x in if (x)
458 bool x;
459 if (x) {}
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('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 +0000464<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000465
466Given
467 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000468declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000469 matches 'int a'.
470</pre></td></tr>
471
472
Manuel Klimek67619ff2012-09-07 13:10:32 +0000473<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 +0000474<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 +0000475
476Example matches the CXXDefaultArgExpr placeholder inserted for the
477 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000478 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000479 void f(int x, int y = 0);
480 f(42);
481</pre></td></tr>
482
483
Manuel Klimek03a83232013-06-10 08:52:15 +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('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
485<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
486
487Given
488 switch(a) { case 42: break; default: break; }
489defaultStmt()
490 matches 'default: break;'.
491</pre></td></tr>
492
493
Manuel Klimek67619ff2012-09-07 13:10:32 +0000494<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000495<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000496
497Given
498 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000499deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000500 matches 'delete X'.
501</pre></td></tr>
502
503
Manuel Klimek67619ff2012-09-07 13:10:32 +0000504<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 +0000505<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
506
507Given
508 do {} while (true);
509doStmt()
510 matches 'do {} while(true)'
511</pre></td></tr>
512
513
Daniel Jaspere0b89972012-12-04 12:08:08 +0000514<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>
515<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
516
517Example:
518 dynamicCastExpr()
519matches
520 dynamic_cast&lt;D*&gt;(&amp;b);
521in
522 struct B { virtual ~B() {} }; struct D : B {};
523 B b;
524 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
525</pre></td></tr>
526
527
528<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>
529<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
530
531Matches any cast expression written in user code, whether it be a
532C-style cast, a functional-style cast, or a keyword cast.
533
534Does not match implicit conversions.
535
536Note: the name "explicitCast" is chosen to match Clang's terminology, as
537Clang uses the term "cast" to apply to implicit conversions as well as to
538actual cast expressions.
539
540hasDestinationType.
541
542Example: matches all five of the casts in
543 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
544but does not match the implicit conversion in
545 long ell = 42;
546</pre></td></tr>
547
548
Manuel Klimek67619ff2012-09-07 13:10:32 +0000549<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 +0000550<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000551
552Example matches x()
553 void f() { x(); }
554</pre></td></tr>
555
556
Daniel Jaspere0b89972012-12-04 12:08:08 +0000557<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>
558<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
559
560forRangeStmt() matches 'for (auto a : i)'
561 int i[] = {1, 2, 3}; for (auto a : i);
562 for(int j = 0; j &lt; 5; ++j);
563</pre></td></tr>
564
565
Manuel Klimek67619ff2012-09-07 13:10:32 +0000566<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 +0000567<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
568
569Example matches 'for (;;) {}'
570 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000571 int i[] = {1, 2, 3}; for (auto a : i);
572</pre></td></tr>
573
574
575<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>
576<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
577
578Example: Matches Foo(bar);
579 Foo f = bar;
580 Foo g = (Foo) bar;
581 Foo h = Foo(bar);
582</pre></td></tr>
583
584
585<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>
586<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
587
588Given
589 goto FOO;
590 FOO: bar();
591gotoStmt()
592 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000593</pre></td></tr>
594
595
Manuel Klimek67619ff2012-09-07 13:10:32 +0000596<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 +0000597<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
598
599Example matches 'if (x) {}'
600 if (x) {}
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('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>
605<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
606
607This matches many different places, including function call return value
608eliding, as well as any type conversions.
609</pre></td></tr>
610
611
Manuel Klimek67619ff2012-09-07 13:10:32 +0000612<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 +0000613<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
614
615Given
616 int a[] = { 1, 2 };
617 struct B { int x, y; };
618 B b = { 5, 6 };
619initList()
620 matches "{ 1, 2 }" and "{ 5, 6 }"
621</pre></td></tr>
622
623
Daniel Jaspere0b89972012-12-04 12:08:08 +0000624<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>
625<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
626
627Not matching character-encoded integers such as L'a'.
628
629Example matches 1, 1L, 0x1, 1U
630</pre></td></tr>
631
632
633<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>
634<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
635
636Given
637 goto FOO;
638 FOO: bar();
639labelStmt()
640 matches 'FOO:'
641</pre></td></tr>
642
643
644<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>
645<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
646
647Example matches [&amp;](){return 5;}
648 [&amp;](){return 5;}
649</pre></td></tr>
650
651
Manuel Klimek67619ff2012-09-07 13:10:32 +0000652<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000653<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
654
655Example: Given
656 struct T {void func()};
657 T f();
658 void g(T);
659materializeTemporaryExpr() matches 'f()' in these statements
660 T u(f());
661 g(f());
662but does not match
663 f();
664 f().func();
665</pre></td></tr>
666
667
Manuel Klimek67619ff2012-09-07 13:10:32 +0000668<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 +0000669<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000670
671Example matches x.y()
672 X x;
673 x.y();
674</pre></td></tr>
675
676
Manuel Klimek67619ff2012-09-07 13:10:32 +0000677<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 +0000678<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000679
680Given
681 class Y {
682 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
683 int a; static int b;
684 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000685memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000686 matches this-&gt;x, x, y.x, a, this-&gt;b
687</pre></td></tr>
688
689
Manuel Klimek67619ff2012-09-07 13:10:32 +0000690<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000691<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000692
693Given
694 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000695newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000696 matches 'new X'.
697</pre></td></tr>
698
699
Daniel Jaspere0b89972012-12-04 12:08:08 +0000700<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>
701<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
702</pre></td></tr>
703
704
705<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>
706<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
707
708 foo();;
709nullStmt()
710 matches the second ';'
711</pre></td></tr>
712
713
Manuel Klimek67619ff2012-09-07 13:10:32 +0000714<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 +0000715<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000716
717Note that if an operator isn't overloaded, it won't match. Instead, use
718binaryOperator matcher.
719Currently it does not match operators such as new delete.
720FIXME: figure out why these do not match?
721
722Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000723 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000724 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
725 ostream &amp;o; int b = 1, c = 1;
726 o &lt;&lt; b &lt;&lt; c;
727</pre></td></tr>
728
729
Daniel Jaspere0b89972012-12-04 12:08:08 +0000730<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>
731<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
732
733Either the source expression or the destination type can be matched
734using has(), but hasDestinationType() is more specific and can be
735more readable.
736
737Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
738 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
739</pre></td></tr>
740
741
742<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>
743<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
744
745Given
746 return 1;
747returnStmt()
748 matches 'return 1'
749</pre></td></tr>
750
751
752<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>
753<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
754
755hasDestinationType
756reinterpretCast
757
758Example:
759 staticCastExpr()
760matches
761 static_cast&lt;long&gt;(8)
762in
763 long eight(static_cast&lt;long&gt;(8));
764</pre></td></tr>
765
766
Manuel Klimek67619ff2012-09-07 13:10:32 +0000767<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000768<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000769
770Given
771 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000772stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000773 matches both the compound statement '{ ++a; }' and '++a'.
774</pre></td></tr>
775
776
Daniel Jaspere0b89972012-12-04 12:08:08 +0000777<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>
778<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
779
780Example matches "abcd", L"abcd"
781 char *s = "abcd"; wchar_t *ws = L"abcd"
782</pre></td></tr>
783
784
Manuel Klimek67619ff2012-09-07 13:10:32 +0000785<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000786<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
787
788Given
789 switch(a) { case 42: break; default: break; }
790switchCase()
791 matches 'case 42: break;' and 'default: break;'.
792</pre></td></tr>
793
794
Daniel Jaspere0b89972012-12-04 12:08:08 +0000795<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>
796<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
797
798Given
799 switch(a) { case 42: break; default: break; }
800switchStmt()
801 matches 'switch(a)'.
802</pre></td></tr>
803
804
805<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>
806<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
807
808Example matches the implicit this expression in "return i".
809 (matcher = thisExpr())
810struct foo {
811 int i;
812 int f() { return i; }
813};
814</pre></td></tr>
815
816
817<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>
818<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
819
820 try { throw 5; } catch(int i) {}
821throwExpr()
822 matches 'throw 5'
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
827<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
828
829 try {} catch(int i) {}
830tryStmt()
831 matches 'try {}'
832</pre></td></tr>
833
834
Manuel Klimek67619ff2012-09-07 13:10:32 +0000835<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 +0000836<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
837
838Given
839 Foo x = bar;
840 int y = sizeof(x) + alignof(x);
841unaryExprOrTypeTraitExpr()
842 matches sizeof(x) and alignof(x)
843</pre></td></tr>
844
845
Manuel Klimek67619ff2012-09-07 13:10:32 +0000846<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 +0000847<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
848
849Example matches !a
850 !a || b
851</pre></td></tr>
852
853
Daniel Jaspere0b89972012-12-04 12:08:08 +0000854<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
855<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
856
857Example match: "foo"_suffix
858</pre></td></tr>
859
860
Manuel Klimek67619ff2012-09-07 13:10:32 +0000861<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000862<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
863
864Given
865 while (true) {}
866whileStmt()
867 matches 'while (true) {}'.
868</pre></td></tr>
869
Daniel Jaspere0b89972012-12-04 12:08:08 +0000870
Manuel Klimek41df16e2013-01-09 09:38:21 +0000871<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>
872<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
873
874Given
875 int a[] = { 2, 3 };
876 int b[4];
877 void f() { int c[a[0]]; }
878arrayType()
879 matches "int a[]", "int b[4]" and "int c[a[0]]";
880</pre></td></tr>
881
882
883<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>
884<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
885
886Given
887 _Atomic(int) i;
888atomicType()
889 matches "_Atomic(int) i"
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('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>
894<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
895
896Given:
897 auto n = 4;
898 int v[] = { 2, 3 }
899 for (auto i : v) { }
900autoType()
901 matches "auto n" and "auto i"
902</pre></td></tr>
903
904
905<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>
906<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
907"void (^)(int)".
908
909The pointee is always required to be a FunctionType.
910</pre></td></tr>
911
912
913<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>
914<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
915
916Given
917 struct A {};
918 A a;
919 int b;
920 float c;
921 bool d;
922builtinType()
923 matches "int b", "float c" and "bool d"
924</pre></td></tr>
925
926
927<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>
928<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
929
930Given
931 _Complex float f;
932complexType()
933 matches "_Complex float f"
934</pre></td></tr>
935
936
937<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>
938<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
939
940Given
941 void() {
942 int a[2];
943 int b[] = { 2, 3 };
944 int c[b[0]];
945 }
946constantArrayType()
947 matches "int a[2]"
948</pre></td></tr>
949
950
951<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>
952<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
953
954Given
955 template&lt;typename T, int Size&gt;
956 class array {
957 T data[Size];
958 };
959dependentSizedArrayType
960 matches "T data[Size]"
961</pre></td></tr>
962
963
Edwin Vane742d9e72013-02-25 20:43:32 +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('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>
965<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
966qualified name.
967
968Given
969 namespace N {
970 namespace M {
971 class D {};
972 }
973 }
974 class C {};
975
976 class C c;
977 N::M::D d;
978
979elaboratedType() matches the type of the variable declarations of both
980c and d.
981</pre></td></tr>
982
983
Manuel Klimek41df16e2013-01-09 09:38:21 +0000984<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>
985<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
986
987Given
988 int (*f)(int);
989 void g();
990functionType()
991 matches "int (*f)(int)" and the type of "g".
992</pre></td></tr>
993
994
995<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>
996<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
997
998Given
999 int a[] = { 2, 3 };
1000 int b[42];
1001 void f(int c[]) { int d[a[0]]; };
1002incompleteArrayType()
1003 matches "int a[]" and "int c[]"
1004</pre></td></tr>
1005
1006
Edwin Vane8203d9f2013-03-28 13:50:22 +00001007<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>
1008<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001009
1010Given:
1011 int *a;
1012 int &amp;b = *a;
1013 int &amp;&amp;c = 1;
1014 auto &amp;d = b;
1015 auto &amp;&amp;e = c;
1016 auto &amp;&amp;f = 2;
1017 int g = 5;
1018
Edwin Vane8203d9f2013-03-28 13:50:22 +00001019lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001020matched since the type is deduced as int&amp; by reference collapsing rules.
1021</pre></td></tr>
1022
1023
Manuel Klimek41df16e2013-01-09 09:38:21 +00001024<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>
1025<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
1026Given
1027 struct A { int i; }
1028 A::* ptr = A::i;
1029memberPointerType()
1030 matches "A::* ptr"
1031</pre></td></tr>
1032
1033
Edwin Vane88be2fd2013-04-01 18:33:34 +00001034<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>
1035<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1036
1037Given
1038 int (*ptr_to_array)[4];
1039 int *array_of_ptrs[4];
1040
1041varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1042array_of_ptrs.
1043</pre></td></tr>
1044
1045
Manuel Klimek41df16e2013-01-09 09:38:21 +00001046<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>
1047<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1048
1049Given
1050 int *a;
1051 int &amp;b = *a;
1052 int c = 5;
1053pointerType()
1054 matches "int *a"
1055</pre></td></tr>
1056
1057
Edwin Vane8203d9f2013-03-28 13:50:22 +00001058<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>
1059<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1060
1061Given:
1062 int *a;
1063 int &amp;b = *a;
1064 int &amp;&amp;c = 1;
1065 auto &amp;d = b;
1066 auto &amp;&amp;e = c;
1067 auto &amp;&amp;f = 2;
1068 int g = 5;
1069
1070rValueReferenceType() matches the types of c and f. e is not
1071matched as it is deduced to int&amp; by reference collapsing rules.
1072</pre></td></tr>
1073
1074
Edwin Vane742d9e72013-02-25 20:43:32 +00001075<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>
1076<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1077
1078Given
1079 class C {};
1080 struct S {};
1081
1082 C c;
1083 S s;
1084
1085recordType() matches the type of the variable declarations of both c
1086and s.
1087</pre></td></tr>
1088
1089
Manuel Klimek41df16e2013-01-09 09:38:21 +00001090<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 +00001091<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001092
1093Given
1094 int *a;
1095 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001096 int &amp;&amp;c = 1;
1097 auto &amp;d = b;
1098 auto &amp;&amp;e = c;
1099 auto &amp;&amp;f = 2;
1100 int g = 5;
1101
1102referenceType() matches the types of b, c, d, e, and f.
1103</pre></td></tr>
1104
1105
Edwin Vane3abf7782013-02-25 14:49:29 +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('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>
1107<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1108
1109Given
1110 template &lt;typename T&gt;
1111 class C { };
1112
1113 template class C&lt;int&gt;; A
1114 C&lt;char&gt; var; B
1115
1116templateSpecializationType() matches the type of the explicit
1117instantiation in A and the type of the variable declaration in B.
1118</pre></td></tr>
1119
1120
Daniel Jaspere0b89972012-12-04 12:08:08 +00001121<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>
1122<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1123</pre></td></tr>
1124
1125
Manuel Klimek41df16e2013-01-09 09:38:21 +00001126<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>
1127<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1128
1129Given
1130 typedef int X;
1131typedefType()
1132 matches "typedef int X"
1133</pre></td></tr>
1134
1135
1136<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>
1137<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1138integer-constant-expression.
1139
1140Given
1141 void f() {
1142 int a[] = { 2, 3 }
1143 int b[42];
1144 int c[a[0]];
1145variableArrayType()
1146 matches "int c[a[0]]"
1147</pre></td></tr>
1148
1149
1150<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>
1151<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1152
1153Given
1154 int a[] = { 2, 3 };
1155 int b[4];
1156 void f() { int c[a[0]]; }
1157arrayType()
1158 matches "int a[]", "int b[4]" and "int c[a[0]]";
1159</pre></td></tr>
1160
1161
1162<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>
1163<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1164
1165Given
1166 _Atomic(int) i;
1167atomicType()
1168 matches "_Atomic(int) i"
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('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>
1173<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1174
1175Given:
1176 auto n = 4;
1177 int v[] = { 2, 3 }
1178 for (auto i : v) { }
1179autoType()
1180 matches "auto n" and "auto i"
1181</pre></td></tr>
1182
1183
1184<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>
1185<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1186"void (^)(int)".
1187
1188The pointee is always required to be a FunctionType.
1189</pre></td></tr>
1190
1191
1192<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>
1193<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1194
1195Given
1196 struct A {};
1197 A a;
1198 int b;
1199 float c;
1200 bool d;
1201builtinType()
1202 matches "int b", "float c" and "bool d"
1203</pre></td></tr>
1204
1205
1206<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>
1207<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1208
1209Given
1210 _Complex float f;
1211complexType()
1212 matches "_Complex float f"
1213</pre></td></tr>
1214
1215
1216<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>
1217<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1218
1219Given
1220 void() {
1221 int a[2];
1222 int b[] = { 2, 3 };
1223 int c[b[0]];
1224 }
1225constantArrayType()
1226 matches "int a[2]"
1227</pre></td></tr>
1228
1229
1230<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>
1231<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1232
1233Given
1234 template&lt;typename T, int Size&gt;
1235 class array {
1236 T data[Size];
1237 };
1238dependentSizedArrayType
1239 matches "T data[Size]"
1240</pre></td></tr>
1241
1242
Edwin Vane742d9e72013-02-25 20:43:32 +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('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>
1244<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1245qualified name.
1246
1247Given
1248 namespace N {
1249 namespace M {
1250 class D {};
1251 }
1252 }
1253 class C {};
1254
1255 class C c;
1256 N::M::D d;
1257
1258elaboratedType() matches the type of the variable declarations of both
1259c and d.
1260</pre></td></tr>
1261
1262
Manuel Klimek41df16e2013-01-09 09:38:21 +00001263<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1264<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1265
1266Given
1267 int (*f)(int);
1268 void g();
1269functionType()
1270 matches "int (*f)(int)" and the type of "g".
1271</pre></td></tr>
1272
1273
1274<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>
1275<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1276
1277Given
1278 int a[] = { 2, 3 };
1279 int b[42];
1280 void f(int c[]) { int d[a[0]]; };
1281incompleteArrayType()
1282 matches "int a[]" and "int c[]"
1283</pre></td></tr>
1284
1285
Edwin Vane8203d9f2013-03-28 13:50:22 +00001286<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>
1287<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001288
1289Given:
1290 int *a;
1291 int &amp;b = *a;
1292 int &amp;&amp;c = 1;
1293 auto &amp;d = b;
1294 auto &amp;&amp;e = c;
1295 auto &amp;&amp;f = 2;
1296 int g = 5;
1297
Edwin Vane8203d9f2013-03-28 13:50:22 +00001298lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001299matched since the type is deduced as int&amp; by reference collapsing rules.
1300</pre></td></tr>
1301
1302
Manuel Klimek41df16e2013-01-09 09:38:21 +00001303<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>
1304<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1305Given
1306 struct A { int i; }
1307 A::* ptr = A::i;
1308memberPointerType()
1309 matches "A::* ptr"
1310</pre></td></tr>
1311
1312
Edwin Vane88be2fd2013-04-01 18:33:34 +00001313<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>
1314<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1315
1316Given
1317 int (*ptr_to_array)[4];
1318 int *array_of_ptrs[4];
1319
1320varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1321array_of_ptrs.
1322</pre></td></tr>
1323
1324
Manuel Klimek41df16e2013-01-09 09:38:21 +00001325<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>
1326<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1327
1328Given
1329 int *a;
1330 int &amp;b = *a;
1331 int c = 5;
1332pointerType()
1333 matches "int *a"
1334</pre></td></tr>
1335
1336
Edwin Vane8203d9f2013-03-28 13:50:22 +00001337<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>
1338<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1339
1340Given:
1341 int *a;
1342 int &amp;b = *a;
1343 int &amp;&amp;c = 1;
1344 auto &amp;d = b;
1345 auto &amp;&amp;e = c;
1346 auto &amp;&amp;f = 2;
1347 int g = 5;
1348
1349rValueReferenceType() matches the types of c and f. e is not
1350matched as it is deduced to int&amp; by reference collapsing rules.
1351</pre></td></tr>
1352
1353
Edwin Vane742d9e72013-02-25 20:43:32 +00001354<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>
1355<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1356
1357Given
1358 class C {};
1359 struct S {};
1360
1361 C c;
1362 S s;
1363
1364recordType() matches the type of the variable declarations of both c
1365and s.
1366</pre></td></tr>
1367
1368
Manuel Klimek41df16e2013-01-09 09:38:21 +00001369<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 +00001370<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001371
1372Given
1373 int *a;
1374 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001375 int &amp;&amp;c = 1;
1376 auto &amp;d = b;
1377 auto &amp;&amp;e = c;
1378 auto &amp;&amp;f = 2;
1379 int g = 5;
1380
1381referenceType() matches the types of b, c, d, e, and f.
1382</pre></td></tr>
1383
1384
Edwin Vane3abf7782013-02-25 14:49:29 +00001385<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>
1386<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1387
1388Given
1389 template &lt;typename T&gt;
1390 class C { };
1391
1392 template class C&lt;int&gt;; A
1393 C&lt;char&gt; var; B
1394
1395templateSpecializationType() matches the type of the explicit
1396instantiation in A and the type of the variable declaration in B.
1397</pre></td></tr>
1398
1399
Daniel Jaspere0b89972012-12-04 12:08:08 +00001400<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>
1401<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1402</pre></td></tr>
1403
Manuel Klimek41df16e2013-01-09 09:38:21 +00001404
1405<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>
1406<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1407
1408Given
1409 typedef int X;
1410typedefType()
1411 matches "typedef int X"
1412</pre></td></tr>
1413
1414
1415<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>
1416<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1417integer-constant-expression.
1418
1419Given
1420 void f() {
1421 int a[] = { 2, 3 }
1422 int b[42];
1423 int c[a[0]];
1424variableArrayType()
1425 matches "int c[a[0]]"
1426</pre></td></tr>
1427
Manuel Klimek1da79332012-08-20 20:54:03 +00001428<!--END_DECL_MATCHERS -->
1429</table>
1430
1431<!-- ======================================================================= -->
1432<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1433<!-- ======================================================================= -->
1434
1435<p>Narrowing matchers match certain attributes on the current node, thus
1436narrowing down the set of nodes of the current type to match on.</p>
1437
1438<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1439which allow users to create more powerful match expressions.</p>
1440
1441<table>
1442<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1443<!-- START_NARROWING_MATCHERS -->
1444
Manuel Klimek67619ff2012-09-07 13:10:32 +00001445<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 +00001446<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1447
1448Usable as: Any Matcher
1449</pre></td></tr>
1450
1451
Manuel Klimek67619ff2012-09-07 13:10:32 +00001452<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 +00001453<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1454
1455Usable as: Any Matcher
1456</pre></td></tr>
1457
1458
Manuel Klimek67619ff2012-09-07 13:10:32 +00001459<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 +00001460<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1461
1462Useful when another matcher requires a child matcher, but there's no
1463additional constraint. This will often be used with an explicit conversion
1464to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1465
1466Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1467"int* p" and "void f()" in
1468 int* p;
1469 void f();
1470
1471Usable as: Any Matcher
1472</pre></td></tr>
1473
1474
Manuel Klimek67619ff2012-09-07 13:10:32 +00001475<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 +00001476<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1477
Manuel Klimeke44a0062012-08-26 23:55:24 +00001478Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001479 class X {};
1480 class Y {};
1481
1482Usable as: Any Matcher
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_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 +00001487<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1488unary).
1489
1490Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1491 !(a || b)
1492</pre></td></tr>
1493
1494
Manuel Klimek67619ff2012-09-07 13:10:32 +00001495<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 +00001496<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1497
1498Example matches true (matcher = boolLiteral(equals(true)))
1499 true
1500
1501Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1502 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;
1503</pre></td></tr>
1504
1505
Manuel Klimek67619ff2012-09-07 13:10:32 +00001506<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 +00001507<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1508by the compiler (eg. implicit defaultcopy constructors).
1509</pre></td></tr>
1510
1511
Manuel Klimek67619ff2012-09-07 13:10:32 +00001512<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 +00001513<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1514code (as opposed to implicitly added by the compiler).
1515
1516Given
1517 struct Foo {
1518 Foo() { }
1519 Foo(int) : foo_("A") { }
1520 string foo_;
1521 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001522constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001523 will match Foo(int), but not Foo()
1524</pre></td></tr>
1525
1526
Edwin Vane6a19a972013-03-06 17:02:57 +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('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001528<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1529
1530Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001531"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001532
Edwin Vane6a19a972013-03-06 17:02:57 +00001533Given:
1534 class A { int operator*(); };
1535 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1536 A a;
1537 a &lt;&lt; a; &lt;-- This matches
1538
1539operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1540line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1541the declaration of A.
1542
1543Usable 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;
1544</pre></td></tr>
1545
1546
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001547<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
1548<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1549
1550Given
1551struct A {
1552 void foo() const;
1553 void bar();
1554};
1555
1556methodDecl(isConst()) matches A::foo() but not A::bar()
1557</pre></td></tr>
1558
1559
Edwin Vane5771a2f2013-04-09 20:46:36 +00001560<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>
1561<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1562
1563Given
1564 class A {
1565 public:
1566 virtual void x();
1567 };
1568 class B : public A {
1569 public:
1570 virtual void x();
1571 };
1572 matches B::x
1573</pre></td></tr>
1574
1575
1576<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>
1577<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1578
1579Given
1580 class A {
1581 public:
1582 virtual void x();
1583 };
1584 matches A::x
1585</pre></td></tr>
1586
1587
Edwin Vane6a19a972013-03-06 17:02:57 +00001588<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>
1589<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1590
1591Matches overloaded operator names specified in strings without the
1592"operator" prefix: e.g. "&lt;&lt;".
1593
1594Given:
1595 class A { int operator*(); };
1596 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1597 A a;
1598 a &lt;&lt; a; &lt;-- This matches
1599
1600operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1601line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1602the declaration of A.
1603
1604Usable 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 +00001605</pre></td></tr>
1606
1607
Manuel Klimek67619ff2012-09-07 13:10:32 +00001608<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 +00001609<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1610</pre></td></tr>
1611
1612
Manuel Klimek415514d2013-02-06 20:36:22 +00001613<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>
1614<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001615static member variable template instantiations.
1616
1617Given
1618 template&lt;typename T&gt; void A(T t) { }
1619 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001620functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001621 matches the specialization A&lt;int&gt;().
1622
1623Usable 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;
1624</pre></td></tr>
1625
1626
Daniel Jaspere0b89972012-12-04 12:08:08 +00001627<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>
1628<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1629isSameOrDerivedFrom(hasName(...)).
1630</pre></td></tr>
1631
1632
Manuel Klimek415514d2013-02-06 20:36:22 +00001633<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>
1634<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001635member variable template instantiations.
1636
1637Given
1638 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1639or
1640 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001641recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001642 matches the template instantiation of X&lt;A&gt;.
1643
1644But given
1645 template &lt;typename T&gt; class X {}; class A {};
1646 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001647recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001648 does not match, as X&lt;A&gt; is an explicit template specialization.
1649
1650Usable 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;
1651</pre></td></tr>
1652
1653
Manuel Klimek67619ff2012-09-07 13:10:32 +00001654<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 +00001655<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1656a specific number of arguments (including absent default arguments).
1657
Manuel Klimeke44a0062012-08-26 23:55:24 +00001658Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001659 void f(int x, int y);
1660 f(0, 0);
1661</pre></td></tr>
1662
1663
Manuel Klimek67619ff2012-09-07 13:10:32 +00001664<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 +00001665<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1666
1667Example matches true (matcher = boolLiteral(equals(true)))
1668 true
1669
1670Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1671 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;
1672</pre></td></tr>
1673
1674
Manuel Klimek67619ff2012-09-07 13:10:32 +00001675<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001676<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1677child statements.
1678
1679Example: Given
1680 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001681compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001682 matches '{}'
1683 but does not match the outer compound statement.
1684</pre></td></tr>
1685
1686
Daniel Jaspere0b89972012-12-04 12:08:08 +00001687<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>
1688<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1689
1690Given
1691 int a[42];
1692 int b[2 * 21];
1693 int c[41], d[43];
1694constantArrayType(hasSize(42))
1695 matches "int a[42]" and "int b[2 * 21]"
1696</pre></td></tr>
1697
1698
Manuel Klimek67619ff2012-09-07 13:10:32 +00001699<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001700<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1701declarations.
1702
1703Example: Given
1704 int a, b;
1705 int c;
1706 int d = 2, e;
1707declCountIs(2)
1708 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1709</pre></td></tr>
1710
1711
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001712<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>
1713<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1714
1715Decl has pointer identity in the AST.
1716</pre></td></tr>
1717
1718
Daniel Jasperc7093d92013-02-25 12:39:41 +00001719<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>
1720<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1721
1722Given
1723 class C {
1724 public: int a;
1725 protected: int b;
1726 private: int c;
1727 };
1728fieldDecl(isPrivate())
1729 matches 'int c;'
1730</pre></td></tr>
1731
1732
1733<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>
1734<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1735
1736Given
1737 class C {
1738 public: int a;
1739 protected: int b;
1740 private: int c;
1741 };
1742fieldDecl(isProtected())
1743 matches 'int b;'
1744</pre></td></tr>
1745
1746
1747<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>
1748<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1749
1750Given
1751 class C {
1752 public: int a;
1753 protected: int b;
1754 private: int c;
1755 };
1756fieldDecl(isPublic())
1757 matches 'int a;'
1758</pre></td></tr>
1759
1760
Manuel Klimek67619ff2012-09-07 13:10:32 +00001761<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 +00001762<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1763
1764Example matches true (matcher = boolLiteral(equals(true)))
1765 true
1766
1767Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1768 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;
1769</pre></td></tr>
1770
1771
Manuel Klimek415514d2013-02-06 20:36:22 +00001772<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>
1773<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001774
1775Example matches A, va, fa
1776 class A {};
1777 class B; Doesn't match, as it has no body.
1778 int va;
1779 extern int vb; Doesn't match, as it doesn't define the variable.
1780 void fa() {}
1781 void fb(); Doesn't match, as it has no body.
1782
1783Usable 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;
1784</pre></td></tr>
1785
1786
Manuel Klimek415514d2013-02-06 20:36:22 +00001787<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>
1788<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001789static member variable template instantiations.
1790
1791Given
1792 template&lt;typename T&gt; void A(T t) { }
1793 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001794functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001795 matches the specialization A&lt;int&gt;().
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
Manuel Klimek67619ff2012-09-07 13:10:32 +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('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001802<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1803
1804Given:
1805 extern "C" void f() {}
1806 extern "C" { void g() {} }
1807 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001808functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001809 matches the declaration of f and g, but not the declaration h
1810</pre></td></tr>
1811
1812
Manuel Klimek415514d2013-02-06 20:36:22 +00001813<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>
1814<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001815member variable template instantiations.
1816
1817Given
1818 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1819or
1820 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001821recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001822 matches the template instantiation of X&lt;A&gt;.
1823
1824But given
1825 template &lt;typename T&gt; class X {}; class A {};
1826 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001827recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001828 does not match, as X&lt;A&gt; is an explicit template specialization.
1829
1830Usable 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;
1831</pre></td></tr>
1832
1833
Daniel Jaspere0b89972012-12-04 12:08:08 +00001834<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
1835<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1836
1837Given
1838 void f(int i) {}
1839 void g(int i, int j) {}
1840functionDecl(parameterCountIs(2))
1841 matches g(int i, int j) {}
1842</pre></td></tr>
1843
1844
Manuel Klimek67619ff2012-09-07 13:10:32 +00001845<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 +00001846<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1847
1848Example matches true (matcher = boolLiteral(equals(true)))
1849 true
1850
1851Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1852 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;
1853</pre></td></tr>
1854
1855
Manuel Klimek67619ff2012-09-07 13:10:32 +00001856<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 +00001857<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1858to '.'.
1859
1860Member calls on the implicit this pointer match as called with '-&gt;'.
1861
1862Given
1863 class Y {
1864 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1865 int a;
1866 static int b;
1867 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001868memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001869 matches this-&gt;x, x, y.x, a, this-&gt;b
1870</pre></td></tr>
1871
1872
Manuel Klimek67619ff2012-09-07 13:10:32 +00001873<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 +00001874<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1875
1876Supports specifying enclosing namespaces or classes by prefixing the name
1877with '&lt;enclosing&gt;::'.
1878Does not match typedefs of an underlying type with the given name.
1879
1880Example matches X (Name == "X")
1881 class X;
1882
1883Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1884 namespace a { namespace b { class X; } }
1885</pre></td></tr>
1886
1887
Manuel Klimek67619ff2012-09-07 13:10:32 +00001888<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 +00001889<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1890a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001891
1892Supports specifying enclosing namespaces or classes by
1893prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1894of an underlying type with the given name.
1895
1896Example matches X (regexp == "::X")
1897 class X;
1898
1899Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1900 namespace foo { namespace bar { class X; } }
1901</pre></td></tr>
1902
1903
Manuel Klimek67619ff2012-09-07 13:10:32 +00001904<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 +00001905<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1906
1907Given
1908 class Y { public: void x(); };
1909 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001910callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001911 matches y-&gt;x()
1912</pre></td></tr>
1913
1914
Edwin Vane7b69cd02013-04-02 18:15:55 +00001915<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>
1916<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1917the node, not hidden within a typedef.
1918
1919Given
1920 typedef const int const_int;
1921 const_int i;
1922 int *const j;
1923 int *volatile k;
1924 int m;
1925varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1926i is const-qualified but the qualifier is not local.
1927</pre></td></tr>
1928
1929
Manuel Klimek67619ff2012-09-07 13:10:32 +00001930<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 +00001931<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1932include "top-level" const.
1933
1934Given
1935 void a(int);
1936 void b(int const);
1937 void c(const int);
1938 void d(const int*);
1939 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001940functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001941 matches "void b(int const)", "void c(const int)" and
1942 "void e(int const) {}". It does not match d as there
1943 is no top-level const on the parameter type "const int *".
1944</pre></td></tr>
1945
1946
Manuel Klimek67619ff2012-09-07 13:10:32 +00001947<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 +00001948<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1949
1950Given
1951 void a(int);
1952 void b(long);
1953 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001954functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001955matches "a(int)", "b(long)", but not "c(double)".
1956</pre></td></tr>
1957
1958
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001959<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>
1960<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1961
1962Stmt has pointer identity in the AST.
1963
1964</pre></td></tr>
1965
1966
Manuel Klimek415514d2013-02-06 20:36:22 +00001967<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>
1968<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001969
1970Example matches A, va, fa
1971 class A {};
1972 class B; Doesn't match, as it has no body.
1973 int va;
1974 extern int vb; Doesn't match, as it doesn't define the variable.
1975 void fa() {}
1976 void fb(); Doesn't match, as it has no body.
1977
1978Usable 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;
1979</pre></td></tr>
1980
1981
Manuel Klimek67619ff2012-09-07 13:10:32 +00001982<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 +00001983<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1984
1985Given
1986 int x;
1987 int s = sizeof(x) + alignof(x)
1988unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1989 matches sizeof(x)
1990</pre></td></tr>
1991
1992
Manuel Klimek67619ff2012-09-07 13:10:32 +00001993<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 +00001994<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1995unary).
1996
1997Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1998 !(a || b)
1999</pre></td></tr>
2000
2001
Manuel Klimek67619ff2012-09-07 13:10:32 +00002002<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002003<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2004
2005Example matches A, va, fa
2006 class A {};
2007 class B; Doesn't match, as it has no body.
2008 int va;
2009 extern int vb; Doesn't match, as it doesn't define the variable.
2010 void fa() {}
2011 void fb(); Doesn't match, as it has no body.
2012
2013Usable 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;
2014</pre></td></tr>
2015
2016
Manuel Klimek67619ff2012-09-07 13:10:32 +00002017<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 +00002018<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2019static member variable template instantiations.
2020
2021Given
2022 template&lt;typename T&gt; void A(T t) { }
2023 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002024functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002025 matches the specialization A&lt;int&gt;().
2026
2027Usable 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;
2028</pre></td></tr>
2029
2030
Manuel Klimek67619ff2012-09-07 13:10:32 +00002031<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 +00002032<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2033member variable template instantiations.
2034
2035Given
2036 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2037or
2038 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002039recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002040 matches the template instantiation of X&lt;A&gt;.
2041
2042But given
2043 template &lt;typename T&gt; class X {}; class A {};
2044 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002045recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002046 does not match, as X&lt;A&gt; is an explicit template specialization.
2047
2048Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2049</pre></td></tr>
2050
2051<!--END_NARROWING_MATCHERS -->
2052</table>
2053
2054<!-- ======================================================================= -->
2055<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2056<!-- ======================================================================= -->
2057
2058<p>Traversal matchers specify the relationship to other nodes that are
2059reachable from the current node.</p>
2060
2061<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2062forEachDescendant) which work on all nodes and allow users to write more generic
2063match expressions.</p>
2064
2065<table>
2066<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2067<!-- START_TRAVERSAL_MATCHERS -->
2068
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002069<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>
2070<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2071
2072Unlike anyOf, eachOf will generate a match result for each
2073matching submatcher.
2074
2075For example, in:
2076 class A { int a; int b; };
2077The matcher:
2078 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2079 has(fieldDecl(hasName("b")).bind("v"))))
2080will generate two results binding "v", the first of which binds
2081the field declaration of a, the second the field declaration of
2082b.
2083
2084Usable as: Any Matcher
2085</pre></td></tr>
2086
2087
2088<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>
2089<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2090
2091Generates results for each match.
2092
2093For example, in:
2094 class A { class B {}; class C {}; };
2095The matcher:
2096 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2097will generate results for A, B and C.
2098
2099Usable as: Any Matcher
2100</pre></td></tr>
2101
2102
Manuel Klimek67619ff2012-09-07 13:10:32 +00002103<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 +00002104<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2105provided matcher.
2106
Manuel Klimeke44a0062012-08-26 23:55:24 +00002107Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002108 class X {}; Matches X, because X::X is a class of name X inside X.
2109 class Y { class X {}; };
2110 class Z { class Y { class X {}; }; }; Does not match Z.
2111
2112ChildT must be an AST base type.
2113
2114As opposed to 'has', 'forEach' will cause a match for each result that
2115matches instead of only on the first one.
2116
2117Usable as: Any Matcher
2118</pre></td></tr>
2119
2120
Manuel Klimek67619ff2012-09-07 13:10:32 +00002121<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 +00002122<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2123provided matcher.
2124
2125Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002126 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002127 class X {}; Matches X, because X::X is a class of name X inside X.
2128 class A { class X {}; };
2129 class B { class C { class X {}; }; };
2130
2131DescendantT must be an AST base type.
2132
2133As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2134each result that matches instead of only on the first one.
2135
2136Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002137 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002138will match 10 times (plus injected class name matches) on:
2139 class A { class B { class C { class D { class E {}; }; }; }; };
2140
2141Usable as: Any Matcher
2142</pre></td></tr>
2143
2144
Manuel Klimek67619ff2012-09-07 13:10:32 +00002145<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 +00002146<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2147provided matcher.
2148
Manuel Klimeke44a0062012-08-26 23:55:24 +00002149Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002150 class X {}; Matches X, because X::X is a class of name X inside X.
2151 class Y { class X {}; };
2152 class Z { class Y { class X {}; }; }; Does not match Z.
2153
2154ChildT must be an AST base type.
2155
2156Usable as: Any Matcher
2157</pre></td></tr>
2158
2159
Manuel Klimek67619ff2012-09-07 13:10:32 +00002160<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>
2161<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2162matcher.
2163
2164Given
2165void f() { if (true) { int x = 42; } }
2166void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002167expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002168
2169Usable as: Any Matcher
2170</pre></td></tr>
2171
2172
2173<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 +00002174<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2175provided matcher.
2176
2177Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002178 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002179 class X {}; Matches X, because X::X is a class of name X inside X.
2180 class Y { class X {}; };
2181 class Z { class Y { class X {}; }; };
2182
2183DescendantT must be an AST base type.
2184
2185Usable as: Any Matcher
2186</pre></td></tr>
2187
2188
Daniel Jaspere0b89972012-12-04 12:08:08 +00002189<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>
2190<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2191matcher.
2192
2193Given
2194void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2195compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2196
2197Usable as: Any Matcher
2198</pre></td></tr>
2199
2200
Manuel Klimek67619ff2012-09-07 13:10:32 +00002201<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 +00002202<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2203
2204Given
2205 int i[5];
2206 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002207arraySubscriptExpression(hasBase(implicitCastExpr(
2208 hasSourceExpression(declRefExpr()))))
2209 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002210</pre></td></tr>
2211
2212
Manuel Klimek67619ff2012-09-07 13:10:32 +00002213<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 +00002214<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2215
2216Given
2217 int i[5];
2218 void f() { i[1] = 42; }
2219arraySubscriptExpression(hasIndex(integerLiteral()))
2220 matches i[1] with the integerLiteral() matching 1
2221</pre></td></tr>
2222
2223
Manuel Klimek41df16e2013-01-09 09:38:21 +00002224<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>
2225<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2226type.
2227
2228Given
2229 struct A {};
2230 A a[7];
2231 int b[7];
2232arrayType(hasElementType(builtinType()))
2233 matches "int b[7]"
2234
2235Usable 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;
2236</pre></td></tr>
2237
2238
2239<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>
2240<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2241type.
2242
2243Given
2244 struct A {};
2245 A a[7];
2246 int b[7];
2247arrayType(hasElementType(builtinType()))
2248 matches "int b[7]"
2249
2250Usable 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;
2251</pre></td></tr>
2252
2253
2254<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>
2255<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2256
2257Given
2258 _Atomic(int) i;
2259 _Atomic(float) f;
2260atomicType(hasValueType(isInteger()))
2261 matches "_Atomic(int) i"
2262
2263Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2264</pre></td></tr>
2265
2266
2267<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>
2268<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2269
2270Given
2271 _Atomic(int) i;
2272 _Atomic(float) f;
2273atomicType(hasValueType(isInteger()))
2274 matches "_Atomic(int) i"
2275
2276Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2277</pre></td></tr>
2278
2279
2280<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>
2281<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2282
2283Note: There is no TypeLoc for the deduced type and thus no
2284getDeducedLoc() matcher.
2285
2286Given
2287 auto a = 1;
2288 auto b = 2.0;
2289autoType(hasDeducedType(isInteger()))
2290 matches "auto a"
2291
2292Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2293</pre></td></tr>
2294
2295
Manuel Klimek67619ff2012-09-07 13:10:32 +00002296<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 +00002297<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2298binary operator matches.
2299</pre></td></tr>
2300
2301
Manuel Klimek67619ff2012-09-07 13:10:32 +00002302<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 +00002303<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2304
2305Example matches a (matcher = binaryOperator(hasLHS()))
2306 a || b
2307</pre></td></tr>
2308
2309
Manuel Klimek67619ff2012-09-07 13:10:32 +00002310<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 +00002311<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2312
2313Example matches b (matcher = binaryOperator(hasRHS()))
2314 a || b
2315</pre></td></tr>
2316
2317
Manuel Klimek41df16e2013-01-09 09:38:21 +00002318<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>
2319<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
2320pointee matches a given matcher.
2321
2322Given
2323 int *a;
2324 int const *b;
2325 float const *f;
2326pointerType(pointee(isConstQualified(), isInteger()))
2327 matches "int const *b"
2328
2329Usable 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;,
2330 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;
2331</pre></td></tr>
2332
2333
2334<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>
2335<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
2336pointee matches a given matcher.
2337
2338Given
2339 int *a;
2340 int const *b;
2341 float const *f;
2342pointerType(pointee(isConstQualified(), isInteger()))
2343 matches "int const *b"
2344
2345Usable 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;,
2346 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;
2347</pre></td></tr>
2348
2349
Edwin Vane3abf7782013-02-25 14:49:29 +00002350<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00002351<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
2352matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002353
Manuel Klimek03a83232013-06-10 08:52:15 +00002354The associated declaration is:
2355- for type nodes, the declaration of the underlying type
2356- for CallExpr, the declaration of the callee
2357- for MemberExpr, the declaration of the referenced member
2358- for CXXConstructExpr, the declaration of the constructor
2359
2360Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2361function. e.g. various subtypes of clang::Type and various expressions.
2362FIXME: Add all node types for which this is matcher is usable due to
2363getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002364
Daniel Jaspere0b89972012-12-04 12:08:08 +00002365Usable 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 +00002366 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;,
2367 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002368</pre></td></tr>
2369
2370
Manuel Klimek67619ff2012-09-07 13:10:32 +00002371<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 +00002372<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2373
2374Given
2375 struct Foo {
2376 Foo() : foo_(1) { }
2377 int foo_;
2378 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002379recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002380 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2381</pre></td></tr>
2382
2383
Manuel Klimek67619ff2012-09-07 13:10:32 +00002384<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 +00002385<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2386
2387Given
2388 struct Foo {
2389 Foo() : foo_(1) { }
2390 int foo_;
2391 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002392recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002393 forField(hasName("foo_"))))))
2394 matches Foo
2395with forField matching foo_
2396</pre></td></tr>
2397
2398
Manuel Klimek67619ff2012-09-07 13:10:32 +00002399<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 +00002400<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2401
2402Given
2403 struct Foo {
2404 Foo() : foo_(1) { }
2405 int foo_;
2406 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002407recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002408 withInitializer(integerLiteral(equals(1)))))))
2409 matches Foo
2410with withInitializer matching (1)
2411</pre></td></tr>
2412
2413
Manuel Klimek67619ff2012-09-07 13:10:32 +00002414<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 +00002415<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2416
Manuel Klimeke44a0062012-08-26 23:55:24 +00002417Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002418 class Y { public: void x(); };
2419 void z() { Y y; y.x(); }",
2420
2421FIXME: Overload to allow directly matching types?
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_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 +00002426<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2427
2428
Manuel Klimek67619ff2012-09-07 13:10:32 +00002429<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 +00002430<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2431</pre></td></tr>
2432
2433
Manuel Klimek67619ff2012-09-07 13:10:32 +00002434<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 +00002435<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2436belongs to.
2437
2438FIXME: Generalize this for other kinds of declarations.
2439FIXME: What other kind of declarations would we need to generalize
2440this to?
2441
2442Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002443 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002444 ofClass(hasName("A"))))))
2445 class A {
2446 public:
2447 A();
2448 };
2449 A a = A();
2450</pre></td></tr>
2451
2452
Edwin Vane6a19a972013-03-06 17:02:57 +00002453<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('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>
2454<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2455
2456Given:
2457 class A { void func(); };
2458 class B { void member(); };
2459
2460recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2461but not B.
2462</pre></td></tr>
2463
2464
Manuel Klimek67619ff2012-09-07 13:10:32 +00002465<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 +00002466<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2467a class matching Base.
2468
Manuel Klimek67619ff2012-09-07 13:10:32 +00002469Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002470
Manuel Klimek67619ff2012-09-07 13:10:32 +00002471Example matches Y, Z, C (Base == hasName("X"))
2472 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002473 class Y : public X {}; directly derived
2474 class Z : public Y {}; indirectly derived
2475 typedef X A;
2476 typedef A B;
2477 class C : public B {}; derived from a typedef of X
2478
2479In the following example, Bar matches isDerivedFrom(hasName("X")):
2480 class Foo;
2481 typedef Foo X;
2482 class Bar : public Foo {}; derived from a type that X is a typedef of
2483</pre></td></tr>
2484
2485
Daniel Jaspere0b89972012-12-04 12:08:08 +00002486<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('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>
2487<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2488match Base.
2489</pre></td></tr>
2490
2491
Manuel Klimek67619ff2012-09-07 13:10:32 +00002492<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 +00002493<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2494given matcher.
2495
Manuel Klimeke44a0062012-08-26 23:55:24 +00002496Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002497 class Y { public: void x(); };
2498 void z() { Y y; y.x();
2499</pre></td></tr>
2500
2501
Manuel Klimek67619ff2012-09-07 13:10:32 +00002502<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 +00002503<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2504expression.
2505
2506Given
2507 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002508callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002509 matches x(1, y, 42)
2510with hasAnyArgument(...)
2511 matching y
2512</pre></td></tr>
2513
2514
Manuel Klimek67619ff2012-09-07 13:10:32 +00002515<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 +00002516<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2517call expression.
2518
2519Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002520 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002521 void x(int) { int y; x(y); }
2522</pre></td></tr>
2523
2524
Edwin Vane3abf7782013-02-25 14:49:29 +00002525<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00002526<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
2527matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002528
Manuel Klimek03a83232013-06-10 08:52:15 +00002529The associated declaration is:
2530- for type nodes, the declaration of the underlying type
2531- for CallExpr, the declaration of the callee
2532- for MemberExpr, the declaration of the referenced member
2533- for CXXConstructExpr, the declaration of the constructor
2534
2535Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2536function. e.g. various subtypes of clang::Type and various expressions.
2537FIXME: Add all node types for which this is matcher is usable due to
2538getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002539
Daniel Jaspere0b89972012-12-04 12:08:08 +00002540Usable 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 +00002541 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;,
2542 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002543</pre></td></tr>
2544
2545
Manuel Klimek03a83232013-06-10 08:52:15 +00002546<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;</td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2547<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2548extension, matches the constant given in the statement.
2549
2550Given
2551 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2552caseStmt(hasCaseConstant(integerLiteral()))
2553 matches "case 1:"
2554</pre></td></tr>
2555
2556
Manuel Klimek67619ff2012-09-07 13:10:32 +00002557<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 +00002558<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2559
2560Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002561 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002562class URL { URL(string); };
2563URL url = "a string";
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_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 +00002568<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2569TemplateArgument matching the given InnerMatcher.
2570
2571Given
2572 template&lt;typename T&gt; class A {};
2573 template&lt;&gt; class A&lt;double&gt; {};
2574 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002575classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002576 refersToType(asString("int"))))
2577 matches the specialization A&lt;int&gt;
2578</pre></td></tr>
2579
2580
Manuel Klimek67619ff2012-09-07 13:10:32 +00002581<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 +00002582<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2583matches the given InnerMatcher.
2584
2585Given
2586 template&lt;typename T, typename U&gt; class A {};
2587 A&lt;bool, int&gt; b;
2588 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002589classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002590 1, refersToType(asString("int"))))
2591 matches the specialization A&lt;bool, int&gt;
2592</pre></td></tr>
2593
2594
Manuel Klimek41df16e2013-01-09 09:38:21 +00002595<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>
2596<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2597type.
2598
2599Given
2600 struct A {};
2601 A a[7];
2602 int b[7];
2603arrayType(hasElementType(builtinType()))
2604 matches "int b[7]"
2605
2606Usable 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;
2607</pre></td></tr>
2608
2609
2610<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>
2611<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2612type.
2613
2614Given
2615 struct A {};
2616 A a[7];
2617 int b[7];
2618arrayType(hasElementType(builtinType()))
2619 matches "int b[7]"
2620
2621Usable 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;
2622</pre></td></tr>
2623
2624
Manuel Klimek67619ff2012-09-07 13:10:32 +00002625<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 +00002626<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2627a given matcher.
2628
2629Given
2630 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002631hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002632 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002633with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002634 matching '{}'
2635</pre></td></tr>
2636
2637
Manuel Klimek67619ff2012-09-07 13:10:32 +00002638<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 +00002639<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2640or conditional operator.
2641
2642Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2643 if (true) {}
2644</pre></td></tr>
2645
2646
Manuel Klimek67619ff2012-09-07 13:10:32 +00002647<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 +00002648<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2649
2650Example matches b
2651 condition ? a : b
2652</pre></td></tr>
2653
2654
Manuel Klimek67619ff2012-09-07 13:10:32 +00002655<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 +00002656<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2657
2658Example matches a
2659 condition ? a : b
2660</pre></td></tr>
2661
2662
Manuel Klimek67619ff2012-09-07 13:10:32 +00002663<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 +00002664<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2665specific using shadow declaration.
2666
2667FIXME: This currently only works for functions. Fix.
2668
2669Given
2670 namespace a { void f() {} }
2671 using a::f;
2672 void g() {
2673 f(); Matches this ..
2674 a::f(); .. but not this.
2675 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002676declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002677 matches f()
2678</pre></td></tr>
2679
2680
Manuel Klimek67619ff2012-09-07 13:10:32 +00002681<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002682<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2683specified matcher.
2684
2685Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002686 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002687 bool x;
2688 if (x) {}
2689</pre></td></tr>
2690
2691
Manuel Klimek67619ff2012-09-07 13:10:32 +00002692<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 +00002693<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2694
2695Note that this does not work for global declarations because the AST
2696breaks up multiple-declaration DeclStmt's into multiple single-declaration
2697DeclStmt's.
2698Example: Given non-global declarations
2699 int a, b = 0;
2700 int c;
2701 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002702declStmt(containsDeclaration(
2703 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002704 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002705declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002706 matches 'int a, b = 0' as well as 'int d = 2, e;'
2707 but 'int c;' is not matched.
2708</pre></td></tr>
2709
2710
Manuel Klimek67619ff2012-09-07 13:10:32 +00002711<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 +00002712<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2713
2714Given
2715 int a, b;
2716 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002717declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002718 matches 'int c;' but not 'int a, b;'.
2719</pre></td></tr>
2720
2721
Edwin Vane742d9e72013-02-25 20:43:32 +00002722<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>
2723<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2724Decl, matches InnerMatcher.
2725
2726Given
2727 namespace N {
2728 namespace M {
2729 class D {};
2730 }
2731 }
2732
2733recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2734declaration of class D.
2735</pre></td></tr>
2736
2737
Manuel Klimek67619ff2012-09-07 13:10:32 +00002738<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 +00002739<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2740a given body.
2741
2742Given
2743 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002744hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002745 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002746with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002747 matching '{}'
2748</pre></td></tr>
2749
2750
Manuel Klimek67619ff2012-09-07 13:10:32 +00002751<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 +00002752<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2753or conditional operator.
2754
2755Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2756 if (true) {}
2757</pre></td></tr>
2758
2759
Edwin Vane742d9e72013-02-25 20:43:32 +00002760<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>
2761<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002762matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002763
2764Given
2765 namespace N {
2766 namespace M {
2767 class D {};
2768 }
2769 }
2770 N::M::D d;
2771
2772elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2773matches the type of the variable declaration of d.
2774</pre></td></tr>
2775
2776
2777<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>
2778<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2779
2780Given
2781 namespace N {
2782 namespace M {
2783 class D {};
2784 }
2785 }
2786 N::M::D d;
2787
2788elaboratedType(namesType(recordType(
2789hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2790declaration of d.
2791</pre></td></tr>
2792
2793
Manuel Klimek67619ff2012-09-07 13:10:32 +00002794<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 +00002795<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2796
2797(Note: Clang's AST refers to other conversions as "casts" too, and calls
2798actual casts "explicit" casts.)
2799</pre></td></tr>
2800
2801
Manuel Klimek67619ff2012-09-07 13:10:32 +00002802<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 +00002803<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2804declaration's type.
2805
2806In case of a value declaration (for example a variable declaration),
2807this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002808declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2809while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002810of x."
2811
Manuel Klimeke44a0062012-08-26 23:55:24 +00002812Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2813 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002814 class X {};
2815 void y(X &amp;x) { x; X z; }
2816
2817Usable 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;
2818</pre></td></tr>
2819
2820
Manuel Klimek67619ff2012-09-07 13:10:32 +00002821<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 +00002822<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2823are stripped off.
2824
2825Parentheses and explicit casts are not discarded.
2826Given
2827 int arr[5];
2828 int a = 0;
2829 char b = 0;
2830 const int c = a;
2831 int *d = arr;
2832 long e = (long) 0l;
2833The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002834 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2835 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002836would match the declarations for a, b, c, and d, but not e.
2837While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002838 varDecl(hasInitializer(integerLiteral()))
2839 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002840only match the declarations for b, c, and d.
2841</pre></td></tr>
2842
2843
Manuel Klimek67619ff2012-09-07 13:10:32 +00002844<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 +00002845<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2846casts are stripped off.
2847
2848Implicit and non-C Style casts are also discarded.
2849Given
2850 int a = 0;
2851 char b = (0);
2852 void* c = reinterpret_cast&lt;char*&gt;(0);
2853 char d = char(0);
2854The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002855 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002856would match the declarations for a, b, c, and d.
2857while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002858 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002859only match the declaration for a.
2860</pre></td></tr>
2861
2862
Manuel Klimek67619ff2012-09-07 13:10:32 +00002863<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002864<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2865parentheses are stripped off.
2866
2867Explicit casts are not discarded.
2868Given
2869 int arr[5];
2870 int a = 0;
2871 char b = (0);
2872 const int c = a;
2873 int *d = (arr);
2874 long e = ((long) 0l);
2875The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002876 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2877 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002878would match the declarations for a, b, c, and d, but not e.
2879while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002880 varDecl(hasInitializer(integerLiteral()))
2881 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002882would only match the declaration for a.
2883</pre></td></tr>
2884
2885
Manuel Klimek67619ff2012-09-07 13:10:32 +00002886<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 +00002887<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2888a given body.
2889
2890Given
2891 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002892hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002893 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002894with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002895 matching '{}'
2896</pre></td></tr>
2897
2898
Manuel Klimek67619ff2012-09-07 13:10:32 +00002899<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002900<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2901or conditional operator.
2902
2903Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2904 if (true) {}
2905</pre></td></tr>
2906
2907
Manuel Klimek67619ff2012-09-07 13:10:32 +00002908<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 +00002909<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2910
2911Example:
2912 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2913matches '++x' in
2914 for (x; x &lt; N; ++x) { }
2915</pre></td></tr>
2916
2917
Manuel Klimek67619ff2012-09-07 13:10:32 +00002918<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 +00002919<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2920
2921Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002922 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002923matches 'int x = 0' in
2924 for (int x = 0; x &lt; N; ++x) { }
2925</pre></td></tr>
2926
2927
Manuel Klimek67619ff2012-09-07 13:10:32 +00002928<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002929<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2930
2931Does not match the 'this' parameter of a method.
2932
2933Given
2934 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002935methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002936 matches f(int x, int y, int z) {}
2937with hasAnyParameter(...)
2938 matching int y
2939</pre></td></tr>
2940
2941
Manuel Klimek67619ff2012-09-07 13:10:32 +00002942<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002943<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2944
2945Given
2946 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002947methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002948 matches f(int x) {}
2949with hasParameter(...)
2950 matching int x
2951</pre></td></tr>
2952
2953
Manuel Klimek67619ff2012-09-07 13:10:32 +00002954<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 +00002955<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2956
2957Given:
2958 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002959methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002960 matches int f() { return 1; }
2961</pre></td></tr>
2962
2963
Manuel Klimek67619ff2012-09-07 13:10:32 +00002964<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 +00002965<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
2966or conditional operator.
2967
2968Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2969 if (true) {}
2970</pre></td></tr>
2971
2972
Manuel Klimek67619ff2012-09-07 13:10:32 +00002973<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 +00002974<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
2975
2976Given
2977 if (A* a = GetAPointer()) {}
2978hasConditionVariableStatment(...)
2979 matches 'A* a = GetAPointer()'.
2980</pre></td></tr>
2981
2982
Manuel Klimek67619ff2012-09-07 13:10:32 +00002983<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 +00002984<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
2985matcher.
2986
2987FIXME: Unit test this matcher
2988</pre></td></tr>
2989
2990
Edwin Vane3abf7782013-02-25 14:49:29 +00002991<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00002992<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
2993matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00002994
Manuel Klimek03a83232013-06-10 08:52:15 +00002995The associated declaration is:
2996- for type nodes, the declaration of the underlying type
2997- for CallExpr, the declaration of the callee
2998- for MemberExpr, the declaration of the referenced member
2999- for CXXConstructExpr, the declaration of the constructor
3000
3001Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3002function. e.g. various subtypes of clang::Type and various expressions.
3003FIXME: Add all node types for which this is matcher is usable due to
3004getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003005
Daniel Jaspere0b89972012-12-04 12:08:08 +00003006Usable 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 +00003007 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;,
3008 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003009</pre></td></tr>
3010
3011
Manuel Klimek67619ff2012-09-07 13:10:32 +00003012<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 +00003013<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3014matched by a given matcher.
3015
3016Given
3017 struct X { int m; };
3018 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003019memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003020 matches "x.m" and "m"
3021with hasObjectExpression(...)
3022 matching "x" and the implicit object expression of "m" which has type X*.
3023</pre></td></tr>
3024
3025
Manuel Klimek67619ff2012-09-07 13:10:32 +00003026<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 +00003027<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3028given matcher.
3029
3030Given
3031 struct { int first, second; } first, second;
3032 int i(second.first);
3033 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003034memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003035 matches second.first
3036 but not first.second (because the member name there is "second").
3037</pre></td></tr>
3038
3039
Manuel Klimek41df16e2013-01-09 09:38:21 +00003040<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>
3041<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
3042pointee matches a given matcher.
3043
3044Given
3045 int *a;
3046 int const *b;
3047 float const *f;
3048pointerType(pointee(isConstQualified(), isInteger()))
3049 matches "int const *b"
3050
3051Usable 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;,
3052 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;
3053</pre></td></tr>
3054
3055
3056<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>
3057<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
3058pointee matches a given matcher.
3059
3060Given
3061 int *a;
3062 int const *b;
3063 float const *f;
3064pointerType(pointee(isConstQualified(), isInteger()))
3065 matches "int const *b"
3066
3067Usable 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;,
3068 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;
3069</pre></td></tr>
3070
3071
Manuel Klimek415514d2013-02-06 20:36:22 +00003072<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 +00003073<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3074
3075Given
3076 struct A { struct B { struct C {}; }; };
3077 A::B::C c;
3078nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3079 matches "A::"
3080</pre></td></tr>
3081
3082
Manuel Klimek41df16e2013-01-09 09:38:21 +00003083<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>
3084<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3085NestedNameSpecifier-matcher matches.
3086</pre></td></tr>
3087
3088
Daniel Jaspere0b89972012-12-04 12:08:08 +00003089<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>
3090<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3091given TypeLoc.
3092
3093Given
3094 struct A { struct B { struct C {}; }; };
3095 A::B::C c;
3096nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3097 hasDeclaration(recordDecl(hasName("A")))))))
3098 matches "A::"
3099</pre></td></tr>
3100
3101
Manuel Klimek415514d2013-02-06 20:36:22 +00003102<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 +00003103<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3104
3105Given
3106 struct A { struct B { struct C {}; }; };
3107 A::B::C c;
3108nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3109 matches "A::"
3110</pre></td></tr>
3111
3112
3113<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>
3114<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3115given namespace matcher.
3116
3117Given
3118 namespace ns { struct A {}; }
3119 ns::A a;
3120nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3121 matches "ns::"
3122</pre></td></tr>
3123
3124
3125<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>
3126<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3127given QualType matcher without qualifiers.
3128
3129Given
3130 struct A { struct B { struct C {}; }; };
3131 A::B::C c;
3132nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3133 matches "A::"
3134</pre></td></tr>
3135
3136
Edwin Vane88be2fd2013-04-01 18:33:34 +00003137<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>
3138<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3139
3140Given
3141 int (*ptr_to_array)[4];
3142 int (*ptr_to_func)(int);
3143
3144varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3145ptr_to_func but not ptr_to_array.
3146
3147Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3148</pre></td></tr>
3149
3150
Manuel Klimek41df16e2013-01-09 09:38:21 +00003151<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>
3152<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3153pointee matches a given matcher.
3154
3155Given
3156 int *a;
3157 int const *b;
3158 float const *f;
3159pointerType(pointee(isConstQualified(), isInteger()))
3160 matches "int const *b"
3161
3162Usable 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;,
3163 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;
3164</pre></td></tr>
3165
3166
3167<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>
3168<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3169pointee matches a given matcher.
3170
3171Given
3172 int *a;
3173 int const *b;
3174 float const *f;
3175pointerType(pointee(isConstQualified(), isInteger()))
3176 matches "int const *b"
3177
3178Usable 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;,
3179 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;
3180</pre></td></tr>
3181
3182
Edwin Vane6a19a972013-03-06 17:02:57 +00003183<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>
3184<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3185
3186Given:
3187 typedef int &amp;int_ref;
3188 int a;
3189 int_ref b = a;
3190
3191varDecl(hasType(qualType(referenceType()))))) will not match the
3192declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3193</pre></td></tr>
3194
3195
Edwin Vane3abf7782013-02-25 14:49:29 +00003196<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003197<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3198matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003199
Manuel Klimek03a83232013-06-10 08:52:15 +00003200The associated declaration is:
3201- for type nodes, the declaration of the underlying type
3202- for CallExpr, the declaration of the callee
3203- for MemberExpr, the declaration of the referenced member
3204- for CXXConstructExpr, the declaration of the constructor
3205
3206Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3207function. e.g. various subtypes of clang::Type and various expressions.
3208FIXME: Add all node types for which this is matcher is usable due to
3209getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003210
Daniel Jaspere0b89972012-12-04 12:08:08 +00003211Usable 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 +00003212 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;,
3213 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003214</pre></td></tr>
3215
3216
Manuel Klimek67619ff2012-09-07 13:10:32 +00003217<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 +00003218<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3219</pre></td></tr>
3220
3221
Manuel Klimek67619ff2012-09-07 13:10:32 +00003222<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 +00003223<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3224</pre></td></tr>
3225
3226
Manuel Klimek41df16e2013-01-09 09:38:21 +00003227<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>
3228<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3229pointee matches a given matcher.
3230
3231Given
3232 int *a;
3233 int const *b;
3234 float const *f;
3235pointerType(pointee(isConstQualified(), isInteger()))
3236 matches "int const *b"
3237
3238Usable 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;,
3239 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;
3240</pre></td></tr>
3241
3242
3243<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>
3244<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3245pointee matches a given matcher.
3246
3247Given
3248 int *a;
3249 int const *b;
3250 float const *f;
3251pointerType(pointee(isConstQualified(), isInteger()))
3252 matches "int const *b"
3253
3254Usable 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;,
3255 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;
3256</pre></td></tr>
3257
3258
Manuel Klimek67619ff2012-09-07 13:10:32 +00003259<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003260<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3261alignof.
3262</pre></td></tr>
3263
3264
Manuel Klimek67619ff2012-09-07 13:10:32 +00003265<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 +00003266<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3267sizeof.
3268</pre></td></tr>
3269
3270
Manuel Klimek03a83232013-06-10 08:52:15 +00003271<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
3272<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3273statement. This matcher may produce multiple matches.
3274
3275Given
3276 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3277switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3278 matches four times, with "c" binding each of "case 1:", "case 2:",
3279"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3280"switch (1)", "switch (2)" and "switch (2)".
3281</pre></td></tr>
3282
3283
Manuel Klimek67619ff2012-09-07 13:10:32 +00003284<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 +00003285<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3286
3287Given
3288 template&lt;typename T&gt; struct A {};
3289 struct B { B* next; };
3290 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003291classTemplateSpecializationDecl(hasAnyTemplateArgument(
3292 refersToDeclaration(fieldDecl(hasName("next"))))
3293 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003294 B::next
3295</pre></td></tr>
3296
3297
Manuel Klimek67619ff2012-09-07 13:10:32 +00003298<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 +00003299<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3300
3301Given
3302 struct X {};
3303 template&lt;typename T&gt; struct A {};
3304 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003305classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003306 refersToType(class(hasName("X")))))
3307 matches the specialization A&lt;X&gt;
3308</pre></td></tr>
3309
3310
Edwin Vane3abf7782013-02-25 14:49:29 +00003311<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003312<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
3313matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003314
Manuel Klimek03a83232013-06-10 08:52:15 +00003315The associated declaration is:
3316- for type nodes, the declaration of the underlying type
3317- for CallExpr, the declaration of the callee
3318- for MemberExpr, the declaration of the referenced member
3319- for CXXConstructExpr, the declaration of the constructor
3320
3321Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3322function. e.g. various subtypes of clang::Type and various expressions.
3323FIXME: Add all node types for which this is matcher is usable due to
3324getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003325
3326Usable 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 +00003327 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;,
3328 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3329</pre></td></tr>
3330
3331
3332<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>
3333<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3334QualType-matcher matches.
3335</pre></td></tr>
3336
3337
3338<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003339<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
3340matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00003341
Manuel Klimek03a83232013-06-10 08:52:15 +00003342The associated declaration is:
3343- for type nodes, the declaration of the underlying type
3344- for CallExpr, the declaration of the callee
3345- for MemberExpr, the declaration of the referenced member
3346- for CXXConstructExpr, the declaration of the constructor
3347
3348Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3349function. e.g. various subtypes of clang::Type and various expressions.
3350FIXME: Add all node types for which this is matcher is usable due to
3351getDecl().
Edwin Vane3abf7782013-02-25 14:49:29 +00003352
3353Usable 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;,
3354 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;,
3355 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003356</pre></td></tr>
3357
3358
Manuel Klimek67619ff2012-09-07 13:10:32 +00003359<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003360<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3361
3362Given
3363 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3364unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3365 matches sizeof(a) and alignof(c)
3366</pre></td></tr>
3367
3368
Manuel Klimek67619ff2012-09-07 13:10:32 +00003369<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003370<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3371
Daniel Jaspere0b89972012-12-04 12:08:08 +00003372Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003373 !true
3374</pre></td></tr>
3375
3376
Manuel Klimek67619ff2012-09-07 13:10:32 +00003377<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003378<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3379
3380Given
3381 namespace X { void b(); }
3382 using X::b;
3383usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3384 matches using X::b </pre></td></tr>
3385
3386
Manuel Klimek67619ff2012-09-07 13:10:32 +00003387<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 +00003388<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3389matched by the given matcher.
3390
3391Given
3392 namespace X { int a; void b(); }
3393 using X::a;
3394 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003395usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003396 matches using X::b but not using X::a </pre></td></tr>
3397
3398
Manuel Klimek67619ff2012-09-07 13:10:32 +00003399<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 +00003400<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3401declaration's type.
3402
3403In case of a value declaration (for example a variable declaration),
3404this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003405declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3406while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003407of x."
3408
Manuel Klimeke44a0062012-08-26 23:55:24 +00003409Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3410 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003411 class X {};
3412 void y(X &amp;x) { x; X z; }
3413
3414Usable 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;
3415</pre></td></tr>
3416
3417
Manuel Klimek67619ff2012-09-07 13:10:32 +00003418<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 +00003419<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3420that matches the given matcher.
3421
Manuel Klimeke44a0062012-08-26 23:55:24 +00003422Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003423 bool y() { return true; }
3424 bool x = y();
3425</pre></td></tr>
3426
3427
Daniel Jaspere0b89972012-12-04 12:08:08 +00003428<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>
3429<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3430expression.
3431
3432Given
3433 void f(int b) {
3434 int a[b];
3435 }
3436variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3437 varDecl(hasName("b")))))))
3438 matches "int a[b]"
3439</pre></td></tr>
3440
3441
Manuel Klimek67619ff2012-09-07 13:10:32 +00003442<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 +00003443<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3444a given body.
3445
3446Given
3447 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003448hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003449 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003450with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003451 matching '{}'
3452</pre></td></tr>
3453
3454
Manuel Klimek67619ff2012-09-07 13:10:32 +00003455<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003456<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3457or conditional operator.
3458
3459Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3460 if (true) {}
3461</pre></td></tr>
3462
3463<!--END_TRAVERSAL_MATCHERS -->
3464</table>
3465
3466</div>
3467</body>
3468</html>
3469
3470