blob: 0ea55bfef54d07f6c97234521b904983c609daa9 [file] [log] [blame]
Manuel Klimek1da79332012-08-20 20:54:03 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10 padding: .33em;
11}
12td.doc {
13 display: none;
14 border-bottom: 1px solid black;
15}
16td.name:hover {
17 color: blue;
18 cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
Manuel Klimek67619ff2012-09-07 13:10:32 +000023 if (!id) return;
Manuel Klimek1da79332012-08-20 20:54:03 +000024 row = document.getElementById(id);
25 if (row.style.display != 'table-cell')
26 row.style.display = 'table-cell';
27 else
28 row.style.display = 'none';
29}
30</script>
31</head>
Manuel Klimek67619ff2012-09-07 13:10:32 +000032<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
Manuel Klimek1da79332012-08-20 20:54:03 +000033
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<!-- ======================================================================= -->
61<h2 id="decl-matchers">Node Matchers</h2>
62<!-- ======================================================================= -->
63
64<p>Node matchers are at the core of matcher expressions - they specify the type
65of node that is expected. Every match expression starts with a node matcher,
66which can then be further refined with a narrowing or traversal matcher. All
67traversal matchers take node matchers as their arguments.</p>
68
69<p>For convenience, all node matchers take an arbitrary number of arguments
70and implicitly act as allOf matchers.</p>
71
72<p>Node matchers are the only matchers that support the bind("id") call to
73bind the matched node to the given string, to be later retrieved from the
74match callback.</p>
75
76<table>
77<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
78<!-- START_DECL_MATCHERS -->
79
Daniel Jasperc7093d92013-02-25 12:39:41 +000080<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
81<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
82
83Given
84 class C {
85 public:
86 int a;
87 };
88accessSpecDecl()
89 matches 'public:'
90</pre></td></tr>
91
92
Manuel Klimek67619ff2012-09-07 13:10:32 +000093<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +000094<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +000095
96Example matches Z
97 template&lt;class T&gt; class Z {};
98</pre></td></tr>
99
100
Manuel Klimek67619ff2012-09-07 13:10:32 +0000101<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000102<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000103
104Given
105 template&lt;typename T&gt; class A {};
106 template&lt;&gt; class A&lt;double&gt; {};
107 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000108classTemplateSpecializationDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000109 matches the specializations A&lt;int&gt; and A&lt;double&gt;
110</pre></td></tr>
111
112
Manuel Klimek67619ff2012-09-07 13:10:32 +0000113<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000114<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000115
116Example matches Foo::Foo() and Foo::Foo(int)
117 class Foo {
118 public:
119 Foo();
120 Foo(int);
121 int DoSomething();
122 };
123</pre></td></tr>
124
125
Manuel Klimek67619ff2012-09-07 13:10:32 +0000126<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000127<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
128
129Examples matches X, C, and the friend declaration inside C;
130 void X();
131 class C {
132 friend X;
133 };
134</pre></td></tr>
135
136
Manuel Klimek67619ff2012-09-07 13:10:32 +0000137<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000138<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000139
140Example matches Foo::~Foo()
141 class Foo {
142 public:
143 virtual ~Foo();
144 };
145</pre></td></tr>
146
147
Manuel Klimek67619ff2012-09-07 13:10:32 +0000148<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000149<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000150
151Example matches A, B, C
152 enum X {
153 A, B, C
154 };
155</pre></td></tr>
156
157
Manuel Klimek67619ff2012-09-07 13:10:32 +0000158<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000159<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
160
161Example matches X
162 enum X {
163 A, B, C
164 };
165</pre></td></tr>
166
167
Manuel Klimek67619ff2012-09-07 13:10:32 +0000168<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000169<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000170
171Given
172 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000173fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000174 matches 'm'.
175</pre></td></tr>
176
177
Manuel Klimek67619ff2012-09-07 13:10:32 +0000178<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000179<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000180
181Example matches f
182 void f();
183</pre></td></tr>
184
185
Manuel Klimek67619ff2012-09-07 13:10:32 +0000186<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000187<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000188
189Example matches f
190 template&lt;class T&gt; void f(T t) {}
191</pre></td></tr>
192
193
Manuel Klimek67619ff2012-09-07 13:10:32 +0000194<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000195<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000196
197Example matches y
198 class X { void y() };
199</pre></td></tr>
200
201
Manuel Klimek67619ff2012-09-07 13:10:32 +0000202<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000203<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
Manuel Klimek1da79332012-08-20 20:54:03 +0000204
205Example matches X, S, the anonymous union type, i, and U;
206 typedef int X;
207 struct S {
208 union {
209 int i;
210 } U;
211 };
212</pre></td></tr>
213
214
Edwin Vane0332e0a2013-05-09 16:42:37 +0000215<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
216<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
217
218Given
219 namespace {}
220 namespace test {}
221namespaceDecl()
222 matches "namespace {}" and "namespace test {}"
223</pre></td></tr>
224
225
Manuel Klimek67619ff2012-09-07 13:10:32 +0000226<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000227<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000228
229Example matches X, Z
230 class X;
231 template&lt;class T&gt; class Z {};
232</pre></td></tr>
233
234
Manuel Klimek67619ff2012-09-07 13:10:32 +0000235<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000236<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
237
238Given
239 namespace X { int x; }
240 using X::x;
241usingDecl()
242 matches using X::x </pre></td></tr>
243
244
Manuel Klimek67619ff2012-09-07 13:10:32 +0000245<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000246<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000247
248Note: this does not match declarations of member variables, which are
249"field" declarations in Clang parlance.
250
251Example matches a
252 int a;
253</pre></td></tr>
254
255
Manuel Klimek41df16e2013-01-09 09:38:21 +0000256<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
257<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
258</pre></td></tr>
259
260
261<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
262<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
263
264Given
265 namespace ns {
266 struct A { static void f(); };
267 void A::f() {}
268 void g() { A::f(); }
269 }
270 ns::A a;
271nestedNameSpecifier()
272 matches "ns::" and both "A::"
273</pre></td></tr>
274
275
276<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
277<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
278</pre></td></tr>
279
280
Manuel Klimek67619ff2012-09-07 13:10:32 +0000281<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000282<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
283
284Given
285 int i = a[1];
286arraySubscriptExpr()
287 matches "a[1]"
288</pre></td></tr>
289
290
Daniel Jaspere0b89972012-12-04 12:08:08 +0000291<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
292<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
293
294 int i = 100;
295 __asm("mov al, 2");
296asmStmt()
297 matches '__asm("mov al, 2")'
298</pre></td></tr>
299
300
Manuel Klimek67619ff2012-09-07 13:10:32 +0000301<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000302<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
303
304Example matches a || b
305 !(a || b)
306</pre></td></tr>
307
308
Manuel Klimek67619ff2012-09-07 13:10:32 +0000309<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000310<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000311
312Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000313 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000314 FunctionTakesString(GetStringByValue());
315 FunctionTakesStringByPointer(GetStringPointer());
316</pre></td></tr>
317
318
Daniel Jaspere0b89972012-12-04 12:08:08 +0000319<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
320<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
321
322Example matches true
323 true
324</pre></td></tr>
325
326
327<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
328<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
329
330Given
331 while (true) { break; }
332breakStmt()
333 matches 'break'
334</pre></td></tr>
335
336
337<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
338<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
339
340Example: Matches (int*) 2.2f in
341 int i = (int) 2.2f;
342</pre></td></tr>
343
344
Manuel Klimek67619ff2012-09-07 13:10:32 +0000345<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000346<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000347
348Example matches x.y() and y()
349 X x;
350 x.y();
351 y();
352</pre></td></tr>
353
354
Daniel Jaspere0b89972012-12-04 12:08:08 +0000355<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
356<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
357
358Example: castExpr() matches each of the following:
359 (int) 3;
360 const_cast&lt;Expr *&gt;(SubExpr);
361 char c = 0;
362but does not match
363 int i = (0);
364 int k = 0;
365</pre></td></tr>
366
367
368<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('catchStmt0')"><a name="catchStmt0Anchor">catchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
369<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
370
371 try {} catch(int i) {}
372catchStmt()
373 matches 'catch(int i)'
374</pre></td></tr>
375
376
377<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
378<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
379
380Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
381though.
382
383Example matches 'a', L'a'
384 char ch = 'a'; wchar_t chw = L'a';
385</pre></td></tr>
386
387
Manuel Klimek415514d2013-02-06 20:36:22 +0000388<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
389<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
390
391Example match: {1}, (1, 2)
392 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
393</pre></td></tr>
394
395
Manuel Klimek67619ff2012-09-07 13:10:32 +0000396<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000397<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000398
399Example matches '{}' and '{{}}'in 'for (;;) {{}}'
400 for (;;) {{}}
401</pre></td></tr>
402
403
Manuel Klimek67619ff2012-09-07 13:10:32 +0000404<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000405<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
406
407Example matches a ? b : c
408 (a ? b : c) + 42
409</pre></td></tr>
410
411
Daniel Jaspere0b89972012-12-04 12:08:08 +0000412<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
413<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
414
415Example: Matches const_cast&lt;int*&gt;(&amp;r) in
416 int n = 42;
417 const int &amp;r(n);
418 int* p = const_cast&lt;int*&gt;(&amp;r);
419</pre></td></tr>
420
421
Manuel Klimek67619ff2012-09-07 13:10:32 +0000422<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000423<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000424
425Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000426 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000427 void f(const string &amp;a, const string &amp;b);
428 char *ptr;
429 int n;
430 f(string(ptr, n), ptr);
431</pre></td></tr>
432
433
Daniel Jaspere0b89972012-12-04 12:08:08 +0000434<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
435<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
436
437Given
438 while (true) { continue; }
439continueStmt()
440 matches 'continue'
441</pre></td></tr>
442
443
Manuel Klimek67619ff2012-09-07 13:10:32 +0000444<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000445<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000446
447Example matches x in if (x)
448 bool x;
449 if (x) {}
450</pre></td></tr>
451
452
Manuel Klimek67619ff2012-09-07 13:10:32 +0000453<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000454<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000455
456Given
457 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000458declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000459 matches 'int a'.
460</pre></td></tr>
461
462
Manuel Klimek67619ff2012-09-07 13:10:32 +0000463<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000464<tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site.
Manuel Klimek1da79332012-08-20 20:54:03 +0000465
466Example matches the CXXDefaultArgExpr placeholder inserted for the
467 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000468 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000469 void f(int x, int y = 0);
470 f(42);
471</pre></td></tr>
472
473
Manuel Klimek67619ff2012-09-07 13:10:32 +0000474<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000475<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000476
477Given
478 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000479deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000480 matches 'delete X'.
481</pre></td></tr>
482
483
Manuel Klimek67619ff2012-09-07 13:10:32 +0000484<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000485<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
486
487Given
488 do {} while (true);
489doStmt()
490 matches 'do {} while(true)'
491</pre></td></tr>
492
493
Daniel Jaspere0b89972012-12-04 12:08:08 +0000494<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
495<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
496
497Example:
498 dynamicCastExpr()
499matches
500 dynamic_cast&lt;D*&gt;(&amp;b);
501in
502 struct B { virtual ~B() {} }; struct D : B {};
503 B b;
504 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
505</pre></td></tr>
506
507
508<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
509<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
510
511Matches any cast expression written in user code, whether it be a
512C-style cast, a functional-style cast, or a keyword cast.
513
514Does not match implicit conversions.
515
516Note: the name "explicitCast" is chosen to match Clang's terminology, as
517Clang uses the term "cast" to apply to implicit conversions as well as to
518actual cast expressions.
519
520hasDestinationType.
521
522Example: matches all five of the casts in
523 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
524but does not match the implicit conversion in
525 long ell = 42;
526</pre></td></tr>
527
528
Manuel Klimek67619ff2012-09-07 13:10:32 +0000529<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000530<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000531
532Example matches x()
533 void f() { x(); }
534</pre></td></tr>
535
536
Daniel Jaspere0b89972012-12-04 12:08:08 +0000537<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forRangeStmt0')"><a name="forRangeStmt0Anchor">forRangeStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
538<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
539
540forRangeStmt() matches 'for (auto a : i)'
541 int i[] = {1, 2, 3}; for (auto a : i);
542 for(int j = 0; j &lt; 5; ++j);
543</pre></td></tr>
544
545
Manuel Klimek67619ff2012-09-07 13:10:32 +0000546<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000547<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
548
549Example matches 'for (;;) {}'
550 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000551 int i[] = {1, 2, 3}; for (auto a : i);
552</pre></td></tr>
553
554
555<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
556<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
557
558Example: Matches Foo(bar);
559 Foo f = bar;
560 Foo g = (Foo) bar;
561 Foo h = Foo(bar);
562</pre></td></tr>
563
564
565<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
566<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
567
568Given
569 goto FOO;
570 FOO: bar();
571gotoStmt()
572 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000573</pre></td></tr>
574
575
Manuel Klimek67619ff2012-09-07 13:10:32 +0000576<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000577<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
578
579Example matches 'if (x) {}'
580 if (x) {}
581</pre></td></tr>
582
583
Daniel Jaspere0b89972012-12-04 12:08:08 +0000584<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
585<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
586
587This matches many different places, including function call return value
588eliding, as well as any type conversions.
589</pre></td></tr>
590
591
Manuel Klimek67619ff2012-09-07 13:10:32 +0000592<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000593<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
594
595Given
596 int a[] = { 1, 2 };
597 struct B { int x, y; };
598 B b = { 5, 6 };
599initList()
600 matches "{ 1, 2 }" and "{ 5, 6 }"
601</pre></td></tr>
602
603
Daniel Jaspere0b89972012-12-04 12:08:08 +0000604<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
605<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
606
607Not matching character-encoded integers such as L'a'.
608
609Example matches 1, 1L, 0x1, 1U
610</pre></td></tr>
611
612
613<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
614<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
615
616Given
617 goto FOO;
618 FOO: bar();
619labelStmt()
620 matches 'FOO:'
621</pre></td></tr>
622
623
624<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
625<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
626
627Example matches [&amp;](){return 5;}
628 [&amp;](){return 5;}
629</pre></td></tr>
630
631
Manuel Klimek67619ff2012-09-07 13:10:32 +0000632<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000633<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
634
635Example: Given
636 struct T {void func()};
637 T f();
638 void g(T);
639materializeTemporaryExpr() matches 'f()' in these statements
640 T u(f());
641 g(f());
642but does not match
643 f();
644 f().func();
645</pre></td></tr>
646
647
Manuel Klimek67619ff2012-09-07 13:10:32 +0000648<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000649<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000650
651Example matches x.y()
652 X x;
653 x.y();
654</pre></td></tr>
655
656
Manuel Klimek67619ff2012-09-07 13:10:32 +0000657<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000658<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000659
660Given
661 class Y {
662 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
663 int a; static int b;
664 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000665memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000666 matches this-&gt;x, x, y.x, a, this-&gt;b
667</pre></td></tr>
668
669
Manuel Klimek67619ff2012-09-07 13:10:32 +0000670<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000671<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000672
673Given
674 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000675newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000676 matches 'new X'.
677</pre></td></tr>
678
679
Daniel Jaspere0b89972012-12-04 12:08:08 +0000680<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullPtrLiteralExpr0')"><a name="nullPtrLiteralExpr0Anchor">nullPtrLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
681<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
682</pre></td></tr>
683
684
685<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
686<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
687
688 foo();;
689nullStmt()
690 matches the second ';'
691</pre></td></tr>
692
693
Manuel Klimek67619ff2012-09-07 13:10:32 +0000694<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000695<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000696
697Note that if an operator isn't overloaded, it won't match. Instead, use
698binaryOperator matcher.
699Currently it does not match operators such as new delete.
700FIXME: figure out why these do not match?
701
702Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000703 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000704 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
705 ostream &amp;o; int b = 1, c = 1;
706 o &lt;&lt; b &lt;&lt; c;
707</pre></td></tr>
708
709
Daniel Jaspere0b89972012-12-04 12:08:08 +0000710<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
711<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
712
713Either the source expression or the destination type can be matched
714using has(), but hasDestinationType() is more specific and can be
715more readable.
716
717Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
718 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
719</pre></td></tr>
720
721
722<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
723<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
724
725Given
726 return 1;
727returnStmt()
728 matches 'return 1'
729</pre></td></tr>
730
731
732<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
733<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
734
735hasDestinationType
736reinterpretCast
737
738Example:
739 staticCastExpr()
740matches
741 static_cast&lt;long&gt;(8)
742in
743 long eight(static_cast&lt;long&gt;(8));
744</pre></td></tr>
745
746
Manuel Klimek67619ff2012-09-07 13:10:32 +0000747<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000748<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000749
750Given
751 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000752stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000753 matches both the compound statement '{ ++a; }' and '++a'.
754</pre></td></tr>
755
756
Daniel Jaspere0b89972012-12-04 12:08:08 +0000757<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
758<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
759
760Example matches "abcd", L"abcd"
761 char *s = "abcd"; wchar_t *ws = L"abcd"
762</pre></td></tr>
763
764
Manuel Klimek67619ff2012-09-07 13:10:32 +0000765<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000766<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
767
768Given
769 switch(a) { case 42: break; default: break; }
770switchCase()
771 matches 'case 42: break;' and 'default: break;'.
772</pre></td></tr>
773
774
Daniel Jaspere0b89972012-12-04 12:08:08 +0000775<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
776<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
777
778Given
779 switch(a) { case 42: break; default: break; }
780switchStmt()
781 matches 'switch(a)'.
782</pre></td></tr>
783
784
785<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('thisExpr0')"><a name="thisExpr0Anchor">thisExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
786<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
787
788Example matches the implicit this expression in "return i".
789 (matcher = thisExpr())
790struct foo {
791 int i;
792 int f() { return i; }
793};
794</pre></td></tr>
795
796
797<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('throwExpr0')"><a name="throwExpr0Anchor">throwExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
798<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
799
800 try { throw 5; } catch(int i) {}
801throwExpr()
802 matches 'throw 5'
803</pre></td></tr>
804
805
806<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('tryStmt0')"><a name="tryStmt0Anchor">tryStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
807<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
808
809 try {} catch(int i) {}
810tryStmt()
811 matches 'try {}'
812</pre></td></tr>
813
814
Manuel Klimek67619ff2012-09-07 13:10:32 +0000815<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000816<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
817
818Given
819 Foo x = bar;
820 int y = sizeof(x) + alignof(x);
821unaryExprOrTypeTraitExpr()
822 matches sizeof(x) and alignof(x)
823</pre></td></tr>
824
825
Manuel Klimek67619ff2012-09-07 13:10:32 +0000826<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000827<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
828
829Example matches !a
830 !a || b
831</pre></td></tr>
832
833
Daniel Jaspere0b89972012-12-04 12:08:08 +0000834<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
835<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
836
837Example match: "foo"_suffix
838</pre></td></tr>
839
840
Manuel Klimek67619ff2012-09-07 13:10:32 +0000841<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000842<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
843
844Given
845 while (true) {}
846whileStmt()
847 matches 'while (true) {}'.
848</pre></td></tr>
849
Daniel Jaspere0b89972012-12-04 12:08:08 +0000850
Manuel Klimek41df16e2013-01-09 09:38:21 +0000851<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('arrayTypeLoc0')"><a name="arrayTypeLoc0Anchor">arrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;...</td></tr>
852<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
853
854Given
855 int a[] = { 2, 3 };
856 int b[4];
857 void f() { int c[a[0]]; }
858arrayType()
859 matches "int a[]", "int b[4]" and "int c[a[0]]";
860</pre></td></tr>
861
862
863<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('atomicTypeLoc0')"><a name="atomicTypeLoc0Anchor">atomicTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>&gt;...</td></tr>
864<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
865
866Given
867 _Atomic(int) i;
868atomicType()
869 matches "_Atomic(int) i"
870</pre></td></tr>
871
872
873<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('autoTypeLoc0')"><a name="autoTypeLoc0Anchor">autoTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoTypeLoc.html">AutoTypeLoc</a>&gt;...</td></tr>
874<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
875
876Given:
877 auto n = 4;
878 int v[] = { 2, 3 }
879 for (auto i : v) { }
880autoType()
881 matches "auto n" and "auto i"
882</pre></td></tr>
883
884
885<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('blockPointerTypeLoc0')"><a name="blockPointerTypeLoc0Anchor">blockPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;...</td></tr>
886<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
887"void (^)(int)".
888
889The pointee is always required to be a FunctionType.
890</pre></td></tr>
891
892
893<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('builtinTypeLoc0')"><a name="builtinTypeLoc0Anchor">builtinTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BuiltinTypeLoc.html">BuiltinTypeLoc</a>&gt;...</td></tr>
894<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
895
896Given
897 struct A {};
898 A a;
899 int b;
900 float c;
901 bool d;
902builtinType()
903 matches "int b", "float c" and "bool d"
904</pre></td></tr>
905
906
907<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('complexTypeLoc0')"><a name="complexTypeLoc0Anchor">complexTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;...</td></tr>
908<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
909
910Given
911 _Complex float f;
912complexType()
913 matches "_Complex float f"
914</pre></td></tr>
915
916
917<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('constantArrayTypeLoc0')"><a name="constantArrayTypeLoc0Anchor">constantArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayTypeLoc.html">ConstantArrayTypeLoc</a>&gt;...</td></tr>
918<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
919
920Given
921 void() {
922 int a[2];
923 int b[] = { 2, 3 };
924 int c[b[0]];
925 }
926constantArrayType()
927 matches "int a[2]"
928</pre></td></tr>
929
930
931<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayTypeLoc0')"><a name="dependentSizedArrayTypeLoc0Anchor">dependentSizedArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayTypeLoc.html">DependentSizedArrayTypeLoc</a>&gt;...</td></tr>
932<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
933
934Given
935 template&lt;typename T, int Size&gt;
936 class array {
937 T data[Size];
938 };
939dependentSizedArrayType
940 matches "T data[Size]"
941</pre></td></tr>
942
943
Edwin Vane742d9e72013-02-25 20:43:32 +0000944<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
945<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
946qualified name.
947
948Given
949 namespace N {
950 namespace M {
951 class D {};
952 }
953 }
954 class C {};
955
956 class C c;
957 N::M::D d;
958
959elaboratedType() matches the type of the variable declarations of both
960c and d.
961</pre></td></tr>
962
963
Manuel Klimek41df16e2013-01-09 09:38:21 +0000964<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('functionTypeLoc0')"><a name="functionTypeLoc0Anchor">functionTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTypeLoc.html">FunctionTypeLoc</a>&gt;...</td></tr>
965<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
966
967Given
968 int (*f)(int);
969 void g();
970functionType()
971 matches "int (*f)(int)" and the type of "g".
972</pre></td></tr>
973
974
975<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayTypeLoc0')"><a name="incompleteArrayTypeLoc0Anchor">incompleteArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayTypeLoc.html">IncompleteArrayTypeLoc</a>&gt;...</td></tr>
976<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
977
978Given
979 int a[] = { 2, 3 };
980 int b[42];
981 void f(int c[]) { int d[a[0]]; };
982incompleteArrayType()
983 matches "int a[]" and "int c[]"
984</pre></td></tr>
985
986
Edwin Vane8203d9f2013-03-28 13:50:22 +0000987<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceTypeLoc0')"><a name="lValueReferenceTypeLoc0Anchor">lValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceTypeLoc.html">LValueReferenceTypeLoc</a>&gt;...</td></tr>
988<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +0000989
990Given:
991 int *a;
992 int &amp;b = *a;
993 int &amp;&amp;c = 1;
994 auto &amp;d = b;
995 auto &amp;&amp;e = c;
996 auto &amp;&amp;f = 2;
997 int g = 5;
998
Edwin Vane8203d9f2013-03-28 13:50:22 +0000999lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001000matched since the type is deduced as int&amp; by reference collapsing rules.
1001</pre></td></tr>
1002
1003
Manuel Klimek41df16e2013-01-09 09:38:21 +00001004<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('memberPointerTypeLoc0')"><a name="memberPointerTypeLoc0Anchor">memberPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;...</td></tr>
1005<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
1006Given
1007 struct A { int i; }
1008 A::* ptr = A::i;
1009memberPointerType()
1010 matches "A::* ptr"
1011</pre></td></tr>
1012
1013
Edwin Vane88be2fd2013-04-01 18:33:34 +00001014<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('parenTypeLoc0')"><a name="parenTypeLoc0Anchor">parenTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenTypeLoc.html">ParenTypeLoc</a>&gt;...</td></tr>
1015<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1016
1017Given
1018 int (*ptr_to_array)[4];
1019 int *array_of_ptrs[4];
1020
1021varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1022array_of_ptrs.
1023</pre></td></tr>
1024
1025
Manuel Klimek41df16e2013-01-09 09:38:21 +00001026<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
1027<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1028
1029Given
1030 int *a;
1031 int &amp;b = *a;
1032 int c = 5;
1033pointerType()
1034 matches "int *a"
1035</pre></td></tr>
1036
1037
Edwin Vane8203d9f2013-03-28 13:50:22 +00001038<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceTypeLoc0')"><a name="rValueReferenceTypeLoc0Anchor">rValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceTypeLoc.html">RValueReferenceTypeLoc</a>&gt;...</td></tr>
1039<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1040
1041Given:
1042 int *a;
1043 int &amp;b = *a;
1044 int &amp;&amp;c = 1;
1045 auto &amp;d = b;
1046 auto &amp;&amp;e = c;
1047 auto &amp;&amp;f = 2;
1048 int g = 5;
1049
1050rValueReferenceType() matches the types of c and f. e is not
1051matched as it is deduced to int&amp; by reference collapsing rules.
1052</pre></td></tr>
1053
1054
Edwin Vane742d9e72013-02-25 20:43:32 +00001055<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('recordTypeLoc0')"><a name="recordTypeLoc0Anchor">recordTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordTypeLoc.html">RecordTypeLoc</a>&gt;...</td></tr>
1056<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1057
1058Given
1059 class C {};
1060 struct S {};
1061
1062 C c;
1063 S s;
1064
1065recordType() matches the type of the variable declarations of both c
1066and s.
1067</pre></td></tr>
1068
1069
Manuel Klimek41df16e2013-01-09 09:38:21 +00001070<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
Edwin Vanef4b48042013-03-07 15:44:40 +00001071<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001072
1073Given
1074 int *a;
1075 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001076 int &amp;&amp;c = 1;
1077 auto &amp;d = b;
1078 auto &amp;&amp;e = c;
1079 auto &amp;&amp;f = 2;
1080 int g = 5;
1081
1082referenceType() matches the types of b, c, d, e, and f.
1083</pre></td></tr>
1084
1085
Edwin Vane3abf7782013-02-25 14:49:29 +00001086<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
1087<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1088
1089Given
1090 template &lt;typename T&gt;
1091 class C { };
1092
1093 template class C&lt;int&gt;; A
1094 C&lt;char&gt; var; B
1095
1096templateSpecializationType() matches the type of the explicit
1097instantiation in A and the type of the variable declaration in B.
1098</pre></td></tr>
1099
1100
Daniel Jaspere0b89972012-12-04 12:08:08 +00001101<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
1102<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1103</pre></td></tr>
1104
1105
Manuel Klimek41df16e2013-01-09 09:38:21 +00001106<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typedefTypeLoc0')"><a name="typedefTypeLoc0Anchor">typedefTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefTypeLoc.html">TypedefTypeLoc</a>&gt;...</td></tr>
1107<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1108
1109Given
1110 typedef int X;
1111typedefType()
1112 matches "typedef int X"
1113</pre></td></tr>
1114
1115
1116<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('variableArrayTypeLoc0')"><a name="variableArrayTypeLoc0Anchor">variableArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayTypeLoc.html">VariableArrayTypeLoc</a>&gt;...</td></tr>
1117<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1118integer-constant-expression.
1119
1120Given
1121 void f() {
1122 int a[] = { 2, 3 }
1123 int b[42];
1124 int c[a[0]];
1125variableArrayType()
1126 matches "int c[a[0]]"
1127</pre></td></tr>
1128
1129
1130<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
1131<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1132
1133Given
1134 int a[] = { 2, 3 };
1135 int b[4];
1136 void f() { int c[a[0]]; }
1137arrayType()
1138 matches "int a[]", "int b[4]" and "int c[a[0]]";
1139</pre></td></tr>
1140
1141
1142<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
1143<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1144
1145Given
1146 _Atomic(int) i;
1147atomicType()
1148 matches "_Atomic(int) i"
1149</pre></td></tr>
1150
1151
1152<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
1153<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1154
1155Given:
1156 auto n = 4;
1157 int v[] = { 2, 3 }
1158 for (auto i : v) { }
1159autoType()
1160 matches "auto n" and "auto i"
1161</pre></td></tr>
1162
1163
1164<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
1165<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1166"void (^)(int)".
1167
1168The pointee is always required to be a FunctionType.
1169</pre></td></tr>
1170
1171
1172<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
1173<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1174
1175Given
1176 struct A {};
1177 A a;
1178 int b;
1179 float c;
1180 bool d;
1181builtinType()
1182 matches "int b", "float c" and "bool d"
1183</pre></td></tr>
1184
1185
1186<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
1187<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1188
1189Given
1190 _Complex float f;
1191complexType()
1192 matches "_Complex float f"
1193</pre></td></tr>
1194
1195
1196<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
1197<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1198
1199Given
1200 void() {
1201 int a[2];
1202 int b[] = { 2, 3 };
1203 int c[b[0]];
1204 }
1205constantArrayType()
1206 matches "int a[2]"
1207</pre></td></tr>
1208
1209
1210<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
1211<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1212
1213Given
1214 template&lt;typename T, int Size&gt;
1215 class array {
1216 T data[Size];
1217 };
1218dependentSizedArrayType
1219 matches "T data[Size]"
1220</pre></td></tr>
1221
1222
Edwin Vane742d9e72013-02-25 20:43:32 +00001223<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
1224<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1225qualified name.
1226
1227Given
1228 namespace N {
1229 namespace M {
1230 class D {};
1231 }
1232 }
1233 class C {};
1234
1235 class C c;
1236 N::M::D d;
1237
1238elaboratedType() matches the type of the variable declarations of both
1239c and d.
1240</pre></td></tr>
1241
1242
Manuel Klimek41df16e2013-01-09 09:38:21 +00001243<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
1244<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1245
1246Given
1247 int (*f)(int);
1248 void g();
1249functionType()
1250 matches "int (*f)(int)" and the type of "g".
1251</pre></td></tr>
1252
1253
1254<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
1255<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1256
1257Given
1258 int a[] = { 2, 3 };
1259 int b[42];
1260 void f(int c[]) { int d[a[0]]; };
1261incompleteArrayType()
1262 matches "int a[]" and "int c[]"
1263</pre></td></tr>
1264
1265
Edwin Vane8203d9f2013-03-28 13:50:22 +00001266<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
1267<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001268
1269Given:
1270 int *a;
1271 int &amp;b = *a;
1272 int &amp;&amp;c = 1;
1273 auto &amp;d = b;
1274 auto &amp;&amp;e = c;
1275 auto &amp;&amp;f = 2;
1276 int g = 5;
1277
Edwin Vane8203d9f2013-03-28 13:50:22 +00001278lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001279matched since the type is deduced as int&amp; by reference collapsing rules.
1280</pre></td></tr>
1281
1282
Manuel Klimek41df16e2013-01-09 09:38:21 +00001283<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
1284<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1285Given
1286 struct A { int i; }
1287 A::* ptr = A::i;
1288memberPointerType()
1289 matches "A::* ptr"
1290</pre></td></tr>
1291
1292
Edwin Vane88be2fd2013-04-01 18:33:34 +00001293<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
1294<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1295
1296Given
1297 int (*ptr_to_array)[4];
1298 int *array_of_ptrs[4];
1299
1300varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1301array_of_ptrs.
1302</pre></td></tr>
1303
1304
Manuel Klimek41df16e2013-01-09 09:38:21 +00001305<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
1306<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1307
1308Given
1309 int *a;
1310 int &amp;b = *a;
1311 int c = 5;
1312pointerType()
1313 matches "int *a"
1314</pre></td></tr>
1315
1316
Edwin Vane8203d9f2013-03-28 13:50:22 +00001317<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
1318<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1319
1320Given:
1321 int *a;
1322 int &amp;b = *a;
1323 int &amp;&amp;c = 1;
1324 auto &amp;d = b;
1325 auto &amp;&amp;e = c;
1326 auto &amp;&amp;f = 2;
1327 int g = 5;
1328
1329rValueReferenceType() matches the types of c and f. e is not
1330matched as it is deduced to int&amp; by reference collapsing rules.
1331</pre></td></tr>
1332
1333
Edwin Vane742d9e72013-02-25 20:43:32 +00001334<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
1335<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1336
1337Given
1338 class C {};
1339 struct S {};
1340
1341 C c;
1342 S s;
1343
1344recordType() matches the type of the variable declarations of both c
1345and s.
1346</pre></td></tr>
1347
1348
Manuel Klimek41df16e2013-01-09 09:38:21 +00001349<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
Edwin Vanef4b48042013-03-07 15:44:40 +00001350<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001351
1352Given
1353 int *a;
1354 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001355 int &amp;&amp;c = 1;
1356 auto &amp;d = b;
1357 auto &amp;&amp;e = c;
1358 auto &amp;&amp;f = 2;
1359 int g = 5;
1360
1361referenceType() matches the types of b, c, d, e, and f.
1362</pre></td></tr>
1363
1364
Edwin Vane3abf7782013-02-25 14:49:29 +00001365<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
1366<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1367
1368Given
1369 template &lt;typename T&gt;
1370 class C { };
1371
1372 template class C&lt;int&gt;; A
1373 C&lt;char&gt; var; B
1374
1375templateSpecializationType() matches the type of the explicit
1376instantiation in A and the type of the variable declaration in B.
1377</pre></td></tr>
1378
1379
Daniel Jaspere0b89972012-12-04 12:08:08 +00001380<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
1381<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1382</pre></td></tr>
1383
Manuel Klimek41df16e2013-01-09 09:38:21 +00001384
1385<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
1386<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1387
1388Given
1389 typedef int X;
1390typedefType()
1391 matches "typedef int X"
1392</pre></td></tr>
1393
1394
1395<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
1396<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1397integer-constant-expression.
1398
1399Given
1400 void f() {
1401 int a[] = { 2, 3 }
1402 int b[42];
1403 int c[a[0]];
1404variableArrayType()
1405 matches "int c[a[0]]"
1406</pre></td></tr>
1407
Manuel Klimek1da79332012-08-20 20:54:03 +00001408<!--END_DECL_MATCHERS -->
1409</table>
1410
1411<!-- ======================================================================= -->
1412<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1413<!-- ======================================================================= -->
1414
1415<p>Narrowing matchers match certain attributes on the current node, thus
1416narrowing down the set of nodes of the current type to match on.</p>
1417
1418<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1419which allow users to create more powerful match expressions.</p>
1420
1421<table>
1422<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1423<!-- START_NARROWING_MATCHERS -->
1424
Manuel Klimek67619ff2012-09-07 13:10:32 +00001425<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001426<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1427
1428Usable as: Any Matcher
1429</pre></td></tr>
1430
1431
Manuel Klimek67619ff2012-09-07 13:10:32 +00001432<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt; P1, Matcher&lt;*&gt; P2</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001433<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1434
1435Usable as: Any Matcher
1436</pre></td></tr>
1437
1438
Manuel Klimek67619ff2012-09-07 13:10:32 +00001439<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001440<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1441
1442Useful when another matcher requires a child matcher, but there's no
1443additional constraint. This will often be used with an explicit conversion
1444to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1445
1446Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1447"int* p" and "void f()" in
1448 int* p;
1449 void f();
1450
1451Usable as: Any Matcher
1452</pre></td></tr>
1453
1454
Manuel Klimek67619ff2012-09-07 13:10:32 +00001455<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt; InnerMatcher</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001456<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1457
Manuel Klimeke44a0062012-08-26 23:55:24 +00001458Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001459 class X {};
1460 class Y {};
1461
1462Usable as: Any Matcher
1463</pre></td></tr>
1464
1465
Manuel Klimek67619ff2012-09-07 13:10:32 +00001466<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001467<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1468unary).
1469
1470Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1471 !(a || b)
1472</pre></td></tr>
1473
1474
Manuel Klimek67619ff2012-09-07 13:10:32 +00001475<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001476<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1477
1478Example matches true (matcher = boolLiteral(equals(true)))
1479 true
1480
1481Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1482 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1483</pre></td></tr>
1484
1485
Manuel Klimek67619ff2012-09-07 13:10:32 +00001486<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001487<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1488by the compiler (eg. implicit defaultcopy constructors).
1489</pre></td></tr>
1490
1491
Manuel Klimek67619ff2012-09-07 13:10:32 +00001492<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001493<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1494code (as opposed to implicitly added by the compiler).
1495
1496Given
1497 struct Foo {
1498 Foo() { }
1499 Foo(int) : foo_("A") { }
1500 string foo_;
1501 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001502constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001503 will match Foo(int), but not Foo()
1504</pre></td></tr>
1505
1506
Edwin Vane6a19a972013-03-06 17:02:57 +00001507<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001508<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1509
1510Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001511"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001512
Edwin Vane6a19a972013-03-06 17:02:57 +00001513Given:
1514 class A { int operator*(); };
1515 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1516 A a;
1517 a &lt;&lt; a; &lt;-- This matches
1518
1519operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1520line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1521the declaration of A.
1522
1523Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;
1524</pre></td></tr>
1525
1526
Edwin Vane32a6ebc2013-05-09 17:00:17 +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('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
1528<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1529
1530Given
1531struct A {
1532 void foo() const;
1533 void bar();
1534};
1535
1536methodDecl(isConst()) matches A::foo() but not A::bar()
1537</pre></td></tr>
1538
1539
Edwin Vane5771a2f2013-04-09 20:46:36 +00001540<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>
1541<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1542
1543Given
1544 class A {
1545 public:
1546 virtual void x();
1547 };
1548 class B : public A {
1549 public:
1550 virtual void x();
1551 };
1552 matches B::x
1553</pre></td></tr>
1554
1555
1556<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>
1557<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1558
1559Given
1560 class A {
1561 public:
1562 virtual void x();
1563 };
1564 matches A::x
1565</pre></td></tr>
1566
1567
Edwin Vane6a19a972013-03-06 17:02:57 +00001568<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>
1569<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1570
1571Matches overloaded operator names specified in strings without the
1572"operator" prefix: e.g. "&lt;&lt;".
1573
1574Given:
1575 class A { int operator*(); };
1576 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1577 A a;
1578 a &lt;&lt; a; &lt;-- This matches
1579
1580operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1581line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1582the declaration of A.
1583
1584Usable 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 +00001585</pre></td></tr>
1586
1587
Manuel Klimek67619ff2012-09-07 13:10:32 +00001588<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 +00001589<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1590</pre></td></tr>
1591
1592
Manuel Klimek415514d2013-02-06 20:36:22 +00001593<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>
1594<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001595static member variable template instantiations.
1596
1597Given
1598 template&lt;typename T&gt; void A(T t) { }
1599 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001600functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001601 matches the specialization A&lt;int&gt;().
1602
1603Usable 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;
1604</pre></td></tr>
1605
1606
Daniel Jaspere0b89972012-12-04 12:08:08 +00001607<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>
1608<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1609isSameOrDerivedFrom(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('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
1614<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001615member variable template instantiations.
1616
1617Given
1618 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1619or
1620 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001621recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001622 matches the template instantiation of X&lt;A&gt;.
1623
1624But given
1625 template &lt;typename T&gt; class X {}; class A {};
1626 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001627recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001628 does not match, as X&lt;A&gt; is an explicit template specialization.
1629
1630Usable 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;
1631</pre></td></tr>
1632
1633
Manuel Klimek67619ff2012-09-07 13:10:32 +00001634<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 +00001635<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1636a specific number of arguments (including absent default arguments).
1637
Manuel Klimeke44a0062012-08-26 23:55:24 +00001638Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001639 void f(int x, int y);
1640 f(0, 0);
1641</pre></td></tr>
1642
1643
Manuel Klimek67619ff2012-09-07 13:10:32 +00001644<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 +00001645<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1646
1647Example matches true (matcher = boolLiteral(equals(true)))
1648 true
1649
1650Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1651 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;
1652</pre></td></tr>
1653
1654
Manuel Klimek67619ff2012-09-07 13:10:32 +00001655<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 +00001656<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1657child statements.
1658
1659Example: Given
1660 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001661compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001662 matches '{}'
1663 but does not match the outer compound statement.
1664</pre></td></tr>
1665
1666
Daniel Jaspere0b89972012-12-04 12:08:08 +00001667<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>
1668<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1669
1670Given
1671 int a[42];
1672 int b[2 * 21];
1673 int c[41], d[43];
1674constantArrayType(hasSize(42))
1675 matches "int a[42]" and "int b[2 * 21]"
1676</pre></td></tr>
1677
1678
Manuel Klimek67619ff2012-09-07 13:10:32 +00001679<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 +00001680<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1681declarations.
1682
1683Example: Given
1684 int a, b;
1685 int c;
1686 int d = 2, e;
1687declCountIs(2)
1688 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1689</pre></td></tr>
1690
1691
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001692<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>
1693<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1694
1695Decl has pointer identity in the AST.
1696</pre></td></tr>
1697
1698
Daniel Jasperc7093d92013-02-25 12:39:41 +00001699<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>
1700<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1701
1702Given
1703 class C {
1704 public: int a;
1705 protected: int b;
1706 private: int c;
1707 };
1708fieldDecl(isPrivate())
1709 matches 'int c;'
1710</pre></td></tr>
1711
1712
1713<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>
1714<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1715
1716Given
1717 class C {
1718 public: int a;
1719 protected: int b;
1720 private: int c;
1721 };
1722fieldDecl(isProtected())
1723 matches 'int b;'
1724</pre></td></tr>
1725
1726
1727<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>
1728<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1729
1730Given
1731 class C {
1732 public: int a;
1733 protected: int b;
1734 private: int c;
1735 };
1736fieldDecl(isPublic())
1737 matches 'int a;'
1738</pre></td></tr>
1739
1740
Manuel Klimek67619ff2012-09-07 13:10:32 +00001741<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 +00001742<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1743
1744Example matches true (matcher = boolLiteral(equals(true)))
1745 true
1746
1747Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1748 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;
1749</pre></td></tr>
1750
1751
Manuel Klimek415514d2013-02-06 20:36:22 +00001752<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>
1753<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001754
1755Example matches A, va, fa
1756 class A {};
1757 class B; Doesn't match, as it has no body.
1758 int va;
1759 extern int vb; Doesn't match, as it doesn't define the variable.
1760 void fa() {}
1761 void fb(); Doesn't match, as it has no body.
1762
1763Usable 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;
1764</pre></td></tr>
1765
1766
Manuel Klimek415514d2013-02-06 20:36:22 +00001767<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>
1768<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001769static member variable template instantiations.
1770
1771Given
1772 template&lt;typename T&gt; void A(T t) { }
1773 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001774functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001775 matches the specialization A&lt;int&gt;().
1776
1777Usable 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;
1778</pre></td></tr>
1779
1780
Manuel Klimek67619ff2012-09-07 13:10:32 +00001781<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 +00001782<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1783
1784Given:
1785 extern "C" void f() {}
1786 extern "C" { void g() {} }
1787 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001788functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001789 matches the declaration of f and g, but not the declaration h
1790</pre></td></tr>
1791
1792
Manuel Klimek415514d2013-02-06 20:36:22 +00001793<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
1794<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001795member variable template instantiations.
1796
1797Given
1798 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1799or
1800 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001801recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001802 matches the template instantiation of X&lt;A&gt;.
1803
1804But given
1805 template &lt;typename T&gt; class X {}; class A {};
1806 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001807recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001808 does not match, as X&lt;A&gt; is an explicit template specialization.
1809
1810Usable 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;
1811</pre></td></tr>
1812
1813
Daniel Jaspere0b89972012-12-04 12:08:08 +00001814<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>
1815<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1816
1817Given
1818 void f(int i) {}
1819 void g(int i, int j) {}
1820functionDecl(parameterCountIs(2))
1821 matches g(int i, int j) {}
1822</pre></td></tr>
1823
1824
Manuel Klimek67619ff2012-09-07 13:10:32 +00001825<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 +00001826<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1827
1828Example matches true (matcher = boolLiteral(equals(true)))
1829 true
1830
1831Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1832 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;
1833</pre></td></tr>
1834
1835
Manuel Klimek67619ff2012-09-07 13:10:32 +00001836<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 +00001837<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1838to '.'.
1839
1840Member calls on the implicit this pointer match as called with '-&gt;'.
1841
1842Given
1843 class Y {
1844 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1845 int a;
1846 static int b;
1847 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001848memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001849 matches this-&gt;x, x, y.x, a, this-&gt;b
1850</pre></td></tr>
1851
1852
Manuel Klimek67619ff2012-09-07 13:10:32 +00001853<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 +00001854<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1855
1856Supports specifying enclosing namespaces or classes by prefixing the name
1857with '&lt;enclosing&gt;::'.
1858Does not match typedefs of an underlying type with the given name.
1859
1860Example matches X (Name == "X")
1861 class X;
1862
1863Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1864 namespace a { namespace b { class X; } }
1865</pre></td></tr>
1866
1867
Manuel Klimek67619ff2012-09-07 13:10:32 +00001868<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001869<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1870a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001871
1872Supports specifying enclosing namespaces or classes by
1873prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1874of an underlying type with the given name.
1875
1876Example matches X (regexp == "::X")
1877 class X;
1878
1879Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1880 namespace foo { namespace bar { class X; } }
1881</pre></td></tr>
1882
1883
Manuel Klimek67619ff2012-09-07 13:10:32 +00001884<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 +00001885<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1886
1887Given
1888 class Y { public: void x(); };
1889 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001890callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001891 matches y-&gt;x()
1892</pre></td></tr>
1893
1894
Edwin Vane7b69cd02013-04-02 18:15:55 +00001895<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>
1896<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1897the node, not hidden within a typedef.
1898
1899Given
1900 typedef const int const_int;
1901 const_int i;
1902 int *const j;
1903 int *volatile k;
1904 int m;
1905varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1906i is const-qualified but the qualifier is not local.
1907</pre></td></tr>
1908
1909
Manuel Klimek67619ff2012-09-07 13:10:32 +00001910<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 +00001911<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1912include "top-level" const.
1913
1914Given
1915 void a(int);
1916 void b(int const);
1917 void c(const int);
1918 void d(const int*);
1919 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001920functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001921 matches "void b(int const)", "void c(const int)" and
1922 "void e(int const) {}". It does not match d as there
1923 is no top-level const on the parameter type "const int *".
1924</pre></td></tr>
1925
1926
Manuel Klimek67619ff2012-09-07 13:10:32 +00001927<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 +00001928<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1929
1930Given
1931 void a(int);
1932 void b(long);
1933 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001934functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001935matches "a(int)", "b(long)", but not "c(double)".
1936</pre></td></tr>
1937
1938
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001939<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>
1940<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1941
1942Stmt has pointer identity in the AST.
1943
1944</pre></td></tr>
1945
1946
Manuel Klimek415514d2013-02-06 20:36:22 +00001947<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>
1948<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001949
1950Example matches A, va, fa
1951 class A {};
1952 class B; Doesn't match, as it has no body.
1953 int va;
1954 extern int vb; Doesn't match, as it doesn't define the variable.
1955 void fa() {}
1956 void fb(); Doesn't match, as it has no body.
1957
1958Usable 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;
1959</pre></td></tr>
1960
1961
Manuel Klimek67619ff2012-09-07 13:10:32 +00001962<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 +00001963<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1964
1965Given
1966 int x;
1967 int s = sizeof(x) + alignof(x)
1968unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1969 matches sizeof(x)
1970</pre></td></tr>
1971
1972
Manuel Klimek67619ff2012-09-07 13:10:32 +00001973<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 +00001974<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1975unary).
1976
1977Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1978 !(a || b)
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_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 +00001983<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
1984
1985Example matches A, va, fa
1986 class A {};
1987 class B; Doesn't match, as it has no body.
1988 int va;
1989 extern int vb; Doesn't match, as it doesn't define the variable.
1990 void fa() {}
1991 void fb(); Doesn't match, as it has no body.
1992
1993Usable 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;
1994</pre></td></tr>
1995
1996
Manuel Klimek67619ff2012-09-07 13:10:32 +00001997<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 +00001998<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
1999static member variable template instantiations.
2000
2001Given
2002 template&lt;typename T&gt; void A(T t) { }
2003 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002004functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002005 matches the specialization A&lt;int&gt;().
2006
2007Usable 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;
2008</pre></td></tr>
2009
2010
Manuel Klimek67619ff2012-09-07 13:10:32 +00002011<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 +00002012<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2013member variable template instantiations.
2014
2015Given
2016 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2017or
2018 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002019recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002020 matches the template instantiation of X&lt;A&gt;.
2021
2022But given
2023 template &lt;typename T&gt; class X {}; class A {};
2024 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002025recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002026 does not match, as X&lt;A&gt; is an explicit template specialization.
2027
2028Usable 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;
2029</pre></td></tr>
2030
2031<!--END_NARROWING_MATCHERS -->
2032</table>
2033
2034<!-- ======================================================================= -->
2035<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2036<!-- ======================================================================= -->
2037
2038<p>Traversal matchers specify the relationship to other nodes that are
2039reachable from the current node.</p>
2040
2041<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2042forEachDescendant) which work on all nodes and allow users to write more generic
2043match expressions.</p>
2044
2045<table>
2046<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2047<!-- START_TRAVERSAL_MATCHERS -->
2048
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002049<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>
2050<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2051
2052Unlike anyOf, eachOf will generate a match result for each
2053matching submatcher.
2054
2055For example, in:
2056 class A { int a; int b; };
2057The matcher:
2058 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2059 has(fieldDecl(hasName("b")).bind("v"))))
2060will generate two results binding "v", the first of which binds
2061the field declaration of a, the second the field declaration of
2062b.
2063
2064Usable as: Any Matcher
2065</pre></td></tr>
2066
2067
2068<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>
2069<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2070
2071Generates results for each match.
2072
2073For example, in:
2074 class A { class B {}; class C {}; };
2075The matcher:
2076 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2077will generate results for A, B and C.
2078
2079Usable as: Any Matcher
2080</pre></td></tr>
2081
2082
Manuel Klimek67619ff2012-09-07 13:10:32 +00002083<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 +00002084<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2085provided matcher.
2086
Manuel Klimeke44a0062012-08-26 23:55:24 +00002087Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002088 class X {}; Matches X, because X::X is a class of name X inside X.
2089 class Y { class X {}; };
2090 class Z { class Y { class X {}; }; }; Does not match Z.
2091
2092ChildT must be an AST base type.
2093
2094As opposed to 'has', 'forEach' will cause a match for each result that
2095matches instead of only on the first one.
2096
2097Usable as: Any Matcher
2098</pre></td></tr>
2099
2100
Manuel Klimek67619ff2012-09-07 13:10:32 +00002101<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 +00002102<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2103provided matcher.
2104
2105Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002106 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002107 class X {}; Matches X, because X::X is a class of name X inside X.
2108 class A { class X {}; };
2109 class B { class C { class X {}; }; };
2110
2111DescendantT must be an AST base type.
2112
2113As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2114each result that matches instead of only on the first one.
2115
2116Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002117 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002118will match 10 times (plus injected class name matches) on:
2119 class A { class B { class C { class D { class E {}; }; }; }; };
2120
2121Usable as: Any Matcher
2122</pre></td></tr>
2123
2124
Manuel Klimek67619ff2012-09-07 13:10:32 +00002125<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 +00002126<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2127provided matcher.
2128
Manuel Klimeke44a0062012-08-26 23:55:24 +00002129Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002130 class X {}; Matches X, because X::X is a class of name X inside X.
2131 class Y { class X {}; };
2132 class Z { class Y { class X {}; }; }; Does not match Z.
2133
2134ChildT must be an AST base type.
2135
2136Usable as: Any Matcher
2137</pre></td></tr>
2138
2139
Manuel Klimek67619ff2012-09-07 13:10:32 +00002140<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>
2141<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2142matcher.
2143
2144Given
2145void f() { if (true) { int x = 42; } }
2146void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002147expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002148
2149Usable as: Any Matcher
2150</pre></td></tr>
2151
2152
2153<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 +00002154<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2155provided matcher.
2156
2157Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002158 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002159 class X {}; Matches X, because X::X is a class of name X inside X.
2160 class Y { class X {}; };
2161 class Z { class Y { class X {}; }; };
2162
2163DescendantT must be an AST base type.
2164
2165Usable as: Any Matcher
2166</pre></td></tr>
2167
2168
Daniel Jaspere0b89972012-12-04 12:08:08 +00002169<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>
2170<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2171matcher.
2172
2173Given
2174void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2175compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2176
2177Usable as: Any Matcher
2178</pre></td></tr>
2179
2180
Manuel Klimek67619ff2012-09-07 13:10:32 +00002181<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 +00002182<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2183
2184Given
2185 int i[5];
2186 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002187arraySubscriptExpression(hasBase(implicitCastExpr(
2188 hasSourceExpression(declRefExpr()))))
2189 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002190</pre></td></tr>
2191
2192
Manuel Klimek67619ff2012-09-07 13:10:32 +00002193<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 +00002194<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2195
2196Given
2197 int i[5];
2198 void f() { i[1] = 42; }
2199arraySubscriptExpression(hasIndex(integerLiteral()))
2200 matches i[1] with the integerLiteral() matching 1
2201</pre></td></tr>
2202
2203
Manuel Klimek41df16e2013-01-09 09:38:21 +00002204<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>
2205<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2206type.
2207
2208Given
2209 struct A {};
2210 A a[7];
2211 int b[7];
2212arrayType(hasElementType(builtinType()))
2213 matches "int b[7]"
2214
2215Usable 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;
2216</pre></td></tr>
2217
2218
2219<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>
2220<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2221type.
2222
2223Given
2224 struct A {};
2225 A a[7];
2226 int b[7];
2227arrayType(hasElementType(builtinType()))
2228 matches "int b[7]"
2229
2230Usable 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;
2231</pre></td></tr>
2232
2233
2234<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>
2235<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2236
2237Given
2238 _Atomic(int) i;
2239 _Atomic(float) f;
2240atomicType(hasValueType(isInteger()))
2241 matches "_Atomic(int) i"
2242
2243Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2244</pre></td></tr>
2245
2246
2247<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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>
2248<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2249
2250Given
2251 _Atomic(int) i;
2252 _Atomic(float) f;
2253atomicType(hasValueType(isInteger()))
2254 matches "_Atomic(int) i"
2255
2256Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2257</pre></td></tr>
2258
2259
2260<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>
2261<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2262
2263Note: There is no TypeLoc for the deduced type and thus no
2264getDeducedLoc() matcher.
2265
2266Given
2267 auto a = 1;
2268 auto b = 2.0;
2269autoType(hasDeducedType(isInteger()))
2270 matches "auto a"
2271
2272Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2273</pre></td></tr>
2274
2275
Manuel Klimek67619ff2012-09-07 13:10:32 +00002276<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 +00002277<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2278binary operator matches.
2279</pre></td></tr>
2280
2281
Manuel Klimek67619ff2012-09-07 13:10:32 +00002282<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 +00002283<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2284
2285Example matches a (matcher = binaryOperator(hasLHS()))
2286 a || b
2287</pre></td></tr>
2288
2289
Manuel Klimek67619ff2012-09-07 13:10:32 +00002290<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 +00002291<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2292
2293Example matches b (matcher = binaryOperator(hasRHS()))
2294 a || b
2295</pre></td></tr>
2296
2297
Manuel Klimek41df16e2013-01-09 09:38:21 +00002298<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>
2299<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
2300pointee matches a given matcher.
2301
2302Given
2303 int *a;
2304 int const *b;
2305 float const *f;
2306pointerType(pointee(isConstQualified(), isInteger()))
2307 matches "int const *b"
2308
2309Usable 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;,
2310 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;
2311</pre></td></tr>
2312
2313
2314<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>
2315<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
2316pointee matches a given matcher.
2317
2318Given
2319 int *a;
2320 int const *b;
2321 float const *f;
2322pointerType(pointee(isConstQualified(), isInteger()))
2323 matches "int const *b"
2324
2325Usable 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;,
2326 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;
2327</pre></td></tr>
2328
2329
Edwin Vane3abf7782013-02-25 14:49:29 +00002330<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>
2331<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00002332matcher.
2333
Edwin Vane52380602013-02-19 17:14:34 +00002334In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2335Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2336subtypes of clang::Type.
2337
Daniel Jaspere0b89972012-12-04 12:08:08 +00002338Usable 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 +00002339 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;,
2340 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002341</pre></td></tr>
2342
2343
Manuel Klimek67619ff2012-09-07 13:10:32 +00002344<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002345<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2346
2347Given
2348 struct Foo {
2349 Foo() : foo_(1) { }
2350 int foo_;
2351 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002352recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002353 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2354</pre></td></tr>
2355
2356
Manuel Klimek67619ff2012-09-07 13:10:32 +00002357<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 +00002358<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2359
2360Given
2361 struct Foo {
2362 Foo() : foo_(1) { }
2363 int foo_;
2364 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002365recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002366 forField(hasName("foo_"))))))
2367 matches Foo
2368with forField matching foo_
2369</pre></td></tr>
2370
2371
Manuel Klimek67619ff2012-09-07 13:10:32 +00002372<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 +00002373<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2374
2375Given
2376 struct Foo {
2377 Foo() : foo_(1) { }
2378 int foo_;
2379 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002380recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002381 withInitializer(integerLiteral(equals(1)))))))
2382 matches Foo
2383with withInitializer matching (1)
2384</pre></td></tr>
2385
2386
Manuel Klimek67619ff2012-09-07 13:10:32 +00002387<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002388<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2389
Manuel Klimeke44a0062012-08-26 23:55:24 +00002390Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002391 class Y { public: void x(); };
2392 void z() { Y y; y.x(); }",
2393
2394FIXME: Overload to allow directly matching types?
2395</pre></td></tr>
2396
2397
Manuel Klimek67619ff2012-09-07 13:10:32 +00002398<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 +00002399<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2400
2401
Manuel Klimek67619ff2012-09-07 13:10:32 +00002402<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 +00002403<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2404</pre></td></tr>
2405
2406
Manuel Klimek67619ff2012-09-07 13:10:32 +00002407<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 +00002408<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2409belongs to.
2410
2411FIXME: Generalize this for other kinds of declarations.
2412FIXME: What other kind of declarations would we need to generalize
2413this to?
2414
2415Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002416 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002417 ofClass(hasName("A"))))))
2418 class A {
2419 public:
2420 A();
2421 };
2422 A a = A();
2423</pre></td></tr>
2424
2425
Edwin Vane6a19a972013-03-06 17:02:57 +00002426<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>
2427<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2428
2429Given:
2430 class A { void func(); };
2431 class B { void member(); };
2432
2433recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2434but not B.
2435</pre></td></tr>
2436
2437
Manuel Klimek67619ff2012-09-07 13:10:32 +00002438<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 +00002439<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2440a class matching Base.
2441
Manuel Klimek67619ff2012-09-07 13:10:32 +00002442Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002443
Manuel Klimek67619ff2012-09-07 13:10:32 +00002444Example matches Y, Z, C (Base == hasName("X"))
2445 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002446 class Y : public X {}; directly derived
2447 class Z : public Y {}; indirectly derived
2448 typedef X A;
2449 typedef A B;
2450 class C : public B {}; derived from a typedef of X
2451
2452In the following example, Bar matches isDerivedFrom(hasName("X")):
2453 class Foo;
2454 typedef Foo X;
2455 class Bar : public Foo {}; derived from a type that X is a typedef of
2456</pre></td></tr>
2457
2458
Daniel Jaspere0b89972012-12-04 12:08:08 +00002459<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>
2460<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2461match Base.
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_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 +00002466<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2467given matcher.
2468
Manuel Klimeke44a0062012-08-26 23:55:24 +00002469Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002470 class Y { public: void x(); };
2471 void z() { Y y; y.x();
2472</pre></td></tr>
2473
2474
Manuel Klimek67619ff2012-09-07 13:10:32 +00002475<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('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 +00002476<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2477expression.
2478
2479Given
2480 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002481callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002482 matches x(1, y, 42)
2483with hasAnyArgument(...)
2484 matching y
2485</pre></td></tr>
2486
2487
Manuel Klimek67619ff2012-09-07 13:10:32 +00002488<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 +00002489<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2490call expression.
2491
2492Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002493 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002494 void x(int) { int y; x(y); }
2495</pre></td></tr>
2496
2497
Edwin Vane3abf7782013-02-25 14:49:29 +00002498<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>
2499<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00002500matcher.
2501
Edwin Vane52380602013-02-19 17:14:34 +00002502In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2503Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2504subtypes of clang::Type.
2505
Daniel Jaspere0b89972012-12-04 12:08:08 +00002506Usable 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 +00002507 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;,
2508 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002509</pre></td></tr>
2510
2511
Manuel Klimek67619ff2012-09-07 13:10:32 +00002512<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 +00002513<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2514
2515Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002516 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002517class URL { URL(string); };
2518URL url = "a string";
2519</pre></td></tr>
2520
2521
Manuel Klimek67619ff2012-09-07 13:10:32 +00002522<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 +00002523<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2524TemplateArgument matching the given InnerMatcher.
2525
2526Given
2527 template&lt;typename T&gt; class A {};
2528 template&lt;&gt; class A&lt;double&gt; {};
2529 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002530classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002531 refersToType(asString("int"))))
2532 matches the specialization A&lt;int&gt;
2533</pre></td></tr>
2534
2535
Manuel Klimek67619ff2012-09-07 13:10:32 +00002536<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 +00002537<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2538matches the given InnerMatcher.
2539
2540Given
2541 template&lt;typename T, typename U&gt; class A {};
2542 A&lt;bool, int&gt; b;
2543 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002544classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002545 1, refersToType(asString("int"))))
2546 matches the specialization A&lt;bool, int&gt;
2547</pre></td></tr>
2548
2549
Manuel Klimek41df16e2013-01-09 09:38:21 +00002550<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>
2551<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2552type.
2553
2554Given
2555 struct A {};
2556 A a[7];
2557 int b[7];
2558arrayType(hasElementType(builtinType()))
2559 matches "int b[7]"
2560
2561Usable 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;
2562</pre></td></tr>
2563
2564
2565<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>
2566<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2567type.
2568
2569Given
2570 struct A {};
2571 A a[7];
2572 int b[7];
2573arrayType(hasElementType(builtinType()))
2574 matches "int b[7]"
2575
2576Usable 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;
2577</pre></td></tr>
2578
2579
Manuel Klimek67619ff2012-09-07 13:10:32 +00002580<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002581<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2582a given matcher.
2583
2584Given
2585 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002586hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002587 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002588with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002589 matching '{}'
2590</pre></td></tr>
2591
2592
Manuel Klimek67619ff2012-09-07 13:10:32 +00002593<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002594<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2595or conditional operator.
2596
2597Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2598 if (true) {}
2599</pre></td></tr>
2600
2601
Manuel Klimek67619ff2012-09-07 13:10:32 +00002602<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 +00002603<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2604
2605Example matches b
2606 condition ? a : b
2607</pre></td></tr>
2608
2609
Manuel Klimek67619ff2012-09-07 13:10:32 +00002610<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 +00002611<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2612
2613Example matches a
2614 condition ? a : b
2615</pre></td></tr>
2616
2617
Manuel Klimek67619ff2012-09-07 13:10:32 +00002618<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 +00002619<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2620specific using shadow declaration.
2621
2622FIXME: This currently only works for functions. Fix.
2623
2624Given
2625 namespace a { void f() {} }
2626 using a::f;
2627 void g() {
2628 f(); Matches this ..
2629 a::f(); .. but not this.
2630 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002631declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002632 matches f()
2633</pre></td></tr>
2634
2635
Manuel Klimek67619ff2012-09-07 13:10:32 +00002636<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002637<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2638specified matcher.
2639
2640Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002641 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002642 bool x;
2643 if (x) {}
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_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 +00002648<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2649
2650Note that this does not work for global declarations because the AST
2651breaks up multiple-declaration DeclStmt's into multiple single-declaration
2652DeclStmt's.
2653Example: Given non-global declarations
2654 int a, b = 0;
2655 int c;
2656 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002657declStmt(containsDeclaration(
2658 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002659 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002660declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002661 matches 'int a, b = 0' as well as 'int d = 2, e;'
2662 but 'int c;' is not matched.
2663</pre></td></tr>
2664
2665
Manuel Klimek67619ff2012-09-07 13:10:32 +00002666<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 +00002667<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2668
2669Given
2670 int a, b;
2671 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002672declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002673 matches 'int c;' but not 'int a, b;'.
2674</pre></td></tr>
2675
2676
Edwin Vane742d9e72013-02-25 20:43:32 +00002677<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>
2678<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2679Decl, matches InnerMatcher.
2680
2681Given
2682 namespace N {
2683 namespace M {
2684 class D {};
2685 }
2686 }
2687
2688recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2689declaration of class D.
2690</pre></td></tr>
2691
2692
Manuel Klimek67619ff2012-09-07 13:10:32 +00002693<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('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 +00002694<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2695a given body.
2696
2697Given
2698 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002699hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002700 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002701with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002702 matching '{}'
2703</pre></td></tr>
2704
2705
Manuel Klimek67619ff2012-09-07 13:10:32 +00002706<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002707<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2708or conditional operator.
2709
2710Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2711 if (true) {}
2712</pre></td></tr>
2713
2714
Edwin Vane742d9e72013-02-25 20:43:32 +00002715<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>
2716<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002717matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002718
2719Given
2720 namespace N {
2721 namespace M {
2722 class D {};
2723 }
2724 }
2725 N::M::D d;
2726
2727elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2728matches the type of the variable declaration of d.
2729</pre></td></tr>
2730
2731
2732<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>
2733<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2734
2735Given
2736 namespace N {
2737 namespace M {
2738 class D {};
2739 }
2740 }
2741 N::M::D d;
2742
2743elaboratedType(namesType(recordType(
2744hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2745declaration of d.
2746</pre></td></tr>
2747
2748
Manuel Klimek67619ff2012-09-07 13:10:32 +00002749<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 +00002750<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2751
2752(Note: Clang's AST refers to other conversions as "casts" too, and calls
2753actual casts "explicit" casts.)
2754</pre></td></tr>
2755
2756
Manuel Klimek67619ff2012-09-07 13:10:32 +00002757<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 +00002758<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2759declaration's type.
2760
2761In case of a value declaration (for example a variable declaration),
2762this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002763declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2764while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002765of x."
2766
Manuel Klimeke44a0062012-08-26 23:55:24 +00002767Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2768 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002769 class X {};
2770 void y(X &amp;x) { x; X z; }
2771
2772Usable 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;
2773</pre></td></tr>
2774
2775
Manuel Klimek67619ff2012-09-07 13:10:32 +00002776<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 +00002777<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2778are stripped off.
2779
2780Parentheses and explicit casts are not discarded.
2781Given
2782 int arr[5];
2783 int a = 0;
2784 char b = 0;
2785 const int c = a;
2786 int *d = arr;
2787 long e = (long) 0l;
2788The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002789 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2790 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002791would match the declarations for a, b, c, and d, but not e.
2792While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002793 varDecl(hasInitializer(integerLiteral()))
2794 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002795only match the declarations for b, c, and d.
2796</pre></td></tr>
2797
2798
Manuel Klimek67619ff2012-09-07 13:10:32 +00002799<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 +00002800<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2801casts are stripped off.
2802
2803Implicit and non-C Style casts are also discarded.
2804Given
2805 int a = 0;
2806 char b = (0);
2807 void* c = reinterpret_cast&lt;char*&gt;(0);
2808 char d = char(0);
2809The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002810 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002811would match the declarations for a, b, c, and d.
2812while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002813 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002814only match the declaration for a.
2815</pre></td></tr>
2816
2817
Manuel Klimek67619ff2012-09-07 13:10:32 +00002818<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 +00002819<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2820parentheses are stripped off.
2821
2822Explicit casts are not discarded.
2823Given
2824 int arr[5];
2825 int a = 0;
2826 char b = (0);
2827 const int c = a;
2828 int *d = (arr);
2829 long e = ((long) 0l);
2830The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002831 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2832 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002833would match the declarations for a, b, c, and d, but not e.
2834while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002835 varDecl(hasInitializer(integerLiteral()))
2836 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002837would only match the declaration for a.
2838</pre></td></tr>
2839
2840
Manuel Klimek67619ff2012-09-07 13:10:32 +00002841<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('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 +00002842<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2843a given body.
2844
2845Given
2846 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002847hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002848 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002849with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002850 matching '{}'
2851</pre></td></tr>
2852
2853
Manuel Klimek67619ff2012-09-07 13:10:32 +00002854<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 +00002855<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2856or conditional operator.
2857
2858Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2859 if (true) {}
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_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 +00002864<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2865
2866Example:
2867 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2868matches '++x' in
2869 for (x; x &lt; N; ++x) { }
2870</pre></td></tr>
2871
2872
Manuel Klimek67619ff2012-09-07 13:10:32 +00002873<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 +00002874<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2875
2876Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002877 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002878matches 'int x = 0' in
2879 for (int x = 0; x &lt; N; ++x) { }
2880</pre></td></tr>
2881
2882
Manuel Klimek67619ff2012-09-07 13:10:32 +00002883<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 +00002884<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2885
2886Does not match the 'this' parameter of a method.
2887
2888Given
2889 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002890methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002891 matches f(int x, int y, int z) {}
2892with hasAnyParameter(...)
2893 matching int y
2894</pre></td></tr>
2895
2896
Manuel Klimek67619ff2012-09-07 13:10:32 +00002897<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 +00002898<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2899
2900Given
2901 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002902methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002903 matches f(int x) {}
2904with hasParameter(...)
2905 matching int x
2906</pre></td></tr>
2907
2908
Manuel Klimek67619ff2012-09-07 13:10:32 +00002909<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 +00002910<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2911
2912Given:
2913 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002914methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002915 matches int f() { return 1; }
2916</pre></td></tr>
2917
2918
Manuel Klimek67619ff2012-09-07 13:10:32 +00002919<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 +00002920<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
2921or conditional operator.
2922
2923Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2924 if (true) {}
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_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 +00002929<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
2930
2931Given
2932 if (A* a = GetAPointer()) {}
2933hasConditionVariableStatment(...)
2934 matches 'A* a = GetAPointer()'.
2935</pre></td></tr>
2936
2937
Manuel Klimek67619ff2012-09-07 13:10:32 +00002938<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 +00002939<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
2940matcher.
2941
2942FIXME: Unit test this matcher
2943</pre></td></tr>
2944
2945
Edwin Vane3abf7782013-02-25 14:49:29 +00002946<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>
2947<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if the declaration of the type matches the given
Daniel Jaspere0b89972012-12-04 12:08:08 +00002948matcher.
2949
Edwin Vane52380602013-02-19 17:14:34 +00002950In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2951Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2952subtypes of clang::Type.
2953
Daniel Jaspere0b89972012-12-04 12:08:08 +00002954Usable 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 +00002955 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;,
2956 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00002957</pre></td></tr>
2958
2959
Manuel Klimek67619ff2012-09-07 13:10:32 +00002960<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 +00002961<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
2962matched by a given matcher.
2963
2964Given
2965 struct X { int m; };
2966 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002967memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002968 matches "x.m" and "m"
2969with hasObjectExpression(...)
2970 matching "x" and the implicit object expression of "m" which has type X*.
2971</pre></td></tr>
2972
2973
Manuel Klimek67619ff2012-09-07 13:10:32 +00002974<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 +00002975<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
2976given matcher.
2977
2978Given
2979 struct { int first, second; } first, second;
2980 int i(second.first);
2981 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002982memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002983 matches second.first
2984 but not first.second (because the member name there is "second").
2985</pre></td></tr>
2986
2987
Manuel Klimek41df16e2013-01-09 09:38:21 +00002988<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>
2989<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
2990pointee matches a given matcher.
2991
2992Given
2993 int *a;
2994 int const *b;
2995 float const *f;
2996pointerType(pointee(isConstQualified(), isInteger()))
2997 matches "int const *b"
2998
2999Usable 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;,
3000 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;
3001</pre></td></tr>
3002
3003
3004<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>
3005<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
3006pointee matches a given matcher.
3007
3008Given
3009 int *a;
3010 int const *b;
3011 float const *f;
3012pointerType(pointee(isConstQualified(), isInteger()))
3013 matches "int const *b"
3014
3015Usable 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;,
3016 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;
3017</pre></td></tr>
3018
3019
Manuel Klimek415514d2013-02-06 20:36:22 +00003020<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 +00003021<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3022
3023Given
3024 struct A { struct B { struct C {}; }; };
3025 A::B::C c;
3026nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3027 matches "A::"
3028</pre></td></tr>
3029
3030
Manuel Klimek41df16e2013-01-09 09:38:21 +00003031<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>
3032<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3033NestedNameSpecifier-matcher matches.
3034</pre></td></tr>
3035
3036
Daniel Jaspere0b89972012-12-04 12:08:08 +00003037<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>
3038<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3039given TypeLoc.
3040
3041Given
3042 struct A { struct B { struct C {}; }; };
3043 A::B::C c;
3044nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3045 hasDeclaration(recordDecl(hasName("A")))))))
3046 matches "A::"
3047</pre></td></tr>
3048
3049
Manuel Klimek415514d2013-02-06 20:36:22 +00003050<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 +00003051<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3052
3053Given
3054 struct A { struct B { struct C {}; }; };
3055 A::B::C c;
3056nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3057 matches "A::"
3058</pre></td></tr>
3059
3060
3061<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>
3062<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3063given namespace matcher.
3064
3065Given
3066 namespace ns { struct A {}; }
3067 ns::A a;
3068nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3069 matches "ns::"
3070</pre></td></tr>
3071
3072
3073<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>
3074<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3075given QualType matcher without qualifiers.
3076
3077Given
3078 struct A { struct B { struct C {}; }; };
3079 A::B::C c;
3080nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3081 matches "A::"
3082</pre></td></tr>
3083
3084
Edwin Vane88be2fd2013-04-01 18:33:34 +00003085<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>
3086<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3087
3088Given
3089 int (*ptr_to_array)[4];
3090 int (*ptr_to_func)(int);
3091
3092varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3093ptr_to_func but not ptr_to_array.
3094
3095Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3096</pre></td></tr>
3097
3098
Manuel Klimek41df16e2013-01-09 09:38:21 +00003099<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>
3100<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3101pointee matches a given matcher.
3102
3103Given
3104 int *a;
3105 int const *b;
3106 float const *f;
3107pointerType(pointee(isConstQualified(), isInteger()))
3108 matches "int const *b"
3109
3110Usable 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;,
3111 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;
3112</pre></td></tr>
3113
3114
3115<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>
3116<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3117pointee matches a given matcher.
3118
3119Given
3120 int *a;
3121 int const *b;
3122 float const *f;
3123pointerType(pointee(isConstQualified(), isInteger()))
3124 matches "int const *b"
3125
3126Usable 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;,
3127 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;
3128</pre></td></tr>
3129
3130
Edwin Vane6a19a972013-03-06 17:02:57 +00003131<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('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>
3132<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3133
3134Given:
3135 typedef int &amp;int_ref;
3136 int a;
3137 int_ref b = a;
3138
3139varDecl(hasType(qualType(referenceType()))))) will not match the
3140declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3141</pre></td></tr>
3142
3143
Edwin Vane3abf7782013-02-25 14:49:29 +00003144<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>
3145<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00003146matcher.
3147
Edwin Vane52380602013-02-19 17:14:34 +00003148In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3149Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3150subtypes of clang::Type.
3151
Daniel Jaspere0b89972012-12-04 12:08:08 +00003152Usable 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 +00003153 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;,
3154 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003155</pre></td></tr>
3156
3157
Manuel Klimek67619ff2012-09-07 13:10:32 +00003158<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 +00003159<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3160</pre></td></tr>
3161
3162
Manuel Klimek67619ff2012-09-07 13:10:32 +00003163<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 +00003164<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3165</pre></td></tr>
3166
3167
Manuel Klimek41df16e2013-01-09 09:38:21 +00003168<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>
3169<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3170pointee matches a given matcher.
3171
3172Given
3173 int *a;
3174 int const *b;
3175 float const *f;
3176pointerType(pointee(isConstQualified(), isInteger()))
3177 matches "int const *b"
3178
3179Usable 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;,
3180 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;
3181</pre></td></tr>
3182
3183
3184<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>
3185<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3186pointee matches a given matcher.
3187
3188Given
3189 int *a;
3190 int const *b;
3191 float const *f;
3192pointerType(pointee(isConstQualified(), isInteger()))
3193 matches "int const *b"
3194
3195Usable 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;,
3196 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;
3197</pre></td></tr>
3198
3199
Manuel Klimek67619ff2012-09-07 13:10:32 +00003200<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 +00003201<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3202alignof.
3203</pre></td></tr>
3204
3205
Manuel Klimek67619ff2012-09-07 13:10:32 +00003206<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 +00003207<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3208sizeof.
3209</pre></td></tr>
3210
3211
Manuel Klimek67619ff2012-09-07 13:10:32 +00003212<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 +00003213<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3214
3215Given
3216 template&lt;typename T&gt; struct A {};
3217 struct B { B* next; };
3218 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003219classTemplateSpecializationDecl(hasAnyTemplateArgument(
3220 refersToDeclaration(fieldDecl(hasName("next"))))
3221 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003222 B::next
3223</pre></td></tr>
3224
3225
Manuel Klimek67619ff2012-09-07 13:10:32 +00003226<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 +00003227<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3228
3229Given
3230 struct X {};
3231 template&lt;typename T&gt; struct A {};
3232 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003233classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003234 refersToType(class(hasName("X")))))
3235 matches the specialization A&lt;X&gt;
3236</pre></td></tr>
3237
3238
Edwin Vane3abf7782013-02-25 14:49:29 +00003239<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Edwin Vane52380602013-02-19 17:14:34 +00003240<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if the declaration of the type matches the given
3241matcher.
3242
3243In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3244Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3245subtypes of clang::Type.
3246
3247Usable 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 +00003248 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;,
3249 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3250</pre></td></tr>
3251
3252
3253<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>
3254<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3255QualType-matcher matches.
3256</pre></td></tr>
3257
3258
3259<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>
3260<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if the declaration of the type matches the given
3261matcher.
3262
3263In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3264Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3265subtypes of clang::Type.
3266
3267Usable 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;,
3268 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;,
3269 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003270</pre></td></tr>
3271
3272
Manuel Klimek67619ff2012-09-07 13:10:32 +00003273<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 +00003274<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3275
3276Given
3277 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3278unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3279 matches sizeof(a) and alignof(c)
3280</pre></td></tr>
3281
3282
Manuel Klimek67619ff2012-09-07 13:10:32 +00003283<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 +00003284<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3285
Daniel Jaspere0b89972012-12-04 12:08:08 +00003286Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003287 !true
3288</pre></td></tr>
3289
3290
Manuel Klimek67619ff2012-09-07 13:10:32 +00003291<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 +00003292<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3293
3294Given
3295 namespace X { void b(); }
3296 using X::b;
3297usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3298 matches using X::b </pre></td></tr>
3299
3300
Manuel Klimek67619ff2012-09-07 13:10:32 +00003301<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 +00003302<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3303matched by the given matcher.
3304
3305Given
3306 namespace X { int a; void b(); }
3307 using X::a;
3308 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003309usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003310 matches using X::b but not using X::a </pre></td></tr>
3311
3312
Manuel Klimek67619ff2012-09-07 13:10:32 +00003313<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 +00003314<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3315declaration's type.
3316
3317In case of a value declaration (for example a variable declaration),
3318this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003319declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3320while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003321of x."
3322
Manuel Klimeke44a0062012-08-26 23:55:24 +00003323Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3324 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003325 class X {};
3326 void y(X &amp;x) { x; X z; }
3327
3328Usable 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;
3329</pre></td></tr>
3330
3331
Manuel Klimek67619ff2012-09-07 13:10:32 +00003332<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 +00003333<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3334that matches the given matcher.
3335
Manuel Klimeke44a0062012-08-26 23:55:24 +00003336Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003337 bool y() { return true; }
3338 bool x = y();
3339</pre></td></tr>
3340
3341
Daniel Jaspere0b89972012-12-04 12:08:08 +00003342<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>
3343<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3344expression.
3345
3346Given
3347 void f(int b) {
3348 int a[b];
3349 }
3350variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3351 varDecl(hasName("b")))))))
3352 matches "int a[b]"
3353</pre></td></tr>
3354
3355
Manuel Klimek67619ff2012-09-07 13:10:32 +00003356<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('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 +00003357<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3358a given body.
3359
3360Given
3361 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003362hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003363 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003364with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003365 matching '{}'
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_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 +00003370<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3371or conditional operator.
3372
3373Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3374 if (true) {}
3375</pre></td></tr>
3376
3377<!--END_TRAVERSAL_MATCHERS -->
3378</table>
3379
3380</div>
3381</body>
3382</html>
3383
3384