blob: 50ff38edfade47e48949d139db66de172a20570d [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 Klimek1a68afd2013-06-20 13:08:29 +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('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
138<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
139and non-type template parameter declarations).
140
141Given
142 class X { int y; };
143declaratorDecl()
144 matches int y.
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('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 +0000149<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000150
151Example matches Foo::~Foo()
152 class Foo {
153 public:
154 virtual ~Foo();
155 };
156</pre></td></tr>
157
158
Manuel Klimek67619ff2012-09-07 13:10:32 +0000159<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 +0000160<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000161
162Example matches A, B, C
163 enum X {
164 A, B, C
165 };
166</pre></td></tr>
167
168
Manuel Klimek67619ff2012-09-07 13:10:32 +0000169<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 +0000170<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
171
172Example matches X
173 enum X {
174 A, B, C
175 };
176</pre></td></tr>
177
178
Manuel Klimek67619ff2012-09-07 13:10:32 +0000179<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 +0000180<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000181
182Given
183 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000184fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000185 matches 'm'.
186</pre></td></tr>
187
188
Manuel Klimek67619ff2012-09-07 13:10:32 +0000189<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000190<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000191
192Example matches f
193 void f();
194</pre></td></tr>
195
196
Manuel Klimek67619ff2012-09-07 13:10:32 +0000197<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 +0000198<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000199
200Example matches f
201 template&lt;class T&gt; void f(T t) {}
202</pre></td></tr>
203
204
Manuel Klimek67619ff2012-09-07 13:10:32 +0000205<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 +0000206<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000207
208Example matches y
209 class X { void y() };
210</pre></td></tr>
211
212
Manuel Klimek67619ff2012-09-07 13:10:32 +0000213<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 +0000214<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 +0000215
216Example matches X, S, the anonymous union type, i, and U;
217 typedef int X;
218 struct S {
219 union {
220 int i;
221 } U;
222 };
223</pre></td></tr>
224
225
Edwin Vane0332e0a2013-05-09 16:42:37 +0000226<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
227<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
228
229Given
230 namespace {}
231 namespace test {}
232namespaceDecl()
233 matches "namespace {}" and "namespace test {}"
234</pre></td></tr>
235
236
Manuel Klimek1a68afd2013-06-20 13:08:29 +0000237<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
238<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
239
240Given
241 void f(int x);
242parmVarDecl()
243 matches int x.
244</pre></td></tr>
245
246
Manuel Klimek67619ff2012-09-07 13:10:32 +0000247<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 +0000248<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000249
250Example matches X, Z
251 class X;
252 template&lt;class T&gt; class Z {};
253</pre></td></tr>
254
255
Manuel Klimek67619ff2012-09-07 13:10:32 +0000256<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 +0000257<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
258
259Given
260 namespace X { int x; }
261 using X::x;
262usingDecl()
263 matches using X::x </pre></td></tr>
264
265
Manuel Klimek67619ff2012-09-07 13:10:32 +0000266<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 +0000267<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000268
269Note: this does not match declarations of member variables, which are
270"field" declarations in Clang parlance.
271
272Example matches a
273 int a;
274</pre></td></tr>
275
276
Manuel Klimek41df16e2013-01-09 09:38:21 +0000277<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>
278<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
279</pre></td></tr>
280
281
282<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>
283<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
284
285Given
286 namespace ns {
287 struct A { static void f(); };
288 void A::f() {}
289 void g() { A::f(); }
290 }
291 ns::A a;
292nestedNameSpecifier()
293 matches "ns::" and both "A::"
294</pre></td></tr>
295
296
297<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>
298<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
299</pre></td></tr>
300
301
Manuel Klimek67619ff2012-09-07 13:10:32 +0000302<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 +0000303<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
304
305Given
306 int i = a[1];
307arraySubscriptExpr()
308 matches "a[1]"
309</pre></td></tr>
310
311
Daniel Jaspere0b89972012-12-04 12:08:08 +0000312<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>
313<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
314
315 int i = 100;
316 __asm("mov al, 2");
317asmStmt()
318 matches '__asm("mov al, 2")'
319</pre></td></tr>
320
321
Manuel Klimek67619ff2012-09-07 13:10:32 +0000322<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 +0000323<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
324
325Example matches a || b
326 !(a || b)
327</pre></td></tr>
328
329
Manuel Klimek67619ff2012-09-07 13:10:32 +0000330<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 +0000331<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000332
333Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000334 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000335 FunctionTakesString(GetStringByValue());
336 FunctionTakesStringByPointer(GetStringPointer());
337</pre></td></tr>
338
339
Daniel Jaspere0b89972012-12-04 12:08:08 +0000340<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>
341<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
342
343Example matches true
344 true
345</pre></td></tr>
346
347
348<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>
349<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
350
351Given
352 while (true) { break; }
353breakStmt()
354 matches 'break'
355</pre></td></tr>
356
357
358<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>
359<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
360
361Example: Matches (int*) 2.2f in
362 int i = (int) 2.2f;
363</pre></td></tr>
364
365
Manuel Klimek67619ff2012-09-07 13:10:32 +0000366<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 +0000367<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000368
369Example matches x.y() and y()
370 X x;
371 x.y();
372 y();
373</pre></td></tr>
374
375
Manuel Klimek03a83232013-06-10 08:52:15 +0000376<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
377<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
378
379Given
380 switch(a) { case 42: break; default: break; }
381caseStmt()
382 matches 'case 42: break;'.
383</pre></td></tr>
384
385
Daniel Jaspere0b89972012-12-04 12:08:08 +0000386<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>
387<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
388
389Example: castExpr() matches each of the following:
390 (int) 3;
391 const_cast&lt;Expr *&gt;(SubExpr);
392 char c = 0;
393but does not match
394 int i = (0);
395 int k = 0;
396</pre></td></tr>
397
398
399<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>
400<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
401
402 try {} catch(int i) {}
403catchStmt()
404 matches 'catch(int i)'
405</pre></td></tr>
406
407
408<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>
409<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
410
411Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
412though.
413
414Example matches 'a', L'a'
415 char ch = 'a'; wchar_t chw = L'a';
416</pre></td></tr>
417
418
Manuel Klimek415514d2013-02-06 20:36:22 +0000419<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>
420<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
421
422Example match: {1}, (1, 2)
423 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
424</pre></td></tr>
425
426
Manuel Klimek67619ff2012-09-07 13:10:32 +0000427<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 +0000428<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000429
430Example matches '{}' and '{{}}'in 'for (;;) {{}}'
431 for (;;) {{}}
432</pre></td></tr>
433
434
Manuel Klimek67619ff2012-09-07 13:10:32 +0000435<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 +0000436<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
437
438Example matches a ? b : c
439 (a ? b : c) + 42
440</pre></td></tr>
441
442
Daniel Jaspere0b89972012-12-04 12:08:08 +0000443<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>
444<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
445
446Example: Matches const_cast&lt;int*&gt;(&amp;r) in
447 int n = 42;
448 const int &amp;r(n);
449 int* p = const_cast&lt;int*&gt;(&amp;r);
450</pre></td></tr>
451
452
Manuel Klimek67619ff2012-09-07 13:10:32 +0000453<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000454<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000455
456Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000457 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000458 void f(const string &amp;a, const string &amp;b);
459 char *ptr;
460 int n;
461 f(string(ptr, n), ptr);
462</pre></td></tr>
463
464
Daniel Jaspere0b89972012-12-04 12:08:08 +0000465<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>
466<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
467
468Given
469 while (true) { continue; }
470continueStmt()
471 matches 'continue'
472</pre></td></tr>
473
474
Manuel Klimek67619ff2012-09-07 13:10:32 +0000475<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 +0000476<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000477
478Example matches x in if (x)
479 bool x;
480 if (x) {}
481</pre></td></tr>
482
483
Manuel Klimek67619ff2012-09-07 13:10:32 +0000484<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000485<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000486
487Given
488 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000489declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000490 matches 'int a'.
491</pre></td></tr>
492
493
Manuel Klimek67619ff2012-09-07 13:10:32 +0000494<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000495<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 +0000496
497Example matches the CXXDefaultArgExpr placeholder inserted for the
498 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000499 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000500 void f(int x, int y = 0);
501 f(42);
502</pre></td></tr>
503
504
Manuel Klimek03a83232013-06-10 08:52:15 +0000505<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
506<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
507
508Given
509 switch(a) { case 42: break; default: break; }
510defaultStmt()
511 matches 'default: break;'.
512</pre></td></tr>
513
514
Manuel Klimek67619ff2012-09-07 13:10:32 +0000515<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 +0000516<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000517
518Given
519 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000520deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000521 matches 'delete X'.
522</pre></td></tr>
523
524
Manuel Klimek67619ff2012-09-07 13:10:32 +0000525<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 +0000526<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
527
528Given
529 do {} while (true);
530doStmt()
531 matches 'do {} while(true)'
532</pre></td></tr>
533
534
Daniel Jaspere0b89972012-12-04 12:08:08 +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('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>
536<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
537
538Example:
539 dynamicCastExpr()
540matches
541 dynamic_cast&lt;D*&gt;(&amp;b);
542in
543 struct B { virtual ~B() {} }; struct D : B {};
544 B b;
545 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
546</pre></td></tr>
547
548
549<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>
550<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
551
552Matches any cast expression written in user code, whether it be a
553C-style cast, a functional-style cast, or a keyword cast.
554
555Does not match implicit conversions.
556
557Note: the name "explicitCast" is chosen to match Clang's terminology, as
558Clang uses the term "cast" to apply to implicit conversions as well as to
559actual cast expressions.
560
561hasDestinationType.
562
563Example: matches all five of the casts in
564 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
565but does not match the implicit conversion in
566 long ell = 42;
567</pre></td></tr>
568
569
Manuel Klimek67619ff2012-09-07 13:10:32 +0000570<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 +0000571<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000572
573Example matches x()
574 void f() { x(); }
575</pre></td></tr>
576
577
Daniel Jaspere0b89972012-12-04 12:08:08 +0000578<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>
579<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
580
581forRangeStmt() matches 'for (auto a : i)'
582 int i[] = {1, 2, 3}; for (auto a : i);
583 for(int j = 0; j &lt; 5; ++j);
584</pre></td></tr>
585
586
Manuel Klimek67619ff2012-09-07 13:10:32 +0000587<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 +0000588<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
589
590Example matches 'for (;;) {}'
591 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000592 int i[] = {1, 2, 3}; for (auto a : i);
593</pre></td></tr>
594
595
596<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>
597<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
598
599Example: Matches Foo(bar);
600 Foo f = bar;
601 Foo g = (Foo) bar;
602 Foo h = Foo(bar);
603</pre></td></tr>
604
605
606<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>
607<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
608
609Given
610 goto FOO;
611 FOO: bar();
612gotoStmt()
613 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000614</pre></td></tr>
615
616
Manuel Klimek67619ff2012-09-07 13:10:32 +0000617<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 +0000618<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
619
620Example matches 'if (x) {}'
621 if (x) {}
622</pre></td></tr>
623
624
Daniel Jaspere0b89972012-12-04 12:08:08 +0000625<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>
626<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
627
628This matches many different places, including function call return value
629eliding, as well as any type conversions.
630</pre></td></tr>
631
632
Manuel Klimek67619ff2012-09-07 13:10:32 +0000633<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000634<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
635
636Given
637 int a[] = { 1, 2 };
638 struct B { int x, y; };
639 B b = { 5, 6 };
640initList()
641 matches "{ 1, 2 }" and "{ 5, 6 }"
642</pre></td></tr>
643
644
Daniel Jaspere0b89972012-12-04 12:08:08 +0000645<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>
646<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
647
648Not matching character-encoded integers such as L'a'.
649
650Example matches 1, 1L, 0x1, 1U
651</pre></td></tr>
652
653
654<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>
655<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
656
657Given
658 goto FOO;
659 FOO: bar();
660labelStmt()
661 matches 'FOO:'
662</pre></td></tr>
663
664
665<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>
666<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
667
668Example matches [&amp;](){return 5;}
669 [&amp;](){return 5;}
670</pre></td></tr>
671
672
Manuel Klimek67619ff2012-09-07 13:10:32 +0000673<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 +0000674<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
675
676Example: Given
677 struct T {void func()};
678 T f();
679 void g(T);
680materializeTemporaryExpr() matches 'f()' in these statements
681 T u(f());
682 g(f());
683but does not match
684 f();
685 f().func();
686</pre></td></tr>
687
688
Manuel Klimek67619ff2012-09-07 13:10:32 +0000689<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 +0000690<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000691
692Example matches x.y()
693 X x;
694 x.y();
695</pre></td></tr>
696
697
Manuel Klimek67619ff2012-09-07 13:10:32 +0000698<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 +0000699<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000700
701Given
702 class Y {
703 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
704 int a; static int b;
705 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000706memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000707 matches this-&gt;x, x, y.x, a, this-&gt;b
708</pre></td></tr>
709
710
Manuel Klimek67619ff2012-09-07 13:10:32 +0000711<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 +0000712<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000713
714Given
715 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000716newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000717 matches 'new X'.
718</pre></td></tr>
719
720
Daniel Jaspere0b89972012-12-04 12:08:08 +0000721<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>
722<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
723</pre></td></tr>
724
725
726<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>
727<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
728
729 foo();;
730nullStmt()
731 matches the second ';'
732</pre></td></tr>
733
734
Manuel Klimek67619ff2012-09-07 13:10:32 +0000735<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 +0000736<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000737
738Note that if an operator isn't overloaded, it won't match. Instead, use
739binaryOperator matcher.
740Currently it does not match operators such as new delete.
741FIXME: figure out why these do not match?
742
743Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000744 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000745 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
746 ostream &amp;o; int b = 1, c = 1;
747 o &lt;&lt; b &lt;&lt; c;
748</pre></td></tr>
749
750
Daniel Jaspere0b89972012-12-04 12:08:08 +0000751<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
752<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
753
754Either the source expression or the destination type can be matched
755using has(), but hasDestinationType() is more specific and can be
756more readable.
757
758Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
759 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
760</pre></td></tr>
761
762
763<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>
764<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
765
766Given
767 return 1;
768returnStmt()
769 matches 'return 1'
770</pre></td></tr>
771
772
773<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
774<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
775
776hasDestinationType
777reinterpretCast
778
779Example:
780 staticCastExpr()
781matches
782 static_cast&lt;long&gt;(8)
783in
784 long eight(static_cast&lt;long&gt;(8));
785</pre></td></tr>
786
787
Manuel Klimek67619ff2012-09-07 13:10:32 +0000788<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 +0000789<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000790
791Given
792 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000793stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000794 matches both the compound statement '{ ++a; }' and '++a'.
795</pre></td></tr>
796
797
Daniel Jaspere0b89972012-12-04 12:08:08 +0000798<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>
799<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
800
801Example matches "abcd", L"abcd"
802 char *s = "abcd"; wchar_t *ws = L"abcd"
803</pre></td></tr>
804
805
Manuel Klimek67619ff2012-09-07 13:10:32 +0000806<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 +0000807<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
808
809Given
810 switch(a) { case 42: break; default: break; }
811switchCase()
812 matches 'case 42: break;' and 'default: break;'.
813</pre></td></tr>
814
815
Daniel Jaspere0b89972012-12-04 12:08:08 +0000816<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>
817<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
818
819Given
820 switch(a) { case 42: break; default: break; }
821switchStmt()
822 matches 'switch(a)'.
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
827<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
828
829Example matches the implicit this expression in "return i".
830 (matcher = thisExpr())
831struct foo {
832 int i;
833 int f() { return i; }
834};
835</pre></td></tr>
836
837
838<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>
839<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
840
841 try { throw 5; } catch(int i) {}
842throwExpr()
843 matches 'throw 5'
844</pre></td></tr>
845
846
847<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>
848<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
849
850 try {} catch(int i) {}
851tryStmt()
852 matches 'try {}'
853</pre></td></tr>
854
855
Manuel Klimek67619ff2012-09-07 13:10:32 +0000856<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 +0000857<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
858
859Given
860 Foo x = bar;
861 int y = sizeof(x) + alignof(x);
862unaryExprOrTypeTraitExpr()
863 matches sizeof(x) and alignof(x)
864</pre></td></tr>
865
866
Manuel Klimek67619ff2012-09-07 13:10:32 +0000867<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 +0000868<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
869
870Example matches !a
871 !a || b
872</pre></td></tr>
873
874
Daniel Jaspere0b89972012-12-04 12:08:08 +0000875<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>
876<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
877
878Example match: "foo"_suffix
879</pre></td></tr>
880
881
Manuel Klimek67619ff2012-09-07 13:10:32 +0000882<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 +0000883<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
884
885Given
886 while (true) {}
887whileStmt()
888 matches 'while (true) {}'.
889</pre></td></tr>
890
Daniel Jaspere0b89972012-12-04 12:08:08 +0000891
Manuel Klimek41df16e2013-01-09 09:38:21 +0000892<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>
893<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
894
895Given
896 int a[] = { 2, 3 };
897 int b[4];
898 void f() { int c[a[0]]; }
899arrayType()
900 matches "int a[]", "int b[4]" and "int c[a[0]]";
901</pre></td></tr>
902
903
904<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>
905<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
906
907Given
908 _Atomic(int) i;
909atomicType()
910 matches "_Atomic(int) i"
911</pre></td></tr>
912
913
914<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>
915<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
916
917Given:
918 auto n = 4;
919 int v[] = { 2, 3 }
920 for (auto i : v) { }
921autoType()
922 matches "auto n" and "auto i"
923</pre></td></tr>
924
925
926<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>
927<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
928"void (^)(int)".
929
930The pointee is always required to be a FunctionType.
931</pre></td></tr>
932
933
934<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>
935<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
936
937Given
938 struct A {};
939 A a;
940 int b;
941 float c;
942 bool d;
943builtinType()
944 matches "int b", "float c" and "bool d"
945</pre></td></tr>
946
947
948<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>
949<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
950
951Given
952 _Complex float f;
953complexType()
954 matches "_Complex float f"
955</pre></td></tr>
956
957
958<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>
959<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
960
961Given
962 void() {
963 int a[2];
964 int b[] = { 2, 3 };
965 int c[b[0]];
966 }
967constantArrayType()
968 matches "int a[2]"
969</pre></td></tr>
970
971
972<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>
973<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
974
975Given
976 template&lt;typename T, int Size&gt;
977 class array {
978 T data[Size];
979 };
980dependentSizedArrayType
981 matches "T data[Size]"
982</pre></td></tr>
983
984
Edwin Vane742d9e72013-02-25 20:43:32 +0000985<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>
986<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
987qualified name.
988
989Given
990 namespace N {
991 namespace M {
992 class D {};
993 }
994 }
995 class C {};
996
997 class C c;
998 N::M::D d;
999
1000elaboratedType() matches the type of the variable declarations of both
1001c and d.
1002</pre></td></tr>
1003
1004
Manuel Klimek41df16e2013-01-09 09:38:21 +00001005<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>
1006<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
1007
1008Given
1009 int (*f)(int);
1010 void g();
1011functionType()
1012 matches "int (*f)(int)" and the type of "g".
1013</pre></td></tr>
1014
1015
1016<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>
1017<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
1018
1019Given
1020 int a[] = { 2, 3 };
1021 int b[42];
1022 void f(int c[]) { int d[a[0]]; };
1023incompleteArrayType()
1024 matches "int a[]" and "int c[]"
1025</pre></td></tr>
1026
1027
Edwin Vane8203d9f2013-03-28 13:50:22 +00001028<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>
1029<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001030
1031Given:
1032 int *a;
1033 int &amp;b = *a;
1034 int &amp;&amp;c = 1;
1035 auto &amp;d = b;
1036 auto &amp;&amp;e = c;
1037 auto &amp;&amp;f = 2;
1038 int g = 5;
1039
Edwin Vane8203d9f2013-03-28 13:50:22 +00001040lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001041matched since the type is deduced as int&amp; by reference collapsing rules.
1042</pre></td></tr>
1043
1044
Manuel Klimek41df16e2013-01-09 09:38:21 +00001045<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>
1046<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
1047Given
1048 struct A { int i; }
1049 A::* ptr = A::i;
1050memberPointerType()
1051 matches "A::* ptr"
1052</pre></td></tr>
1053
1054
Edwin Vane88be2fd2013-04-01 18:33:34 +00001055<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('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>
1056<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1057
1058Given
1059 int (*ptr_to_array)[4];
1060 int *array_of_ptrs[4];
1061
1062varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1063array_of_ptrs.
1064</pre></td></tr>
1065
1066
Manuel Klimek41df16e2013-01-09 09:38:21 +00001067<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>
1068<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1069
1070Given
1071 int *a;
1072 int &amp;b = *a;
1073 int c = 5;
1074pointerType()
1075 matches "int *a"
1076</pre></td></tr>
1077
1078
Edwin Vane8203d9f2013-03-28 13:50:22 +00001079<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>
1080<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1081
1082Given:
1083 int *a;
1084 int &amp;b = *a;
1085 int &amp;&amp;c = 1;
1086 auto &amp;d = b;
1087 auto &amp;&amp;e = c;
1088 auto &amp;&amp;f = 2;
1089 int g = 5;
1090
1091rValueReferenceType() matches the types of c and f. e is not
1092matched as it is deduced to int&amp; by reference collapsing rules.
1093</pre></td></tr>
1094
1095
Edwin Vane742d9e72013-02-25 20:43:32 +00001096<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>
1097<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1098
1099Given
1100 class C {};
1101 struct S {};
1102
1103 C c;
1104 S s;
1105
1106recordType() matches the type of the variable declarations of both c
1107and s.
1108</pre></td></tr>
1109
1110
Manuel Klimek41df16e2013-01-09 09:38:21 +00001111<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 +00001112<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001113
1114Given
1115 int *a;
1116 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001117 int &amp;&amp;c = 1;
1118 auto &amp;d = b;
1119 auto &amp;&amp;e = c;
1120 auto &amp;&amp;f = 2;
1121 int g = 5;
1122
1123referenceType() matches the types of b, c, d, e, and f.
1124</pre></td></tr>
1125
1126
Edwin Vane3abf7782013-02-25 14:49:29 +00001127<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>
1128<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1129
1130Given
1131 template &lt;typename T&gt;
1132 class C { };
1133
1134 template class C&lt;int&gt;; A
1135 C&lt;char&gt; var; B
1136
1137templateSpecializationType() matches the type of the explicit
1138instantiation in A and the type of the variable declaration in B.
1139</pre></td></tr>
1140
1141
Daniel Jaspere0b89972012-12-04 12:08:08 +00001142<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>
1143<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1144</pre></td></tr>
1145
1146
Manuel Klimek41df16e2013-01-09 09:38:21 +00001147<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>
1148<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1149
1150Given
1151 typedef int X;
1152typedefType()
1153 matches "typedef int X"
1154</pre></td></tr>
1155
1156
1157<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>
1158<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1159integer-constant-expression.
1160
1161Given
1162 void f() {
1163 int a[] = { 2, 3 }
1164 int b[42];
1165 int c[a[0]];
1166variableArrayType()
1167 matches "int c[a[0]]"
1168</pre></td></tr>
1169
1170
1171<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1172<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1173
1174Given
1175 int a[] = { 2, 3 };
1176 int b[4];
1177 void f() { int c[a[0]]; }
1178arrayType()
1179 matches "int a[]", "int b[4]" and "int c[a[0]]";
1180</pre></td></tr>
1181
1182
1183<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>
1184<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1185
1186Given
1187 _Atomic(int) i;
1188atomicType()
1189 matches "_Atomic(int) i"
1190</pre></td></tr>
1191
1192
1193<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>
1194<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1195
1196Given:
1197 auto n = 4;
1198 int v[] = { 2, 3 }
1199 for (auto i : v) { }
1200autoType()
1201 matches "auto n" and "auto i"
1202</pre></td></tr>
1203
1204
1205<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>
1206<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1207"void (^)(int)".
1208
1209The pointee is always required to be a FunctionType.
1210</pre></td></tr>
1211
1212
1213<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>
1214<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1215
1216Given
1217 struct A {};
1218 A a;
1219 int b;
1220 float c;
1221 bool d;
1222builtinType()
1223 matches "int b", "float c" and "bool d"
1224</pre></td></tr>
1225
1226
1227<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>
1228<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1229
1230Given
1231 _Complex float f;
1232complexType()
1233 matches "_Complex float f"
1234</pre></td></tr>
1235
1236
1237<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>
1238<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1239
1240Given
1241 void() {
1242 int a[2];
1243 int b[] = { 2, 3 };
1244 int c[b[0]];
1245 }
1246constantArrayType()
1247 matches "int a[2]"
1248</pre></td></tr>
1249
1250
1251<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>
1252<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1253
1254Given
1255 template&lt;typename T, int Size&gt;
1256 class array {
1257 T data[Size];
1258 };
1259dependentSizedArrayType
1260 matches "T data[Size]"
1261</pre></td></tr>
1262
1263
Edwin Vane742d9e72013-02-25 20:43:32 +00001264<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>
1265<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1266qualified name.
1267
1268Given
1269 namespace N {
1270 namespace M {
1271 class D {};
1272 }
1273 }
1274 class C {};
1275
1276 class C c;
1277 N::M::D d;
1278
1279elaboratedType() matches the type of the variable declarations of both
1280c and d.
1281</pre></td></tr>
1282
1283
Manuel Klimek41df16e2013-01-09 09:38:21 +00001284<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>
1285<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1286
1287Given
1288 int (*f)(int);
1289 void g();
1290functionType()
1291 matches "int (*f)(int)" and the type of "g".
1292</pre></td></tr>
1293
1294
1295<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>
1296<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1297
1298Given
1299 int a[] = { 2, 3 };
1300 int b[42];
1301 void f(int c[]) { int d[a[0]]; };
1302incompleteArrayType()
1303 matches "int a[]" and "int c[]"
1304</pre></td></tr>
1305
1306
Edwin Vane8203d9f2013-03-28 13:50:22 +00001307<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>
1308<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001309
1310Given:
1311 int *a;
1312 int &amp;b = *a;
1313 int &amp;&amp;c = 1;
1314 auto &amp;d = b;
1315 auto &amp;&amp;e = c;
1316 auto &amp;&amp;f = 2;
1317 int g = 5;
1318
Edwin Vane8203d9f2013-03-28 13:50:22 +00001319lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001320matched since the type is deduced as int&amp; by reference collapsing rules.
1321</pre></td></tr>
1322
1323
Manuel Klimek41df16e2013-01-09 09:38:21 +00001324<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>
1325<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1326Given
1327 struct A { int i; }
1328 A::* ptr = A::i;
1329memberPointerType()
1330 matches "A::* ptr"
1331</pre></td></tr>
1332
1333
Edwin Vane88be2fd2013-04-01 18:33:34 +00001334<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1335<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1336
1337Given
1338 int (*ptr_to_array)[4];
1339 int *array_of_ptrs[4];
1340
1341varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1342array_of_ptrs.
1343</pre></td></tr>
1344
1345
Manuel Klimek41df16e2013-01-09 09:38:21 +00001346<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>
1347<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1348
1349Given
1350 int *a;
1351 int &amp;b = *a;
1352 int c = 5;
1353pointerType()
1354 matches "int *a"
1355</pre></td></tr>
1356
1357
Edwin Vane8203d9f2013-03-28 13:50:22 +00001358<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>
1359<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1360
1361Given:
1362 int *a;
1363 int &amp;b = *a;
1364 int &amp;&amp;c = 1;
1365 auto &amp;d = b;
1366 auto &amp;&amp;e = c;
1367 auto &amp;&amp;f = 2;
1368 int g = 5;
1369
1370rValueReferenceType() matches the types of c and f. e is not
1371matched as it is deduced to int&amp; by reference collapsing rules.
1372</pre></td></tr>
1373
1374
Edwin Vane742d9e72013-02-25 20:43:32 +00001375<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>
1376<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1377
1378Given
1379 class C {};
1380 struct S {};
1381
1382 C c;
1383 S s;
1384
1385recordType() matches the type of the variable declarations of both c
1386and s.
1387</pre></td></tr>
1388
1389
Manuel Klimek41df16e2013-01-09 09:38:21 +00001390<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 +00001391<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001392
1393Given
1394 int *a;
1395 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001396 int &amp;&amp;c = 1;
1397 auto &amp;d = b;
1398 auto &amp;&amp;e = c;
1399 auto &amp;&amp;f = 2;
1400 int g = 5;
1401
1402referenceType() matches the types of b, c, d, e, and f.
1403</pre></td></tr>
1404
1405
Edwin Vane3abf7782013-02-25 14:49:29 +00001406<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>
1407<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1408
1409Given
1410 template &lt;typename T&gt;
1411 class C { };
1412
1413 template class C&lt;int&gt;; A
1414 C&lt;char&gt; var; B
1415
1416templateSpecializationType() matches the type of the explicit
1417instantiation in A and the type of the variable declaration in B.
1418</pre></td></tr>
1419
1420
Daniel Jaspere0b89972012-12-04 12:08:08 +00001421<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>
1422<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1423</pre></td></tr>
1424
Manuel Klimek41df16e2013-01-09 09:38:21 +00001425
1426<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>
1427<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1428
1429Given
1430 typedef int X;
1431typedefType()
1432 matches "typedef int X"
1433</pre></td></tr>
1434
1435
1436<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>
1437<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1438integer-constant-expression.
1439
1440Given
1441 void f() {
1442 int a[] = { 2, 3 }
1443 int b[42];
1444 int c[a[0]];
1445variableArrayType()
1446 matches "int c[a[0]]"
1447</pre></td></tr>
1448
Manuel Klimek1da79332012-08-20 20:54:03 +00001449<!--END_DECL_MATCHERS -->
1450</table>
1451
1452<!-- ======================================================================= -->
1453<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1454<!-- ======================================================================= -->
1455
1456<p>Narrowing matchers match certain attributes on the current node, thus
1457narrowing down the set of nodes of the current type to match on.</p>
1458
1459<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1460which allow users to create more powerful match expressions.</p>
1461
1462<table>
1463<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1464<!-- START_NARROWING_MATCHERS -->
1465
Manuel Klimek67619ff2012-09-07 13:10:32 +00001466<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 +00001467<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1468
1469Usable as: Any Matcher
1470</pre></td></tr>
1471
1472
Manuel Klimek67619ff2012-09-07 13:10:32 +00001473<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 +00001474<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1475
1476Usable as: Any Matcher
1477</pre></td></tr>
1478
1479
Manuel Klimek67619ff2012-09-07 13:10:32 +00001480<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 +00001481<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1482
1483Useful when another matcher requires a child matcher, but there's no
1484additional constraint. This will often be used with an explicit conversion
1485to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1486
1487Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1488"int* p" and "void f()" in
1489 int* p;
1490 void f();
1491
1492Usable as: Any Matcher
1493</pre></td></tr>
1494
1495
Manuel Klimek67619ff2012-09-07 13:10:32 +00001496<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 +00001497<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1498
Manuel Klimeke44a0062012-08-26 23:55:24 +00001499Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001500 class X {};
1501 class Y {};
1502
1503Usable as: Any Matcher
1504</pre></td></tr>
1505
1506
Manuel Klimek67619ff2012-09-07 13:10:32 +00001507<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 +00001508<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1509unary).
1510
1511Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1512 !(a || b)
1513</pre></td></tr>
1514
1515
Manuel Klimek67619ff2012-09-07 13:10:32 +00001516<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 +00001517<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1518
1519Example matches true (matcher = boolLiteral(equals(true)))
1520 true
1521
1522Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1523 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;
1524</pre></td></tr>
1525
1526
Manuel Klimek67619ff2012-09-07 13:10:32 +00001527<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 +00001528<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1529by the compiler (eg. implicit defaultcopy constructors).
1530</pre></td></tr>
1531
1532
Manuel Klimek67619ff2012-09-07 13:10:32 +00001533<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 +00001534<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1535code (as opposed to implicitly added by the compiler).
1536
1537Given
1538 struct Foo {
1539 Foo() { }
1540 Foo(int) : foo_("A") { }
1541 string foo_;
1542 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001543constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001544 will match Foo(int), but not Foo()
1545</pre></td></tr>
1546
1547
Edwin Vane6a19a972013-03-06 17:02:57 +00001548<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 +00001549<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1550
1551Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001552"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001553
Edwin Vane6a19a972013-03-06 17:02:57 +00001554Given:
1555 class A { int operator*(); };
1556 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1557 A a;
1558 a &lt;&lt; a; &lt;-- This matches
1559
1560operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1561line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1562the declaration of A.
1563
1564Usable 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;
1565</pre></td></tr>
1566
1567
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001568<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
1569<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1570
1571Given
1572struct A {
1573 void foo() const;
1574 void bar();
1575};
1576
1577methodDecl(isConst()) matches A::foo() but not A::bar()
1578</pre></td></tr>
1579
1580
Edwin Vane5771a2f2013-04-09 20:46:36 +00001581<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
1582<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1583
1584Given
1585 class A {
1586 public:
1587 virtual void x();
1588 };
1589 class B : public A {
1590 public:
1591 virtual void x();
1592 };
1593 matches B::x
1594</pre></td></tr>
1595
1596
1597<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
1598<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1599
1600Given
1601 class A {
1602 public:
1603 virtual void x();
1604 };
1605 matches A::x
1606</pre></td></tr>
1607
1608
Edwin Vane6a19a972013-03-06 17:02:57 +00001609<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>
1610<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1611
1612Matches overloaded operator names specified in strings without the
1613"operator" prefix: e.g. "&lt;&lt;".
1614
1615Given:
1616 class A { int operator*(); };
1617 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1618 A a;
1619 a &lt;&lt; a; &lt;-- This matches
1620
1621operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1622line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1623the declaration of A.
1624
1625Usable 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 +00001626</pre></td></tr>
1627
1628
Manuel Klimek67619ff2012-09-07 13:10:32 +00001629<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 +00001630<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1631</pre></td></tr>
1632
1633
Manuel Klimek415514d2013-02-06 20:36:22 +00001634<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>
1635<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001636static member variable template instantiations.
1637
1638Given
1639 template&lt;typename T&gt; void A(T t) { }
1640 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001641functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001642 matches the specialization A&lt;int&gt;().
1643
1644Usable 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;
1645</pre></td></tr>
1646
1647
Daniel Jaspere0b89972012-12-04 12:08:08 +00001648<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>
1649<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1650isSameOrDerivedFrom(hasName(...)).
1651</pre></td></tr>
1652
1653
Manuel Klimek415514d2013-02-06 20:36:22 +00001654<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>
1655<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001656member variable template instantiations.
1657
1658Given
1659 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1660or
1661 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001662recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001663 matches the template instantiation of X&lt;A&gt;.
1664
1665But given
1666 template &lt;typename T&gt; class X {}; class A {};
1667 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001668recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001669 does not match, as X&lt;A&gt; is an explicit template specialization.
1670
1671Usable 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;
1672</pre></td></tr>
1673
1674
Manuel Klimek67619ff2012-09-07 13:10:32 +00001675<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001676<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1677a specific number of arguments (including absent default arguments).
1678
Manuel Klimeke44a0062012-08-26 23:55:24 +00001679Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001680 void f(int x, int y);
1681 f(0, 0);
1682</pre></td></tr>
1683
1684
Manuel Klimek67619ff2012-09-07 13:10:32 +00001685<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 +00001686<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1687
1688Example matches true (matcher = boolLiteral(equals(true)))
1689 true
1690
1691Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1692 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;
1693</pre></td></tr>
1694
1695
Manuel Klimek67619ff2012-09-07 13:10:32 +00001696<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 +00001697<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1698child statements.
1699
1700Example: Given
1701 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001702compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001703 matches '{}'
1704 but does not match the outer compound statement.
1705</pre></td></tr>
1706
1707
Daniel Jaspere0b89972012-12-04 12:08:08 +00001708<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>
1709<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1710
1711Given
1712 int a[42];
1713 int b[2 * 21];
1714 int c[41], d[43];
1715constantArrayType(hasSize(42))
1716 matches "int a[42]" and "int b[2 * 21]"
1717</pre></td></tr>
1718
1719
Manuel Klimek67619ff2012-09-07 13:10:32 +00001720<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 +00001721<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1722declarations.
1723
1724Example: Given
1725 int a, b;
1726 int c;
1727 int d = 2, e;
1728declCountIs(2)
1729 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1730</pre></td></tr>
1731
1732
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001733<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
1734<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1735
1736Matches a node if it equals the node previously bound to ID.
1737
1738Given
1739 class X { int a; int b; };
1740recordDecl(
1741 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1742 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1743 matches the class X, as a and b have the same type.
1744
1745Note that when multiple matches are involved via forEach* matchers,
1746equalsBoundNodes acts as a filter.
1747For example:
1748compoundStmt(
1749 forEachDescendant(varDecl().bind("d")),
1750 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1751will trigger a match for each combination of variable declaration
1752and reference to that variable declaration within a compound statement.
1753</pre></td></tr>
1754
1755
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001756<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>
1757<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1758
1759Decl has pointer identity in the AST.
1760</pre></td></tr>
1761
1762
Daniel Jasperc7093d92013-02-25 12:39:41 +00001763<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>
1764<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1765
1766Given
1767 class C {
1768 public: int a;
1769 protected: int b;
1770 private: int c;
1771 };
1772fieldDecl(isPrivate())
1773 matches 'int c;'
1774</pre></td></tr>
1775
1776
1777<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>
1778<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1779
1780Given
1781 class C {
1782 public: int a;
1783 protected: int b;
1784 private: int c;
1785 };
1786fieldDecl(isProtected())
1787 matches 'int b;'
1788</pre></td></tr>
1789
1790
1791<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>
1792<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1793
1794Given
1795 class C {
1796 public: int a;
1797 protected: int b;
1798 private: int c;
1799 };
1800fieldDecl(isPublic())
1801 matches 'int a;'
1802</pre></td></tr>
1803
1804
Manuel Klimek67619ff2012-09-07 13:10:32 +00001805<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 +00001806<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1807
1808Example matches true (matcher = boolLiteral(equals(true)))
1809 true
1810
1811Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1812 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;
1813</pre></td></tr>
1814
1815
Manuel Klimek415514d2013-02-06 20:36:22 +00001816<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>
1817<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001818
1819Example matches A, va, fa
1820 class A {};
1821 class B; Doesn't match, as it has no body.
1822 int va;
1823 extern int vb; Doesn't match, as it doesn't define the variable.
1824 void fa() {}
1825 void fb(); Doesn't match, as it has no body.
1826
1827Usable 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;
1828</pre></td></tr>
1829
1830
Manuel Klimek415514d2013-02-06 20:36:22 +00001831<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>
1832<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001833static member variable template instantiations.
1834
1835Given
1836 template&lt;typename T&gt; void A(T t) { }
1837 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001838functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001839 matches the specialization A&lt;int&gt;().
1840
1841Usable 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;
1842</pre></td></tr>
1843
1844
Manuel Klimek67619ff2012-09-07 13:10:32 +00001845<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001846<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1847
1848Given:
1849 extern "C" void f() {}
1850 extern "C" { void g() {} }
1851 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001852functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001853 matches the declaration of f and g, but not the declaration h
1854</pre></td></tr>
1855
1856
Manuel Klimek415514d2013-02-06 20:36:22 +00001857<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>
1858<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001859member variable template instantiations.
1860
1861Given
1862 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1863or
1864 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001865recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001866 matches the template instantiation of X&lt;A&gt;.
1867
1868But given
1869 template &lt;typename T&gt; class X {}; class A {};
1870 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001871recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001872 does not match, as X&lt;A&gt; is an explicit template specialization.
1873
1874Usable 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;
1875</pre></td></tr>
1876
1877
Daniel Jaspere0b89972012-12-04 12:08:08 +00001878<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>
1879<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1880
1881Given
1882 void f(int i) {}
1883 void g(int i, int j) {}
1884functionDecl(parameterCountIs(2))
1885 matches g(int i, int j) {}
1886</pre></td></tr>
1887
1888
Manuel Klimek67619ff2012-09-07 13:10:32 +00001889<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 +00001890<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1891
1892Example matches true (matcher = boolLiteral(equals(true)))
1893 true
1894
1895Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1896 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;
1897</pre></td></tr>
1898
1899
Manuel Klimek67619ff2012-09-07 13:10:32 +00001900<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 +00001901<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1902to '.'.
1903
1904Member calls on the implicit this pointer match as called with '-&gt;'.
1905
1906Given
1907 class Y {
1908 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1909 int a;
1910 static int b;
1911 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001912memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001913 matches this-&gt;x, x, y.x, a, this-&gt;b
1914</pre></td></tr>
1915
1916
Manuel Klimek67619ff2012-09-07 13:10:32 +00001917<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 +00001918<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1919
1920Supports specifying enclosing namespaces or classes by prefixing the name
1921with '&lt;enclosing&gt;::'.
1922Does not match typedefs of an underlying type with the given name.
1923
1924Example matches X (Name == "X")
1925 class X;
1926
1927Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1928 namespace a { namespace b { class X; } }
1929</pre></td></tr>
1930
1931
Manuel Klimek67619ff2012-09-07 13:10:32 +00001932<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 +00001933<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1934a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001935
1936Supports specifying enclosing namespaces or classes by
1937prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1938of an underlying type with the given name.
1939
1940Example matches X (regexp == "::X")
1941 class X;
1942
1943Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1944 namespace foo { namespace bar { class X; } }
1945</pre></td></tr>
1946
1947
Manuel Klimek67619ff2012-09-07 13:10:32 +00001948<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 +00001949<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1950
1951Given
1952 class Y { public: void x(); };
1953 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001954callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001955 matches y-&gt;x()
1956</pre></td></tr>
1957
1958
Manuel Klimekcf52ca62013-06-20 14:06:32 +00001959<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
1960<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
1961
1962Matches a node if it equals the node previously bound to ID.
1963
1964Given
1965 class X { int a; int b; };
1966recordDecl(
1967 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1968 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1969 matches the class X, as a and b have the same type.
1970
1971Note that when multiple matches are involved via forEach* matchers,
1972equalsBoundNodes acts as a filter.
1973For example:
1974compoundStmt(
1975 forEachDescendant(varDecl().bind("d")),
1976 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1977will trigger a match for each combination of variable declaration
1978and reference to that variable declaration within a compound statement.
1979</pre></td></tr>
1980
1981
Edwin Vane7b69cd02013-04-02 18:15:55 +00001982<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>
1983<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1984the node, not hidden within a typedef.
1985
1986Given
1987 typedef const int const_int;
1988 const_int i;
1989 int *const j;
1990 int *volatile k;
1991 int m;
1992varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1993i is const-qualified but the qualifier is not local.
1994</pre></td></tr>
1995
1996
Manuel Klimek67619ff2012-09-07 13:10:32 +00001997<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001998<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1999include "top-level" const.
2000
2001Given
2002 void a(int);
2003 void b(int const);
2004 void c(const int);
2005 void d(const int*);
2006 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00002007functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002008 matches "void b(int const)", "void c(const int)" and
2009 "void e(int const) {}". It does not match d as there
2010 is no top-level const on the parameter type "const int *".
2011</pre></td></tr>
2012
2013
Manuel Klimek67619ff2012-09-07 13:10:32 +00002014<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 +00002015<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2016
2017Given
2018 void a(int);
2019 void b(long);
2020 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002021functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002022matches "a(int)", "b(long)", but not "c(double)".
2023</pre></td></tr>
2024
2025
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002026<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2027<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2028
2029Matches a node if it equals the node previously bound to ID.
2030
2031Given
2032 class X { int a; int b; };
2033recordDecl(
2034 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2035 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2036 matches the class X, as a and b have the same type.
2037
2038Note that when multiple matches are involved via forEach* matchers,
2039equalsBoundNodes acts as a filter.
2040For example:
2041compoundStmt(
2042 forEachDescendant(varDecl().bind("d")),
2043 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2044will trigger a match for each combination of variable declaration
2045and reference to that variable declaration within a compound statement.
2046</pre></td></tr>
2047
2048
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00002049<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>
2050<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
2051
2052Stmt has pointer identity in the AST.
2053
2054</pre></td></tr>
2055
2056
Manuel Klimek415514d2013-02-06 20:36:22 +00002057<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>
2058<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00002059
2060Example matches A, va, fa
2061 class A {};
2062 class B; Doesn't match, as it has no body.
2063 int va;
2064 extern int vb; Doesn't match, as it doesn't define the variable.
2065 void fa() {}
2066 void fb(); Doesn't match, as it has no body.
2067
2068Usable 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;
2069</pre></td></tr>
2070
2071
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002072<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2073<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2074
2075Matches a node if it equals the node previously bound to ID.
2076
2077Given
2078 class X { int a; int b; };
2079recordDecl(
2080 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2081 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2082 matches the class X, as a and b have the same type.
2083
2084Note that when multiple matches are involved via forEach* matchers,
2085equalsBoundNodes acts as a filter.
2086For example:
2087compoundStmt(
2088 forEachDescendant(varDecl().bind("d")),
2089 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2090will trigger a match for each combination of variable declaration
2091and reference to that variable declaration within a compound statement.
2092</pre></td></tr>
2093
2094
Manuel Klimek67619ff2012-09-07 13:10:32 +00002095<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 +00002096<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2097
2098Given
2099 int x;
2100 int s = sizeof(x) + alignof(x)
2101unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2102 matches sizeof(x)
2103</pre></td></tr>
2104
2105
Manuel Klimek67619ff2012-09-07 13:10:32 +00002106<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 +00002107<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2108unary).
2109
2110Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2111 !(a || b)
2112</pre></td></tr>
2113
2114
Manuel Klimek67619ff2012-09-07 13:10:32 +00002115<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 +00002116<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2117
2118Example matches A, va, fa
2119 class A {};
2120 class B; Doesn't match, as it has no body.
2121 int va;
2122 extern int vb; Doesn't match, as it doesn't define the variable.
2123 void fa() {}
2124 void fb(); Doesn't match, as it has no body.
2125
2126Usable 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;
2127</pre></td></tr>
2128
2129
Manuel Klimek67619ff2012-09-07 13:10:32 +00002130<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 +00002131<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2132static member variable template instantiations.
2133
2134Given
2135 template&lt;typename T&gt; void A(T t) { }
2136 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002137functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002138 matches the specialization A&lt;int&gt;().
2139
2140Usable 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;
2141</pre></td></tr>
2142
2143
Manuel Klimek67619ff2012-09-07 13:10:32 +00002144<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 +00002145<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2146member variable template instantiations.
2147
2148Given
2149 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2150or
2151 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002152recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002153 matches the template instantiation of X&lt;A&gt;.
2154
2155But given
2156 template &lt;typename T&gt; class X {}; class A {};
2157 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002158recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002159 does not match, as X&lt;A&gt; is an explicit template specialization.
2160
2161Usable 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;
2162</pre></td></tr>
2163
2164<!--END_NARROWING_MATCHERS -->
2165</table>
2166
2167<!-- ======================================================================= -->
2168<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2169<!-- ======================================================================= -->
2170
2171<p>Traversal matchers specify the relationship to other nodes that are
2172reachable from the current node.</p>
2173
2174<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2175forEachDescendant) which work on all nodes and allow users to write more generic
2176match expressions.</p>
2177
2178<table>
2179<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2180<!-- START_TRAVERSAL_MATCHERS -->
2181
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002182<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>
2183<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2184
2185Unlike anyOf, eachOf will generate a match result for each
2186matching submatcher.
2187
2188For example, in:
2189 class A { int a; int b; };
2190The matcher:
2191 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2192 has(fieldDecl(hasName("b")).bind("v"))))
2193will generate two results binding "v", the first of which binds
2194the field declaration of a, the second the field declaration of
2195b.
2196
2197Usable as: Any Matcher
2198</pre></td></tr>
2199
2200
2201<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>
2202<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2203
2204Generates results for each match.
2205
2206For example, in:
2207 class A { class B {}; class C {}; };
2208The matcher:
2209 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2210will generate results for A, B and C.
2211
2212Usable as: Any Matcher
2213</pre></td></tr>
2214
2215
Manuel Klimek67619ff2012-09-07 13:10:32 +00002216<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 +00002217<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2218provided matcher.
2219
Manuel Klimeke44a0062012-08-26 23:55:24 +00002220Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002221 class X {}; Matches X, because X::X is a class of name X inside X.
2222 class Y { class X {}; };
2223 class Z { class Y { class X {}; }; }; Does not match Z.
2224
2225ChildT must be an AST base type.
2226
2227As opposed to 'has', 'forEach' will cause a match for each result that
2228matches instead of only on the first one.
2229
2230Usable as: Any Matcher
2231</pre></td></tr>
2232
2233
Manuel Klimek67619ff2012-09-07 13:10:32 +00002234<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 +00002235<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2236provided matcher.
2237
2238Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002239 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002240 class X {}; Matches X, because X::X is a class of name X inside X.
2241 class A { class X {}; };
2242 class B { class C { class X {}; }; };
2243
2244DescendantT must be an AST base type.
2245
2246As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2247each result that matches instead of only on the first one.
2248
2249Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002250 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002251will match 10 times (plus injected class name matches) on:
2252 class A { class B { class C { class D { class E {}; }; }; }; };
2253
2254Usable as: Any Matcher
2255</pre></td></tr>
2256
2257
Manuel Klimek67619ff2012-09-07 13:10:32 +00002258<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 +00002259<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2260provided matcher.
2261
Manuel Klimeke44a0062012-08-26 23:55:24 +00002262Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002263 class X {}; Matches X, because X::X is a class of name X inside X.
2264 class Y { class X {}; };
2265 class Z { class Y { class X {}; }; }; Does not match Z.
2266
2267ChildT must be an AST base type.
2268
2269Usable as: Any Matcher
2270</pre></td></tr>
2271
2272
Manuel Klimek67619ff2012-09-07 13:10:32 +00002273<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>
2274<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2275matcher.
2276
2277Given
2278void f() { if (true) { int x = 42; } }
2279void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002280expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002281
2282Usable as: Any Matcher
2283</pre></td></tr>
2284
2285
2286<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 +00002287<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2288provided matcher.
2289
2290Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002291 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002292 class X {}; Matches X, because X::X is a class of name X inside X.
2293 class Y { class X {}; };
2294 class Z { class Y { class X {}; }; };
2295
2296DescendantT must be an AST base type.
2297
2298Usable as: Any Matcher
2299</pre></td></tr>
2300
2301
Daniel Jaspere0b89972012-12-04 12:08:08 +00002302<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>
2303<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2304matcher.
2305
2306Given
2307void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2308compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2309
2310Usable as: Any Matcher
2311</pre></td></tr>
2312
2313
Manuel Klimek67619ff2012-09-07 13:10:32 +00002314<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 +00002315<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2316
2317Given
2318 int i[5];
2319 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002320arraySubscriptExpression(hasBase(implicitCastExpr(
2321 hasSourceExpression(declRefExpr()))))
2322 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002323</pre></td></tr>
2324
2325
Manuel Klimek67619ff2012-09-07 13:10:32 +00002326<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 +00002327<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2328
2329Given
2330 int i[5];
2331 void f() { i[1] = 42; }
2332arraySubscriptExpression(hasIndex(integerLiteral()))
2333 matches i[1] with the integerLiteral() matching 1
2334</pre></td></tr>
2335
2336
Manuel Klimek41df16e2013-01-09 09:38:21 +00002337<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>
2338<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2339type.
2340
2341Given
2342 struct A {};
2343 A a[7];
2344 int b[7];
2345arrayType(hasElementType(builtinType()))
2346 matches "int b[7]"
2347
2348Usable 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;
2349</pre></td></tr>
2350
2351
2352<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>
2353<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2354type.
2355
2356Given
2357 struct A {};
2358 A a[7];
2359 int b[7];
2360arrayType(hasElementType(builtinType()))
2361 matches "int b[7]"
2362
2363Usable 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;
2364</pre></td></tr>
2365
2366
2367<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>
2368<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2369
2370Given
2371 _Atomic(int) i;
2372 _Atomic(float) f;
2373atomicType(hasValueType(isInteger()))
2374 matches "_Atomic(int) i"
2375
2376Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2377</pre></td></tr>
2378
2379
2380<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>
2381<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2382
2383Given
2384 _Atomic(int) i;
2385 _Atomic(float) f;
2386atomicType(hasValueType(isInteger()))
2387 matches "_Atomic(int) i"
2388
2389Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2390</pre></td></tr>
2391
2392
2393<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>
2394<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2395
2396Note: There is no TypeLoc for the deduced type and thus no
2397getDeducedLoc() matcher.
2398
2399Given
2400 auto a = 1;
2401 auto b = 2.0;
2402autoType(hasDeducedType(isInteger()))
2403 matches "auto a"
2404
2405Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2406</pre></td></tr>
2407
2408
Manuel Klimek67619ff2012-09-07 13:10:32 +00002409<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 +00002410<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2411binary operator matches.
2412</pre></td></tr>
2413
2414
Manuel Klimek67619ff2012-09-07 13:10:32 +00002415<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 +00002416<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2417
2418Example matches a (matcher = binaryOperator(hasLHS()))
2419 a || b
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_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 +00002424<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2425
2426Example matches b (matcher = binaryOperator(hasRHS()))
2427 a || b
2428</pre></td></tr>
2429
2430
Manuel Klimek41df16e2013-01-09 09:38:21 +00002431<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>
2432<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
2433pointee matches a given matcher.
2434
2435Given
2436 int *a;
2437 int const *b;
2438 float const *f;
2439pointerType(pointee(isConstQualified(), isInteger()))
2440 matches "int const *b"
2441
2442Usable 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;,
2443 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;
2444</pre></td></tr>
2445
2446
2447<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>
2448<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
2449pointee matches a given matcher.
2450
2451Given
2452 int *a;
2453 int const *b;
2454 float const *f;
2455pointerType(pointee(isConstQualified(), isInteger()))
2456 matches "int const *b"
2457
2458Usable 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;,
2459 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;
2460</pre></td></tr>
2461
2462
Edwin Vane3abf7782013-02-25 14:49:29 +00002463<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00002464<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
2465matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002466
Manuel Klimek03a83232013-06-10 08:52:15 +00002467The associated declaration is:
2468- for type nodes, the declaration of the underlying type
2469- for CallExpr, the declaration of the callee
2470- for MemberExpr, the declaration of the referenced member
2471- for CXXConstructExpr, the declaration of the constructor
2472
2473Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2474function. e.g. various subtypes of clang::Type and various expressions.
2475FIXME: Add all node types for which this is matcher is usable due to
2476getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002477
Daniel Jaspere0b89972012-12-04 12:08:08 +00002478Usable 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 +00002479 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;,
2480 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002481</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_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 +00002485<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2486
2487Given
2488 struct Foo {
2489 Foo() : foo_(1) { }
2490 int foo_;
2491 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002492recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002493 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2494</pre></td></tr>
2495
2496
Manuel Klimek67619ff2012-09-07 13:10:32 +00002497<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 +00002498<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2499
2500Given
2501 struct Foo {
2502 Foo() : foo_(1) { }
2503 int foo_;
2504 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002505recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002506 forField(hasName("foo_"))))))
2507 matches Foo
2508with forField matching foo_
2509</pre></td></tr>
2510
2511
Manuel Klimek67619ff2012-09-07 13:10:32 +00002512<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002513<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2514
2515Given
2516 struct Foo {
2517 Foo() : foo_(1) { }
2518 int foo_;
2519 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002520recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002521 withInitializer(integerLiteral(equals(1)))))))
2522 matches Foo
2523with withInitializer matching (1)
2524</pre></td></tr>
2525
2526
Manuel Klimek67619ff2012-09-07 13:10:32 +00002527<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 +00002528<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2529
Manuel Klimeke44a0062012-08-26 23:55:24 +00002530Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002531 class Y { public: void x(); };
2532 void z() { Y y; y.x(); }",
2533
2534FIXME: Overload to allow directly matching types?
2535</pre></td></tr>
2536
2537
Manuel Klimek67619ff2012-09-07 13:10:32 +00002538<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 +00002539<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2540
2541
Manuel Klimek67619ff2012-09-07 13:10:32 +00002542<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 +00002543<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2544</pre></td></tr>
2545
2546
Manuel Klimek67619ff2012-09-07 13:10:32 +00002547<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 +00002548<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2549belongs to.
2550
2551FIXME: Generalize this for other kinds of declarations.
2552FIXME: What other kind of declarations would we need to generalize
2553this to?
2554
2555Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002556 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002557 ofClass(hasName("A"))))))
2558 class A {
2559 public:
2560 A();
2561 };
2562 A a = A();
2563</pre></td></tr>
2564
2565
Edwin Vane6a19a972013-03-06 17:02:57 +00002566<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>
2567<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2568
2569Given:
2570 class A { void func(); };
2571 class B { void member(); };
2572
2573recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2574but not B.
2575</pre></td></tr>
2576
2577
Manuel Klimek67619ff2012-09-07 13:10:32 +00002578<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 +00002579<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2580a class matching Base.
2581
Manuel Klimek67619ff2012-09-07 13:10:32 +00002582Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002583
Manuel Klimek67619ff2012-09-07 13:10:32 +00002584Example matches Y, Z, C (Base == hasName("X"))
2585 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002586 class Y : public X {}; directly derived
2587 class Z : public Y {}; indirectly derived
2588 typedef X A;
2589 typedef A B;
2590 class C : public B {}; derived from a typedef of X
2591
2592In the following example, Bar matches isDerivedFrom(hasName("X")):
2593 class Foo;
2594 typedef Foo X;
2595 class Bar : public Foo {}; derived from a type that X is a typedef of
2596</pre></td></tr>
2597
2598
Daniel Jaspere0b89972012-12-04 12:08:08 +00002599<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>
2600<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2601match Base.
2602</pre></td></tr>
2603
2604
Manuel Klimek67619ff2012-09-07 13:10:32 +00002605<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002606<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2607given matcher.
2608
Manuel Klimeke44a0062012-08-26 23:55:24 +00002609Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002610 class Y { public: void x(); };
2611 void z() { Y y; y.x();
2612</pre></td></tr>
2613
2614
Manuel Klimek67619ff2012-09-07 13:10:32 +00002615<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 +00002616<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2617expression.
2618
2619Given
2620 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002621callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002622 matches x(1, y, 42)
2623with hasAnyArgument(...)
2624 matching y
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002625
2626FIXME: Currently this will ignore parentheses and implicit casts on
2627the argument before applying the inner matcher. We'll want to remove
2628this to allow for greater control by the user once ignoreImplicit()
2629has been implemented.
Manuel Klimek1da79332012-08-20 20:54:03 +00002630</pre></td></tr>
2631
2632
Manuel Klimek67619ff2012-09-07 13:10:32 +00002633<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 +00002634<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2635call expression.
2636
2637Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002638 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002639 void x(int) { int y; x(y); }
2640</pre></td></tr>
2641
2642
Edwin Vane3abf7782013-02-25 14:49:29 +00002643<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00002644<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
2645matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002646
Manuel Klimek03a83232013-06-10 08:52:15 +00002647The associated declaration is:
2648- for type nodes, the declaration of the underlying type
2649- for CallExpr, the declaration of the callee
2650- for MemberExpr, the declaration of the referenced member
2651- for CXXConstructExpr, the declaration of the constructor
2652
2653Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2654function. e.g. various subtypes of clang::Type and various expressions.
2655FIXME: Add all node types for which this is matcher is usable due to
2656getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002657
Daniel Jaspere0b89972012-12-04 12:08:08 +00002658Usable 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 +00002659 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;,
2660 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002661</pre></td></tr>
2662
2663
Manuel Klimek03a83232013-06-10 08:52:15 +00002664<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;</td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2665<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2666extension, matches the constant given in the statement.
2667
2668Given
2669 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2670caseStmt(hasCaseConstant(integerLiteral()))
2671 matches "case 1:"
2672</pre></td></tr>
2673
2674
Manuel Klimek67619ff2012-09-07 13:10:32 +00002675<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 +00002676<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2677
2678Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002679 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002680class URL { URL(string); };
2681URL url = "a string";
2682</pre></td></tr>
2683
2684
Manuel Klimek67619ff2012-09-07 13:10:32 +00002685<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 +00002686<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2687TemplateArgument matching the given InnerMatcher.
2688
2689Given
2690 template&lt;typename T&gt; class A {};
2691 template&lt;&gt; class A&lt;double&gt; {};
2692 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002693classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002694 refersToType(asString("int"))))
2695 matches the specialization A&lt;int&gt;
2696</pre></td></tr>
2697
2698
Manuel Klimek67619ff2012-09-07 13:10:32 +00002699<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 +00002700<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2701matches the given InnerMatcher.
2702
2703Given
2704 template&lt;typename T, typename U&gt; class A {};
2705 A&lt;bool, int&gt; b;
2706 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002707classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002708 1, refersToType(asString("int"))))
2709 matches the specialization A&lt;bool, int&gt;
2710</pre></td></tr>
2711
2712
Manuel Klimek41df16e2013-01-09 09:38:21 +00002713<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>
2714<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2715type.
2716
2717Given
2718 struct A {};
2719 A a[7];
2720 int b[7];
2721arrayType(hasElementType(builtinType()))
2722 matches "int b[7]"
2723
2724Usable 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;
2725</pre></td></tr>
2726
2727
2728<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>
2729<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2730type.
2731
2732Given
2733 struct A {};
2734 A a[7];
2735 int b[7];
2736arrayType(hasElementType(builtinType()))
2737 matches "int b[7]"
2738
2739Usable 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;
2740</pre></td></tr>
2741
2742
Manuel Klimek67619ff2012-09-07 13:10:32 +00002743<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002744<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2745a given matcher.
2746
2747Given
2748 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002749hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002750 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002751with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002752 matching '{}'
2753</pre></td></tr>
2754
2755
Manuel Klimek67619ff2012-09-07 13:10:32 +00002756<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 +00002757<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2758or conditional operator.
2759
2760Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2761 if (true) {}
2762</pre></td></tr>
2763
2764
Manuel Klimek67619ff2012-09-07 13:10:32 +00002765<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 +00002766<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2767
2768Example matches b
2769 condition ? a : b
2770</pre></td></tr>
2771
2772
Manuel Klimek67619ff2012-09-07 13:10:32 +00002773<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 +00002774<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2775
2776Example matches a
2777 condition ? a : b
2778</pre></td></tr>
2779
2780
Manuel Klimek67619ff2012-09-07 13:10:32 +00002781<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 +00002782<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2783specific using shadow declaration.
2784
2785FIXME: This currently only works for functions. Fix.
2786
2787Given
2788 namespace a { void f() {} }
2789 using a::f;
2790 void g() {
2791 f(); Matches this ..
2792 a::f(); .. but not this.
2793 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002794declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002795 matches f()
2796</pre></td></tr>
2797
2798
Manuel Klimek67619ff2012-09-07 13:10:32 +00002799<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002800<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2801specified matcher.
2802
2803Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002804 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002805 bool x;
2806 if (x) {}
2807</pre></td></tr>
2808
2809
Manuel Klimek67619ff2012-09-07 13:10:32 +00002810<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 +00002811<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2812
2813Note that this does not work for global declarations because the AST
2814breaks up multiple-declaration DeclStmt's into multiple single-declaration
2815DeclStmt's.
2816Example: Given non-global declarations
2817 int a, b = 0;
2818 int c;
2819 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002820declStmt(containsDeclaration(
2821 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002822 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002823declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002824 matches 'int a, b = 0' as well as 'int d = 2, e;'
2825 but 'int c;' is not matched.
2826</pre></td></tr>
2827
2828
Manuel Klimek67619ff2012-09-07 13:10:32 +00002829<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 +00002830<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2831
2832Given
2833 int a, b;
2834 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002835declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002836 matches 'int c;' but not 'int a, b;'.
2837</pre></td></tr>
2838
2839
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002840<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
2841<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
2842the inner matcher.
2843
2844Given
2845 int x;
2846declaratorDecl(hasTypeLoc(loc(asString("int"))))
2847 matches int x
2848</pre></td></tr>
2849
2850
Edwin Vane742d9e72013-02-25 20:43:32 +00002851<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>
2852<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2853Decl, matches InnerMatcher.
2854
2855Given
2856 namespace N {
2857 namespace M {
2858 class D {};
2859 }
2860 }
2861
2862recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2863declaration of class D.
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_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 +00002868<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2869a given body.
2870
2871Given
2872 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002873hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002874 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002875with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002876 matching '{}'
2877</pre></td></tr>
2878
2879
Manuel Klimek67619ff2012-09-07 13:10:32 +00002880<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 +00002881<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2882or conditional operator.
2883
2884Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2885 if (true) {}
2886</pre></td></tr>
2887
2888
Edwin Vane742d9e72013-02-25 20:43:32 +00002889<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>
2890<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002891matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002892
2893Given
2894 namespace N {
2895 namespace M {
2896 class D {};
2897 }
2898 }
2899 N::M::D d;
2900
2901elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2902matches the type of the variable declaration of d.
2903</pre></td></tr>
2904
2905
2906<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>
2907<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2908
2909Given
2910 namespace N {
2911 namespace M {
2912 class D {};
2913 }
2914 }
2915 N::M::D d;
2916
2917elaboratedType(namesType(recordType(
2918hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2919declaration of d.
2920</pre></td></tr>
2921
2922
Manuel Klimek67619ff2012-09-07 13:10:32 +00002923<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 +00002924<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2925
2926(Note: Clang's AST refers to other conversions as "casts" too, and calls
2927actual casts "explicit" casts.)
2928</pre></td></tr>
2929
2930
Manuel Klimek67619ff2012-09-07 13:10:32 +00002931<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 +00002932<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2933declaration's type.
2934
2935In case of a value declaration (for example a variable declaration),
2936this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002937declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2938while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002939of x."
2940
Manuel Klimeke44a0062012-08-26 23:55:24 +00002941Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2942 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002943 class X {};
2944 void y(X &amp;x) { x; X z; }
2945
2946Usable 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;
2947</pre></td></tr>
2948
2949
Manuel Klimek67619ff2012-09-07 13:10:32 +00002950<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 +00002951<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2952are stripped off.
2953
2954Parentheses and explicit casts are not discarded.
2955Given
2956 int arr[5];
2957 int a = 0;
2958 char b = 0;
2959 const int c = a;
2960 int *d = arr;
2961 long e = (long) 0l;
2962The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002963 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2964 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002965would match the declarations for a, b, c, and d, but not e.
2966While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002967 varDecl(hasInitializer(integerLiteral()))
2968 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002969only match the declarations for b, c, and d.
2970</pre></td></tr>
2971
2972
Manuel Klimek67619ff2012-09-07 13:10:32 +00002973<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002974<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2975casts are stripped off.
2976
2977Implicit and non-C Style casts are also discarded.
2978Given
2979 int a = 0;
2980 char b = (0);
2981 void* c = reinterpret_cast&lt;char*&gt;(0);
2982 char d = char(0);
2983The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00002984 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002985would match the declarations for a, b, c, and d.
2986while
Manuel Klimeke44a0062012-08-26 23:55:24 +00002987 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002988only match the declaration for a.
2989</pre></td></tr>
2990
2991
Manuel Klimek67619ff2012-09-07 13:10:32 +00002992<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 +00002993<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2994parentheses are stripped off.
2995
2996Explicit casts are not discarded.
2997Given
2998 int arr[5];
2999 int a = 0;
3000 char b = (0);
3001 const int c = a;
3002 int *d = (arr);
3003 long e = ((long) 0l);
3004The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00003005 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3006 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003007would match the declarations for a, b, c, and d, but not e.
3008while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003009 varDecl(hasInitializer(integerLiteral()))
3010 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003011would only match the declaration for a.
3012</pre></td></tr>
3013
3014
Manuel Klimek67619ff2012-09-07 13:10:32 +00003015<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 +00003016<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3017a given body.
3018
3019Given
3020 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003021hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003022 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003023with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003024 matching '{}'
3025</pre></td></tr>
3026
3027
Manuel Klimek67619ff2012-09-07 13:10:32 +00003028<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 +00003029<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3030or conditional operator.
3031
3032Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3033 if (true) {}
3034</pre></td></tr>
3035
3036
Manuel Klimek67619ff2012-09-07 13:10:32 +00003037<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 +00003038<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3039
3040Example:
3041 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3042matches '++x' in
3043 for (x; x &lt; N; ++x) { }
3044</pre></td></tr>
3045
3046
Manuel Klimek67619ff2012-09-07 13:10:32 +00003047<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 +00003048<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3049
3050Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00003051 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003052matches 'int x = 0' in
3053 for (int x = 0; x &lt; N; ++x) { }
3054</pre></td></tr>
3055
3056
Manuel Klimek67619ff2012-09-07 13:10:32 +00003057<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 +00003058<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3059
3060Does not match the 'this' parameter of a method.
3061
3062Given
3063 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003064methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003065 matches f(int x, int y, int z) {}
3066with hasAnyParameter(...)
3067 matching int y
3068</pre></td></tr>
3069
3070
Manuel Klimek67619ff2012-09-07 13:10:32 +00003071<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 +00003072<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3073
3074Given
3075 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003076methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003077 matches f(int x) {}
3078with hasParameter(...)
3079 matching int x
3080</pre></td></tr>
3081
3082
Manuel Klimek67619ff2012-09-07 13:10:32 +00003083<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 +00003084<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3085
3086Given:
3087 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003088methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003089 matches int f() { return 1; }
3090</pre></td></tr>
3091
3092
Manuel Klimek67619ff2012-09-07 13:10:32 +00003093<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 +00003094<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3095or conditional operator.
3096
3097Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3098 if (true) {}
3099</pre></td></tr>
3100
3101
Manuel Klimek67619ff2012-09-07 13:10:32 +00003102<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 +00003103<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3104
3105Given
3106 if (A* a = GetAPointer()) {}
3107hasConditionVariableStatment(...)
3108 matches 'A* a = GetAPointer()'.
3109</pre></td></tr>
3110
3111
Manuel Klimek67619ff2012-09-07 13:10:32 +00003112<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 +00003113<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3114matcher.
3115
3116FIXME: Unit test this matcher
3117</pre></td></tr>
3118
3119
Edwin Vane3abf7782013-02-25 14:49:29 +00003120<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003121<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3122matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00003123
Manuel Klimek03a83232013-06-10 08:52:15 +00003124The associated declaration is:
3125- for type nodes, the declaration of the underlying type
3126- for CallExpr, the declaration of the callee
3127- for MemberExpr, the declaration of the referenced member
3128- for CXXConstructExpr, the declaration of the constructor
3129
3130Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3131function. e.g. various subtypes of clang::Type and various expressions.
3132FIXME: Add all node types for which this is matcher is usable due to
3133getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003134
Daniel Jaspere0b89972012-12-04 12:08:08 +00003135Usable 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 +00003136 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;,
3137 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003138</pre></td></tr>
3139
3140
Manuel Klimek67619ff2012-09-07 13:10:32 +00003141<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 +00003142<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3143matched by a given matcher.
3144
3145Given
3146 struct X { int m; };
3147 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003148memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003149 matches "x.m" and "m"
3150with hasObjectExpression(...)
3151 matching "x" and the implicit object expression of "m" which has type X*.
3152</pre></td></tr>
3153
3154
Manuel Klimek67619ff2012-09-07 13:10:32 +00003155<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 +00003156<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3157given matcher.
3158
3159Given
3160 struct { int first, second; } first, second;
3161 int i(second.first);
3162 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003163memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003164 matches second.first
3165 but not first.second (because the member name there is "second").
3166</pre></td></tr>
3167
3168
Manuel Klimek41df16e2013-01-09 09:38:21 +00003169<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>
3170<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
3171pointee matches a given matcher.
3172
3173Given
3174 int *a;
3175 int const *b;
3176 float const *f;
3177pointerType(pointee(isConstQualified(), isInteger()))
3178 matches "int const *b"
3179
3180Usable 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;,
3181 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;
3182</pre></td></tr>
3183
3184
3185<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>
3186<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
3187pointee matches a given matcher.
3188
3189Given
3190 int *a;
3191 int const *b;
3192 float const *f;
3193pointerType(pointee(isConstQualified(), isInteger()))
3194 matches "int const *b"
3195
3196Usable 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;,
3197 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;
3198</pre></td></tr>
3199
3200
Manuel Klimek415514d2013-02-06 20:36:22 +00003201<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 +00003202<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3203
3204Given
3205 struct A { struct B { struct C {}; }; };
3206 A::B::C c;
3207nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3208 matches "A::"
3209</pre></td></tr>
3210
3211
Manuel Klimek41df16e2013-01-09 09:38:21 +00003212<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>
3213<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3214NestedNameSpecifier-matcher matches.
3215</pre></td></tr>
3216
3217
Daniel Jaspere0b89972012-12-04 12:08:08 +00003218<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>
3219<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3220given TypeLoc.
3221
3222Given
3223 struct A { struct B { struct C {}; }; };
3224 A::B::C c;
3225nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3226 hasDeclaration(recordDecl(hasName("A")))))))
3227 matches "A::"
3228</pre></td></tr>
3229
3230
Manuel Klimek415514d2013-02-06 20:36:22 +00003231<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 +00003232<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3233
3234Given
3235 struct A { struct B { struct C {}; }; };
3236 A::B::C c;
3237nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3238 matches "A::"
3239</pre></td></tr>
3240
3241
3242<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>
3243<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3244given namespace matcher.
3245
3246Given
3247 namespace ns { struct A {}; }
3248 ns::A a;
3249nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3250 matches "ns::"
3251</pre></td></tr>
3252
3253
3254<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>
3255<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3256given QualType matcher without qualifiers.
3257
3258Given
3259 struct A { struct B { struct C {}; }; };
3260 A::B::C c;
3261nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3262 matches "A::"
3263</pre></td></tr>
3264
3265
Edwin Vane88be2fd2013-04-01 18:33:34 +00003266<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>
3267<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3268
3269Given
3270 int (*ptr_to_array)[4];
3271 int (*ptr_to_func)(int);
3272
3273varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3274ptr_to_func but not ptr_to_array.
3275
3276Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3277</pre></td></tr>
3278
3279
Manuel Klimek41df16e2013-01-09 09:38:21 +00003280<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>
3281<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3282pointee matches a given matcher.
3283
3284Given
3285 int *a;
3286 int const *b;
3287 float const *f;
3288pointerType(pointee(isConstQualified(), isInteger()))
3289 matches "int const *b"
3290
3291Usable 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;,
3292 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;
3293</pre></td></tr>
3294
3295
3296<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>
3297<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3298pointee matches a given matcher.
3299
3300Given
3301 int *a;
3302 int const *b;
3303 float const *f;
3304pointerType(pointee(isConstQualified(), isInteger()))
3305 matches "int const *b"
3306
3307Usable 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;,
3308 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;
3309</pre></td></tr>
3310
3311
Edwin Vane6a19a972013-03-06 17:02:57 +00003312<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>
3313<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3314
3315Given:
3316 typedef int &amp;int_ref;
3317 int a;
3318 int_ref b = a;
3319
3320varDecl(hasType(qualType(referenceType()))))) will not match the
3321declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3322</pre></td></tr>
3323
3324
Edwin Vane3abf7782013-02-25 14:49:29 +00003325<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003326<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3327matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003328
Manuel Klimek03a83232013-06-10 08:52:15 +00003329The associated declaration is:
3330- for type nodes, the declaration of the underlying type
3331- for CallExpr, the declaration of the callee
3332- for MemberExpr, the declaration of the referenced member
3333- for CXXConstructExpr, the declaration of the constructor
3334
3335Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3336function. e.g. various subtypes of clang::Type and various expressions.
3337FIXME: Add all node types for which this is matcher is usable due to
3338getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003339
Daniel Jaspere0b89972012-12-04 12:08:08 +00003340Usable 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 +00003341 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;,
3342 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003343</pre></td></tr>
3344
3345
Manuel Klimek67619ff2012-09-07 13:10:32 +00003346<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 +00003347<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3348</pre></td></tr>
3349
3350
Manuel Klimek67619ff2012-09-07 13:10:32 +00003351<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 +00003352<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3353</pre></td></tr>
3354
3355
Manuel Klimek41df16e2013-01-09 09:38:21 +00003356<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>
3357<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3358pointee matches a given matcher.
3359
3360Given
3361 int *a;
3362 int const *b;
3363 float const *f;
3364pointerType(pointee(isConstQualified(), isInteger()))
3365 matches "int const *b"
3366
3367Usable 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;,
3368 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;
3369</pre></td></tr>
3370
3371
3372<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>
3373<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3374pointee matches a given matcher.
3375
3376Given
3377 int *a;
3378 int const *b;
3379 float const *f;
3380pointerType(pointee(isConstQualified(), isInteger()))
3381 matches "int const *b"
3382
3383Usable 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;,
3384 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;
3385</pre></td></tr>
3386
3387
Manuel Klimek67619ff2012-09-07 13:10:32 +00003388<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 +00003389<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3390alignof.
3391</pre></td></tr>
3392
3393
Manuel Klimek67619ff2012-09-07 13:10:32 +00003394<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 +00003395<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3396sizeof.
3397</pre></td></tr>
3398
3399
Manuel Klimek03a83232013-06-10 08:52:15 +00003400<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
3401<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3402statement. This matcher may produce multiple matches.
3403
3404Given
3405 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3406switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3407 matches four times, with "c" binding each of "case 1:", "case 2:",
3408"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3409"switch (1)", "switch (2)" and "switch (2)".
3410</pre></td></tr>
3411
3412
Manuel Klimek67619ff2012-09-07 13:10:32 +00003413<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 +00003414<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3415
3416Given
3417 template&lt;typename T&gt; struct A {};
3418 struct B { B* next; };
3419 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003420classTemplateSpecializationDecl(hasAnyTemplateArgument(
3421 refersToDeclaration(fieldDecl(hasName("next"))))
3422 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003423 B::next
3424</pre></td></tr>
3425
3426
Manuel Klimek67619ff2012-09-07 13:10:32 +00003427<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 +00003428<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3429
3430Given
3431 struct X {};
3432 template&lt;typename T&gt; struct A {};
3433 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003434classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003435 refersToType(class(hasName("X")))))
3436 matches the specialization A&lt;X&gt;
3437</pre></td></tr>
3438
3439
Edwin Vane3abf7782013-02-25 14:49:29 +00003440<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003441<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
3442matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003443
Manuel Klimek03a83232013-06-10 08:52:15 +00003444The associated declaration is:
3445- for type nodes, the declaration of the underlying type
3446- for CallExpr, the declaration of the callee
3447- for MemberExpr, the declaration of the referenced member
3448- for CXXConstructExpr, the declaration of the constructor
3449
3450Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3451function. e.g. various subtypes of clang::Type and various expressions.
3452FIXME: Add all node types for which this is matcher is usable due to
3453getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003454
3455Usable 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 +00003456 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;,
3457 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3458</pre></td></tr>
3459
3460
3461<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>
3462<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3463QualType-matcher matches.
3464</pre></td></tr>
3465
3466
3467<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek03a83232013-06-10 08:52:15 +00003468<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
3469matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00003470
Manuel Klimek03a83232013-06-10 08:52:15 +00003471The associated declaration is:
3472- for type nodes, the declaration of the underlying type
3473- for CallExpr, the declaration of the callee
3474- for MemberExpr, the declaration of the referenced member
3475- for CXXConstructExpr, the declaration of the constructor
3476
3477Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3478function. e.g. various subtypes of clang::Type and various expressions.
3479FIXME: Add all node types for which this is matcher is usable due to
3480getDecl().
Edwin Vane3abf7782013-02-25 14:49:29 +00003481
3482Usable 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;,
3483 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;,
3484 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003485</pre></td></tr>
3486
3487
Manuel Klimek67619ff2012-09-07 13:10:32 +00003488<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 +00003489<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3490
3491Given
3492 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3493unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3494 matches sizeof(a) and alignof(c)
3495</pre></td></tr>
3496
3497
Manuel Klimek67619ff2012-09-07 13:10:32 +00003498<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 +00003499<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3500
Daniel Jaspere0b89972012-12-04 12:08:08 +00003501Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003502 !true
3503</pre></td></tr>
3504
3505
Manuel Klimek67619ff2012-09-07 13:10:32 +00003506<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 +00003507<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3508
3509Given
3510 namespace X { void b(); }
3511 using X::b;
3512usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3513 matches using X::b </pre></td></tr>
3514
3515
Manuel Klimek67619ff2012-09-07 13:10:32 +00003516<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 +00003517<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3518matched by the given matcher.
3519
3520Given
3521 namespace X { int a; void b(); }
3522 using X::a;
3523 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003524usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003525 matches using X::b but not using X::a </pre></td></tr>
3526
3527
Manuel Klimek67619ff2012-09-07 13:10:32 +00003528<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 +00003529<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3530declaration's type.
3531
3532In case of a value declaration (for example a variable declaration),
3533this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003534declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3535while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003536of x."
3537
Manuel Klimeke44a0062012-08-26 23:55:24 +00003538Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3539 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003540 class X {};
3541 void y(X &amp;x) { x; X z; }
3542
3543Usable 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;
3544</pre></td></tr>
3545
3546
Manuel Klimek67619ff2012-09-07 13:10:32 +00003547<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 +00003548<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3549that matches the given matcher.
3550
Manuel Klimeke44a0062012-08-26 23:55:24 +00003551Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003552 bool y() { return true; }
3553 bool x = y();
3554</pre></td></tr>
3555
3556
Daniel Jaspere0b89972012-12-04 12:08:08 +00003557<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>
3558<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3559expression.
3560
3561Given
3562 void f(int b) {
3563 int a[b];
3564 }
3565variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3566 varDecl(hasName("b")))))))
3567 matches "int a[b]"
3568</pre></td></tr>
3569
3570
Manuel Klimek67619ff2012-09-07 13:10:32 +00003571<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 +00003572<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3573a given body.
3574
3575Given
3576 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003577hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003578 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003579with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003580 matching '{}'
3581</pre></td></tr>
3582
3583
Manuel Klimek67619ff2012-09-07 13:10:32 +00003584<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 +00003585<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3586or conditional operator.
3587
3588Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3589 if (true) {}
3590</pre></td></tr>
3591
3592<!--END_TRAVERSAL_MATCHERS -->
3593</table>
3594
3595</div>
3596</body>
3597</html>
3598
3599