blob: b476065b8495559062921723189c4f7cf9fd982c [file] [log] [blame]
Manuel Klimek1da79332012-08-20 20:54:03 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10 padding: .33em;
11}
12td.doc {
13 display: none;
14 border-bottom: 1px solid black;
15}
16td.name:hover {
17 color: blue;
18 cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
Manuel Klimek67619ff2012-09-07 13:10:32 +000023 if (!id) return;
Manuel Klimek1da79332012-08-20 20:54:03 +000024 row = document.getElementById(id);
25 if (row.style.display != 'table-cell')
26 row.style.display = 'table-cell';
27 else
28 row.style.display = 'none';
29}
30</script>
31</head>
Manuel Klimek67619ff2012-09-07 13:10:32 +000032<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
Manuel Klimek1da79332012-08-20 20:54:03 +000033
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<!-- ======================================================================= -->
61<h2 id="decl-matchers">Node Matchers</h2>
62<!-- ======================================================================= -->
63
64<p>Node matchers are at the core of matcher expressions - they specify the type
65of node that is expected. Every match expression starts with a node matcher,
66which can then be further refined with a narrowing or traversal matcher. All
67traversal matchers take node matchers as their arguments.</p>
68
69<p>For convenience, all node matchers take an arbitrary number of arguments
70and implicitly act as allOf matchers.</p>
71
72<p>Node matchers are the only matchers that support the bind("id") call to
73bind the matched node to the given string, to be later retrieved from the
74match callback.</p>
75
76<table>
77<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
78<!-- START_DECL_MATCHERS -->
79
Daniel Jasperc7093d92013-02-25 12:39:41 +000080<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
81<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
82
83Given
84 class C {
85 public:
86 int a;
87 };
88accessSpecDecl()
89 matches 'public:'
90</pre></td></tr>
91
92
Manuel Klimek67619ff2012-09-07 13:10:32 +000093<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +000094<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +000095
96Example matches Z
97 template&lt;class T&gt; class Z {};
98</pre></td></tr>
99
100
Manuel Klimek67619ff2012-09-07 13:10:32 +0000101<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000102<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000103
104Given
105 template&lt;typename T&gt; class A {};
106 template&lt;&gt; class A&lt;double&gt; {};
107 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000108classTemplateSpecializationDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000109 matches the specializations A&lt;int&gt; and A&lt;double&gt;
110</pre></td></tr>
111
112
Manuel Klimek67619ff2012-09-07 13:10:32 +0000113<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000114<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000115
116Example matches Foo::Foo() and Foo::Foo(int)
117 class Foo {
118 public:
119 Foo();
120 Foo(int);
121 int DoSomething();
122 };
123</pre></td></tr>
124
125
Manuel Klimek67619ff2012-09-07 13:10:32 +0000126<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000127<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
128
129Examples matches X, C, and the friend declaration inside C;
130 void X();
131 class C {
132 friend X;
133 };
134</pre></td></tr>
135
136
Manuel Klimek67619ff2012-09-07 13:10:32 +0000137<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000138<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000139
140Example matches Foo::~Foo()
141 class Foo {
142 public:
143 virtual ~Foo();
144 };
145</pre></td></tr>
146
147
Manuel Klimek67619ff2012-09-07 13:10:32 +0000148<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000149<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000150
151Example matches A, B, C
152 enum X {
153 A, B, C
154 };
155</pre></td></tr>
156
157
Manuel Klimek67619ff2012-09-07 13:10:32 +0000158<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +0000159<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
160
161Example matches X
162 enum X {
163 A, B, C
164 };
165</pre></td></tr>
166
167
Manuel Klimek67619ff2012-09-07 13:10:32 +0000168<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000169<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000170
171Given
172 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000173fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000174 matches 'm'.
175</pre></td></tr>
176
177
Manuel Klimek67619ff2012-09-07 13:10:32 +0000178<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000179<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000180
181Example matches f
182 void f();
183</pre></td></tr>
184
185
Manuel Klimek67619ff2012-09-07 13:10:32 +0000186<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000187<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000188
189Example matches f
190 template&lt;class T&gt; void f(T t) {}
191</pre></td></tr>
192
193
Manuel Klimek67619ff2012-09-07 13:10:32 +0000194<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000195<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000196
197Example matches y
198 class X { void y() };
199</pre></td></tr>
200
201
Manuel Klimek67619ff2012-09-07 13:10:32 +0000202<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
Manuel Klimeke44a0062012-08-26 23:55:24 +0000203<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
Manuel Klimek1da79332012-08-20 20:54:03 +0000204
205Example matches X, S, the anonymous union type, i, and U;
206 typedef int X;
207 struct S {
208 union {
209 int i;
210 } U;
211 };
212</pre></td></tr>
213
214
Manuel Klimek67619ff2012-09-07 13:10:32 +0000215<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000216<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000217
218Example matches X, Z
219 class X;
220 template&lt;class T&gt; class Z {};
221</pre></td></tr>
222
223
Manuel Klimek67619ff2012-09-07 13:10:32 +0000224<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 +0000225<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
226
227Given
228 namespace X { int x; }
229 using X::x;
230usingDecl()
231 matches using X::x </pre></td></tr>
232
233
Manuel Klimek67619ff2012-09-07 13:10:32 +0000234<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 +0000235<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000236
237Note: this does not match declarations of member variables, which are
238"field" declarations in Clang parlance.
239
240Example matches a
241 int a;
242</pre></td></tr>
243
244
Manuel Klimek41df16e2013-01-09 09:38:21 +0000245<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>
246<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
247</pre></td></tr>
248
249
250<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>
251<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
252
253Given
254 namespace ns {
255 struct A { static void f(); };
256 void A::f() {}
257 void g() { A::f(); }
258 }
259 ns::A a;
260nestedNameSpecifier()
261 matches "ns::" and both "A::"
262</pre></td></tr>
263
264
265<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>
266<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
267</pre></td></tr>
268
269
Manuel Klimek67619ff2012-09-07 13:10:32 +0000270<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 +0000271<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
272
273Given
274 int i = a[1];
275arraySubscriptExpr()
276 matches "a[1]"
277</pre></td></tr>
278
279
Daniel Jaspere0b89972012-12-04 12:08:08 +0000280<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>
281<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
282
283 int i = 100;
284 __asm("mov al, 2");
285asmStmt()
286 matches '__asm("mov al, 2")'
287</pre></td></tr>
288
289
Manuel Klimek67619ff2012-09-07 13:10:32 +0000290<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 +0000291<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
292
293Example matches a || b
294 !(a || b)
295</pre></td></tr>
296
297
Manuel Klimek67619ff2012-09-07 13:10:32 +0000298<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 +0000299<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000300
301Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000302 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000303 FunctionTakesString(GetStringByValue());
304 FunctionTakesStringByPointer(GetStringPointer());
305</pre></td></tr>
306
307
Daniel Jaspere0b89972012-12-04 12:08:08 +0000308<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>
309<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
310
311Example matches true
312 true
313</pre></td></tr>
314
315
316<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>
317<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
318
319Given
320 while (true) { break; }
321breakStmt()
322 matches 'break'
323</pre></td></tr>
324
325
326<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>
327<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
328
329Example: Matches (int*) 2.2f in
330 int i = (int) 2.2f;
331</pre></td></tr>
332
333
Manuel Klimek67619ff2012-09-07 13:10:32 +0000334<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 +0000335<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000336
337Example matches x.y() and y()
338 X x;
339 x.y();
340 y();
341</pre></td></tr>
342
343
Daniel Jaspere0b89972012-12-04 12:08:08 +0000344<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>
345<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
346
347Example: castExpr() matches each of the following:
348 (int) 3;
349 const_cast&lt;Expr *&gt;(SubExpr);
350 char c = 0;
351but does not match
352 int i = (0);
353 int k = 0;
354</pre></td></tr>
355
356
357<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>
358<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
359
360 try {} catch(int i) {}
361catchStmt()
362 matches 'catch(int i)'
363</pre></td></tr>
364
365
366<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>
367<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
368
369Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
370though.
371
372Example matches 'a', L'a'
373 char ch = 'a'; wchar_t chw = L'a';
374</pre></td></tr>
375
376
Manuel Klimek415514d2013-02-06 20:36:22 +0000377<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>
378<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
379
380Example match: {1}, (1, 2)
381 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
382</pre></td></tr>
383
384
Manuel Klimek67619ff2012-09-07 13:10:32 +0000385<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 +0000386<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000387
388Example matches '{}' and '{{}}'in 'for (;;) {{}}'
389 for (;;) {{}}
390</pre></td></tr>
391
392
Manuel Klimek67619ff2012-09-07 13:10:32 +0000393<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 +0000394<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
395
396Example matches a ? b : c
397 (a ? b : c) + 42
398</pre></td></tr>
399
400
Daniel Jaspere0b89972012-12-04 12:08:08 +0000401<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>
402<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
403
404Example: Matches const_cast&lt;int*&gt;(&amp;r) in
405 int n = 42;
406 const int &amp;r(n);
407 int* p = const_cast&lt;int*&gt;(&amp;r);
408</pre></td></tr>
409
410
Manuel Klimek67619ff2012-09-07 13:10:32 +0000411<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 +0000412<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000413
414Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000415 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000416 void f(const string &amp;a, const string &amp;b);
417 char *ptr;
418 int n;
419 f(string(ptr, n), ptr);
420</pre></td></tr>
421
422
Daniel Jaspere0b89972012-12-04 12:08:08 +0000423<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>
424<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
425
426Given
427 while (true) { continue; }
428continueStmt()
429 matches 'continue'
430</pre></td></tr>
431
432
Manuel Klimek67619ff2012-09-07 13:10:32 +0000433<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 +0000434<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000435
436Example matches x in if (x)
437 bool x;
438 if (x) {}
439</pre></td></tr>
440
441
Manuel Klimek67619ff2012-09-07 13:10:32 +0000442<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 +0000443<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000444
445Given
446 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000447declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000448 matches 'int a'.
449</pre></td></tr>
450
451
Manuel Klimek67619ff2012-09-07 13:10:32 +0000452<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 +0000453<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 +0000454
455Example matches the CXXDefaultArgExpr placeholder inserted for the
456 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000457 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000458 void f(int x, int y = 0);
459 f(42);
460</pre></td></tr>
461
462
Manuel Klimek67619ff2012-09-07 13:10:32 +0000463<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000464<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000465
466Given
467 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000468deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000469 matches 'delete X'.
470</pre></td></tr>
471
472
Manuel Klimek67619ff2012-09-07 13:10:32 +0000473<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000474<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
475
476Given
477 do {} while (true);
478doStmt()
479 matches 'do {} while(true)'
480</pre></td></tr>
481
482
Daniel Jaspere0b89972012-12-04 12:08:08 +0000483<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>
484<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
485
486Example:
487 dynamicCastExpr()
488matches
489 dynamic_cast&lt;D*&gt;(&amp;b);
490in
491 struct B { virtual ~B() {} }; struct D : B {};
492 B b;
493 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
494</pre></td></tr>
495
496
497<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>
498<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
499
500Matches any cast expression written in user code, whether it be a
501C-style cast, a functional-style cast, or a keyword cast.
502
503Does not match implicit conversions.
504
505Note: the name "explicitCast" is chosen to match Clang's terminology, as
506Clang uses the term "cast" to apply to implicit conversions as well as to
507actual cast expressions.
508
509hasDestinationType.
510
511Example: matches all five of the casts in
512 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
513but does not match the implicit conversion in
514 long ell = 42;
515</pre></td></tr>
516
517
Manuel Klimek67619ff2012-09-07 13:10:32 +0000518<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 +0000519<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000520
521Example matches x()
522 void f() { x(); }
523</pre></td></tr>
524
525
Daniel Jaspere0b89972012-12-04 12:08:08 +0000526<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>
527<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
528
529forRangeStmt() matches 'for (auto a : i)'
530 int i[] = {1, 2, 3}; for (auto a : i);
531 for(int j = 0; j &lt; 5; ++j);
532</pre></td></tr>
533
534
Manuel Klimek67619ff2012-09-07 13:10:32 +0000535<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000536<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
537
538Example matches 'for (;;) {}'
539 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000540 int i[] = {1, 2, 3}; for (auto a : i);
541</pre></td></tr>
542
543
544<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>
545<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
546
547Example: Matches Foo(bar);
548 Foo f = bar;
549 Foo g = (Foo) bar;
550 Foo h = Foo(bar);
551</pre></td></tr>
552
553
554<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>
555<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
556
557Given
558 goto FOO;
559 FOO: bar();
560gotoStmt()
561 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000562</pre></td></tr>
563
564
Manuel Klimek67619ff2012-09-07 13:10:32 +0000565<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 +0000566<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
567
568Example matches 'if (x) {}'
569 if (x) {}
570</pre></td></tr>
571
572
Daniel Jaspere0b89972012-12-04 12:08:08 +0000573<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>
574<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
575
576This matches many different places, including function call return value
577eliding, as well as any type conversions.
578</pre></td></tr>
579
580
Manuel Klimek67619ff2012-09-07 13:10:32 +0000581<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 +0000582<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
583
584Given
585 int a[] = { 1, 2 };
586 struct B { int x, y; };
587 B b = { 5, 6 };
588initList()
589 matches "{ 1, 2 }" and "{ 5, 6 }"
590</pre></td></tr>
591
592
Daniel Jaspere0b89972012-12-04 12:08:08 +0000593<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>
594<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
595
596Not matching character-encoded integers such as L'a'.
597
598Example matches 1, 1L, 0x1, 1U
599</pre></td></tr>
600
601
602<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>
603<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
604
605Given
606 goto FOO;
607 FOO: bar();
608labelStmt()
609 matches 'FOO:'
610</pre></td></tr>
611
612
613<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
614<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
615
616Example matches [&amp;](){return 5;}
617 [&amp;](){return 5;}
618</pre></td></tr>
619
620
Manuel Klimek67619ff2012-09-07 13:10:32 +0000621<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 +0000622<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
623
624Example: Given
625 struct T {void func()};
626 T f();
627 void g(T);
628materializeTemporaryExpr() matches 'f()' in these statements
629 T u(f());
630 g(f());
631but does not match
632 f();
633 f().func();
634</pre></td></tr>
635
636
Manuel Klimek67619ff2012-09-07 13:10:32 +0000637<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 +0000638<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000639
640Example matches x.y()
641 X x;
642 x.y();
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('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 +0000647<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000648
649Given
650 class Y {
651 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
652 int a; static int b;
653 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000654memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000655 matches this-&gt;x, x, y.x, a, this-&gt;b
656</pre></td></tr>
657
658
Manuel Klimek67619ff2012-09-07 13:10:32 +0000659<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 +0000660<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000661
662Given
663 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000664newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000665 matches 'new X'.
666</pre></td></tr>
667
668
Daniel Jaspere0b89972012-12-04 12:08:08 +0000669<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>
670<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
671</pre></td></tr>
672
673
674<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>
675<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
676
677 foo();;
678nullStmt()
679 matches the second ';'
680</pre></td></tr>
681
682
Manuel Klimek67619ff2012-09-07 13:10:32 +0000683<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 +0000684<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000685
686Note that if an operator isn't overloaded, it won't match. Instead, use
687binaryOperator matcher.
688Currently it does not match operators such as new delete.
689FIXME: figure out why these do not match?
690
691Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000692 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000693 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
694 ostream &amp;o; int b = 1, c = 1;
695 o &lt;&lt; b &lt;&lt; c;
696</pre></td></tr>
697
698
Daniel Jaspere0b89972012-12-04 12:08:08 +0000699<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>
700<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
701
702Either the source expression or the destination type can be matched
703using has(), but hasDestinationType() is more specific and can be
704more readable.
705
706Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
707 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
708</pre></td></tr>
709
710
711<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>
712<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
713
714Given
715 return 1;
716returnStmt()
717 matches 'return 1'
718</pre></td></tr>
719
720
721<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>
722<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
723
724hasDestinationType
725reinterpretCast
726
727Example:
728 staticCastExpr()
729matches
730 static_cast&lt;long&gt;(8)
731in
732 long eight(static_cast&lt;long&gt;(8));
733</pre></td></tr>
734
735
Manuel Klimek67619ff2012-09-07 13:10:32 +0000736<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 +0000737<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000738
739Given
740 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000741stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000742 matches both the compound statement '{ ++a; }' and '++a'.
743</pre></td></tr>
744
745
Daniel Jaspere0b89972012-12-04 12:08:08 +0000746<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>
747<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
748
749Example matches "abcd", L"abcd"
750 char *s = "abcd"; wchar_t *ws = L"abcd"
751</pre></td></tr>
752
753
Manuel Klimek67619ff2012-09-07 13:10:32 +0000754<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 +0000755<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
756
757Given
758 switch(a) { case 42: break; default: break; }
759switchCase()
760 matches 'case 42: break;' and 'default: break;'.
761</pre></td></tr>
762
763
Daniel Jaspere0b89972012-12-04 12:08:08 +0000764<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>
765<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
766
767Given
768 switch(a) { case 42: break; default: break; }
769switchStmt()
770 matches 'switch(a)'.
771</pre></td></tr>
772
773
774<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>
775<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
776
777Example matches the implicit this expression in "return i".
778 (matcher = thisExpr())
779struct foo {
780 int i;
781 int f() { return i; }
782};
783</pre></td></tr>
784
785
786<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>
787<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
788
789 try { throw 5; } catch(int i) {}
790throwExpr()
791 matches 'throw 5'
792</pre></td></tr>
793
794
795<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>
796<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
797
798 try {} catch(int i) {}
799tryStmt()
800 matches 'try {}'
801</pre></td></tr>
802
803
Manuel Klimek67619ff2012-09-07 13:10:32 +0000804<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 +0000805<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
806
807Given
808 Foo x = bar;
809 int y = sizeof(x) + alignof(x);
810unaryExprOrTypeTraitExpr()
811 matches sizeof(x) and alignof(x)
812</pre></td></tr>
813
814
Manuel Klimek67619ff2012-09-07 13:10:32 +0000815<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000816<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
817
818Example matches !a
819 !a || b
820</pre></td></tr>
821
822
Daniel Jaspere0b89972012-12-04 12:08:08 +0000823<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>
824<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
825
826Example match: "foo"_suffix
827</pre></td></tr>
828
829
Manuel Klimek67619ff2012-09-07 13:10:32 +0000830<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 +0000831<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
832
833Given
834 while (true) {}
835whileStmt()
836 matches 'while (true) {}'.
837</pre></td></tr>
838
Daniel Jaspere0b89972012-12-04 12:08:08 +0000839
Manuel Klimek41df16e2013-01-09 09:38:21 +0000840<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>
841<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
842
843Given
844 int a[] = { 2, 3 };
845 int b[4];
846 void f() { int c[a[0]]; }
847arrayType()
848 matches "int a[]", "int b[4]" and "int c[a[0]]";
849</pre></td></tr>
850
851
852<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>
853<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
854
855Given
856 _Atomic(int) i;
857atomicType()
858 matches "_Atomic(int) i"
859</pre></td></tr>
860
861
862<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>
863<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
864
865Given:
866 auto n = 4;
867 int v[] = { 2, 3 }
868 for (auto i : v) { }
869autoType()
870 matches "auto n" and "auto i"
871</pre></td></tr>
872
873
874<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>
875<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
876"void (^)(int)".
877
878The pointee is always required to be a FunctionType.
879</pre></td></tr>
880
881
882<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>
883<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
884
885Given
886 struct A {};
887 A a;
888 int b;
889 float c;
890 bool d;
891builtinType()
892 matches "int b", "float c" and "bool d"
893</pre></td></tr>
894
895
896<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>
897<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
898
899Given
900 _Complex float f;
901complexType()
902 matches "_Complex float f"
903</pre></td></tr>
904
905
906<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>
907<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
908
909Given
910 void() {
911 int a[2];
912 int b[] = { 2, 3 };
913 int c[b[0]];
914 }
915constantArrayType()
916 matches "int a[2]"
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('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>
921<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
922
923Given
924 template&lt;typename T, int Size&gt;
925 class array {
926 T data[Size];
927 };
928dependentSizedArrayType
929 matches "T data[Size]"
930</pre></td></tr>
931
932
Edwin Vane742d9e72013-02-25 20:43:32 +0000933<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
934<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
935qualified name.
936
937Given
938 namespace N {
939 namespace M {
940 class D {};
941 }
942 }
943 class C {};
944
945 class C c;
946 N::M::D d;
947
948elaboratedType() matches the type of the variable declarations of both
949c and d.
950</pre></td></tr>
951
952
Manuel Klimek41df16e2013-01-09 09:38:21 +0000953<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>
954<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
955
956Given
957 int (*f)(int);
958 void g();
959functionType()
960 matches "int (*f)(int)" and the type of "g".
961</pre></td></tr>
962
963
964<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>
965<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
966
967Given
968 int a[] = { 2, 3 };
969 int b[42];
970 void f(int c[]) { int d[a[0]]; };
971incompleteArrayType()
972 matches "int a[]" and "int c[]"
973</pre></td></tr>
974
975
Edwin Vane8203d9f2013-03-28 13:50:22 +0000976<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceTypeLoc0')"><a name="lValueReferenceTypeLoc0Anchor">lValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceTypeLoc.html">LValueReferenceTypeLoc</a>&gt;...</td></tr>
977<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +0000978
979Given:
980 int *a;
981 int &amp;b = *a;
982 int &amp;&amp;c = 1;
983 auto &amp;d = b;
984 auto &amp;&amp;e = c;
985 auto &amp;&amp;f = 2;
986 int g = 5;
987
Edwin Vane8203d9f2013-03-28 13:50:22 +0000988lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +0000989matched since the type is deduced as int&amp; by reference collapsing rules.
990</pre></td></tr>
991
992
Manuel Klimek41df16e2013-01-09 09:38:21 +0000993<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>
994<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
995Given
996 struct A { int i; }
997 A::* ptr = A::i;
998memberPointerType()
999 matches "A::* ptr"
1000</pre></td></tr>
1001
1002
Edwin Vane88be2fd2013-04-01 18:33:34 +00001003<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('parenTypeLoc0')"><a name="parenTypeLoc0Anchor">parenTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenTypeLoc.html">ParenTypeLoc</a>&gt;...</td></tr>
1004<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1005
1006Given
1007 int (*ptr_to_array)[4];
1008 int *array_of_ptrs[4];
1009
1010varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1011array_of_ptrs.
1012</pre></td></tr>
1013
1014
Manuel Klimek41df16e2013-01-09 09:38:21 +00001015<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>
1016<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1017
1018Given
1019 int *a;
1020 int &amp;b = *a;
1021 int c = 5;
1022pointerType()
1023 matches "int *a"
1024</pre></td></tr>
1025
1026
Edwin Vane8203d9f2013-03-28 13:50:22 +00001027<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceTypeLoc0')"><a name="rValueReferenceTypeLoc0Anchor">rValueReferenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceTypeLoc.html">RValueReferenceTypeLoc</a>&gt;...</td></tr>
1028<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1029
1030Given:
1031 int *a;
1032 int &amp;b = *a;
1033 int &amp;&amp;c = 1;
1034 auto &amp;d = b;
1035 auto &amp;&amp;e = c;
1036 auto &amp;&amp;f = 2;
1037 int g = 5;
1038
1039rValueReferenceType() matches the types of c and f. e is not
1040matched as it is deduced to int&amp; by reference collapsing rules.
1041</pre></td></tr>
1042
1043
Edwin Vane742d9e72013-02-25 20:43:32 +00001044<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('recordTypeLoc0')"><a name="recordTypeLoc0Anchor">recordTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordTypeLoc.html">RecordTypeLoc</a>&gt;...</td></tr>
1045<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1046
1047Given
1048 class C {};
1049 struct S {};
1050
1051 C c;
1052 S s;
1053
1054recordType() matches the type of the variable declarations of both c
1055and s.
1056</pre></td></tr>
1057
1058
Manuel Klimek41df16e2013-01-09 09:38:21 +00001059<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
Edwin Vanef4b48042013-03-07 15:44:40 +00001060<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001061
1062Given
1063 int *a;
1064 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001065 int &amp;&amp;c = 1;
1066 auto &amp;d = b;
1067 auto &amp;&amp;e = c;
1068 auto &amp;&amp;f = 2;
1069 int g = 5;
1070
1071referenceType() matches the types of b, c, d, e, and f.
1072</pre></td></tr>
1073
1074
Edwin Vane3abf7782013-02-25 14:49:29 +00001075<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
1076<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1077
1078Given
1079 template &lt;typename T&gt;
1080 class C { };
1081
1082 template class C&lt;int&gt;; A
1083 C&lt;char&gt; var; B
1084
1085templateSpecializationType() matches the type of the explicit
1086instantiation in A and the type of the variable declaration in B.
1087</pre></td></tr>
1088
1089
Daniel Jaspere0b89972012-12-04 12:08:08 +00001090<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('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>
1091<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1092</pre></td></tr>
1093
1094
Manuel Klimek41df16e2013-01-09 09:38:21 +00001095<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>
1096<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1097
1098Given
1099 typedef int X;
1100typedefType()
1101 matches "typedef int X"
1102</pre></td></tr>
1103
1104
1105<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>
1106<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1107integer-constant-expression.
1108
1109Given
1110 void f() {
1111 int a[] = { 2, 3 }
1112 int b[42];
1113 int c[a[0]];
1114variableArrayType()
1115 matches "int c[a[0]]"
1116</pre></td></tr>
1117
1118
1119<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>
1120<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1121
1122Given
1123 int a[] = { 2, 3 };
1124 int b[4];
1125 void f() { int c[a[0]]; }
1126arrayType()
1127 matches "int a[]", "int b[4]" and "int c[a[0]]";
1128</pre></td></tr>
1129
1130
1131<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>
1132<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1133
1134Given
1135 _Atomic(int) i;
1136atomicType()
1137 matches "_Atomic(int) i"
1138</pre></td></tr>
1139
1140
1141<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>
1142<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1143
1144Given:
1145 auto n = 4;
1146 int v[] = { 2, 3 }
1147 for (auto i : v) { }
1148autoType()
1149 matches "auto n" and "auto i"
1150</pre></td></tr>
1151
1152
1153<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>
1154<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1155"void (^)(int)".
1156
1157The pointee is always required to be a FunctionType.
1158</pre></td></tr>
1159
1160
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('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>
1162<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1163
1164Given
1165 struct A {};
1166 A a;
1167 int b;
1168 float c;
1169 bool d;
1170builtinType()
1171 matches "int b", "float c" and "bool d"
1172</pre></td></tr>
1173
1174
1175<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>
1176<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1177
1178Given
1179 _Complex float f;
1180complexType()
1181 matches "_Complex float f"
1182</pre></td></tr>
1183
1184
1185<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>
1186<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1187
1188Given
1189 void() {
1190 int a[2];
1191 int b[] = { 2, 3 };
1192 int c[b[0]];
1193 }
1194constantArrayType()
1195 matches "int a[2]"
1196</pre></td></tr>
1197
1198
1199<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>
1200<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1201
1202Given
1203 template&lt;typename T, int Size&gt;
1204 class array {
1205 T data[Size];
1206 };
1207dependentSizedArrayType
1208 matches "T data[Size]"
1209</pre></td></tr>
1210
1211
Edwin Vane742d9e72013-02-25 20:43:32 +00001212<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
1213<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1214qualified name.
1215
1216Given
1217 namespace N {
1218 namespace M {
1219 class D {};
1220 }
1221 }
1222 class C {};
1223
1224 class C c;
1225 N::M::D d;
1226
1227elaboratedType() matches the type of the variable declarations of both
1228c and d.
1229</pre></td></tr>
1230
1231
Manuel Klimek41df16e2013-01-09 09:38:21 +00001232<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>
1233<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1234
1235Given
1236 int (*f)(int);
1237 void g();
1238functionType()
1239 matches "int (*f)(int)" and the type of "g".
1240</pre></td></tr>
1241
1242
1243<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>
1244<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1245
1246Given
1247 int a[] = { 2, 3 };
1248 int b[42];
1249 void f(int c[]) { int d[a[0]]; };
1250incompleteArrayType()
1251 matches "int a[]" and "int c[]"
1252</pre></td></tr>
1253
1254
Edwin Vane8203d9f2013-03-28 13:50:22 +00001255<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
1256<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001257
1258Given:
1259 int *a;
1260 int &amp;b = *a;
1261 int &amp;&amp;c = 1;
1262 auto &amp;d = b;
1263 auto &amp;&amp;e = c;
1264 auto &amp;&amp;f = 2;
1265 int g = 5;
1266
Edwin Vane8203d9f2013-03-28 13:50:22 +00001267lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001268matched since the type is deduced as int&amp; by reference collapsing rules.
1269</pre></td></tr>
1270
1271
Manuel Klimek41df16e2013-01-09 09:38:21 +00001272<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>
1273<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1274Given
1275 struct A { int i; }
1276 A::* ptr = A::i;
1277memberPointerType()
1278 matches "A::* ptr"
1279</pre></td></tr>
1280
1281
Edwin Vane88be2fd2013-04-01 18:33:34 +00001282<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
1283<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1284
1285Given
1286 int (*ptr_to_array)[4];
1287 int *array_of_ptrs[4];
1288
1289varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1290array_of_ptrs.
1291</pre></td></tr>
1292
1293
Manuel Klimek41df16e2013-01-09 09:38:21 +00001294<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>
1295<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1296
1297Given
1298 int *a;
1299 int &amp;b = *a;
1300 int c = 5;
1301pointerType()
1302 matches "int *a"
1303</pre></td></tr>
1304
1305
Edwin Vane8203d9f2013-03-28 13:50:22 +00001306<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
1307<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1308
1309Given:
1310 int *a;
1311 int &amp;b = *a;
1312 int &amp;&amp;c = 1;
1313 auto &amp;d = b;
1314 auto &amp;&amp;e = c;
1315 auto &amp;&amp;f = 2;
1316 int g = 5;
1317
1318rValueReferenceType() matches the types of c and f. e is not
1319matched as it is deduced to int&amp; by reference collapsing rules.
1320</pre></td></tr>
1321
1322
Edwin Vane742d9e72013-02-25 20:43:32 +00001323<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
1324<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1325
1326Given
1327 class C {};
1328 struct S {};
1329
1330 C c;
1331 S s;
1332
1333recordType() matches the type of the variable declarations of both c
1334and s.
1335</pre></td></tr>
1336
1337
Manuel Klimek41df16e2013-01-09 09:38:21 +00001338<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
Edwin Vanef4b48042013-03-07 15:44:40 +00001339<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001340
1341Given
1342 int *a;
1343 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001344 int &amp;&amp;c = 1;
1345 auto &amp;d = b;
1346 auto &amp;&amp;e = c;
1347 auto &amp;&amp;f = 2;
1348 int g = 5;
1349
1350referenceType() matches the types of b, c, d, e, and f.
1351</pre></td></tr>
1352
1353
Edwin Vane3abf7782013-02-25 14:49:29 +00001354<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
1355<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1356
1357Given
1358 template &lt;typename T&gt;
1359 class C { };
1360
1361 template class C&lt;int&gt;; A
1362 C&lt;char&gt; var; B
1363
1364templateSpecializationType() matches the type of the explicit
1365instantiation in A and the type of the variable declaration in B.
1366</pre></td></tr>
1367
1368
Daniel Jaspere0b89972012-12-04 12:08:08 +00001369<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1370<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1371</pre></td></tr>
1372
Manuel Klimek41df16e2013-01-09 09:38:21 +00001373
1374<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>
1375<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1376
1377Given
1378 typedef int X;
1379typedefType()
1380 matches "typedef int X"
1381</pre></td></tr>
1382
1383
1384<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>
1385<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1386integer-constant-expression.
1387
1388Given
1389 void f() {
1390 int a[] = { 2, 3 }
1391 int b[42];
1392 int c[a[0]];
1393variableArrayType()
1394 matches "int c[a[0]]"
1395</pre></td></tr>
1396
Manuel Klimek1da79332012-08-20 20:54:03 +00001397<!--END_DECL_MATCHERS -->
1398</table>
1399
1400<!-- ======================================================================= -->
1401<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1402<!-- ======================================================================= -->
1403
1404<p>Narrowing matchers match certain attributes on the current node, thus
1405narrowing down the set of nodes of the current type to match on.</p>
1406
1407<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1408which allow users to create more powerful match expressions.</p>
1409
1410<table>
1411<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1412<!-- START_NARROWING_MATCHERS -->
1413
Manuel Klimek67619ff2012-09-07 13:10:32 +00001414<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 +00001415<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1416
1417Usable as: Any Matcher
1418</pre></td></tr>
1419
1420
Manuel Klimek67619ff2012-09-07 13:10:32 +00001421<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 +00001422<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1423
1424Usable as: Any Matcher
1425</pre></td></tr>
1426
1427
Manuel Klimek67619ff2012-09-07 13:10:32 +00001428<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 +00001429<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1430
1431Useful when another matcher requires a child matcher, but there's no
1432additional constraint. This will often be used with an explicit conversion
1433to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1434
1435Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1436"int* p" and "void f()" in
1437 int* p;
1438 void f();
1439
1440Usable as: Any Matcher
1441</pre></td></tr>
1442
1443
Manuel Klimek67619ff2012-09-07 13:10:32 +00001444<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 +00001445<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1446
Manuel Klimeke44a0062012-08-26 23:55:24 +00001447Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001448 class X {};
1449 class Y {};
1450
1451Usable as: Any Matcher
1452</pre></td></tr>
1453
1454
Manuel Klimek67619ff2012-09-07 13:10:32 +00001455<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 +00001456<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1457unary).
1458
1459Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1460 !(a || b)
1461</pre></td></tr>
1462
1463
Manuel Klimek67619ff2012-09-07 13:10:32 +00001464<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 +00001465<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1466
1467Example matches true (matcher = boolLiteral(equals(true)))
1468 true
1469
1470Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1471 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;
1472</pre></td></tr>
1473
1474
Manuel Klimek67619ff2012-09-07 13:10:32 +00001475<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 +00001476<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1477by the compiler (eg. implicit defaultcopy constructors).
1478</pre></td></tr>
1479
1480
Manuel Klimek67619ff2012-09-07 13:10:32 +00001481<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 +00001482<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1483code (as opposed to implicitly added by the compiler).
1484
1485Given
1486 struct Foo {
1487 Foo() { }
1488 Foo(int) : foo_("A") { }
1489 string foo_;
1490 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001491constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001492 will match Foo(int), but not Foo()
1493</pre></td></tr>
1494
1495
Edwin Vane6a19a972013-03-06 17:02:57 +00001496<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Manuel Klimek1da79332012-08-20 20:54:03 +00001497<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1498
1499Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001500"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001501
Edwin Vane6a19a972013-03-06 17:02:57 +00001502Given:
1503 class A { int operator*(); };
1504 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1505 A a;
1506 a &lt;&lt; a; &lt;-- This matches
1507
1508operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1509line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1510the declaration of A.
1511
1512Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;
1513</pre></td></tr>
1514
1515
1516<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
1517<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1518
1519Matches overloaded operator names specified in strings without the
1520"operator" prefix: e.g. "&lt;&lt;".
1521
1522Given:
1523 class A { int operator*(); };
1524 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1525 A a;
1526 a &lt;&lt; a; &lt;-- This matches
1527
1528operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1529line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1530the declaration of A.
1531
1532Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00001533</pre></td></tr>
1534
1535
Manuel Klimek67619ff2012-09-07 13:10:32 +00001536<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 +00001537<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1538</pre></td></tr>
1539
1540
Manuel Klimek415514d2013-02-06 20:36:22 +00001541<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>
1542<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001543static member variable template instantiations.
1544
1545Given
1546 template&lt;typename T&gt; void A(T t) { }
1547 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001548functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001549 matches the specialization A&lt;int&gt;().
1550
1551Usable 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;
1552</pre></td></tr>
1553
1554
Daniel Jaspere0b89972012-12-04 12:08:08 +00001555<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>
1556<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1557isSameOrDerivedFrom(hasName(...)).
1558</pre></td></tr>
1559
1560
Manuel Klimek415514d2013-02-06 20:36:22 +00001561<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>
1562<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001563member variable template instantiations.
1564
1565Given
1566 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1567or
1568 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001569recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001570 matches the template instantiation of X&lt;A&gt;.
1571
1572But given
1573 template &lt;typename T&gt; class X {}; class A {};
1574 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001575recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001576 does not match, as X&lt;A&gt; is an explicit template specialization.
1577
1578Usable 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;
1579</pre></td></tr>
1580
1581
Manuel Klimek67619ff2012-09-07 13:10:32 +00001582<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 +00001583<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1584a specific number of arguments (including absent default arguments).
1585
Manuel Klimeke44a0062012-08-26 23:55:24 +00001586Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001587 void f(int x, int y);
1588 f(0, 0);
1589</pre></td></tr>
1590
1591
Manuel Klimek67619ff2012-09-07 13:10:32 +00001592<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 +00001593<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1594
1595Example matches true (matcher = boolLiteral(equals(true)))
1596 true
1597
1598Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1599 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;
1600</pre></td></tr>
1601
1602
Manuel Klimek67619ff2012-09-07 13:10:32 +00001603<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 +00001604<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1605child statements.
1606
1607Example: Given
1608 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001609compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001610 matches '{}'
1611 but does not match the outer compound statement.
1612</pre></td></tr>
1613
1614
Daniel Jaspere0b89972012-12-04 12:08:08 +00001615<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>
1616<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1617
1618Given
1619 int a[42];
1620 int b[2 * 21];
1621 int c[41], d[43];
1622constantArrayType(hasSize(42))
1623 matches "int a[42]" and "int b[2 * 21]"
1624</pre></td></tr>
1625
1626
Manuel Klimek67619ff2012-09-07 13:10:32 +00001627<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 +00001628<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1629declarations.
1630
1631Example: Given
1632 int a, b;
1633 int c;
1634 int d = 2, e;
1635declCountIs(2)
1636 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1637</pre></td></tr>
1638
1639
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001640<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>
1641<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1642
1643Decl has pointer identity in the AST.
1644</pre></td></tr>
1645
1646
Daniel Jasperc7093d92013-02-25 12:39:41 +00001647<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
1648<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1649
1650Given
1651 class C {
1652 public: int a;
1653 protected: int b;
1654 private: int c;
1655 };
1656fieldDecl(isPrivate())
1657 matches 'int c;'
1658</pre></td></tr>
1659
1660
1661<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
1662<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1663
1664Given
1665 class C {
1666 public: int a;
1667 protected: int b;
1668 private: int c;
1669 };
1670fieldDecl(isProtected())
1671 matches 'int b;'
1672</pre></td></tr>
1673
1674
1675<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
1676<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1677
1678Given
1679 class C {
1680 public: int a;
1681 protected: int b;
1682 private: int c;
1683 };
1684fieldDecl(isPublic())
1685 matches 'int a;'
1686</pre></td></tr>
1687
1688
Manuel Klimek67619ff2012-09-07 13:10:32 +00001689<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 +00001690<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1691
1692Example matches true (matcher = boolLiteral(equals(true)))
1693 true
1694
1695Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1696 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;
1697</pre></td></tr>
1698
1699
Manuel Klimek415514d2013-02-06 20:36:22 +00001700<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>
1701<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001702
1703Example matches A, va, fa
1704 class A {};
1705 class B; Doesn't match, as it has no body.
1706 int va;
1707 extern int vb; Doesn't match, as it doesn't define the variable.
1708 void fa() {}
1709 void fb(); Doesn't match, as it has no body.
1710
1711Usable 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;
1712</pre></td></tr>
1713
1714
Manuel Klimek415514d2013-02-06 20:36:22 +00001715<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>
1716<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001717static member variable template instantiations.
1718
1719Given
1720 template&lt;typename T&gt; void A(T t) { }
1721 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001722functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001723 matches the specialization A&lt;int&gt;().
1724
1725Usable 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;
1726</pre></td></tr>
1727
1728
Manuel Klimek67619ff2012-09-07 13:10:32 +00001729<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 +00001730<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1731
1732Given:
1733 extern "C" void f() {}
1734 extern "C" { void g() {} }
1735 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001736functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001737 matches the declaration of f and g, but not the declaration h
1738</pre></td></tr>
1739
1740
Manuel Klimek415514d2013-02-06 20:36:22 +00001741<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>
1742<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001743member variable template instantiations.
1744
1745Given
1746 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1747or
1748 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001749recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001750 matches the template instantiation of X&lt;A&gt;.
1751
1752But given
1753 template &lt;typename T&gt; class X {}; class A {};
1754 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001755recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001756 does not match, as X&lt;A&gt; is an explicit template specialization.
1757
1758Usable 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;
1759</pre></td></tr>
1760
1761
Daniel Jaspere0b89972012-12-04 12:08:08 +00001762<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>
1763<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1764
1765Given
1766 void f(int i) {}
1767 void g(int i, int j) {}
1768functionDecl(parameterCountIs(2))
1769 matches g(int i, int j) {}
1770</pre></td></tr>
1771
1772
Manuel Klimek67619ff2012-09-07 13:10:32 +00001773<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 +00001774<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1775
1776Example matches true (matcher = boolLiteral(equals(true)))
1777 true
1778
1779Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1780 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;
1781</pre></td></tr>
1782
1783
Manuel Klimek67619ff2012-09-07 13:10:32 +00001784<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 +00001785<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1786to '.'.
1787
1788Member calls on the implicit this pointer match as called with '-&gt;'.
1789
1790Given
1791 class Y {
1792 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1793 int a;
1794 static int b;
1795 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001796memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001797 matches this-&gt;x, x, y.x, a, this-&gt;b
1798</pre></td></tr>
1799
1800
Manuel Klimek67619ff2012-09-07 13:10:32 +00001801<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001802<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1803
1804Supports specifying enclosing namespaces or classes by prefixing the name
1805with '&lt;enclosing&gt;::'.
1806Does not match typedefs of an underlying type with the given name.
1807
1808Example matches X (Name == "X")
1809 class X;
1810
1811Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1812 namespace a { namespace b { class X; } }
1813</pre></td></tr>
1814
1815
Manuel Klimek67619ff2012-09-07 13:10:32 +00001816<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 +00001817<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1818a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001819
1820Supports specifying enclosing namespaces or classes by
1821prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1822of an underlying type with the given name.
1823
1824Example matches X (regexp == "::X")
1825 class X;
1826
1827Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1828 namespace foo { namespace bar { class X; } }
1829</pre></td></tr>
1830
1831
Manuel Klimek67619ff2012-09-07 13:10:32 +00001832<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 +00001833<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1834
1835Given
1836 class Y { public: void x(); };
1837 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001838callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001839 matches y-&gt;x()
1840</pre></td></tr>
1841
1842
Edwin Vane7b69cd02013-04-02 18:15:55 +00001843<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
1844<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1845the node, not hidden within a typedef.
1846
1847Given
1848 typedef const int const_int;
1849 const_int i;
1850 int *const j;
1851 int *volatile k;
1852 int m;
1853varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1854i is const-qualified but the qualifier is not local.
1855</pre></td></tr>
1856
1857
Manuel Klimek67619ff2012-09-07 13:10:32 +00001858<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 +00001859<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1860include "top-level" const.
1861
1862Given
1863 void a(int);
1864 void b(int const);
1865 void c(const int);
1866 void d(const int*);
1867 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00001868functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001869 matches "void b(int const)", "void c(const int)" and
1870 "void e(int const) {}". It does not match d as there
1871 is no top-level const on the parameter type "const int *".
1872</pre></td></tr>
1873
1874
Manuel Klimek67619ff2012-09-07 13:10:32 +00001875<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 +00001876<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1877
1878Given
1879 void a(int);
1880 void b(long);
1881 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00001882functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00001883matches "a(int)", "b(long)", but not "c(double)".
1884</pre></td></tr>
1885
1886
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001887<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>
1888<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1889
1890Stmt has pointer identity in the AST.
1891
1892</pre></td></tr>
1893
1894
Manuel Klimek415514d2013-02-06 20:36:22 +00001895<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>
1896<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001897
1898Example matches A, va, fa
1899 class A {};
1900 class B; Doesn't match, as it has no body.
1901 int va;
1902 extern int vb; Doesn't match, as it doesn't define the variable.
1903 void fa() {}
1904 void fb(); Doesn't match, as it has no body.
1905
1906Usable 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;
1907</pre></td></tr>
1908
1909
Manuel Klimek67619ff2012-09-07 13:10:32 +00001910<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001911<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1912
1913Given
1914 int x;
1915 int s = sizeof(x) + alignof(x)
1916unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1917 matches sizeof(x)
1918</pre></td></tr>
1919
1920
Manuel Klimek67619ff2012-09-07 13:10:32 +00001921<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 +00001922<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1923unary).
1924
1925Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1926 !(a || b)
1927</pre></td></tr>
1928
1929
Manuel Klimek67619ff2012-09-07 13:10:32 +00001930<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001931<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
1932
1933Example matches A, va, fa
1934 class A {};
1935 class B; Doesn't match, as it has no body.
1936 int va;
1937 extern int vb; Doesn't match, as it doesn't define the variable.
1938 void fa() {}
1939 void fb(); Doesn't match, as it has no body.
1940
1941Usable 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;
1942</pre></td></tr>
1943
1944
Manuel Klimek67619ff2012-09-07 13:10:32 +00001945<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 +00001946<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
1947static member variable template instantiations.
1948
1949Given
1950 template&lt;typename T&gt; void A(T t) { }
1951 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001952functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001953 matches the specialization A&lt;int&gt;().
1954
1955Usable 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;
1956</pre></td></tr>
1957
1958
Manuel Klimek67619ff2012-09-07 13:10:32 +00001959<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 +00001960<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
1961member variable template instantiations.
1962
1963Given
1964 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1965or
1966 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001967recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001968 matches the template instantiation of X&lt;A&gt;.
1969
1970But given
1971 template &lt;typename T&gt; class X {}; class A {};
1972 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001973recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001974 does not match, as X&lt;A&gt; is an explicit template specialization.
1975
1976Usable 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;
1977</pre></td></tr>
1978
1979<!--END_NARROWING_MATCHERS -->
1980</table>
1981
1982<!-- ======================================================================= -->
1983<h2 id="traversal-matchers">AST Traversal Matchers</h2>
1984<!-- ======================================================================= -->
1985
1986<p>Traversal matchers specify the relationship to other nodes that are
1987reachable from the current node.</p>
1988
1989<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
1990forEachDescendant) which work on all nodes and allow users to write more generic
1991match expressions.</p>
1992
1993<table>
1994<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1995<!-- START_TRAVERSAL_MATCHERS -->
1996
Manuel Klimek152ea0e2013-02-04 10:59:20 +00001997<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>
1998<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
1999
2000Unlike anyOf, eachOf will generate a match result for each
2001matching submatcher.
2002
2003For example, in:
2004 class A { int a; int b; };
2005The matcher:
2006 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2007 has(fieldDecl(hasName("b")).bind("v"))))
2008will generate two results binding "v", the first of which binds
2009the field declaration of a, the second the field declaration of
2010b.
2011
2012Usable as: Any Matcher
2013</pre></td></tr>
2014
2015
2016<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>
2017<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2018
2019Generates results for each match.
2020
2021For example, in:
2022 class A { class B {}; class C {}; };
2023The matcher:
2024 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2025will generate results for A, B and C.
2026
2027Usable as: Any Matcher
2028</pre></td></tr>
2029
2030
Manuel Klimek67619ff2012-09-07 13:10:32 +00002031<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 +00002032<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2033provided matcher.
2034
Manuel Klimeke44a0062012-08-26 23:55:24 +00002035Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002036 class X {}; Matches X, because X::X is a class of name X inside X.
2037 class Y { class X {}; };
2038 class Z { class Y { class X {}; }; }; Does not match Z.
2039
2040ChildT must be an AST base type.
2041
2042As opposed to 'has', 'forEach' will cause a match for each result that
2043matches instead of only on the first one.
2044
2045Usable as: Any Matcher
2046</pre></td></tr>
2047
2048
Manuel Klimek67619ff2012-09-07 13:10:32 +00002049<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 +00002050<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2051provided matcher.
2052
2053Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002054 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002055 class X {}; Matches X, because X::X is a class of name X inside X.
2056 class A { class X {}; };
2057 class B { class C { class X {}; }; };
2058
2059DescendantT must be an AST base type.
2060
2061As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2062each result that matches instead of only on the first one.
2063
2064Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002065 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002066will match 10 times (plus injected class name matches) on:
2067 class A { class B { class C { class D { class E {}; }; }; }; };
2068
2069Usable as: Any Matcher
2070</pre></td></tr>
2071
2072
Manuel Klimek67619ff2012-09-07 13:10:32 +00002073<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 +00002074<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2075provided matcher.
2076
Manuel Klimeke44a0062012-08-26 23:55:24 +00002077Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002078 class X {}; Matches X, because X::X is a class of name X inside X.
2079 class Y { class X {}; };
2080 class Z { class Y { class X {}; }; }; Does not match Z.
2081
2082ChildT must be an AST base type.
2083
2084Usable as: Any Matcher
2085</pre></td></tr>
2086
2087
Manuel Klimek67619ff2012-09-07 13:10:32 +00002088<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;AncestorT&gt; AncestorMatcher</td></tr>
2089<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2090matcher.
2091
2092Given
2093void f() { if (true) { int x = 42; } }
2094void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002095expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002096
2097Usable as: Any Matcher
2098</pre></td></tr>
2099
2100
2101<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 +00002102<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2103provided matcher.
2104
2105Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002106 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002107 class X {}; Matches X, because X::X is a class of name X inside X.
2108 class Y { class X {}; };
2109 class Z { class Y { class X {}; }; };
2110
2111DescendantT must be an AST base type.
2112
2113Usable as: Any Matcher
2114</pre></td></tr>
2115
2116
Daniel Jaspere0b89972012-12-04 12:08:08 +00002117<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>
2118<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2119matcher.
2120
2121Given
2122void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2123compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2124
2125Usable as: Any Matcher
2126</pre></td></tr>
2127
2128
Manuel Klimek67619ff2012-09-07 13:10:32 +00002129<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 +00002130<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2131
2132Given
2133 int i[5];
2134 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002135arraySubscriptExpression(hasBase(implicitCastExpr(
2136 hasSourceExpression(declRefExpr()))))
2137 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002138</pre></td></tr>
2139
2140
Manuel Klimek67619ff2012-09-07 13:10:32 +00002141<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 +00002142<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2143
2144Given
2145 int i[5];
2146 void f() { i[1] = 42; }
2147arraySubscriptExpression(hasIndex(integerLiteral()))
2148 matches i[1] with the integerLiteral() matching 1
2149</pre></td></tr>
2150
2151
Manuel Klimek41df16e2013-01-09 09:38:21 +00002152<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>
2153<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2154type.
2155
2156Given
2157 struct A {};
2158 A a[7];
2159 int b[7];
2160arrayType(hasElementType(builtinType()))
2161 matches "int b[7]"
2162
2163Usable 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;
2164</pre></td></tr>
2165
2166
2167<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>
2168<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2169type.
2170
2171Given
2172 struct A {};
2173 A a[7];
2174 int b[7];
2175arrayType(hasElementType(builtinType()))
2176 matches "int b[7]"
2177
2178Usable 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;
2179</pre></td></tr>
2180
2181
2182<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>
2183<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2184
2185Given
2186 _Atomic(int) i;
2187 _Atomic(float) f;
2188atomicType(hasValueType(isInteger()))
2189 matches "_Atomic(int) i"
2190
2191Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2192</pre></td></tr>
2193
2194
2195<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>
2196<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2197
2198Given
2199 _Atomic(int) i;
2200 _Atomic(float) f;
2201atomicType(hasValueType(isInteger()))
2202 matches "_Atomic(int) i"
2203
2204Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2205</pre></td></tr>
2206
2207
2208<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>
2209<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2210
2211Note: There is no TypeLoc for the deduced type and thus no
2212getDeducedLoc() matcher.
2213
2214Given
2215 auto a = 1;
2216 auto b = 2.0;
2217autoType(hasDeducedType(isInteger()))
2218 matches "auto a"
2219
2220Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2221</pre></td></tr>
2222
2223
Manuel Klimek67619ff2012-09-07 13:10:32 +00002224<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 +00002225<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2226binary operator matches.
2227</pre></td></tr>
2228
2229
Manuel Klimek67619ff2012-09-07 13:10:32 +00002230<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 +00002231<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2232
2233Example matches a (matcher = binaryOperator(hasLHS()))
2234 a || b
2235</pre></td></tr>
2236
2237
Manuel Klimek67619ff2012-09-07 13:10:32 +00002238<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 +00002239<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2240
2241Example matches b (matcher = binaryOperator(hasRHS()))
2242 a || b
2243</pre></td></tr>
2244
2245
Manuel Klimek41df16e2013-01-09 09:38:21 +00002246<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>
2247<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
2248pointee matches a given matcher.
2249
2250Given
2251 int *a;
2252 int const *b;
2253 float const *f;
2254pointerType(pointee(isConstQualified(), isInteger()))
2255 matches "int const *b"
2256
2257Usable 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;,
2258 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;
2259</pre></td></tr>
2260
2261
2262<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>
2263<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
2264pointee matches a given matcher.
2265
2266Given
2267 int *a;
2268 int const *b;
2269 float const *f;
2270pointerType(pointee(isConstQualified(), isInteger()))
2271 matches "int const *b"
2272
2273Usable 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;,
2274 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;
2275</pre></td></tr>
2276
2277
Edwin Vane3abf7782013-02-25 14:49:29 +00002278<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2279<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 +00002280matcher.
2281
Edwin Vane52380602013-02-19 17:14:34 +00002282In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2283Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2284subtypes of clang::Type.
2285
Daniel Jaspere0b89972012-12-04 12:08:08 +00002286Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00002287 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
2288 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002289</pre></td></tr>
2290
2291
Manuel Klimek67619ff2012-09-07 13:10:32 +00002292<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 +00002293<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2294
2295Given
2296 struct Foo {
2297 Foo() : foo_(1) { }
2298 int foo_;
2299 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002300recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002301 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2302</pre></td></tr>
2303
2304
Manuel Klimek67619ff2012-09-07 13:10:32 +00002305<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 +00002306<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2307
2308Given
2309 struct Foo {
2310 Foo() : foo_(1) { }
2311 int foo_;
2312 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002313recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002314 forField(hasName("foo_"))))))
2315 matches Foo
2316with forField matching foo_
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_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 +00002321<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2322
2323Given
2324 struct Foo {
2325 Foo() : foo_(1) { }
2326 int foo_;
2327 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002328recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002329 withInitializer(integerLiteral(equals(1)))))))
2330 matches Foo
2331with withInitializer matching (1)
2332</pre></td></tr>
2333
2334
Manuel Klimek67619ff2012-09-07 13:10:32 +00002335<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 +00002336<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2337
Manuel Klimeke44a0062012-08-26 23:55:24 +00002338Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002339 class Y { public: void x(); };
2340 void z() { Y y; y.x(); }",
2341
2342FIXME: Overload to allow directly matching types?
2343</pre></td></tr>
2344
2345
Manuel Klimek67619ff2012-09-07 13:10:32 +00002346<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 +00002347<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2348
2349
Manuel Klimek67619ff2012-09-07 13:10:32 +00002350<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 +00002351<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2352</pre></td></tr>
2353
2354
Manuel Klimek67619ff2012-09-07 13:10:32 +00002355<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 +00002356<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2357belongs to.
2358
2359FIXME: Generalize this for other kinds of declarations.
2360FIXME: What other kind of declarations would we need to generalize
2361this to?
2362
2363Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002364 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002365 ofClass(hasName("A"))))))
2366 class A {
2367 public:
2368 A();
2369 };
2370 A a = A();
2371</pre></td></tr>
2372
2373
Edwin Vane6a19a972013-03-06 17:02:57 +00002374<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
2375<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2376
2377Given:
2378 class A { void func(); };
2379 class B { void member(); };
2380
2381recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2382but not B.
2383</pre></td></tr>
2384
2385
Manuel Klimek67619ff2012-09-07 13:10:32 +00002386<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 +00002387<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2388a class matching Base.
2389
Manuel Klimek67619ff2012-09-07 13:10:32 +00002390Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002391
Manuel Klimek67619ff2012-09-07 13:10:32 +00002392Example matches Y, Z, C (Base == hasName("X"))
2393 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002394 class Y : public X {}; directly derived
2395 class Z : public Y {}; indirectly derived
2396 typedef X A;
2397 typedef A B;
2398 class C : public B {}; derived from a typedef of X
2399
2400In the following example, Bar matches isDerivedFrom(hasName("X")):
2401 class Foo;
2402 typedef Foo X;
2403 class Bar : public Foo {}; derived from a type that X is a typedef of
2404</pre></td></tr>
2405
2406
Daniel Jaspere0b89972012-12-04 12:08:08 +00002407<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>
2408<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2409match Base.
2410</pre></td></tr>
2411
2412
Manuel Klimek67619ff2012-09-07 13:10:32 +00002413<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 +00002414<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2415given matcher.
2416
Manuel Klimeke44a0062012-08-26 23:55:24 +00002417Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002418 class Y { public: void x(); };
2419 void z() { Y y; y.x();
2420</pre></td></tr>
2421
2422
Manuel Klimek67619ff2012-09-07 13:10:32 +00002423<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 +00002424<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2425expression.
2426
2427Given
2428 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002429callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002430 matches x(1, y, 42)
2431with hasAnyArgument(...)
2432 matching y
2433</pre></td></tr>
2434
2435
Manuel Klimek67619ff2012-09-07 13:10:32 +00002436<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 +00002437<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2438call expression.
2439
2440Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002441 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002442 void x(int) { int y; x(y); }
2443</pre></td></tr>
2444
2445
Edwin Vane3abf7782013-02-25 14:49:29 +00002446<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2447<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00002448matcher.
2449
Edwin Vane52380602013-02-19 17:14:34 +00002450In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2451Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2452subtypes of clang::Type.
2453
Daniel Jaspere0b89972012-12-04 12:08:08 +00002454Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00002455 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
2456 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002457</pre></td></tr>
2458
2459
Manuel Klimek67619ff2012-09-07 13:10:32 +00002460<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 +00002461<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2462
2463Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002464 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002465class URL { URL(string); };
2466URL url = "a string";
2467</pre></td></tr>
2468
2469
Manuel Klimek67619ff2012-09-07 13:10:32 +00002470<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 +00002471<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2472TemplateArgument matching the given InnerMatcher.
2473
2474Given
2475 template&lt;typename T&gt; class A {};
2476 template&lt;&gt; class A&lt;double&gt; {};
2477 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002478classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002479 refersToType(asString("int"))))
2480 matches the specialization A&lt;int&gt;
2481</pre></td></tr>
2482
2483
Manuel Klimek67619ff2012-09-07 13:10:32 +00002484<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 +00002485<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2486matches the given InnerMatcher.
2487
2488Given
2489 template&lt;typename T, typename U&gt; class A {};
2490 A&lt;bool, int&gt; b;
2491 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002492classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002493 1, refersToType(asString("int"))))
2494 matches the specialization A&lt;bool, int&gt;
2495</pre></td></tr>
2496
2497
Manuel Klimek41df16e2013-01-09 09:38:21 +00002498<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>
2499<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2500type.
2501
2502Given
2503 struct A {};
2504 A a[7];
2505 int b[7];
2506arrayType(hasElementType(builtinType()))
2507 matches "int b[7]"
2508
2509Usable 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;
2510</pre></td></tr>
2511
2512
2513<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>
2514<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2515type.
2516
2517Given
2518 struct A {};
2519 A a[7];
2520 int b[7];
2521arrayType(hasElementType(builtinType()))
2522 matches "int b[7]"
2523
2524Usable 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;
2525</pre></td></tr>
2526
2527
Manuel Klimek67619ff2012-09-07 13:10:32 +00002528<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 +00002529<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2530a given matcher.
2531
2532Given
2533 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002534hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002535 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002536with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002537 matching '{}'
2538</pre></td></tr>
2539
2540
Manuel Klimek67619ff2012-09-07 13:10:32 +00002541<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002542<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2543or conditional operator.
2544
2545Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2546 if (true) {}
2547</pre></td></tr>
2548
2549
Manuel Klimek67619ff2012-09-07 13:10:32 +00002550<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 +00002551<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2552
2553Example matches b
2554 condition ? a : b
2555</pre></td></tr>
2556
2557
Manuel Klimek67619ff2012-09-07 13:10:32 +00002558<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 +00002559<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2560
2561Example matches a
2562 condition ? a : b
2563</pre></td></tr>
2564
2565
Manuel Klimek67619ff2012-09-07 13:10:32 +00002566<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 +00002567<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2568specific using shadow declaration.
2569
2570FIXME: This currently only works for functions. Fix.
2571
2572Given
2573 namespace a { void f() {} }
2574 using a::f;
2575 void g() {
2576 f(); Matches this ..
2577 a::f(); .. but not this.
2578 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002579declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002580 matches f()
2581</pre></td></tr>
2582
2583
Manuel Klimek67619ff2012-09-07 13:10:32 +00002584<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 +00002585<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2586specified matcher.
2587
2588Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002589 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002590 bool x;
2591 if (x) {}
2592</pre></td></tr>
2593
2594
Manuel Klimek67619ff2012-09-07 13:10:32 +00002595<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 +00002596<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2597
2598Note that this does not work for global declarations because the AST
2599breaks up multiple-declaration DeclStmt's into multiple single-declaration
2600DeclStmt's.
2601Example: Given non-global declarations
2602 int a, b = 0;
2603 int c;
2604 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002605declStmt(containsDeclaration(
2606 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002607 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002608declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002609 matches 'int a, b = 0' as well as 'int d = 2, e;'
2610 but 'int c;' is not matched.
2611</pre></td></tr>
2612
2613
Manuel Klimek67619ff2012-09-07 13:10:32 +00002614<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 +00002615<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2616
2617Given
2618 int a, b;
2619 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002620declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002621 matches 'int c;' but not 'int a, b;'.
2622</pre></td></tr>
2623
2624
Edwin Vane742d9e72013-02-25 20:43:32 +00002625<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2626<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2627Decl, matches InnerMatcher.
2628
2629Given
2630 namespace N {
2631 namespace M {
2632 class D {};
2633 }
2634 }
2635
2636recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2637declaration of class D.
2638</pre></td></tr>
2639
2640
Manuel Klimek67619ff2012-09-07 13:10:32 +00002641<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 +00002642<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2643a given body.
2644
2645Given
2646 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002647hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002648 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002649with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002650 matching '{}'
2651</pre></td></tr>
2652
2653
Manuel Klimek67619ff2012-09-07 13:10:32 +00002654<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 +00002655<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2656or conditional operator.
2657
2658Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2659 if (true) {}
2660</pre></td></tr>
2661
2662
Edwin Vane742d9e72013-02-25 20:43:32 +00002663<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
2664<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002665matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002666
2667Given
2668 namespace N {
2669 namespace M {
2670 class D {};
2671 }
2672 }
2673 N::M::D d;
2674
2675elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2676matches the type of the variable declaration of d.
2677</pre></td></tr>
2678
2679
2680<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
2681<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2682
2683Given
2684 namespace N {
2685 namespace M {
2686 class D {};
2687 }
2688 }
2689 N::M::D d;
2690
2691elaboratedType(namesType(recordType(
2692hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2693declaration of d.
2694</pre></td></tr>
2695
2696
Manuel Klimek67619ff2012-09-07 13:10:32 +00002697<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 +00002698<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2699
2700(Note: Clang's AST refers to other conversions as "casts" too, and calls
2701actual casts "explicit" casts.)
2702</pre></td></tr>
2703
2704
Manuel Klimek67619ff2012-09-07 13:10:32 +00002705<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 +00002706<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2707declaration's type.
2708
2709In case of a value declaration (for example a variable declaration),
2710this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002711declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2712while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002713of x."
2714
Manuel Klimeke44a0062012-08-26 23:55:24 +00002715Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2716 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002717 class X {};
2718 void y(X &amp;x) { x; X z; }
2719
2720Usable 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;
2721</pre></td></tr>
2722
2723
Manuel Klimek67619ff2012-09-07 13:10:32 +00002724<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 +00002725<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2726are stripped off.
2727
2728Parentheses and explicit casts are not discarded.
2729Given
2730 int arr[5];
2731 int a = 0;
2732 char b = 0;
2733 const int c = a;
2734 int *d = arr;
2735 long e = (long) 0l;
2736The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002737 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2738 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002739would match the declarations for a, b, c, and d, but not e.
2740While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002741 varDecl(hasInitializer(integerLiteral()))
2742 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002743only match the declarations for b, c, and d.
2744</pre></td></tr>
2745
2746
Manuel Klimek67619ff2012-09-07 13:10:32 +00002747<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 +00002748<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2749casts are stripped off.
2750
2751Implicit and non-C Style casts are also discarded.
2752Given
2753 int a = 0;
2754 char b = (0);
2755 void* c = reinterpret_cast&lt;char*&gt;(0);
2756 char d = char(0);
2757The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002758 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002759would match the declarations for a, b, c, and d.
2760while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002761 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002762only match the declaration for a.
2763</pre></td></tr>
2764
2765
Manuel Klimek67619ff2012-09-07 13:10:32 +00002766<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 +00002767<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2768parentheses are stripped off.
2769
2770Explicit casts are not discarded.
2771Given
2772 int arr[5];
2773 int a = 0;
2774 char b = (0);
2775 const int c = a;
2776 int *d = (arr);
2777 long e = ((long) 0l);
2778The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002779 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2780 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002781would match the declarations for a, b, c, and d, but not e.
2782while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002783 varDecl(hasInitializer(integerLiteral()))
2784 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002785would only match the declaration for a.
2786</pre></td></tr>
2787
2788
Manuel Klimek67619ff2012-09-07 13:10:32 +00002789<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 +00002790<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2791a given body.
2792
2793Given
2794 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002795hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002796 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002797with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002798 matching '{}'
2799</pre></td></tr>
2800
2801
Manuel Klimek67619ff2012-09-07 13:10:32 +00002802<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002803<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2804or conditional operator.
2805
2806Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2807 if (true) {}
2808</pre></td></tr>
2809
2810
Manuel Klimek67619ff2012-09-07 13:10:32 +00002811<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 +00002812<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2813
2814Example:
2815 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2816matches '++x' in
2817 for (x; x &lt; N; ++x) { }
2818</pre></td></tr>
2819
2820
Manuel Klimek67619ff2012-09-07 13:10:32 +00002821<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002822<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2823
2824Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002825 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002826matches 'int x = 0' in
2827 for (int x = 0; x &lt; N; ++x) { }
2828</pre></td></tr>
2829
2830
Manuel Klimek67619ff2012-09-07 13:10:32 +00002831<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002832<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2833
2834Does not match the 'this' parameter of a method.
2835
2836Given
2837 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002838methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002839 matches f(int x, int y, int z) {}
2840with hasAnyParameter(...)
2841 matching int y
2842</pre></td></tr>
2843
2844
Manuel Klimek67619ff2012-09-07 13:10:32 +00002845<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 +00002846<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2847
2848Given
2849 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002850methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002851 matches f(int x) {}
2852with hasParameter(...)
2853 matching int x
2854</pre></td></tr>
2855
2856
Manuel Klimek67619ff2012-09-07 13:10:32 +00002857<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 +00002858<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2859
2860Given:
2861 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002862methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002863 matches int f() { return 1; }
2864</pre></td></tr>
2865
2866
Manuel Klimek67619ff2012-09-07 13:10:32 +00002867<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 +00002868<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
2869or conditional operator.
2870
2871Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2872 if (true) {}
2873</pre></td></tr>
2874
2875
Manuel Klimek67619ff2012-09-07 13:10:32 +00002876<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 +00002877<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
2878
2879Given
2880 if (A* a = GetAPointer()) {}
2881hasConditionVariableStatment(...)
2882 matches 'A* a = GetAPointer()'.
2883</pre></td></tr>
2884
2885
Manuel Klimek67619ff2012-09-07 13:10:32 +00002886<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002887<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
2888matcher.
2889
2890FIXME: Unit test this matcher
2891</pre></td></tr>
2892
2893
Edwin Vane3abf7782013-02-25 14:49:29 +00002894<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2895<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if the declaration of the type matches the given
Daniel Jaspere0b89972012-12-04 12:08:08 +00002896matcher.
2897
Edwin Vane52380602013-02-19 17:14:34 +00002898In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
2899Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
2900subtypes of clang::Type.
2901
Daniel Jaspere0b89972012-12-04 12:08:08 +00002902Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00002903 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
2904 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00002905</pre></td></tr>
2906
2907
Manuel Klimek67619ff2012-09-07 13:10:32 +00002908<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002909<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
2910matched by a given matcher.
2911
2912Given
2913 struct X { int m; };
2914 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002915memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002916 matches "x.m" and "m"
2917with hasObjectExpression(...)
2918 matching "x" and the implicit object expression of "m" which has type X*.
2919</pre></td></tr>
2920
2921
Manuel Klimek67619ff2012-09-07 13:10:32 +00002922<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 +00002923<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
2924given matcher.
2925
2926Given
2927 struct { int first, second; } first, second;
2928 int i(second.first);
2929 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002930memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002931 matches second.first
2932 but not first.second (because the member name there is "second").
2933</pre></td></tr>
2934
2935
Manuel Klimek41df16e2013-01-09 09:38:21 +00002936<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>
2937<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
2938pointee matches a given matcher.
2939
2940Given
2941 int *a;
2942 int const *b;
2943 float const *f;
2944pointerType(pointee(isConstQualified(), isInteger()))
2945 matches "int const *b"
2946
2947Usable 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;,
2948 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;
2949</pre></td></tr>
2950
2951
2952<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>
2953<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
2954pointee matches a given matcher.
2955
2956Given
2957 int *a;
2958 int const *b;
2959 float const *f;
2960pointerType(pointee(isConstQualified(), isInteger()))
2961 matches "int const *b"
2962
2963Usable 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;,
2964 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;
2965</pre></td></tr>
2966
2967
Manuel Klimek415514d2013-02-06 20:36:22 +00002968<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 +00002969<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
2970
2971Given
2972 struct A { struct B { struct C {}; }; };
2973 A::B::C c;
2974nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
2975 matches "A::"
2976</pre></td></tr>
2977
2978
Manuel Klimek41df16e2013-01-09 09:38:21 +00002979<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>
2980<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
2981NestedNameSpecifier-matcher matches.
2982</pre></td></tr>
2983
2984
Daniel Jaspere0b89972012-12-04 12:08:08 +00002985<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>
2986<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
2987given TypeLoc.
2988
2989Given
2990 struct A { struct B { struct C {}; }; };
2991 A::B::C c;
2992nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
2993 hasDeclaration(recordDecl(hasName("A")))))))
2994 matches "A::"
2995</pre></td></tr>
2996
2997
Manuel Klimek415514d2013-02-06 20:36:22 +00002998<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 +00002999<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3000
3001Given
3002 struct A { struct B { struct C {}; }; };
3003 A::B::C c;
3004nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3005 matches "A::"
3006</pre></td></tr>
3007
3008
3009<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>
3010<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3011given namespace matcher.
3012
3013Given
3014 namespace ns { struct A {}; }
3015 ns::A a;
3016nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3017 matches "ns::"
3018</pre></td></tr>
3019
3020
3021<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>
3022<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3023given QualType matcher without qualifiers.
3024
3025Given
3026 struct A { struct B { struct C {}; }; };
3027 A::B::C c;
3028nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3029 matches "A::"
3030</pre></td></tr>
3031
3032
Edwin Vane88be2fd2013-04-01 18:33:34 +00003033<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;</td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3034<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3035
3036Given
3037 int (*ptr_to_array)[4];
3038 int (*ptr_to_func)(int);
3039
3040varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3041ptr_to_func but not ptr_to_array.
3042
3043Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3044</pre></td></tr>
3045
3046
Manuel Klimek41df16e2013-01-09 09:38:21 +00003047<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>
3048<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3049pointee matches a given matcher.
3050
3051Given
3052 int *a;
3053 int const *b;
3054 float const *f;
3055pointerType(pointee(isConstQualified(), isInteger()))
3056 matches "int const *b"
3057
3058Usable 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;,
3059 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;
3060</pre></td></tr>
3061
3062
3063<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>
3064<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3065pointee matches a given matcher.
3066
3067Given
3068 int *a;
3069 int const *b;
3070 float const *f;
3071pointerType(pointee(isConstQualified(), isInteger()))
3072 matches "int const *b"
3073
3074Usable 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;,
3075 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;
3076</pre></td></tr>
3077
3078
Edwin Vane6a19a972013-03-06 17:02:57 +00003079<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3080<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3081
3082Given:
3083 typedef int &amp;int_ref;
3084 int a;
3085 int_ref b = a;
3086
3087varDecl(hasType(qualType(referenceType()))))) will not match the
3088declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3089</pre></td></tr>
3090
3091
Edwin Vane3abf7782013-02-25 14:49:29 +00003092<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3093<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a type if the declaration of the type matches the given
Manuel Klimek1da79332012-08-20 20:54:03 +00003094matcher.
3095
Edwin Vane52380602013-02-19 17:14:34 +00003096In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3097Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3098subtypes of clang::Type.
3099
Daniel Jaspere0b89972012-12-04 12:08:08 +00003100Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003101 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3102 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003103</pre></td></tr>
3104
3105
Manuel Klimek67619ff2012-09-07 13:10:32 +00003106<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 +00003107<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3108</pre></td></tr>
3109
3110
Manuel Klimek67619ff2012-09-07 13:10:32 +00003111<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 +00003112<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3113</pre></td></tr>
3114
3115
Manuel Klimek41df16e2013-01-09 09:38:21 +00003116<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>
3117<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3118pointee matches a given matcher.
3119
3120Given
3121 int *a;
3122 int const *b;
3123 float const *f;
3124pointerType(pointee(isConstQualified(), isInteger()))
3125 matches "int const *b"
3126
3127Usable 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;,
3128 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;
3129</pre></td></tr>
3130
3131
3132<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>
3133<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3134pointee matches a given matcher.
3135
3136Given
3137 int *a;
3138 int const *b;
3139 float const *f;
3140pointerType(pointee(isConstQualified(), isInteger()))
3141 matches "int const *b"
3142
3143Usable 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;,
3144 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;
3145</pre></td></tr>
3146
3147
Manuel Klimek67619ff2012-09-07 13:10:32 +00003148<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 +00003149<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3150alignof.
3151</pre></td></tr>
3152
3153
Manuel Klimek67619ff2012-09-07 13:10:32 +00003154<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 +00003155<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3156sizeof.
3157</pre></td></tr>
3158
3159
Manuel Klimek67619ff2012-09-07 13:10:32 +00003160<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 +00003161<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3162
3163Given
3164 template&lt;typename T&gt; struct A {};
3165 struct B { B* next; };
3166 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003167classTemplateSpecializationDecl(hasAnyTemplateArgument(
3168 refersToDeclaration(fieldDecl(hasName("next"))))
3169 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003170 B::next
3171</pre></td></tr>
3172
3173
Manuel Klimek67619ff2012-09-07 13:10:32 +00003174<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 +00003175<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3176
3177Given
3178 struct X {};
3179 template&lt;typename T&gt; struct A {};
3180 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003181classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003182 refersToType(class(hasName("X")))))
3183 matches the specialization A&lt;X&gt;
3184</pre></td></tr>
3185
3186
Edwin Vane3abf7782013-02-25 14:49:29 +00003187<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Edwin Vane52380602013-02-19 17:14:34 +00003188<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if the declaration of the type matches the given
3189matcher.
3190
3191In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3192Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3193subtypes of clang::Type.
3194
3195Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
Edwin Vane3abf7782013-02-25 14:49:29 +00003196 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3197 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3198</pre></td></tr>
3199
3200
3201<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>
3202<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3203QualType-matcher matches.
3204</pre></td></tr>
3205
3206
3207<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3208<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if the declaration of the type matches the given
3209matcher.
3210
3211In addition to being usable as Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, also usable as
3212Matcher&lt;T&gt; for any T supporting the getDecl() member function. e.g. various
3213subtypes of clang::Type.
3214
3215Usable 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;,
3216 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3217 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003218</pre></td></tr>
3219
3220
Manuel Klimek67619ff2012-09-07 13:10:32 +00003221<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 +00003222<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3223
3224Given
3225 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3226unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3227 matches sizeof(a) and alignof(c)
3228</pre></td></tr>
3229
3230
Manuel Klimek67619ff2012-09-07 13:10:32 +00003231<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 +00003232<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3233
Daniel Jaspere0b89972012-12-04 12:08:08 +00003234Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003235 !true
3236</pre></td></tr>
3237
3238
Manuel Klimek67619ff2012-09-07 13:10:32 +00003239<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 +00003240<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3241
3242Given
3243 namespace X { void b(); }
3244 using X::b;
3245usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3246 matches using X::b </pre></td></tr>
3247
3248
Manuel Klimek67619ff2012-09-07 13:10:32 +00003249<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 +00003250<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3251matched by the given matcher.
3252
3253Given
3254 namespace X { int a; void b(); }
3255 using X::a;
3256 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003257usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003258 matches using X::b but not using X::a </pre></td></tr>
3259
3260
Manuel Klimek67619ff2012-09-07 13:10:32 +00003261<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 +00003262<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3263declaration's type.
3264
3265In case of a value declaration (for example a variable declaration),
3266this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003267declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3268while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003269of x."
3270
Manuel Klimeke44a0062012-08-26 23:55:24 +00003271Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3272 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003273 class X {};
3274 void y(X &amp;x) { x; X z; }
3275
3276Usable 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;
3277</pre></td></tr>
3278
3279
Manuel Klimek67619ff2012-09-07 13:10:32 +00003280<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 +00003281<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3282that matches the given matcher.
3283
Manuel Klimeke44a0062012-08-26 23:55:24 +00003284Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003285 bool y() { return true; }
3286 bool x = y();
3287</pre></td></tr>
3288
3289
Daniel Jaspere0b89972012-12-04 12:08:08 +00003290<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>
3291<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3292expression.
3293
3294Given
3295 void f(int b) {
3296 int a[b];
3297 }
3298variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3299 varDecl(hasName("b")))))))
3300 matches "int a[b]"
3301</pre></td></tr>
3302
3303
Manuel Klimek67619ff2012-09-07 13:10:32 +00003304<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 +00003305<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3306a given body.
3307
3308Given
3309 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003310hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003311 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003312with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003313 matching '{}'
3314</pre></td></tr>
3315
3316
Manuel Klimek67619ff2012-09-07 13:10:32 +00003317<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 +00003318<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3319or conditional operator.
3320
3321Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3322 if (true) {}
3323</pre></td></tr>
3324
3325<!--END_TRAVERSAL_MATCHERS -->
3326</table>
3327
3328</div>
3329</body>
3330</html>
3331
3332