blob: 930b922cdd175a1998a0d083760b33f91eed604f [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
Manuel Klimek67619ff2012-09-07 13:10:32 +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('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 +000081<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +000082
83Example matches Z
84 template&lt;class T&gt; class Z {};
85</pre></td></tr>
86
87
Manuel Klimek67619ff2012-09-07 13:10:32 +000088<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 +000089<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
Manuel Klimek1da79332012-08-20 20:54:03 +000090
91Given
92 template&lt;typename T&gt; class A {};
93 template&lt;&gt; class A&lt;double&gt; {};
94 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +000095classTemplateSpecializationDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +000096 matches the specializations A&lt;int&gt; and A&lt;double&gt;
97</pre></td></tr>
98
99
Manuel Klimek67619ff2012-09-07 13:10:32 +0000100<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 +0000101<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000102
103Example matches Foo::Foo() and Foo::Foo(int)
104 class Foo {
105 public:
106 Foo();
107 Foo(int);
108 int DoSomething();
109 };
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('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 +0000114<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
115
116Examples matches X, C, and the friend declaration inside C;
117 void X();
118 class C {
119 friend X;
120 };
121</pre></td></tr>
122
123
Manuel Klimek67619ff2012-09-07 13:10:32 +0000124<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 +0000125<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000126
127Example matches Foo::~Foo()
128 class Foo {
129 public:
130 virtual ~Foo();
131 };
132</pre></td></tr>
133
134
Manuel Klimek67619ff2012-09-07 13:10:32 +0000135<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000136<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000137
138Example matches A, B, C
139 enum X {
140 A, B, C
141 };
142</pre></td></tr>
143
144
Manuel Klimek67619ff2012-09-07 13:10:32 +0000145<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 +0000146<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
147
148Example matches X
149 enum X {
150 A, B, C
151 };
152</pre></td></tr>
153
154
Manuel Klimek67619ff2012-09-07 13:10:32 +0000155<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 +0000156<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000157
158Given
159 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000160fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000161 matches 'm'.
162</pre></td></tr>
163
164
Manuel Klimek67619ff2012-09-07 13:10:32 +0000165<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 +0000166<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000167
168Example matches f
169 void f();
170</pre></td></tr>
171
172
Manuel Klimek67619ff2012-09-07 13:10:32 +0000173<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 +0000174<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000175
176Example matches f
177 template&lt;class T&gt; void f(T t) {}
178</pre></td></tr>
179
180
Manuel Klimek67619ff2012-09-07 13:10:32 +0000181<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 +0000182<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000183
184Example matches y
185 class X { void y() };
186</pre></td></tr>
187
188
Manuel Klimek67619ff2012-09-07 13:10:32 +0000189<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000190<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 +0000191
192Example matches X, S, the anonymous union type, i, and U;
193 typedef int X;
194 struct S {
195 union {
196 int i;
197 } U;
198 };
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('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 +0000203<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000204
205Example matches X, Z
206 class X;
207 template&lt;class T&gt; class Z {};
208</pre></td></tr>
209
210
Manuel Klimek67619ff2012-09-07 13:10:32 +0000211<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 +0000212<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
213
214Given
215 namespace X { int x; }
216 using X::x;
217usingDecl()
218 matches using X::x </pre></td></tr>
219
220
Manuel Klimek67619ff2012-09-07 13:10:32 +0000221<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 +0000222<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000223
224Note: this does not match declarations of member variables, which are
225"field" declarations in Clang parlance.
226
227Example matches a
228 int a;
229</pre></td></tr>
230
231
Manuel Klimek41df16e2013-01-09 09:38:21 +0000232<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>
233<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
234</pre></td></tr>
235
236
237<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>
238<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
239
240Given
241 namespace ns {
242 struct A { static void f(); };
243 void A::f() {}
244 void g() { A::f(); }
245 }
246 ns::A a;
247nestedNameSpecifier()
248 matches "ns::" and both "A::"
249</pre></td></tr>
250
251
252<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>
253<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
254</pre></td></tr>
255
256
Manuel Klimek67619ff2012-09-07 13:10:32 +0000257<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 +0000258<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
259
260Given
261 int i = a[1];
262arraySubscriptExpr()
263 matches "a[1]"
264</pre></td></tr>
265
266
Daniel Jaspere0b89972012-12-04 12:08:08 +0000267<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>
268<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
269
270 int i = 100;
271 __asm("mov al, 2");
272asmStmt()
273 matches '__asm("mov al, 2")'
274</pre></td></tr>
275
276
Manuel Klimek67619ff2012-09-07 13:10:32 +0000277<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 +0000278<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
279
280Example matches a || b
281 !(a || b)
282</pre></td></tr>
283
284
Manuel Klimek67619ff2012-09-07 13:10:32 +0000285<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 +0000286<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000287
288Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000289 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000290 FunctionTakesString(GetStringByValue());
291 FunctionTakesStringByPointer(GetStringPointer());
292</pre></td></tr>
293
294
Daniel Jaspere0b89972012-12-04 12:08:08 +0000295<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>
296<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
297
298Example matches true
299 true
300</pre></td></tr>
301
302
303<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>
304<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
305
306Given
307 while (true) { break; }
308breakStmt()
309 matches 'break'
310</pre></td></tr>
311
312
313<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>
314<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
315
316Example: Matches (int*) 2.2f in
317 int i = (int) 2.2f;
318</pre></td></tr>
319
320
Manuel Klimek67619ff2012-09-07 13:10:32 +0000321<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 +0000322<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000323
324Example matches x.y() and y()
325 X x;
326 x.y();
327 y();
328</pre></td></tr>
329
330
Daniel Jaspere0b89972012-12-04 12:08:08 +0000331<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>
332<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
333
334Example: castExpr() matches each of the following:
335 (int) 3;
336 const_cast&lt;Expr *&gt;(SubExpr);
337 char c = 0;
338but does not match
339 int i = (0);
340 int k = 0;
341</pre></td></tr>
342
343
344<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>
345<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
346
347 try {} catch(int i) {}
348catchStmt()
349 matches 'catch(int i)'
350</pre></td></tr>
351
352
353<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>
354<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
355
356Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
357though.
358
359Example matches 'a', L'a'
360 char ch = 'a'; wchar_t chw = L'a';
361</pre></td></tr>
362
363
Manuel Klimek415514d2013-02-06 20:36:22 +0000364<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>
365<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
366
367Example match: {1}, (1, 2)
368 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
369</pre></td></tr>
370
371
Manuel Klimek67619ff2012-09-07 13:10:32 +0000372<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 +0000373<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000374
375Example matches '{}' and '{{}}'in 'for (;;) {{}}'
376 for (;;) {{}}
377</pre></td></tr>
378
379
Manuel Klimek67619ff2012-09-07 13:10:32 +0000380<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 +0000381<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
382
383Example matches a ? b : c
384 (a ? b : c) + 42
385</pre></td></tr>
386
387
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
389<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
390
391Example: Matches const_cast&lt;int*&gt;(&amp;r) in
392 int n = 42;
393 const int &amp;r(n);
394 int* p = const_cast&lt;int*&gt;(&amp;r);
395</pre></td></tr>
396
397
Manuel Klimek67619ff2012-09-07 13:10:32 +0000398<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000399<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000400
401Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000402 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000403 void f(const string &amp;a, const string &amp;b);
404 char *ptr;
405 int n;
406 f(string(ptr, n), ptr);
407</pre></td></tr>
408
409
Daniel Jaspere0b89972012-12-04 12:08:08 +0000410<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>
411<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
412
413Given
414 while (true) { continue; }
415continueStmt()
416 matches 'continue'
417</pre></td></tr>
418
419
Manuel Klimek67619ff2012-09-07 13:10:32 +0000420<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 +0000421<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000422
423Example matches x in if (x)
424 bool x;
425 if (x) {}
426</pre></td></tr>
427
428
Manuel Klimek67619ff2012-09-07 13:10:32 +0000429<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 +0000430<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000431
432Given
433 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000434declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000435 matches 'int a'.
436</pre></td></tr>
437
438
Manuel Klimek67619ff2012-09-07 13:10:32 +0000439<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 +0000440<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 +0000441
442Example matches the CXXDefaultArgExpr placeholder inserted for the
443 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000444 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000445 void f(int x, int y = 0);
446 f(42);
447</pre></td></tr>
448
449
Manuel Klimek67619ff2012-09-07 13:10:32 +0000450<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 +0000451<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000452
453Given
454 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000455deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000456 matches 'delete X'.
457</pre></td></tr>
458
459
Manuel Klimek67619ff2012-09-07 13:10:32 +0000460<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 +0000461<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
462
463Given
464 do {} while (true);
465doStmt()
466 matches 'do {} while(true)'
467</pre></td></tr>
468
469
Daniel Jaspere0b89972012-12-04 12:08:08 +0000470<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>
471<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
472
473Example:
474 dynamicCastExpr()
475matches
476 dynamic_cast&lt;D*&gt;(&amp;b);
477in
478 struct B { virtual ~B() {} }; struct D : B {};
479 B b;
480 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
481</pre></td></tr>
482
483
484<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>
485<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
486
487Matches any cast expression written in user code, whether it be a
488C-style cast, a functional-style cast, or a keyword cast.
489
490Does not match implicit conversions.
491
492Note: the name "explicitCast" is chosen to match Clang's terminology, as
493Clang uses the term "cast" to apply to implicit conversions as well as to
494actual cast expressions.
495
496hasDestinationType.
497
498Example: matches all five of the casts in
499 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
500but does not match the implicit conversion in
501 long ell = 42;
502</pre></td></tr>
503
504
Manuel Klimek67619ff2012-09-07 13:10:32 +0000505<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000506<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000507
508Example matches x()
509 void f() { x(); }
510</pre></td></tr>
511
512
Daniel Jaspere0b89972012-12-04 12:08:08 +0000513<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>
514<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
515
516forRangeStmt() matches 'for (auto a : i)'
517 int i[] = {1, 2, 3}; for (auto a : i);
518 for(int j = 0; j &lt; 5; ++j);
519</pre></td></tr>
520
521
Manuel Klimek67619ff2012-09-07 13:10:32 +0000522<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 +0000523<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
524
525Example matches 'for (;;) {}'
526 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000527 int i[] = {1, 2, 3}; for (auto a : i);
528</pre></td></tr>
529
530
531<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>
532<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
533
534Example: Matches Foo(bar);
535 Foo f = bar;
536 Foo g = (Foo) bar;
537 Foo h = Foo(bar);
538</pre></td></tr>
539
540
541<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>
542<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
543
544Given
545 goto FOO;
546 FOO: bar();
547gotoStmt()
548 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000549</pre></td></tr>
550
551
Manuel Klimek67619ff2012-09-07 13:10:32 +0000552<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 +0000553<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
554
555Example matches 'if (x) {}'
556 if (x) {}
557</pre></td></tr>
558
559
Daniel Jaspere0b89972012-12-04 12:08:08 +0000560<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>
561<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
562
563This matches many different places, including function call return value
564eliding, as well as any type conversions.
565</pre></td></tr>
566
567
Manuel Klimek67619ff2012-09-07 13:10:32 +0000568<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 +0000569<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
570
571Given
572 int a[] = { 1, 2 };
573 struct B { int x, y; };
574 B b = { 5, 6 };
575initList()
576 matches "{ 1, 2 }" and "{ 5, 6 }"
577</pre></td></tr>
578
579
Daniel Jaspere0b89972012-12-04 12:08:08 +0000580<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>
581<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
582
583Not matching character-encoded integers such as L'a'.
584
585Example matches 1, 1L, 0x1, 1U
586</pre></td></tr>
587
588
589<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>
590<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
591
592Given
593 goto FOO;
594 FOO: bar();
595labelStmt()
596 matches 'FOO:'
597</pre></td></tr>
598
599
600<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>
601<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
602
603Example matches [&amp;](){return 5;}
604 [&amp;](){return 5;}
605</pre></td></tr>
606
607
Manuel Klimek67619ff2012-09-07 13:10:32 +0000608<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 +0000609<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
610
611Example: Given
612 struct T {void func()};
613 T f();
614 void g(T);
615materializeTemporaryExpr() matches 'f()' in these statements
616 T u(f());
617 g(f());
618but does not match
619 f();
620 f().func();
621</pre></td></tr>
622
623
Manuel Klimek67619ff2012-09-07 13:10:32 +0000624<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000625<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000626
627Example matches x.y()
628 X x;
629 x.y();
630</pre></td></tr>
631
632
Manuel Klimek67619ff2012-09-07 13:10:32 +0000633<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000634<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000635
636Given
637 class Y {
638 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
639 int a; static int b;
640 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000641memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000642 matches this-&gt;x, x, y.x, a, this-&gt;b
643</pre></td></tr>
644
645
Manuel Klimek67619ff2012-09-07 13:10:32 +0000646<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 +0000647<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000648
649Given
650 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000651newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000652 matches 'new X'.
653</pre></td></tr>
654
655
Daniel Jaspere0b89972012-12-04 12:08:08 +0000656<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>
657<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
658</pre></td></tr>
659
660
661<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>
662<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
663
664 foo();;
665nullStmt()
666 matches the second ';'
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('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 +0000671<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000672
673Note that if an operator isn't overloaded, it won't match. Instead, use
674binaryOperator matcher.
675Currently it does not match operators such as new delete.
676FIXME: figure out why these do not match?
677
678Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000679 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000680 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
681 ostream &amp;o; int b = 1, c = 1;
682 o &lt;&lt; b &lt;&lt; c;
683</pre></td></tr>
684
685
Daniel Jaspere0b89972012-12-04 12:08:08 +0000686<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
687<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
688
689Either the source expression or the destination type can be matched
690using has(), but hasDestinationType() is more specific and can be
691more readable.
692
693Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
694 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
695</pre></td></tr>
696
697
698<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>
699<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
700
701Given
702 return 1;
703returnStmt()
704 matches 'return 1'
705</pre></td></tr>
706
707
708<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>
709<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
710
711hasDestinationType
712reinterpretCast
713
714Example:
715 staticCastExpr()
716matches
717 static_cast&lt;long&gt;(8)
718in
719 long eight(static_cast&lt;long&gt;(8));
720</pre></td></tr>
721
722
Manuel Klimek67619ff2012-09-07 13:10:32 +0000723<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 +0000724<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000725
726Given
727 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000728stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000729 matches both the compound statement '{ ++a; }' and '++a'.
730</pre></td></tr>
731
732
Daniel Jaspere0b89972012-12-04 12:08:08 +0000733<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>
734<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
735
736Example matches "abcd", L"abcd"
737 char *s = "abcd"; wchar_t *ws = L"abcd"
738</pre></td></tr>
739
740
Manuel Klimek67619ff2012-09-07 13:10:32 +0000741<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 +0000742<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
743
744Given
745 switch(a) { case 42: break; default: break; }
746switchCase()
747 matches 'case 42: break;' and 'default: break;'.
748</pre></td></tr>
749
750
Daniel Jaspere0b89972012-12-04 12:08:08 +0000751<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
752<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
753
754Given
755 switch(a) { case 42: break; default: break; }
756switchStmt()
757 matches 'switch(a)'.
758</pre></td></tr>
759
760
761<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>
762<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
763
764Example matches the implicit this expression in "return i".
765 (matcher = thisExpr())
766struct foo {
767 int i;
768 int f() { return i; }
769};
770</pre></td></tr>
771
772
773<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
774<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
775
776 try { throw 5; } catch(int i) {}
777throwExpr()
778 matches 'throw 5'
779</pre></td></tr>
780
781
782<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>
783<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
784
785 try {} catch(int i) {}
786tryStmt()
787 matches 'try {}'
788</pre></td></tr>
789
790
Manuel Klimek67619ff2012-09-07 13:10:32 +0000791<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 +0000792<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
793
794Given
795 Foo x = bar;
796 int y = sizeof(x) + alignof(x);
797unaryExprOrTypeTraitExpr()
798 matches sizeof(x) and alignof(x)
799</pre></td></tr>
800
801
Manuel Klimek67619ff2012-09-07 13:10:32 +0000802<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 +0000803<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
804
805Example matches !a
806 !a || b
807</pre></td></tr>
808
809
Daniel Jaspere0b89972012-12-04 12:08:08 +0000810<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>
811<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
812
813Example match: "foo"_suffix
814</pre></td></tr>
815
816
Manuel Klimek67619ff2012-09-07 13:10:32 +0000817<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 +0000818<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
819
820Given
821 while (true) {}
822whileStmt()
823 matches 'while (true) {}'.
824</pre></td></tr>
825
Daniel Jaspere0b89972012-12-04 12:08:08 +0000826
Manuel Klimek41df16e2013-01-09 09:38:21 +0000827<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>
828<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
829
830Given
831 int a[] = { 2, 3 };
832 int b[4];
833 void f() { int c[a[0]]; }
834arrayType()
835 matches "int a[]", "int b[4]" and "int c[a[0]]";
836</pre></td></tr>
837
838
839<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>
840<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
841
842Given
843 _Atomic(int) i;
844atomicType()
845 matches "_Atomic(int) i"
846</pre></td></tr>
847
848
849<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>
850<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
851
852Given:
853 auto n = 4;
854 int v[] = { 2, 3 }
855 for (auto i : v) { }
856autoType()
857 matches "auto n" and "auto i"
858</pre></td></tr>
859
860
861<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>
862<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
863"void (^)(int)".
864
865The pointee is always required to be a FunctionType.
866</pre></td></tr>
867
868
869<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>
870<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
871
872Given
873 struct A {};
874 A a;
875 int b;
876 float c;
877 bool d;
878builtinType()
879 matches "int b", "float c" and "bool d"
880</pre></td></tr>
881
882
883<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('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>
884<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
885
886Given
887 _Complex float f;
888complexType()
889 matches "_Complex float f"
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('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>
894<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
895
896Given
897 void() {
898 int a[2];
899 int b[] = { 2, 3 };
900 int c[b[0]];
901 }
902constantArrayType()
903 matches "int a[2]"
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('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>
908<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
909
910Given
911 template&lt;typename T, int Size&gt;
912 class array {
913 T data[Size];
914 };
915dependentSizedArrayType
916 matches "T data[Size]"
917</pre></td></tr>
918
919
920<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>
921<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
922
923Given
924 int (*f)(int);
925 void g();
926functionType()
927 matches "int (*f)(int)" and the type of "g".
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('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>
932<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
933
934Given
935 int a[] = { 2, 3 };
936 int b[42];
937 void f(int c[]) { int d[a[0]]; };
938incompleteArrayType()
939 matches "int a[]" and "int c[]"
940</pre></td></tr>
941
942
943<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>
944<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
945Given
946 struct A { int i; }
947 A::* ptr = A::i;
948memberPointerType()
949 matches "A::* ptr"
950</pre></td></tr>
951
952
953<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>
954<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
955
956Given
957 int *a;
958 int &amp;b = *a;
959 int c = 5;
960pointerType()
961 matches "int *a"
962</pre></td></tr>
963
964
965<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>
966<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference types.
967
968Given
969 int *a;
970 int &amp;b = *a;
971 int c = 5;
972pointerType()
973 matches "int &amp;b"
974</pre></td></tr>
975
976
Daniel Jaspere0b89972012-12-04 12:08:08 +0000977<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>
978<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
979</pre></td></tr>
980
981
Manuel Klimek41df16e2013-01-09 09:38:21 +0000982<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>
983<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
984
985Given
986 typedef int X;
987typedefType()
988 matches "typedef int X"
989</pre></td></tr>
990
991
992<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>
993<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
994integer-constant-expression.
995
996Given
997 void f() {
998 int a[] = { 2, 3 }
999 int b[42];
1000 int c[a[0]];
1001variableArrayType()
1002 matches "int c[a[0]]"
1003</pre></td></tr>
1004
1005
1006<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>
1007<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1008
1009Given
1010 int a[] = { 2, 3 };
1011 int b[4];
1012 void f() { int c[a[0]]; }
1013arrayType()
1014 matches "int a[]", "int b[4]" and "int c[a[0]]";
1015</pre></td></tr>
1016
1017
1018<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>
1019<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1020
1021Given
1022 _Atomic(int) i;
1023atomicType()
1024 matches "_Atomic(int) i"
1025</pre></td></tr>
1026
1027
1028<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>
1029<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1030
1031Given:
1032 auto n = 4;
1033 int v[] = { 2, 3 }
1034 for (auto i : v) { }
1035autoType()
1036 matches "auto n" and "auto i"
1037</pre></td></tr>
1038
1039
1040<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>
1041<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1042"void (^)(int)".
1043
1044The pointee is always required to be a FunctionType.
1045</pre></td></tr>
1046
1047
1048<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>
1049<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1050
1051Given
1052 struct A {};
1053 A a;
1054 int b;
1055 float c;
1056 bool d;
1057builtinType()
1058 matches "int b", "float c" and "bool d"
1059</pre></td></tr>
1060
1061
1062<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>
1063<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1064
1065Given
1066 _Complex float f;
1067complexType()
1068 matches "_Complex float f"
1069</pre></td></tr>
1070
1071
1072<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>
1073<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1074
1075Given
1076 void() {
1077 int a[2];
1078 int b[] = { 2, 3 };
1079 int c[b[0]];
1080 }
1081constantArrayType()
1082 matches "int a[2]"
1083</pre></td></tr>
1084
1085
1086<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>
1087<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1088
1089Given
1090 template&lt;typename T, int Size&gt;
1091 class array {
1092 T data[Size];
1093 };
1094dependentSizedArrayType
1095 matches "T data[Size]"
1096</pre></td></tr>
1097
1098
1099<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>
1100<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1101
1102Given
1103 int (*f)(int);
1104 void g();
1105functionType()
1106 matches "int (*f)(int)" and the type of "g".
1107</pre></td></tr>
1108
1109
1110<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>
1111<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1112
1113Given
1114 int a[] = { 2, 3 };
1115 int b[42];
1116 void f(int c[]) { int d[a[0]]; };
1117incompleteArrayType()
1118 matches "int a[]" and "int c[]"
1119</pre></td></tr>
1120
1121
1122<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>
1123<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1124Given
1125 struct A { int i; }
1126 A::* ptr = A::i;
1127memberPointerType()
1128 matches "A::* ptr"
1129</pre></td></tr>
1130
1131
1132<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>
1133<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1134
1135Given
1136 int *a;
1137 int &amp;b = *a;
1138 int c = 5;
1139pointerType()
1140 matches "int *a"
1141</pre></td></tr>
1142
1143
1144<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>
1145<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches reference types.
1146
1147Given
1148 int *a;
1149 int &amp;b = *a;
1150 int c = 5;
1151pointerType()
1152 matches "int &amp;b"
1153</pre></td></tr>
1154
1155
Daniel Jaspere0b89972012-12-04 12:08:08 +00001156<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>
1157<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1158</pre></td></tr>
1159
Manuel Klimek41df16e2013-01-09 09:38:21 +00001160
1161<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>
1162<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1163
1164Given
1165 typedef int X;
1166typedefType()
1167 matches "typedef int X"
1168</pre></td></tr>
1169
1170
1171<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1172<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1173integer-constant-expression.
1174
1175Given
1176 void f() {
1177 int a[] = { 2, 3 }
1178 int b[42];
1179 int c[a[0]];
1180variableArrayType()
1181 matches "int c[a[0]]"
1182</pre></td></tr>
1183
Manuel Klimek1da79332012-08-20 20:54:03 +00001184<!--END_DECL_MATCHERS -->
1185</table>
1186
1187<!-- ======================================================================= -->
1188<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1189<!-- ======================================================================= -->
1190
1191<p>Narrowing matchers match certain attributes on the current node, thus
1192narrowing down the set of nodes of the current type to match on.</p>
1193
1194<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1195which allow users to create more powerful match expressions.</p>
1196
1197<table>
1198<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1199<!-- START_NARROWING_MATCHERS -->
1200
Manuel Klimek67619ff2012-09-07 13:10:32 +00001201<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 +00001202<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1203
1204Usable as: Any Matcher
1205</pre></td></tr>
1206
1207
Manuel Klimek67619ff2012-09-07 13:10:32 +00001208<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 +00001209<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1210
1211Usable as: Any Matcher
1212</pre></td></tr>
1213
1214
Manuel Klimek67619ff2012-09-07 13:10:32 +00001215<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 +00001216<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1217
1218Useful when another matcher requires a child matcher, but there's no
1219additional constraint. This will often be used with an explicit conversion
1220to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1221
1222Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1223"int* p" and "void f()" in
1224 int* p;
1225 void f();
1226
1227Usable as: Any Matcher
1228</pre></td></tr>
1229
1230
Manuel Klimek67619ff2012-09-07 13:10:32 +00001231<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 +00001232<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1233
Manuel Klimeke44a0062012-08-26 23:55:24 +00001234Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001235 class X {};
1236 class Y {};
1237
1238Usable as: Any Matcher
1239</pre></td></tr>
1240
1241
Manuel Klimek67619ff2012-09-07 13:10:32 +00001242<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 +00001243<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1244unary).
1245
1246Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1247 !(a || b)
1248</pre></td></tr>
1249
1250
Manuel Klimek67619ff2012-09-07 13:10:32 +00001251<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 +00001252<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1253
1254Example matches true (matcher = boolLiteral(equals(true)))
1255 true
1256
1257Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1258 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;
1259</pre></td></tr>
1260
1261
Manuel Klimek67619ff2012-09-07 13:10:32 +00001262<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 +00001263<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1264by the compiler (eg. implicit defaultcopy constructors).
1265</pre></td></tr>
1266
1267
Manuel Klimek67619ff2012-09-07 13:10:32 +00001268<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 +00001269<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1270code (as opposed to implicitly added by the compiler).
1271
1272Given
1273 struct Foo {
1274 Foo() { }
1275 Foo(int) : foo_("A") { }
1276 string foo_;
1277 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001278constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001279 will match Foo(int), but not Foo()
1280</pre></td></tr>
1281
1282
Manuel Klimek67619ff2012-09-07 13:10:32 +00001283<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>std::string Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001284<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1285
1286Matches overloaded operator names specified in strings without the
1287"operator" prefix, such as "&lt;&lt;", for OverloadedOperatorCall's.
1288
1289Example matches a &lt;&lt; b
Manuel Klimeke44a0062012-08-26 23:55:24 +00001290 (matcher == operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;")))
Manuel Klimek1da79332012-08-20 20:54:03 +00001291 a &lt;&lt; b;
1292 c &amp;&amp; d; assuming both operator&lt;&lt;
1293 and operator&amp;&amp; are overloaded somewhere.
1294</pre></td></tr>
1295
1296
Manuel Klimek67619ff2012-09-07 13:10:32 +00001297<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 +00001298<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1299</pre></td></tr>
1300
1301
Manuel Klimek415514d2013-02-06 20:36:22 +00001302<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>
1303<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001304static member variable template instantiations.
1305
1306Given
1307 template&lt;typename T&gt; void A(T t) { }
1308 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001309functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001310 matches the specialization A&lt;int&gt;().
1311
1312Usable 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;
1313</pre></td></tr>
1314
1315
Daniel Jaspere0b89972012-12-04 12:08:08 +00001316<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>
1317<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1318isSameOrDerivedFrom(hasName(...)).
1319</pre></td></tr>
1320
1321
Manuel Klimek415514d2013-02-06 20:36:22 +00001322<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>
1323<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001324member variable template instantiations.
1325
1326Given
1327 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1328or
1329 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001330recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001331 matches the template instantiation of X&lt;A&gt;.
1332
1333But given
1334 template &lt;typename T&gt; class X {}; class A {};
1335 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001336recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001337 does not match, as X&lt;A&gt; is an explicit template specialization.
1338
1339Usable 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;
1340</pre></td></tr>
1341
1342
Manuel Klimek67619ff2012-09-07 13:10:32 +00001343<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 +00001344<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1345a specific number of arguments (including absent default arguments).
1346
Manuel Klimeke44a0062012-08-26 23:55:24 +00001347Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001348 void f(int x, int y);
1349 f(0, 0);
1350</pre></td></tr>
1351
1352
Manuel Klimek67619ff2012-09-07 13:10:32 +00001353<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 +00001354<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1355
1356Example matches true (matcher = boolLiteral(equals(true)))
1357 true
1358
1359Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1360 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;
1361</pre></td></tr>
1362
1363
Manuel Klimek67619ff2012-09-07 13:10:32 +00001364<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 +00001365<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1366child statements.
1367
1368Example: Given
1369 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001370compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001371 matches '{}'
1372 but does not match the outer compound statement.
1373</pre></td></tr>
1374
1375
Daniel Jaspere0b89972012-12-04 12:08:08 +00001376<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>
1377<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1378
1379Given
1380 int a[42];
1381 int b[2 * 21];
1382 int c[41], d[43];
1383constantArrayType(hasSize(42))
1384 matches "int a[42]" and "int b[2 * 21]"
1385</pre></td></tr>
1386
1387
Manuel Klimek67619ff2012-09-07 13:10:32 +00001388<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 +00001389<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1390declarations.
1391
1392Example: Given
1393 int a, b;
1394 int c;
1395 int d = 2, e;
1396declCountIs(2)
1397 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1398</pre></td></tr>
1399
1400
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001401<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>
1402<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1403
1404Decl has pointer identity in the AST.
1405</pre></td></tr>
1406
1407
Manuel Klimek67619ff2012-09-07 13:10:32 +00001408<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 +00001409<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1410
1411Example matches true (matcher = boolLiteral(equals(true)))
1412 true
1413
1414Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1415 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;
1416</pre></td></tr>
1417
1418
Manuel Klimek415514d2013-02-06 20:36:22 +00001419<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>
1420<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001421
1422Example matches A, va, fa
1423 class A {};
1424 class B; Doesn't match, as it has no body.
1425 int va;
1426 extern int vb; Doesn't match, as it doesn't define the variable.
1427 void fa() {}
1428 void fb(); Doesn't match, as it has no body.
1429
1430Usable 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;
1431</pre></td></tr>
1432
1433
Manuel Klimek415514d2013-02-06 20:36:22 +00001434<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>
1435<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001436static member variable template instantiations.
1437
1438Given
1439 template&lt;typename T&gt; void A(T t) { }
1440 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001441functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001442 matches the specialization A&lt;int&gt;().
1443
1444Usable 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;
1445</pre></td></tr>
1446
1447
Manuel Klimek67619ff2012-09-07 13:10:32 +00001448<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 +00001449<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1450
1451Given:
1452 extern "C" void f() {}
1453 extern "C" { void g() {} }
1454 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001455functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001456 matches the declaration of f and g, but not the declaration h
1457</pre></td></tr>
1458
1459
Manuel Klimek415514d2013-02-06 20:36:22 +00001460<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>
1461<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001462member variable template instantiations.
1463
1464Given
1465 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1466or
1467 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001468recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001469 matches the template instantiation of X&lt;A&gt;.
1470
1471But given
1472 template &lt;typename T&gt; class X {}; class A {};
1473 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001474recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001475 does not match, as X&lt;A&gt; is an explicit template specialization.
1476
1477Usable 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;
1478</pre></td></tr>
1479
1480
Daniel Jaspere0b89972012-12-04 12:08:08 +00001481<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>
1482<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1483
1484Given
1485 void f(int i) {}
1486 void g(int i, int j) {}
1487functionDecl(parameterCountIs(2))
1488 matches g(int i, int j) {}
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_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 +00001493<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1494
1495Example matches true (matcher = boolLiteral(equals(true)))
1496 true
1497
1498Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1499 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;
1500</pre></td></tr>
1501
1502
Manuel Klimek67619ff2012-09-07 13:10:32 +00001503<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 +00001504<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1505to '.'.
1506
1507Member calls on the implicit this pointer match as called with '-&gt;'.
1508
1509Given
1510 class Y {
1511 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1512 int a;
1513 static int b;
1514 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001515memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001516 matches this-&gt;x, x, y.x, a, this-&gt;b
1517</pre></td></tr>
1518
1519
Manuel Klimek67619ff2012-09-07 13:10:32 +00001520<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 +00001521<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1522
1523Supports specifying enclosing namespaces or classes by prefixing the name
1524with '&lt;enclosing&gt;::'.
1525Does not match typedefs of an underlying type with the given name.
1526
1527Example matches X (Name == "X")
1528 class X;
1529
1530Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1531 namespace a { namespace b { class X; } }
1532</pre></td></tr>
1533
1534
Manuel Klimek67619ff2012-09-07 13:10:32 +00001535<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 +00001536<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1537a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001538
1539Supports specifying enclosing namespaces or classes by
1540prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1541of an underlying type with the given name.
1542
1543Example matches X (regexp == "::X")
1544 class X;
1545
1546Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1547 namespace foo { namespace bar { class X; } }
1548</pre></td></tr>
1549
1550
Manuel Klimek67619ff2012-09-07 13:10:32 +00001551<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 +00001552<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1553
1554Given
1555 class Y { public: void x(); };
1556 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001557callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001558 matches y-&gt;x()
1559</pre></td></tr>
1560
1561
Manuel Klimek67619ff2012-09-07 13:10:32 +00001562<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 +00001563<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1564include "top-level" const.
1565
1566Given
1567 void a(int);
1568 void b(int const);
1569 void c(const int);
1570 void d(const int*);
1571 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001572functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001573 matches "void b(int const)", "void c(const int)" and
1574 "void e(int const) {}". It does not match d as there
1575 is no top-level const on the parameter type "const int *".
1576</pre></td></tr>
1577
1578
Manuel Klimek67619ff2012-09-07 13:10:32 +00001579<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 +00001580<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1581
1582Given
1583 void a(int);
1584 void b(long);
1585 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001586functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001587matches "a(int)", "b(long)", but not "c(double)".
1588</pre></td></tr>
1589
1590
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001591<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>
1592<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1593
1594Stmt has pointer identity in the AST.
1595
1596</pre></td></tr>
1597
1598
Manuel Klimek415514d2013-02-06 20:36:22 +00001599<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>
1600<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001601
1602Example matches A, va, fa
1603 class A {};
1604 class B; Doesn't match, as it has no body.
1605 int va;
1606 extern int vb; Doesn't match, as it doesn't define the variable.
1607 void fa() {}
1608 void fb(); Doesn't match, as it has no body.
1609
1610Usable 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;
1611</pre></td></tr>
1612
1613
Manuel Klimek67619ff2012-09-07 13:10:32 +00001614<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 +00001615<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1616
1617Given
1618 int x;
1619 int s = sizeof(x) + alignof(x)
1620unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1621 matches sizeof(x)
1622</pre></td></tr>
1623
1624
Manuel Klimek67619ff2012-09-07 13:10:32 +00001625<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 +00001626<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1627unary).
1628
1629Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1630 !(a || b)
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_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 +00001635<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
1636
1637Example matches A, va, fa
1638 class A {};
1639 class B; Doesn't match, as it has no body.
1640 int va;
1641 extern int vb; Doesn't match, as it doesn't define the variable.
1642 void fa() {}
1643 void fb(); Doesn't match, as it has no body.
1644
1645Usable 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;
1646</pre></td></tr>
1647
1648
Manuel Klimek67619ff2012-09-07 13:10:32 +00001649<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 +00001650<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
1651static member variable template instantiations.
1652
1653Given
1654 template&lt;typename T&gt; void A(T t) { }
1655 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001656functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001657 matches the specialization A&lt;int&gt;().
1658
1659Usable 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;
1660</pre></td></tr>
1661
1662
Manuel Klimek67619ff2012-09-07 13:10:32 +00001663<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 +00001664<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
1665member variable template instantiations.
1666
1667Given
1668 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1669or
1670 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001671recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001672 matches the template instantiation of X&lt;A&gt;.
1673
1674But given
1675 template &lt;typename T&gt; class X {}; class A {};
1676 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001677recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001678 does not match, as X&lt;A&gt; is an explicit template specialization.
1679
1680Usable 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;
1681</pre></td></tr>
1682
1683<!--END_NARROWING_MATCHERS -->
1684</table>
1685
1686<!-- ======================================================================= -->
1687<h2 id="traversal-matchers">AST Traversal Matchers</h2>
1688<!-- ======================================================================= -->
1689
1690<p>Traversal matchers specify the relationship to other nodes that are
1691reachable from the current node.</p>
1692
1693<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
1694forEachDescendant) which work on all nodes and allow users to write more generic
1695match expressions.</p>
1696
1697<table>
1698<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1699<!-- START_TRAVERSAL_MATCHERS -->
1700
Manuel Klimek152ea0e2013-02-04 10:59:20 +00001701<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>
1702<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
1703
1704Unlike anyOf, eachOf will generate a match result for each
1705matching submatcher.
1706
1707For example, in:
1708 class A { int a; int b; };
1709The matcher:
1710 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
1711 has(fieldDecl(hasName("b")).bind("v"))))
1712will generate two results binding "v", the first of which binds
1713the field declaration of a, the second the field declaration of
1714b.
1715
1716Usable as: Any Matcher
1717</pre></td></tr>
1718
1719
1720<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>
1721<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
1722
1723Generates results for each match.
1724
1725For example, in:
1726 class A { class B {}; class C {}; };
1727The matcher:
1728 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
1729will generate results for A, B and C.
1730
1731Usable as: Any Matcher
1732</pre></td></tr>
1733
1734
Manuel Klimek67619ff2012-09-07 13:10:32 +00001735<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 +00001736<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
1737provided matcher.
1738
Manuel Klimeke44a0062012-08-26 23:55:24 +00001739Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00001740 class X {}; Matches X, because X::X is a class of name X inside X.
1741 class Y { class X {}; };
1742 class Z { class Y { class X {}; }; }; Does not match Z.
1743
1744ChildT must be an AST base type.
1745
1746As opposed to 'has', 'forEach' will cause a match for each result that
1747matches instead of only on the first one.
1748
1749Usable as: Any Matcher
1750</pre></td></tr>
1751
1752
Manuel Klimek67619ff2012-09-07 13:10:32 +00001753<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 +00001754<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
1755provided matcher.
1756
1757Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00001758 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001759 class X {}; Matches X, because X::X is a class of name X inside X.
1760 class A { class X {}; };
1761 class B { class C { class X {}; }; };
1762
1763DescendantT must be an AST base type.
1764
1765As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
1766each result that matches instead of only on the first one.
1767
1768Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00001769 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001770will match 10 times (plus injected class name matches) on:
1771 class A { class B { class C { class D { class E {}; }; }; }; };
1772
1773Usable as: Any Matcher
1774</pre></td></tr>
1775
1776
Manuel Klimek67619ff2012-09-07 13:10:32 +00001777<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 +00001778<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
1779provided matcher.
1780
Manuel Klimeke44a0062012-08-26 23:55:24 +00001781Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00001782 class X {}; Matches X, because X::X is a class of name X inside X.
1783 class Y { class X {}; };
1784 class Z { class Y { class X {}; }; }; Does not match Z.
1785
1786ChildT must be an AST base type.
1787
1788Usable as: Any Matcher
1789</pre></td></tr>
1790
1791
Manuel Klimek67619ff2012-09-07 13:10:32 +00001792<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>
1793<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
1794matcher.
1795
1796Given
1797void f() { if (true) { int x = 42; } }
1798void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00001799expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00001800
1801Usable as: Any Matcher
1802</pre></td></tr>
1803
1804
1805<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 +00001806<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
1807provided matcher.
1808
1809Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00001810 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001811 class X {}; Matches X, because X::X is a class of name X inside X.
1812 class Y { class X {}; };
1813 class Z { class Y { class X {}; }; };
1814
1815DescendantT must be an AST base type.
1816
1817Usable as: Any Matcher
1818</pre></td></tr>
1819
1820
Daniel Jaspere0b89972012-12-04 12:08:08 +00001821<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>
1822<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
1823matcher.
1824
1825Given
1826void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
1827compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
1828
1829Usable as: Any Matcher
1830</pre></td></tr>
1831
1832
Manuel Klimek67619ff2012-09-07 13:10:32 +00001833<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 +00001834<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
1835
1836Given
1837 int i[5];
1838 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001839arraySubscriptExpression(hasBase(implicitCastExpr(
1840 hasSourceExpression(declRefExpr()))))
1841 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00001842</pre></td></tr>
1843
1844
Manuel Klimek67619ff2012-09-07 13:10:32 +00001845<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001846<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
1847
1848Given
1849 int i[5];
1850 void f() { i[1] = 42; }
1851arraySubscriptExpression(hasIndex(integerLiteral()))
1852 matches i[1] with the integerLiteral() matching 1
1853</pre></td></tr>
1854
1855
Manuel Klimek41df16e2013-01-09 09:38:21 +00001856<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>
1857<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
1858type.
1859
1860Given
1861 struct A {};
1862 A a[7];
1863 int b[7];
1864arrayType(hasElementType(builtinType()))
1865 matches "int b[7]"
1866
1867Usable 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;
1868</pre></td></tr>
1869
1870
1871<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>
1872<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
1873type.
1874
1875Given
1876 struct A {};
1877 A a[7];
1878 int b[7];
1879arrayType(hasElementType(builtinType()))
1880 matches "int b[7]"
1881
1882Usable 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;
1883</pre></td></tr>
1884
1885
1886<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>
1887<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
1888
1889Given
1890 _Atomic(int) i;
1891 _Atomic(float) f;
1892atomicType(hasValueType(isInteger()))
1893 matches "_Atomic(int) i"
1894
1895Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
1896</pre></td></tr>
1897
1898
1899<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>
1900<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
1901
1902Given
1903 _Atomic(int) i;
1904 _Atomic(float) f;
1905atomicType(hasValueType(isInteger()))
1906 matches "_Atomic(int) i"
1907
1908Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
1909</pre></td></tr>
1910
1911
1912<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>
1913<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
1914
1915Note: There is no TypeLoc for the deduced type and thus no
1916getDeducedLoc() matcher.
1917
1918Given
1919 auto a = 1;
1920 auto b = 2.0;
1921autoType(hasDeducedType(isInteger()))
1922 matches "auto a"
1923
1924Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
1925</pre></td></tr>
1926
1927
Manuel Klimek67619ff2012-09-07 13:10:32 +00001928<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 +00001929<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
1930binary operator matches.
1931</pre></td></tr>
1932
1933
Manuel Klimek67619ff2012-09-07 13:10:32 +00001934<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 +00001935<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
1936
1937Example matches a (matcher = binaryOperator(hasLHS()))
1938 a || b
1939</pre></td></tr>
1940
1941
Manuel Klimek67619ff2012-09-07 13:10:32 +00001942<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 +00001943<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
1944
1945Example matches b (matcher = binaryOperator(hasRHS()))
1946 a || b
1947</pre></td></tr>
1948
1949
Manuel Klimek41df16e2013-01-09 09:38:21 +00001950<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>
1951<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
1952pointee matches a given matcher.
1953
1954Given
1955 int *a;
1956 int const *b;
1957 float const *f;
1958pointerType(pointee(isConstQualified(), isInteger()))
1959 matches "int const *b"
1960
1961Usable 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;,
1962 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;
1963</pre></td></tr>
1964
1965
1966<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>
1967<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
1968pointee matches a given matcher.
1969
1970Given
1971 int *a;
1972 int const *b;
1973 float const *f;
1974pointerType(pointee(isConstQualified(), isInteger()))
1975 matches "int const *b"
1976
1977Usable 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;,
1978 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;
1979</pre></td></tr>
1980
1981
Daniel Jaspere0b89972012-12-04 12:08:08 +00001982<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</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>
1983<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00001984matcher.
1985
Daniel Jaspere0b89972012-12-04 12:08:08 +00001986Usable 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;,
1987 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00001988</pre></td></tr>
1989
1990
Manuel Klimek67619ff2012-09-07 13:10:32 +00001991<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 +00001992<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
1993
1994Given
1995 struct Foo {
1996 Foo() : foo_(1) { }
1997 int foo_;
1998 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001999recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002000 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2001</pre></td></tr>
2002
2003
Manuel Klimek67619ff2012-09-07 13:10:32 +00002004<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 +00002005<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2006
2007Given
2008 struct Foo {
2009 Foo() : foo_(1) { }
2010 int foo_;
2011 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002012recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002013 forField(hasName("foo_"))))))
2014 matches Foo
2015with forField matching foo_
2016</pre></td></tr>
2017
2018
Manuel Klimek67619ff2012-09-07 13:10:32 +00002019<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002020<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2021
2022Given
2023 struct Foo {
2024 Foo() : foo_(1) { }
2025 int foo_;
2026 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002027recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002028 withInitializer(integerLiteral(equals(1)))))))
2029 matches Foo
2030with withInitializer matching (1)
2031</pre></td></tr>
2032
2033
Manuel Klimek67619ff2012-09-07 13:10:32 +00002034<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 +00002035<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2036
Manuel Klimeke44a0062012-08-26 23:55:24 +00002037Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002038 class Y { public: void x(); };
2039 void z() { Y y; y.x(); }",
2040
2041FIXME: Overload to allow directly matching types?
2042</pre></td></tr>
2043
2044
Manuel Klimek67619ff2012-09-07 13:10:32 +00002045<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 +00002046<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2047
2048
Manuel Klimek67619ff2012-09-07 13:10:32 +00002049<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 +00002050<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2051</pre></td></tr>
2052
2053
Manuel Klimek67619ff2012-09-07 13:10:32 +00002054<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 +00002055<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2056belongs to.
2057
2058FIXME: Generalize this for other kinds of declarations.
2059FIXME: What other kind of declarations would we need to generalize
2060this to?
2061
2062Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002063 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002064 ofClass(hasName("A"))))))
2065 class A {
2066 public:
2067 A();
2068 };
2069 A a = A();
2070</pre></td></tr>
2071
2072
Manuel Klimek67619ff2012-09-07 13:10:32 +00002073<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 +00002074<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2075a class matching Base.
2076
Manuel Klimek67619ff2012-09-07 13:10:32 +00002077Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002078
Manuel Klimek67619ff2012-09-07 13:10:32 +00002079Example matches Y, Z, C (Base == hasName("X"))
2080 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002081 class Y : public X {}; directly derived
2082 class Z : public Y {}; indirectly derived
2083 typedef X A;
2084 typedef A B;
2085 class C : public B {}; derived from a typedef of X
2086
2087In the following example, Bar matches isDerivedFrom(hasName("X")):
2088 class Foo;
2089 typedef Foo X;
2090 class Bar : public Foo {}; derived from a type that X is a typedef of
2091</pre></td></tr>
2092
2093
Daniel Jaspere0b89972012-12-04 12:08:08 +00002094<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>
2095<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2096match Base.
2097</pre></td></tr>
2098
2099
Manuel Klimek67619ff2012-09-07 13:10:32 +00002100<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 +00002101<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2102given matcher.
2103
Manuel Klimeke44a0062012-08-26 23:55:24 +00002104Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002105 class Y { public: void x(); };
2106 void z() { Y y; y.x();
2107</pre></td></tr>
2108
2109
Manuel Klimek67619ff2012-09-07 13:10:32 +00002110<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 +00002111<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2112expression.
2113
2114Given
2115 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002116callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002117 matches x(1, y, 42)
2118with hasAnyArgument(...)
2119 matching y
2120</pre></td></tr>
2121
2122
Manuel Klimek67619ff2012-09-07 13:10:32 +00002123<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 +00002124<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2125call expression.
2126
2127Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002128 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002129 void x(int) { int y; x(y); }
2130</pre></td></tr>
2131
2132
Daniel Jaspere0b89972012-12-04 12:08:08 +00002133<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</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>
2134<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00002135matcher.
2136
Daniel Jaspere0b89972012-12-04 12:08:08 +00002137Usable 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;,
2138 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002139</pre></td></tr>
2140
2141
Manuel Klimek67619ff2012-09-07 13:10:32 +00002142<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 +00002143<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2144
2145Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002146 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002147class URL { URL(string); };
2148URL url = "a string";
2149</pre></td></tr>
2150
2151
Manuel Klimek67619ff2012-09-07 13:10:32 +00002152<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 +00002153<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2154TemplateArgument matching the given InnerMatcher.
2155
2156Given
2157 template&lt;typename T&gt; class A {};
2158 template&lt;&gt; class A&lt;double&gt; {};
2159 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002160classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002161 refersToType(asString("int"))))
2162 matches the specialization A&lt;int&gt;
2163</pre></td></tr>
2164
2165
Manuel Klimek67619ff2012-09-07 13:10:32 +00002166<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 +00002167<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2168matches the given InnerMatcher.
2169
2170Given
2171 template&lt;typename T, typename U&gt; class A {};
2172 A&lt;bool, int&gt; b;
2173 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002174classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002175 1, refersToType(asString("int"))))
2176 matches the specialization A&lt;bool, int&gt;
2177</pre></td></tr>
2178
2179
Manuel Klimek41df16e2013-01-09 09:38:21 +00002180<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>
2181<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2182type.
2183
2184Given
2185 struct A {};
2186 A a[7];
2187 int b[7];
2188arrayType(hasElementType(builtinType()))
2189 matches "int b[7]"
2190
2191Usable 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;
2192</pre></td></tr>
2193
2194
2195<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>
2196<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2197type.
2198
2199Given
2200 struct A {};
2201 A a[7];
2202 int b[7];
2203arrayType(hasElementType(builtinType()))
2204 matches "int b[7]"
2205
2206Usable 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;
2207</pre></td></tr>
2208
2209
Manuel Klimek67619ff2012-09-07 13:10:32 +00002210<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 +00002211<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2212a given matcher.
2213
2214Given
2215 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002216hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002217 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002218with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002219 matching '{}'
2220</pre></td></tr>
2221
2222
Manuel Klimek67619ff2012-09-07 13:10:32 +00002223<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 +00002224<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2225or conditional operator.
2226
2227Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2228 if (true) {}
2229</pre></td></tr>
2230
2231
Manuel Klimek67619ff2012-09-07 13:10:32 +00002232<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 +00002233<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2234
2235Example matches b
2236 condition ? a : b
2237</pre></td></tr>
2238
2239
Manuel Klimek67619ff2012-09-07 13:10:32 +00002240<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 +00002241<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2242
2243Example matches a
2244 condition ? a : b
2245</pre></td></tr>
2246
2247
Manuel Klimek67619ff2012-09-07 13:10:32 +00002248<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 +00002249<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2250specific using shadow declaration.
2251
2252FIXME: This currently only works for functions. Fix.
2253
2254Given
2255 namespace a { void f() {} }
2256 using a::f;
2257 void g() {
2258 f(); Matches this ..
2259 a::f(); .. but not this.
2260 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002261declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002262 matches f()
2263</pre></td></tr>
2264
2265
Manuel Klimek67619ff2012-09-07 13:10:32 +00002266<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 +00002267<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2268specified matcher.
2269
2270Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002271 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002272 bool x;
2273 if (x) {}
2274</pre></td></tr>
2275
2276
Manuel Klimek67619ff2012-09-07 13:10:32 +00002277<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002278<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2279
2280Note that this does not work for global declarations because the AST
2281breaks up multiple-declaration DeclStmt's into multiple single-declaration
2282DeclStmt's.
2283Example: Given non-global declarations
2284 int a, b = 0;
2285 int c;
2286 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002287declStmt(containsDeclaration(
2288 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002289 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002290declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002291 matches 'int a, b = 0' as well as 'int d = 2, e;'
2292 but 'int c;' is not matched.
2293</pre></td></tr>
2294
2295
Manuel Klimek67619ff2012-09-07 13:10:32 +00002296<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002297<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2298
2299Given
2300 int a, b;
2301 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002302declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002303 matches 'int c;' but not 'int a, b;'.
2304</pre></td></tr>
2305
2306
Manuel Klimek67619ff2012-09-07 13:10:32 +00002307<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 +00002308<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2309a given body.
2310
2311Given
2312 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002313hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002314 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002315with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002316 matching '{}'
2317</pre></td></tr>
2318
2319
Manuel Klimek67619ff2012-09-07 13:10:32 +00002320<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 +00002321<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2322or conditional operator.
2323
2324Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2325 if (true) {}
2326</pre></td></tr>
2327
2328
Manuel Klimek67619ff2012-09-07 13:10:32 +00002329<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 +00002330<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2331
2332(Note: Clang's AST refers to other conversions as "casts" too, and calls
2333actual casts "explicit" casts.)
2334</pre></td></tr>
2335
2336
Manuel Klimek67619ff2012-09-07 13:10:32 +00002337<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 +00002338<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2339declaration's type.
2340
2341In case of a value declaration (for example a variable declaration),
2342this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002343declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2344while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002345of x."
2346
Manuel Klimeke44a0062012-08-26 23:55:24 +00002347Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2348 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002349 class X {};
2350 void y(X &amp;x) { x; X z; }
2351
2352Usable 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;
2353</pre></td></tr>
2354
2355
Manuel Klimek67619ff2012-09-07 13:10:32 +00002356<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 +00002357<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2358are stripped off.
2359
2360Parentheses and explicit casts are not discarded.
2361Given
2362 int arr[5];
2363 int a = 0;
2364 char b = 0;
2365 const int c = a;
2366 int *d = arr;
2367 long e = (long) 0l;
2368The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002369 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2370 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002371would match the declarations for a, b, c, and d, but not e.
2372While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002373 varDecl(hasInitializer(integerLiteral()))
2374 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002375only match the declarations for b, c, and d.
2376</pre></td></tr>
2377
2378
Manuel Klimek67619ff2012-09-07 13:10:32 +00002379<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 +00002380<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2381casts are stripped off.
2382
2383Implicit and non-C Style casts are also discarded.
2384Given
2385 int a = 0;
2386 char b = (0);
2387 void* c = reinterpret_cast&lt;char*&gt;(0);
2388 char d = char(0);
2389The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002390 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002391would match the declarations for a, b, c, and d.
2392while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002393 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002394only match the declaration for a.
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_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 +00002399<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2400parentheses are stripped off.
2401
2402Explicit casts are not discarded.
2403Given
2404 int arr[5];
2405 int a = 0;
2406 char b = (0);
2407 const int c = a;
2408 int *d = (arr);
2409 long e = ((long) 0l);
2410The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002411 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2412 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002413would match the declarations for a, b, c, and d, but not e.
2414while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002415 varDecl(hasInitializer(integerLiteral()))
2416 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002417would only match the declaration for a.
2418</pre></td></tr>
2419
2420
Manuel Klimek67619ff2012-09-07 13:10:32 +00002421<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 +00002422<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2423a given body.
2424
2425Given
2426 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002427hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002428 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002429with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002430 matching '{}'
2431</pre></td></tr>
2432
2433
Manuel Klimek67619ff2012-09-07 13:10:32 +00002434<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002435<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2436or conditional operator.
2437
2438Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2439 if (true) {}
2440</pre></td></tr>
2441
2442
Manuel Klimek67619ff2012-09-07 13:10:32 +00002443<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 +00002444<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2445
2446Example:
2447 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2448matches '++x' in
2449 for (x; x &lt; N; ++x) { }
2450</pre></td></tr>
2451
2452
Manuel Klimek67619ff2012-09-07 13:10:32 +00002453<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 +00002454<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2455
2456Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002457 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002458matches 'int x = 0' in
2459 for (int x = 0; x &lt; N; ++x) { }
2460</pre></td></tr>
2461
2462
Manuel Klimek67619ff2012-09-07 13:10:32 +00002463<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 +00002464<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2465
2466Does not match the 'this' parameter of a method.
2467
2468Given
2469 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002470methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002471 matches f(int x, int y, int z) {}
2472with hasAnyParameter(...)
2473 matching int y
2474</pre></td></tr>
2475
2476
Manuel Klimek67619ff2012-09-07 13:10:32 +00002477<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 +00002478<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2479
2480Given
2481 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002482methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002483 matches f(int x) {}
2484with hasParameter(...)
2485 matching int x
2486</pre></td></tr>
2487
2488
Manuel Klimek67619ff2012-09-07 13:10:32 +00002489<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 +00002490<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2491
2492Given:
2493 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002494methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002495 matches int f() { return 1; }
2496</pre></td></tr>
2497
2498
Manuel Klimek67619ff2012-09-07 13:10:32 +00002499<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002500<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
2501or conditional operator.
2502
2503Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2504 if (true) {}
2505</pre></td></tr>
2506
2507
Manuel Klimek67619ff2012-09-07 13:10:32 +00002508<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 +00002509<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
2510
2511Given
2512 if (A* a = GetAPointer()) {}
2513hasConditionVariableStatment(...)
2514 matches 'A* a = GetAPointer()'.
2515</pre></td></tr>
2516
2517
Manuel Klimek67619ff2012-09-07 13:10:32 +00002518<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 +00002519<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
2520matcher.
2521
2522FIXME: Unit test this matcher
2523</pre></td></tr>
2524
2525
Daniel Jaspere0b89972012-12-04 12:08:08 +00002526<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</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>
2527<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if the declaration of the type matches the given
2528matcher.
2529
2530Usable 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;,
2531 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
2532</pre></td></tr>
2533
2534
Manuel Klimek67619ff2012-09-07 13:10:32 +00002535<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 +00002536<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
2537matched by a given matcher.
2538
2539Given
2540 struct X { int m; };
2541 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002542memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002543 matches "x.m" and "m"
2544with hasObjectExpression(...)
2545 matching "x" and the implicit object expression of "m" which has type X*.
2546</pre></td></tr>
2547
2548
Manuel Klimek67619ff2012-09-07 13:10:32 +00002549<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 +00002550<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
2551given matcher.
2552
2553Given
2554 struct { int first, second; } first, second;
2555 int i(second.first);
2556 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002557memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002558 matches second.first
2559 but not first.second (because the member name there is "second").
2560</pre></td></tr>
2561
2562
Manuel Klimek41df16e2013-01-09 09:38:21 +00002563<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>
2564<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
2565pointee matches a given matcher.
2566
2567Given
2568 int *a;
2569 int const *b;
2570 float const *f;
2571pointerType(pointee(isConstQualified(), isInteger()))
2572 matches "int const *b"
2573
2574Usable 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;,
2575 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;
2576</pre></td></tr>
2577
2578
2579<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>
2580<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
2581pointee matches a given matcher.
2582
2583Given
2584 int *a;
2585 int const *b;
2586 float const *f;
2587pointerType(pointee(isConstQualified(), isInteger()))
2588 matches "int const *b"
2589
2590Usable 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;,
2591 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;
2592</pre></td></tr>
2593
2594
Manuel Klimek415514d2013-02-06 20:36:22 +00002595<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 +00002596<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
2597
2598Given
2599 struct A { struct B { struct C {}; }; };
2600 A::B::C c;
2601nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
2602 matches "A::"
2603</pre></td></tr>
2604
2605
Manuel Klimek41df16e2013-01-09 09:38:21 +00002606<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>
2607<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
2608NestedNameSpecifier-matcher matches.
2609</pre></td></tr>
2610
2611
Daniel Jaspere0b89972012-12-04 12:08:08 +00002612<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>
2613<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
2614given TypeLoc.
2615
2616Given
2617 struct A { struct B { struct C {}; }; };
2618 A::B::C c;
2619nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
2620 hasDeclaration(recordDecl(hasName("A")))))))
2621 matches "A::"
2622</pre></td></tr>
2623
2624
Manuel Klimek415514d2013-02-06 20:36:22 +00002625<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 +00002626<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
2627
2628Given
2629 struct A { struct B { struct C {}; }; };
2630 A::B::C c;
2631nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
2632 matches "A::"
2633</pre></td></tr>
2634
2635
2636<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>
2637<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
2638given namespace matcher.
2639
2640Given
2641 namespace ns { struct A {}; }
2642 ns::A a;
2643nestedNameSpecifier(specifiesNamespace(hasName("ns")))
2644 matches "ns::"
2645</pre></td></tr>
2646
2647
2648<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>
2649<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
2650given QualType matcher without qualifiers.
2651
2652Given
2653 struct A { struct B { struct C {}; }; };
2654 A::B::C c;
2655nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
2656 matches "A::"
2657</pre></td></tr>
2658
2659
Manuel Klimek41df16e2013-01-09 09:38:21 +00002660<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>
2661<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
2662pointee matches a given matcher.
2663
2664Given
2665 int *a;
2666 int const *b;
2667 float const *f;
2668pointerType(pointee(isConstQualified(), isInteger()))
2669 matches "int const *b"
2670
2671Usable 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;,
2672 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;
2673</pre></td></tr>
2674
2675
2676<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>
2677<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
2678pointee matches a given matcher.
2679
2680Given
2681 int *a;
2682 int const *b;
2683 float const *f;
2684pointerType(pointee(isConstQualified(), isInteger()))
2685 matches "int const *b"
2686
2687Usable 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;,
2688 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;
2689</pre></td></tr>
2690
2691
Daniel Jaspere0b89972012-12-04 12:08:08 +00002692<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</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>
2693<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 +00002694matcher.
2695
Daniel Jaspere0b89972012-12-04 12:08:08 +00002696Usable 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;,
2697 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002698</pre></td></tr>
2699
2700
Manuel Klimek67619ff2012-09-07 13:10:32 +00002701<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 +00002702<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
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_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 +00002707<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
2708</pre></td></tr>
2709
2710
Manuel Klimek41df16e2013-01-09 09:38:21 +00002711<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>
2712<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
2713pointee matches a given matcher.
2714
2715Given
2716 int *a;
2717 int const *b;
2718 float const *f;
2719pointerType(pointee(isConstQualified(), isInteger()))
2720 matches "int const *b"
2721
2722Usable 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;,
2723 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;
2724</pre></td></tr>
2725
2726
2727<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>
2728<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
2729pointee matches a given matcher.
2730
2731Given
2732 int *a;
2733 int const *b;
2734 float const *f;
2735pointerType(pointee(isConstQualified(), isInteger()))
2736 matches "int const *b"
2737
2738Usable 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;,
2739 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;
2740</pre></td></tr>
2741
2742
Manuel Klimek67619ff2012-09-07 13:10:32 +00002743<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 +00002744<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
2745alignof.
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_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 +00002750<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
2751sizeof.
2752</pre></td></tr>
2753
2754
Manuel Klimek67619ff2012-09-07 13:10:32 +00002755<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 +00002756<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
2757
2758Given
2759 template&lt;typename T&gt; struct A {};
2760 struct B { B* next; };
2761 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002762classTemplateSpecializationDecl(hasAnyTemplateArgument(
2763 refersToDeclaration(fieldDecl(hasName("next"))))
2764 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00002765 B::next
2766</pre></td></tr>
2767
2768
Manuel Klimek67619ff2012-09-07 13:10:32 +00002769<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 +00002770<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
2771
2772Given
2773 struct X {};
2774 template&lt;typename T&gt; struct A {};
2775 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002776classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002777 refersToType(class(hasName("X")))))
2778 matches the specialization A&lt;X&gt;
2779</pre></td></tr>
2780
2781
Manuel Klimek41df16e2013-01-09 09:38:21 +00002782<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>
2783<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
2784QualType-matcher matches.
2785</pre></td></tr>
2786
2787
Daniel Jaspere0b89972012-12-04 12:08:08 +00002788<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDecl0')"><a name="hasDecl0Anchor">hasDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt; InnerMatcher</td></tr>
2789<tr><td colspan="4" class="doc" id="hasDecl0"><pre>Matches TypedefTypes referring to a specific
2790TypedefNameDecl.
2791</pre></td></tr>
2792
2793
Manuel Klimek67619ff2012-09-07 13:10:32 +00002794<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002795<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
2796
2797Given
2798 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
2799unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
2800 matches sizeof(a) and alignof(c)
2801</pre></td></tr>
2802
2803
Manuel Klimek67619ff2012-09-07 13:10:32 +00002804<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 +00002805<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
2806
Daniel Jaspere0b89972012-12-04 12:08:08 +00002807Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002808 !true
2809</pre></td></tr>
2810
2811
Manuel Klimek67619ff2012-09-07 13:10:32 +00002812<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 +00002813<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
2814
2815Given
2816 namespace X { void b(); }
2817 using X::b;
2818usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
2819 matches using X::b </pre></td></tr>
2820
2821
Manuel Klimek67619ff2012-09-07 13:10:32 +00002822<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 +00002823<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
2824matched by the given matcher.
2825
2826Given
2827 namespace X { int a; void b(); }
2828 using X::a;
2829 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002830usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002831 matches using X::b but not using X::a </pre></td></tr>
2832
2833
Manuel Klimek67619ff2012-09-07 13:10:32 +00002834<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 +00002835<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
2836declaration's type.
2837
2838In case of a value declaration (for example a variable declaration),
2839this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002840declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2841while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002842of x."
2843
Manuel Klimeke44a0062012-08-26 23:55:24 +00002844Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2845 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002846 class X {};
2847 void y(X &amp;x) { x; X z; }
2848
2849Usable 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;
2850</pre></td></tr>
2851
2852
Manuel Klimek67619ff2012-09-07 13:10:32 +00002853<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 +00002854<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
2855that matches the given matcher.
2856
Manuel Klimeke44a0062012-08-26 23:55:24 +00002857Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002858 bool y() { return true; }
2859 bool x = y();
2860</pre></td></tr>
2861
2862
Daniel Jaspere0b89972012-12-04 12:08:08 +00002863<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>
2864<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
2865expression.
2866
2867Given
2868 void f(int b) {
2869 int a[b];
2870 }
2871variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
2872 varDecl(hasName("b")))))))
2873 matches "int a[b]"
2874</pre></td></tr>
2875
2876
Manuel Klimek67619ff2012-09-07 13:10:32 +00002877<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 +00002878<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
2879a given body.
2880
2881Given
2882 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002883hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002884 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002885with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002886 matching '{}'
2887</pre></td></tr>
2888
2889
Manuel Klimek67619ff2012-09-07 13:10:32 +00002890<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 +00002891<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
2892or conditional operator.
2893
2894Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2895 if (true) {}
2896</pre></td></tr>
2897
2898<!--END_TRAVERSAL_MATCHERS -->
2899</table>
2900
2901</div>
2902</body>
2903</html>
2904
2905