blob: 7b70f118454864b11bf55a2c0038ec32c73153ae [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
Manuel Klimek8c5f9482013-06-21 09:59:59 +000060<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66 ifStmt(hasTrueExpression(
67 expr(hasDescendant(
68 ifStmt()))))))
69</pre>
70</p>
71
Manuel Klimek1da79332012-08-20 20:54:03 +000072<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
Manuel Klimek8c5f9482013-06-21 09:59:59 +000088<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
Manuel Klimek1da79332012-08-20 20:54:03 +000099<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
Daniel Jasperc7093d92013-02-25 12:39:41 +0000103<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>
104<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
105
106Given
107 class C {
108 public:
109 int a;
110 };
111accessSpecDecl()
112 matches 'public:'
113</pre></td></tr>
114
115
Manuel Klimek67619ff2012-09-07 13:10:32 +0000116<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 +0000117<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000118
119Example matches Z
120 template&lt;class T&gt; class Z {};
121</pre></td></tr>
122
123
Manuel Klimek67619ff2012-09-07 13:10:32 +0000124<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000125<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000126
127Given
128 template&lt;typename T&gt; class A {};
129 template&lt;&gt; class A&lt;double&gt; {};
130 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000131classTemplateSpecializationDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000132 matches the specializations A&lt;int&gt; and A&lt;double&gt;
133</pre></td></tr>
134
135
Manuel Klimek67619ff2012-09-07 13:10:32 +0000136<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 +0000137<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000138
139Example matches Foo::Foo() and Foo::Foo(int)
140 class Foo {
141 public:
142 Foo();
143 Foo(int);
144 int DoSomething();
145 };
146</pre></td></tr>
147
148
Manuel Klimek67619ff2012-09-07 13:10:32 +0000149<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 +0000150<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
151
152Examples matches X, C, and the friend declaration inside C;
153 void X();
154 class C {
155 friend X;
156 };
157</pre></td></tr>
158
159
Manuel Klimek1a68afd2013-06-20 13:08:29 +0000160<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>
161<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
162and non-type template parameter declarations).
163
164Given
165 class X { int y; };
166declaratorDecl()
167 matches int y.
168</pre></td></tr>
169
170
Manuel Klimek67619ff2012-09-07 13:10:32 +0000171<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 +0000172<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000173
174Example matches Foo::~Foo()
175 class Foo {
176 public:
177 virtual ~Foo();
178 };
179</pre></td></tr>
180
181
Manuel Klimek67619ff2012-09-07 13:10:32 +0000182<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 +0000183<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
Manuel Klimek1da79332012-08-20 20:54:03 +0000184
185Example matches A, B, C
186 enum X {
187 A, B, C
188 };
189</pre></td></tr>
190
191
Manuel Klimek67619ff2012-09-07 13:10:32 +0000192<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 +0000193<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
194
195Example matches X
196 enum X {
197 A, B, C
198 };
199</pre></td></tr>
200
201
Manuel Klimek67619ff2012-09-07 13:10:32 +0000202<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000203<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000204
205Given
206 class X { int m; };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000207fieldDecl()
Manuel Klimek1da79332012-08-20 20:54:03 +0000208 matches 'm'.
209</pre></td></tr>
210
211
Manuel Klimek67619ff2012-09-07 13:10:32 +0000212<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 +0000213<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000214
215Example matches f
216 void f();
217</pre></td></tr>
218
219
Manuel Klimek67619ff2012-09-07 13:10:32 +0000220<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 +0000221<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000222
223Example matches f
224 template&lt;class T&gt; void f(T t) {}
225</pre></td></tr>
226
227
Manuel Klimek67619ff2012-09-07 13:10:32 +0000228<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 +0000229<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000230
231Example matches y
232 class X { void y() };
233</pre></td></tr>
234
235
Manuel Klimek67619ff2012-09-07 13:10:32 +0000236<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 +0000237<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 +0000238
239Example matches X, S, the anonymous union type, i, and U;
240 typedef int X;
241 struct S {
242 union {
243 int i;
244 } U;
245 };
246</pre></td></tr>
247
248
Edwin Vane0332e0a2013-05-09 16:42:37 +0000249<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>
250<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
251
252Given
253 namespace {}
254 namespace test {}
255namespaceDecl()
256 matches "namespace {}" and "namespace test {}"
257</pre></td></tr>
258
259
Manuel Klimek1a68afd2013-06-20 13:08:29 +0000260<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>
261<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
262
263Given
264 void f(int x);
265parmVarDecl()
266 matches int x.
267</pre></td></tr>
268
269
Manuel Klimek67619ff2012-09-07 13:10:32 +0000270<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +0000271<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000272
273Example matches X, Z
274 class X;
275 template&lt;class T&gt; class Z {};
276</pre></td></tr>
277
278
Manuel Klimek67619ff2012-09-07 13:10:32 +0000279<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 +0000280<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
281
282Given
283 namespace X { int x; }
284 using X::x;
285usingDecl()
286 matches using X::x </pre></td></tr>
287
288
Manuel Klimek67619ff2012-09-07 13:10:32 +0000289<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 +0000290<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000291
292Note: this does not match declarations of member variables, which are
293"field" declarations in Clang parlance.
294
295Example matches a
296 int a;
297</pre></td></tr>
298
299
Manuel Klimek41df16e2013-01-09 09:38:21 +0000300<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>
301<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
302</pre></td></tr>
303
304
305<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>
306<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
307
308Given
309 namespace ns {
310 struct A { static void f(); };
311 void A::f() {}
312 void g() { A::f(); }
313 }
314 ns::A a;
315nestedNameSpecifier()
316 matches "ns::" and both "A::"
317</pre></td></tr>
318
319
320<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>
321<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
322</pre></td></tr>
323
324
Manuel Klimek67619ff2012-09-07 13:10:32 +0000325<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 +0000326<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
327
328Given
329 int i = a[1];
330arraySubscriptExpr()
331 matches "a[1]"
332</pre></td></tr>
333
334
Daniel Jaspere0b89972012-12-04 12:08:08 +0000335<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>
336<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
337
338 int i = 100;
339 __asm("mov al, 2");
340asmStmt()
341 matches '__asm("mov al, 2")'
342</pre></td></tr>
343
344
Manuel Klimek67619ff2012-09-07 13:10:32 +0000345<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000346<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
347
348Example matches a || b
349 !(a || b)
350</pre></td></tr>
351
352
Manuel Klimek67619ff2012-09-07 13:10:32 +0000353<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 +0000354<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
Manuel Klimek1da79332012-08-20 20:54:03 +0000355
356Example matches FunctionTakesString(GetStringByValue())
Manuel Klimeke44a0062012-08-26 23:55:24 +0000357 (matcher = bindTemporaryExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000358 FunctionTakesString(GetStringByValue());
359 FunctionTakesStringByPointer(GetStringPointer());
360</pre></td></tr>
361
362
Daniel Jaspere0b89972012-12-04 12:08:08 +0000363<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>
364<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
365
366Example matches true
367 true
368</pre></td></tr>
369
370
371<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>
372<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
373
374Given
375 while (true) { break; }
376breakStmt()
377 matches 'break'
378</pre></td></tr>
379
380
381<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>
382<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
383
384Example: Matches (int*) 2.2f in
385 int i = (int) 2.2f;
386</pre></td></tr>
387
388
Manuel Klimek67619ff2012-09-07 13:10:32 +0000389<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 +0000390<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000391
392Example matches x.y() and y()
393 X x;
394 x.y();
395 y();
396</pre></td></tr>
397
398
Manuel Klimek03a83232013-06-10 08:52:15 +0000399<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>
400<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
401
402Given
403 switch(a) { case 42: break; default: break; }
404caseStmt()
405 matches 'case 42: break;'.
406</pre></td></tr>
407
408
Daniel Jaspere0b89972012-12-04 12:08:08 +0000409<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>
410<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
411
412Example: castExpr() matches each of the following:
413 (int) 3;
414 const_cast&lt;Expr *&gt;(SubExpr);
415 char c = 0;
416but does not match
417 int i = (0);
418 int k = 0;
419</pre></td></tr>
420
421
422<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>
423<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
424
425 try {} catch(int i) {}
426catchStmt()
427 matches 'catch(int i)'
428</pre></td></tr>
429
430
431<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>
432<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
433
434Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
435though.
436
437Example matches 'a', L'a'
438 char ch = 'a'; wchar_t chw = L'a';
439</pre></td></tr>
440
441
Manuel Klimek415514d2013-02-06 20:36:22 +0000442<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
443<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
444
445Example match: {1}, (1, 2)
446 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
447</pre></td></tr>
448
449
Manuel Klimek67619ff2012-09-07 13:10:32 +0000450<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000451<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000452
453Example matches '{}' and '{{}}'in 'for (;;) {{}}'
454 for (;;) {{}}
455</pre></td></tr>
456
457
Manuel Klimek67619ff2012-09-07 13:10:32 +0000458<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 +0000459<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
460
461Example matches a ? b : c
462 (a ? b : c) + 42
463</pre></td></tr>
464
465
Daniel Jaspere0b89972012-12-04 12:08:08 +0000466<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>
467<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
468
469Example: Matches const_cast&lt;int*&gt;(&amp;r) in
470 int n = 42;
471 const int &amp;r(n);
472 int* p = const_cast&lt;int*&gt;(&amp;r);
473</pre></td></tr>
474
475
Manuel Klimek67619ff2012-09-07 13:10:32 +0000476<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 +0000477<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
Manuel Klimek1da79332012-08-20 20:54:03 +0000478
479Example matches string(ptr, n) and ptr within arguments of f
Manuel Klimeke44a0062012-08-26 23:55:24 +0000480 (matcher = constructExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000481 void f(const string &amp;a, const string &amp;b);
482 char *ptr;
483 int n;
484 f(string(ptr, n), ptr);
485</pre></td></tr>
486
487
Daniel Jaspere0b89972012-12-04 12:08:08 +0000488<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>
489<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
490
491Given
492 while (true) { continue; }
493continueStmt()
494 matches 'continue'
495</pre></td></tr>
496
497
Manuel Klimek67619ff2012-09-07 13:10:32 +0000498<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 +0000499<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
Manuel Klimek1da79332012-08-20 20:54:03 +0000500
501Example matches x in if (x)
502 bool x;
503 if (x) {}
504</pre></td></tr>
505
506
Manuel Klimek67619ff2012-09-07 13:10:32 +0000507<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 +0000508<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000509
510Given
511 int a;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000512declStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000513 matches 'int a'.
514</pre></td></tr>
515
516
Manuel Klimek67619ff2012-09-07 13:10:32 +0000517<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 +0000518<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 +0000519
520Example matches the CXXDefaultArgExpr placeholder inserted for the
521 default value of the second parameter in the call expression f(42)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000522 (matcher = defaultArgExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000523 void f(int x, int y = 0);
524 f(42);
525</pre></td></tr>
526
527
Manuel Klimek03a83232013-06-10 08:52:15 +0000528<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>
529<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
530
531Given
532 switch(a) { case 42: break; default: break; }
533defaultStmt()
534 matches 'default: break;'.
535</pre></td></tr>
536
537
Manuel Klimek67619ff2012-09-07 13:10:32 +0000538<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 +0000539<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000540
541Given
542 delete X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000543deleteExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000544 matches 'delete X'.
545</pre></td></tr>
546
547
Manuel Klimek67619ff2012-09-07 13:10:32 +0000548<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 +0000549<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
550
551Given
552 do {} while (true);
553doStmt()
554 matches 'do {} while(true)'
555</pre></td></tr>
556
557
Daniel Jaspere0b89972012-12-04 12:08:08 +0000558<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>
559<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
560
561Example:
562 dynamicCastExpr()
563matches
564 dynamic_cast&lt;D*&gt;(&amp;b);
565in
566 struct B { virtual ~B() {} }; struct D : B {};
567 B b;
568 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
569</pre></td></tr>
570
571
572<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>
573<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
574
575Matches any cast expression written in user code, whether it be a
576C-style cast, a functional-style cast, or a keyword cast.
577
578Does not match implicit conversions.
579
580Note: the name "explicitCast" is chosen to match Clang's terminology, as
581Clang uses the term "cast" to apply to implicit conversions as well as to
582actual cast expressions.
583
584hasDestinationType.
585
586Example: matches all five of the casts in
587 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
588but does not match the implicit conversion in
589 long ell = 42;
590</pre></td></tr>
591
592
Manuel Klimek67619ff2012-09-07 13:10:32 +0000593<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000594<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000595
596Example matches x()
597 void f() { x(); }
598</pre></td></tr>
599
600
Daniel Jaspere0b89972012-12-04 12:08:08 +0000601<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>
602<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
603
604forRangeStmt() matches 'for (auto a : i)'
605 int i[] = {1, 2, 3}; for (auto a : i);
606 for(int j = 0; j &lt; 5; ++j);
607</pre></td></tr>
608
609
Manuel Klimek67619ff2012-09-07 13:10:32 +0000610<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 +0000611<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
612
613Example matches 'for (;;) {}'
614 for (;;) {}
Daniel Jaspere0b89972012-12-04 12:08:08 +0000615 int i[] = {1, 2, 3}; for (auto a : i);
616</pre></td></tr>
617
618
619<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>
620<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
621
622Example: Matches Foo(bar);
623 Foo f = bar;
624 Foo g = (Foo) bar;
625 Foo h = Foo(bar);
626</pre></td></tr>
627
628
629<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>
630<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
631
632Given
633 goto FOO;
634 FOO: bar();
635gotoStmt()
636 matches 'goto FOO'
Manuel Klimek1da79332012-08-20 20:54:03 +0000637</pre></td></tr>
638
639
Manuel Klimek67619ff2012-09-07 13:10:32 +0000640<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 +0000641<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
642
643Example matches 'if (x) {}'
644 if (x) {}
645</pre></td></tr>
646
647
Daniel Jaspere0b89972012-12-04 12:08:08 +0000648<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
649<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
650
651This matches many different places, including function call return value
652eliding, as well as any type conversions.
653</pre></td></tr>
654
655
Manuel Klimek67619ff2012-09-07 13:10:32 +0000656<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000657<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
658
659Given
660 int a[] = { 1, 2 };
661 struct B { int x, y; };
662 B b = { 5, 6 };
663initList()
664 matches "{ 1, 2 }" and "{ 5, 6 }"
665</pre></td></tr>
666
667
Daniel Jaspere0b89972012-12-04 12:08:08 +0000668<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
669<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
670
671Not matching character-encoded integers such as L'a'.
672
673Example matches 1, 1L, 0x1, 1U
674</pre></td></tr>
675
676
677<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>
678<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
679
680Given
681 goto FOO;
682 FOO: bar();
683labelStmt()
684 matches 'FOO:'
685</pre></td></tr>
686
687
688<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>
689<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
690
691Example matches [&amp;](){return 5;}
692 [&amp;](){return 5;}
693</pre></td></tr>
694
695
Manuel Klimek67619ff2012-09-07 13:10:32 +0000696<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 +0000697<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
698
699Example: Given
700 struct T {void func()};
701 T f();
702 void g(T);
703materializeTemporaryExpr() matches 'f()' in these statements
704 T u(f());
705 g(f());
706but does not match
707 f();
708 f().func();
709</pre></td></tr>
710
711
Manuel Klimek67619ff2012-09-07 13:10:32 +0000712<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 +0000713<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000714
715Example matches x.y()
716 X x;
717 x.y();
718</pre></td></tr>
719
720
Manuel Klimek67619ff2012-09-07 13:10:32 +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('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 +0000722<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000723
724Given
725 class Y {
726 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
727 int a; static int b;
728 };
Manuel Klimeke44a0062012-08-26 23:55:24 +0000729memberExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000730 matches this-&gt;x, x, y.x, a, this-&gt;b
731</pre></td></tr>
732
733
Manuel Klimek67619ff2012-09-07 13:10:32 +0000734<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 +0000735<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
Manuel Klimek1da79332012-08-20 20:54:03 +0000736
737Given
738 new X;
Manuel Klimeke44a0062012-08-26 23:55:24 +0000739newExpr()
Manuel Klimek1da79332012-08-20 20:54:03 +0000740 matches 'new X'.
741</pre></td></tr>
742
743
Daniel Jaspere0b89972012-12-04 12:08:08 +0000744<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>
745<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
746</pre></td></tr>
747
748
749<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>
750<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
751
752 foo();;
753nullStmt()
754 matches the second ';'
755</pre></td></tr>
756
757
Manuel Klimek67619ff2012-09-07 13:10:32 +0000758<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 +0000759<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
Manuel Klimek1da79332012-08-20 20:54:03 +0000760
761Note that if an operator isn't overloaded, it won't match. Instead, use
762binaryOperator matcher.
763Currently it does not match operators such as new delete.
764FIXME: figure out why these do not match?
765
766Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
Manuel Klimeke44a0062012-08-26 23:55:24 +0000767 (matcher = operatorCallExpr())
Manuel Klimek1da79332012-08-20 20:54:03 +0000768 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
769 ostream &amp;o; int b = 1, c = 1;
770 o &lt;&lt; b &lt;&lt; c;
771</pre></td></tr>
772
773
Daniel Jaspere0b89972012-12-04 12:08:08 +0000774<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>
775<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
776
777Either the source expression or the destination type can be matched
778using has(), but hasDestinationType() is more specific and can be
779more readable.
780
781Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
782 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
783</pre></td></tr>
784
785
786<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
787<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
788
789Given
790 return 1;
791returnStmt()
792 matches 'return 1'
793</pre></td></tr>
794
795
796<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>
797<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
798
799hasDestinationType
800reinterpretCast
801
802Example:
803 staticCastExpr()
804matches
805 static_cast&lt;long&gt;(8)
806in
807 long eight(static_cast&lt;long&gt;(8));
808</pre></td></tr>
809
810
Manuel Klimek67619ff2012-09-07 13:10:32 +0000811<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 +0000812<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
Manuel Klimek1da79332012-08-20 20:54:03 +0000813
814Given
815 { ++a; }
Manuel Klimeke44a0062012-08-26 23:55:24 +0000816stmt()
Manuel Klimek1da79332012-08-20 20:54:03 +0000817 matches both the compound statement '{ ++a; }' and '++a'.
818</pre></td></tr>
819
820
Daniel Jaspere0b89972012-12-04 12:08:08 +0000821<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>
822<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
823
824Example matches "abcd", L"abcd"
825 char *s = "abcd"; wchar_t *ws = L"abcd"
826</pre></td></tr>
827
828
Manuel Klimek67619ff2012-09-07 13:10:32 +0000829<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 +0000830<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
831
832Given
833 switch(a) { case 42: break; default: break; }
834switchCase()
835 matches 'case 42: break;' and 'default: break;'.
836</pre></td></tr>
837
838
Daniel Jaspere0b89972012-12-04 12:08:08 +0000839<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>
840<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
841
842Given
843 switch(a) { case 42: break; default: break; }
844switchStmt()
845 matches 'switch(a)'.
846</pre></td></tr>
847
848
849<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>
850<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
851
852Example matches the implicit this expression in "return i".
853 (matcher = thisExpr())
854struct foo {
855 int i;
856 int f() { return i; }
857};
858</pre></td></tr>
859
860
861<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>
862<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
863
864 try { throw 5; } catch(int i) {}
865throwExpr()
866 matches 'throw 5'
867</pre></td></tr>
868
869
870<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>
871<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
872
873 try {} catch(int i) {}
874tryStmt()
875 matches 'try {}'
876</pre></td></tr>
877
878
Manuel Klimek67619ff2012-09-07 13:10:32 +0000879<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 +0000880<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
881
882Given
883 Foo x = bar;
884 int y = sizeof(x) + alignof(x);
885unaryExprOrTypeTraitExpr()
886 matches sizeof(x) and alignof(x)
887</pre></td></tr>
888
889
Manuel Klimek67619ff2012-09-07 13:10:32 +0000890<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 +0000891<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
892
893Example matches !a
894 !a || b
895</pre></td></tr>
896
897
Daniel Jaspere0b89972012-12-04 12:08:08 +0000898<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>
899<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
900
901Example match: "foo"_suffix
902</pre></td></tr>
903
904
Manuel Klimek67619ff2012-09-07 13:10:32 +0000905<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 +0000906<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
907
908Given
909 while (true) {}
910whileStmt()
911 matches 'while (true) {}'.
912</pre></td></tr>
913
Daniel Jaspere0b89972012-12-04 12:08:08 +0000914
Manuel Klimek41df16e2013-01-09 09:38:21 +0000915<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>
916<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
917
918Given
919 int a[] = { 2, 3 };
920 int b[4];
921 void f() { int c[a[0]]; }
922arrayType()
923 matches "int a[]", "int b[4]" and "int c[a[0]]";
924</pre></td></tr>
925
926
927<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('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>
928<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
929
930Given
931 _Atomic(int) i;
932atomicType()
933 matches "_Atomic(int) i"
934</pre></td></tr>
935
936
937<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('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>
938<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
939
940Given:
941 auto n = 4;
942 int v[] = { 2, 3 }
943 for (auto i : v) { }
944autoType()
945 matches "auto n" and "auto i"
946</pre></td></tr>
947
948
949<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>
950<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
951"void (^)(int)".
952
953The pointee is always required to be a FunctionType.
954</pre></td></tr>
955
956
957<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>
958<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
959
960Given
961 struct A {};
962 A a;
963 int b;
964 float c;
965 bool d;
966builtinType()
967 matches "int b", "float c" and "bool d"
968</pre></td></tr>
969
970
971<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>
972<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
973
974Given
975 _Complex float f;
976complexType()
977 matches "_Complex float f"
978</pre></td></tr>
979
980
981<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>
982<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
983
984Given
985 void() {
986 int a[2];
987 int b[] = { 2, 3 };
988 int c[b[0]];
989 }
990constantArrayType()
991 matches "int a[2]"
992</pre></td></tr>
993
994
995<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('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>
996<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
997
998Given
999 template&lt;typename T, int Size&gt;
1000 class array {
1001 T data[Size];
1002 };
1003dependentSizedArrayType
1004 matches "T data[Size]"
1005</pre></td></tr>
1006
1007
Edwin Vane742d9e72013-02-25 20:43:32 +00001008<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>
1009<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches types specified with an elaborated type keyword or with a
1010qualified name.
1011
1012Given
1013 namespace N {
1014 namespace M {
1015 class D {};
1016 }
1017 }
1018 class C {};
1019
1020 class C c;
1021 N::M::D d;
1022
1023elaboratedType() matches the type of the variable declarations of both
1024c and d.
1025</pre></td></tr>
1026
1027
Manuel Klimek41df16e2013-01-09 09:38:21 +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('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>
1029<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
1030
1031Given
1032 int (*f)(int);
1033 void g();
1034functionType()
1035 matches "int (*f)(int)" and the type of "g".
1036</pre></td></tr>
1037
1038
1039<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>
1040<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
1041
1042Given
1043 int a[] = { 2, 3 };
1044 int b[42];
1045 void f(int c[]) { int d[a[0]]; };
1046incompleteArrayType()
1047 matches "int a[]" and "int c[]"
1048</pre></td></tr>
1049
1050
Edwin Vane8203d9f2013-03-28 13:50:22 +00001051<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>
1052<tr><td colspan="4" class="doc" id="lValueReferenceTypeLoc0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001053
1054Given:
1055 int *a;
1056 int &amp;b = *a;
1057 int &amp;&amp;c = 1;
1058 auto &amp;d = b;
1059 auto &amp;&amp;e = c;
1060 auto &amp;&amp;f = 2;
1061 int g = 5;
1062
Edwin Vane8203d9f2013-03-28 13:50:22 +00001063lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001064matched since the type is deduced as int&amp; by reference collapsing rules.
1065</pre></td></tr>
1066
1067
Manuel Klimek41df16e2013-01-09 09:38:21 +00001068<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>
1069<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
1070Given
1071 struct A { int i; }
1072 A::* ptr = A::i;
1073memberPointerType()
1074 matches "A::* ptr"
1075</pre></td></tr>
1076
1077
Edwin Vane88be2fd2013-04-01 18:33:34 +00001078<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>
1079<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
1080
1081Given
1082 int (*ptr_to_array)[4];
1083 int *array_of_ptrs[4];
1084
1085varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1086array_of_ptrs.
1087</pre></td></tr>
1088
1089
Manuel Klimek41df16e2013-01-09 09:38:21 +00001090<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('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>
1091<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
1092
1093Given
1094 int *a;
1095 int &amp;b = *a;
1096 int c = 5;
1097pointerType()
1098 matches "int *a"
1099</pre></td></tr>
1100
1101
Edwin Vane8203d9f2013-03-28 13:50:22 +00001102<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>
1103<tr><td colspan="4" class="doc" id="rValueReferenceTypeLoc0"><pre>Matches rvalue reference types.
1104
1105Given:
1106 int *a;
1107 int &amp;b = *a;
1108 int &amp;&amp;c = 1;
1109 auto &amp;d = b;
1110 auto &amp;&amp;e = c;
1111 auto &amp;&amp;f = 2;
1112 int g = 5;
1113
1114rValueReferenceType() matches the types of c and f. e is not
1115matched as it is deduced to int&amp; by reference collapsing rules.
1116</pre></td></tr>
1117
1118
Edwin Vane742d9e72013-02-25 20:43:32 +00001119<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>
1120<tr><td colspan="4" class="doc" id="recordTypeLoc0"><pre>Matches record types (e.g. structs, classes).
1121
1122Given
1123 class C {};
1124 struct S {};
1125
1126 C c;
1127 S s;
1128
1129recordType() matches the type of the variable declarations of both c
1130and s.
1131</pre></td></tr>
1132
1133
Manuel Klimek41df16e2013-01-09 09:38:21 +00001134<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 +00001135<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001136
1137Given
1138 int *a;
1139 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001140 int &amp;&amp;c = 1;
1141 auto &amp;d = b;
1142 auto &amp;&amp;e = c;
1143 auto &amp;&amp;f = 2;
1144 int g = 5;
1145
1146referenceType() matches the types of b, c, d, e, and f.
1147</pre></td></tr>
1148
1149
Edwin Vane3abf7782013-02-25 14:49:29 +00001150<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>
1151<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization types.
1152
1153Given
1154 template &lt;typename T&gt;
1155 class C { };
1156
1157 template class C&lt;int&gt;; A
1158 C&lt;char&gt; var; B
1159
1160templateSpecializationType() matches the type of the explicit
1161instantiation in A and the type of the variable declaration in B.
1162</pre></td></tr>
1163
1164
Daniel Jaspere0b89972012-12-04 12:08:08 +00001165<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>
1166<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1167</pre></td></tr>
1168
1169
Manuel Klimek41df16e2013-01-09 09:38:21 +00001170<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>
1171<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
1172
1173Given
1174 typedef int X;
1175typedefType()
1176 matches "typedef int X"
1177</pre></td></tr>
1178
1179
1180<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>
1181<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
1182integer-constant-expression.
1183
1184Given
1185 void f() {
1186 int a[] = { 2, 3 }
1187 int b[42];
1188 int c[a[0]];
1189variableArrayType()
1190 matches "int c[a[0]]"
1191</pre></td></tr>
1192
1193
1194<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>
1195<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1196
1197Given
1198 int a[] = { 2, 3 };
1199 int b[4];
1200 void f() { int c[a[0]]; }
1201arrayType()
1202 matches "int a[]", "int b[4]" and "int c[a[0]]";
1203</pre></td></tr>
1204
1205
1206<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1207<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1208
1209Given
1210 _Atomic(int) i;
1211atomicType()
1212 matches "_Atomic(int) i"
1213</pre></td></tr>
1214
1215
1216<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1217<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1218
1219Given:
1220 auto n = 4;
1221 int v[] = { 2, 3 }
1222 for (auto i : v) { }
1223autoType()
1224 matches "auto n" and "auto i"
1225</pre></td></tr>
1226
1227
1228<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>
1229<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1230"void (^)(int)".
1231
1232The pointee is always required to be a FunctionType.
1233</pre></td></tr>
1234
1235
1236<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>
1237<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1238
1239Given
1240 struct A {};
1241 A a;
1242 int b;
1243 float c;
1244 bool d;
1245builtinType()
1246 matches "int b", "float c" and "bool d"
1247</pre></td></tr>
1248
1249
1250<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>
1251<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1252
1253Given
1254 _Complex float f;
1255complexType()
1256 matches "_Complex float f"
1257</pre></td></tr>
1258
1259
1260<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>
1261<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1262
1263Given
1264 void() {
1265 int a[2];
1266 int b[] = { 2, 3 };
1267 int c[b[0]];
1268 }
1269constantArrayType()
1270 matches "int a[2]"
1271</pre></td></tr>
1272
1273
1274<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1275<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1276
1277Given
1278 template&lt;typename T, int Size&gt;
1279 class array {
1280 T data[Size];
1281 };
1282dependentSizedArrayType
1283 matches "T data[Size]"
1284</pre></td></tr>
1285
1286
Edwin Vane742d9e72013-02-25 20:43:32 +00001287<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>
1288<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1289qualified name.
1290
1291Given
1292 namespace N {
1293 namespace M {
1294 class D {};
1295 }
1296 }
1297 class C {};
1298
1299 class C c;
1300 N::M::D d;
1301
1302elaboratedType() matches the type of the variable declarations of both
1303c and d.
1304</pre></td></tr>
1305
1306
Manuel Klimek41df16e2013-01-09 09:38:21 +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('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>
1308<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1309
1310Given
1311 int (*f)(int);
1312 void g();
1313functionType()
1314 matches "int (*f)(int)" and the type of "g".
1315</pre></td></tr>
1316
1317
1318<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>
1319<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1320
1321Given
1322 int a[] = { 2, 3 };
1323 int b[42];
1324 void f(int c[]) { int d[a[0]]; };
1325incompleteArrayType()
1326 matches "int a[]" and "int c[]"
1327</pre></td></tr>
1328
1329
Edwin Vane8203d9f2013-03-28 13:50:22 +00001330<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>
1331<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
Edwin Vanef4b48042013-03-07 15:44:40 +00001332
1333Given:
1334 int *a;
1335 int &amp;b = *a;
1336 int &amp;&amp;c = 1;
1337 auto &amp;d = b;
1338 auto &amp;&amp;e = c;
1339 auto &amp;&amp;f = 2;
1340 int g = 5;
1341
Edwin Vane8203d9f2013-03-28 13:50:22 +00001342lValueReferenceType() matches the types of b, d, and e. e is
Edwin Vanef4b48042013-03-07 15:44:40 +00001343matched since the type is deduced as int&amp; by reference collapsing rules.
1344</pre></td></tr>
1345
1346
Manuel Klimek41df16e2013-01-09 09:38:21 +00001347<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>
1348<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1349Given
1350 struct A { int i; }
1351 A::* ptr = A::i;
1352memberPointerType()
1353 matches "A::* ptr"
1354</pre></td></tr>
1355
1356
Edwin Vane88be2fd2013-04-01 18:33:34 +00001357<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>
1358<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1359
1360Given
1361 int (*ptr_to_array)[4];
1362 int *array_of_ptrs[4];
1363
1364varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1365array_of_ptrs.
1366</pre></td></tr>
1367
1368
Manuel Klimek41df16e2013-01-09 09:38:21 +00001369<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1370<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1371
1372Given
1373 int *a;
1374 int &amp;b = *a;
1375 int c = 5;
1376pointerType()
1377 matches "int *a"
1378</pre></td></tr>
1379
1380
Edwin Vane8203d9f2013-03-28 13:50:22 +00001381<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>
1382<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1383
1384Given:
1385 int *a;
1386 int &amp;b = *a;
1387 int &amp;&amp;c = 1;
1388 auto &amp;d = b;
1389 auto &amp;&amp;e = c;
1390 auto &amp;&amp;f = 2;
1391 int g = 5;
1392
1393rValueReferenceType() matches the types of c and f. e is not
1394matched as it is deduced to int&amp; by reference collapsing rules.
1395</pre></td></tr>
1396
1397
Edwin Vane742d9e72013-02-25 20:43:32 +00001398<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>
1399<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1400
1401Given
1402 class C {};
1403 struct S {};
1404
1405 C c;
1406 S s;
1407
1408recordType() matches the type of the variable declarations of both c
1409and s.
1410</pre></td></tr>
1411
1412
Manuel Klimek41df16e2013-01-09 09:38:21 +00001413<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 +00001414<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
Manuel Klimek41df16e2013-01-09 09:38:21 +00001415
1416Given
1417 int *a;
1418 int &amp;b = *a;
Edwin Vanef4b48042013-03-07 15:44:40 +00001419 int &amp;&amp;c = 1;
1420 auto &amp;d = b;
1421 auto &amp;&amp;e = c;
1422 auto &amp;&amp;f = 2;
1423 int g = 5;
1424
1425referenceType() matches the types of b, c, d, e, and f.
1426</pre></td></tr>
1427
1428
Edwin Vane3abf7782013-02-25 14:49:29 +00001429<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>
1430<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1431
1432Given
1433 template &lt;typename T&gt;
1434 class C { };
1435
1436 template class C&lt;int&gt;; A
1437 C&lt;char&gt; var; B
1438
1439templateSpecializationType() matches the type of the explicit
1440instantiation in A and the type of the variable declaration in B.
1441</pre></td></tr>
1442
1443
Daniel Jaspere0b89972012-12-04 12:08:08 +00001444<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>
1445<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1446</pre></td></tr>
1447
Manuel Klimek41df16e2013-01-09 09:38:21 +00001448
1449<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>
1450<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1451
1452Given
1453 typedef int X;
1454typedefType()
1455 matches "typedef int X"
1456</pre></td></tr>
1457
1458
1459<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>
1460<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1461integer-constant-expression.
1462
1463Given
1464 void f() {
1465 int a[] = { 2, 3 }
1466 int b[42];
1467 int c[a[0]];
1468variableArrayType()
1469 matches "int c[a[0]]"
1470</pre></td></tr>
1471
Manuel Klimek1da79332012-08-20 20:54:03 +00001472<!--END_DECL_MATCHERS -->
1473</table>
1474
1475<!-- ======================================================================= -->
1476<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1477<!-- ======================================================================= -->
1478
1479<p>Narrowing matchers match certain attributes on the current node, thus
1480narrowing down the set of nodes of the current type to match on.</p>
1481
1482<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1483which allow users to create more powerful match expressions.</p>
1484
1485<table>
1486<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1487<!-- START_NARROWING_MATCHERS -->
1488
Manuel Klimek67619ff2012-09-07 13:10:32 +00001489<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 +00001490<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
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('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 +00001497<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1498
1499Usable as: Any Matcher
1500</pre></td></tr>
1501
1502
Manuel Klimek67619ff2012-09-07 13:10:32 +00001503<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 +00001504<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1505
1506Useful when another matcher requires a child matcher, but there's no
1507additional constraint. This will often be used with an explicit conversion
1508to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1509
1510Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1511"int* p" and "void f()" in
1512 int* p;
1513 void f();
1514
1515Usable as: Any Matcher
1516</pre></td></tr>
1517
1518
Manuel Klimek67619ff2012-09-07 13:10:32 +00001519<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 +00001520<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1521
Manuel Klimeke44a0062012-08-26 23:55:24 +00001522Example matches Y (matcher = recordDecl(unless(hasName("X"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001523 class X {};
1524 class Y {};
1525
1526Usable as: Any Matcher
1527</pre></td></tr>
1528
1529
Manuel Klimek67619ff2012-09-07 13:10:32 +00001530<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 +00001531<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1532unary).
1533
1534Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1535 !(a || b)
1536</pre></td></tr>
1537
1538
Manuel Klimek67619ff2012-09-07 13:10:32 +00001539<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 +00001540<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1541
1542Example matches true (matcher = boolLiteral(equals(true)))
1543 true
1544
1545Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1546 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;
1547</pre></td></tr>
1548
1549
Manuel Klimek67619ff2012-09-07 13:10:32 +00001550<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 +00001551<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1552by the compiler (eg. implicit defaultcopy constructors).
1553</pre></td></tr>
1554
1555
Manuel Klimek67619ff2012-09-07 13:10:32 +00001556<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 +00001557<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1558code (as opposed to implicitly added by the compiler).
1559
1560Given
1561 struct Foo {
1562 Foo() { }
1563 Foo(int) : foo_("A") { }
1564 string foo_;
1565 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001566constructorDecl(hasAnyConstructorInitializer(isWritten()))
Manuel Klimek1da79332012-08-20 20:54:03 +00001567 will match Foo(int), but not Foo()
1568</pre></td></tr>
1569
1570
Edwin Vane6a19a972013-03-06 17:02:57 +00001571<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 +00001572<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1573
1574Matches overloaded operator names specified in strings without the
Edwin Vane6a19a972013-03-06 17:02:57 +00001575"operator" prefix: e.g. "&lt;&lt;".
Manuel Klimek1da79332012-08-20 20:54:03 +00001576
Edwin Vane6a19a972013-03-06 17:02:57 +00001577Given:
1578 class A { int operator*(); };
1579 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1580 A a;
1581 a &lt;&lt; a; &lt;-- This matches
1582
1583operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1584line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1585the declaration of A.
1586
1587Usable 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;
1588</pre></td></tr>
1589
1590
Edwin Vane32a6ebc2013-05-09 17:00:17 +00001591<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>
1592<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1593
1594Given
1595struct A {
1596 void foo() const;
1597 void bar();
1598};
1599
1600methodDecl(isConst()) matches A::foo() but not A::bar()
1601</pre></td></tr>
1602
1603
Edwin Vane5771a2f2013-04-09 20:46:36 +00001604<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>
1605<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1606
1607Given
1608 class A {
1609 public:
1610 virtual void x();
1611 };
1612 class B : public A {
1613 public:
1614 virtual void x();
1615 };
1616 matches B::x
1617</pre></td></tr>
1618
1619
1620<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>
1621<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1622
1623Given
1624 class A {
1625 public:
1626 virtual void x();
1627 };
1628 matches A::x
1629</pre></td></tr>
1630
1631
Edwin Vane6a19a972013-03-06 17:02:57 +00001632<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>
1633<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1634
1635Matches overloaded operator names specified in strings without the
1636"operator" prefix: e.g. "&lt;&lt;".
1637
1638Given:
1639 class A { int operator*(); };
1640 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1641 A a;
1642 a &lt;&lt; a; &lt;-- This matches
1643
1644operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1645line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1646the declaration of A.
1647
1648Usable 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 +00001649</pre></td></tr>
1650
1651
Manuel Klimek67619ff2012-09-07 13:10:32 +00001652<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 +00001653<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1654</pre></td></tr>
1655
1656
Manuel Klimek415514d2013-02-06 20:36:22 +00001657<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>
1658<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001659static member variable template instantiations.
1660
1661Given
1662 template&lt;typename T&gt; void A(T t) { }
1663 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001664functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001665 matches the specialization A&lt;int&gt;().
1666
1667Usable 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;
1668</pre></td></tr>
1669
1670
Daniel Jaspere0b89972012-12-04 12:08:08 +00001671<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>
1672<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1673isSameOrDerivedFrom(hasName(...)).
1674</pre></td></tr>
1675
1676
Manuel Klimek415514d2013-02-06 20:36:22 +00001677<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>
1678<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001679member variable template instantiations.
1680
1681Given
1682 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1683or
1684 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001685recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001686 matches the template instantiation of X&lt;A&gt;.
1687
1688But given
1689 template &lt;typename T&gt; class X {}; class A {};
1690 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001691recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001692 does not match, as X&lt;A&gt; is an explicit template specialization.
1693
1694Usable 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;
1695</pre></td></tr>
1696
1697
Manuel Klimek67619ff2012-09-07 13:10:32 +00001698<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 +00001699<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1700a specific number of arguments (including absent default arguments).
1701
Manuel Klimeke44a0062012-08-26 23:55:24 +00001702Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001703 void f(int x, int y);
1704 f(0, 0);
1705</pre></td></tr>
1706
1707
Manuel Klimek67619ff2012-09-07 13:10:32 +00001708<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 +00001709<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1710
1711Example matches true (matcher = boolLiteral(equals(true)))
1712 true
1713
1714Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1715 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;
1716</pre></td></tr>
1717
1718
Manuel Klimek67619ff2012-09-07 13:10:32 +00001719<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 +00001720<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1721child statements.
1722
1723Example: Given
1724 { for (;;) {} }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001725compoundStmt(statementCountIs(0)))
Manuel Klimek1da79332012-08-20 20:54:03 +00001726 matches '{}'
1727 but does not match the outer compound statement.
1728</pre></td></tr>
1729
1730
Daniel Jaspere0b89972012-12-04 12:08:08 +00001731<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>
1732<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1733
1734Given
1735 int a[42];
1736 int b[2 * 21];
1737 int c[41], d[43];
1738constantArrayType(hasSize(42))
1739 matches "int a[42]" and "int b[2 * 21]"
1740</pre></td></tr>
1741
1742
Manuel Klimek67619ff2012-09-07 13:10:32 +00001743<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 +00001744<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1745declarations.
1746
1747Example: Given
1748 int a, b;
1749 int c;
1750 int d = 2, e;
1751declCountIs(2)
1752 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1753</pre></td></tr>
1754
1755
Manuel Klimekcf52ca62013-06-20 14:06:32 +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('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
1757<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1758
1759Matches a node if it equals the node previously bound to ID.
1760
1761Given
1762 class X { int a; int b; };
1763recordDecl(
1764 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1765 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1766 matches the class X, as a and b have the same type.
1767
1768Note that when multiple matches are involved via forEach* matchers,
1769equalsBoundNodes acts as a filter.
1770For example:
1771compoundStmt(
1772 forEachDescendant(varDecl().bind("d")),
1773 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1774will trigger a match for each combination of variable declaration
1775and reference to that variable declaration within a compound statement.
1776</pre></td></tr>
1777
1778
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00001779<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>
1780<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1781
1782Decl has pointer identity in the AST.
1783</pre></td></tr>
1784
1785
Daniel Jasperc7093d92013-02-25 12:39:41 +00001786<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>
1787<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1788
1789Given
1790 class C {
1791 public: int a;
1792 protected: int b;
1793 private: int c;
1794 };
1795fieldDecl(isPrivate())
1796 matches 'int c;'
1797</pre></td></tr>
1798
1799
1800<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>
1801<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1802
1803Given
1804 class C {
1805 public: int a;
1806 protected: int b;
1807 private: int c;
1808 };
1809fieldDecl(isProtected())
1810 matches 'int b;'
1811</pre></td></tr>
1812
1813
1814<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>
1815<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1816
1817Given
1818 class C {
1819 public: int a;
1820 protected: int b;
1821 private: int c;
1822 };
1823fieldDecl(isPublic())
1824 matches 'int a;'
1825</pre></td></tr>
1826
1827
Manuel Klimek67619ff2012-09-07 13:10:32 +00001828<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 +00001829<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1830
1831Example matches true (matcher = boolLiteral(equals(true)))
1832 true
1833
1834Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1835 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;
1836</pre></td></tr>
1837
1838
Manuel Klimek415514d2013-02-06 20:36:22 +00001839<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>
1840<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00001841
1842Example matches A, va, fa
1843 class A {};
1844 class B; Doesn't match, as it has no body.
1845 int va;
1846 extern int vb; Doesn't match, as it doesn't define the variable.
1847 void fa() {}
1848 void fb(); Doesn't match, as it has no body.
1849
1850Usable 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;
1851</pre></td></tr>
1852
1853
Manuel Klimek415514d2013-02-06 20:36:22 +00001854<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>
1855<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
Manuel Klimek1da79332012-08-20 20:54:03 +00001856static member variable template instantiations.
1857
1858Given
1859 template&lt;typename T&gt; void A(T t) { }
1860 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001861functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00001862 matches the specialization A&lt;int&gt;().
1863
1864Usable 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;
1865</pre></td></tr>
1866
1867
Manuel Klimek67619ff2012-09-07 13:10:32 +00001868<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001869<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1870
1871Given:
1872 extern "C" void f() {}
1873 extern "C" { void g() {} }
1874 void h() {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00001875functionDecl(isExternC())
Manuel Klimek1da79332012-08-20 20:54:03 +00001876 matches the declaration of f and g, but not the declaration h
1877</pre></td></tr>
1878
1879
Manuel Klimek415514d2013-02-06 20:36:22 +00001880<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>
1881<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
Manuel Klimek1da79332012-08-20 20:54:03 +00001882member variable template instantiations.
1883
1884Given
1885 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1886or
1887 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001888recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001889 matches the template instantiation of X&lt;A&gt;.
1890
1891But given
1892 template &lt;typename T&gt; class X {}; class A {};
1893 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00001894recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00001895 does not match, as X&lt;A&gt; is an explicit template specialization.
1896
1897Usable 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;
1898</pre></td></tr>
1899
1900
Daniel Jaspere0b89972012-12-04 12:08:08 +00001901<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>
1902<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1903
1904Given
1905 void f(int i) {}
1906 void g(int i, int j) {}
1907functionDecl(parameterCountIs(2))
1908 matches g(int i, int j) {}
1909</pre></td></tr>
1910
1911
Manuel Klimek67619ff2012-09-07 13:10:32 +00001912<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 +00001913<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1914
1915Example matches true (matcher = boolLiteral(equals(true)))
1916 true
1917
1918Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1919 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;
1920</pre></td></tr>
1921
1922
Manuel Klimek67619ff2012-09-07 13:10:32 +00001923<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 +00001924<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1925to '.'.
1926
1927Member calls on the implicit this pointer match as called with '-&gt;'.
1928
1929Given
1930 class Y {
1931 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1932 int a;
1933 static int b;
1934 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00001935memberExpr(isArrow())
Manuel Klimek1da79332012-08-20 20:54:03 +00001936 matches this-&gt;x, x, y.x, a, this-&gt;b
1937</pre></td></tr>
1938
1939
Manuel Klimek67619ff2012-09-07 13:10:32 +00001940<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 +00001941<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1942
1943Supports specifying enclosing namespaces or classes by prefixing the name
1944with '&lt;enclosing&gt;::'.
1945Does not match typedefs of an underlying type with the given name.
1946
1947Example matches X (Name == "X")
1948 class X;
1949
1950Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1951 namespace a { namespace b { class X; } }
1952</pre></td></tr>
1953
1954
Manuel Klimek67619ff2012-09-07 13:10:32 +00001955<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 +00001956<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1957a substring matched by the given RegExp.
Manuel Klimek1da79332012-08-20 20:54:03 +00001958
1959Supports specifying enclosing namespaces or classes by
1960prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
1961of an underlying type with the given name.
1962
1963Example matches X (regexp == "::X")
1964 class X;
1965
1966Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1967 namespace foo { namespace bar { class X; } }
1968</pre></td></tr>
1969
1970
Manuel Klimek67619ff2012-09-07 13:10:32 +00001971<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 +00001972<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1973
1974Given
1975 class Y { public: void x(); };
1976 void z() { Y* y; y-&gt;x(); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00001977callExpr(on(hasType(asString("class Y *"))))
Manuel Klimek1da79332012-08-20 20:54:03 +00001978 matches y-&gt;x()
1979</pre></td></tr>
1980
1981
Manuel Klimekcf52ca62013-06-20 14:06:32 +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('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
1983<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
1984
1985Matches a node if it equals the node previously bound to ID.
1986
1987Given
1988 class X { int a; int b; };
1989recordDecl(
1990 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1991 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1992 matches the class X, as a and b have the same type.
1993
1994Note that when multiple matches are involved via forEach* matchers,
1995equalsBoundNodes acts as a filter.
1996For example:
1997compoundStmt(
1998 forEachDescendant(varDecl().bind("d")),
1999 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2000will trigger a match for each combination of variable declaration
2001and reference to that variable declaration within a compound statement.
2002</pre></td></tr>
2003
2004
Edwin Vane7b69cd02013-04-02 18:15:55 +00002005<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>
2006<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
2007the node, not hidden within a typedef.
2008
2009Given
2010 typedef const int const_int;
2011 const_int i;
2012 int *const j;
2013 int *volatile k;
2014 int m;
2015varDecl(hasType(hasLocalQualifiers())) matches only j and k.
2016i is const-qualified but the qualifier is not local.
2017</pre></td></tr>
2018
2019
Manuel Klimek67619ff2012-09-07 13:10:32 +00002020<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 +00002021<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2022include "top-level" const.
2023
2024Given
2025 void a(int);
2026 void b(int const);
2027 void c(const int);
2028 void d(const int*);
2029 void e(int const) {};
Manuel Klimeke44a0062012-08-26 23:55:24 +00002030functionDecl(hasAnyParameter(hasType(isConstQualified())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002031 matches "void b(int const)", "void c(const int)" and
2032 "void e(int const) {}". It does not match d as there
2033 is no top-level const on the parameter type "const int *".
2034</pre></td></tr>
2035
2036
Manuel Klimek67619ff2012-09-07 13:10:32 +00002037<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 +00002038<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2039
2040Given
2041 void a(int);
2042 void b(long);
2043 void c(double);
Manuel Klimeke44a0062012-08-26 23:55:24 +00002044functionDecl(hasAnyParameter(hasType(isInteger())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002045matches "a(int)", "b(long)", but not "c(double)".
2046</pre></td></tr>
2047
2048
Manuel Klimekcf52ca62013-06-20 14:06:32 +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('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2050<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2051
2052Matches a node if it equals the node previously bound to ID.
2053
2054Given
2055 class X { int a; int b; };
2056recordDecl(
2057 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2058 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2059 matches the class X, as a and b have the same type.
2060
2061Note that when multiple matches are involved via forEach* matchers,
2062equalsBoundNodes acts as a filter.
2063For example:
2064compoundStmt(
2065 forEachDescendant(varDecl().bind("d")),
2066 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2067will trigger a match for each combination of variable declaration
2068and reference to that variable declaration within a compound statement.
2069</pre></td></tr>
2070
2071
Manuel Klimekfa37c5c2013-02-07 12:42:10 +00002072<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>
2073<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
2074
2075Stmt has pointer identity in the AST.
2076
2077</pre></td></tr>
2078
2079
Manuel Klimek415514d2013-02-06 20:36:22 +00002080<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>
2081<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
Manuel Klimek1da79332012-08-20 20:54:03 +00002082
2083Example matches A, va, fa
2084 class A {};
2085 class B; Doesn't match, as it has no body.
2086 int va;
2087 extern int vb; Doesn't match, as it doesn't define the variable.
2088 void fa() {}
2089 void fb(); Doesn't match, as it has no body.
2090
2091Usable 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;
2092</pre></td></tr>
2093
2094
Manuel Klimekcf52ca62013-06-20 14:06:32 +00002095<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>
2096<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2097
2098Matches a node if it equals the node previously bound to ID.
2099
2100Given
2101 class X { int a; int b; };
2102recordDecl(
2103 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2104 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2105 matches the class X, as a and b have the same type.
2106
2107Note that when multiple matches are involved via forEach* matchers,
2108equalsBoundNodes acts as a filter.
2109For example:
2110compoundStmt(
2111 forEachDescendant(varDecl().bind("d")),
2112 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2113will trigger a match for each combination of variable declaration
2114and reference to that variable declaration within a compound statement.
2115</pre></td></tr>
2116
2117
Manuel Klimek67619ff2012-09-07 13:10:32 +00002118<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 +00002119<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2120
2121Given
2122 int x;
2123 int s = sizeof(x) + alignof(x)
2124unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2125 matches sizeof(x)
2126</pre></td></tr>
2127
2128
Manuel Klimek67619ff2012-09-07 13:10:32 +00002129<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002130<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2131unary).
2132
2133Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2134 !(a || b)
2135</pre></td></tr>
2136
2137
Manuel Klimek67619ff2012-09-07 13:10:32 +00002138<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 +00002139<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2140
2141Example matches A, va, fa
2142 class A {};
2143 class B; Doesn't match, as it has no body.
2144 int va;
2145 extern int vb; Doesn't match, as it doesn't define the variable.
2146 void fa() {}
2147 void fb(); Doesn't match, as it has no body.
2148
2149Usable 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;
2150</pre></td></tr>
2151
2152
Manuel Klimek67619ff2012-09-07 13:10:32 +00002153<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 +00002154<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2155static member variable template instantiations.
2156
2157Given
2158 template&lt;typename T&gt; void A(T t) { }
2159 template&lt;&gt; void A(int N) { }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002160functionDecl(isExplicitTemplateSpecialization())
Manuel Klimek1da79332012-08-20 20:54:03 +00002161 matches the specialization A&lt;int&gt;().
2162
2163Usable 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;
2164</pre></td></tr>
2165
2166
Manuel Klimek67619ff2012-09-07 13:10:32 +00002167<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 +00002168<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2169member variable template instantiations.
2170
2171Given
2172 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2173or
2174 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002175recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002176 matches the template instantiation of X&lt;A&gt;.
2177
2178But given
2179 template &lt;typename T&gt; class X {}; class A {};
2180 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002181recordDecl(hasName("::X"), isTemplateInstantiation())
Manuel Klimek1da79332012-08-20 20:54:03 +00002182 does not match, as X&lt;A&gt; is an explicit template specialization.
2183
2184Usable 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;
2185</pre></td></tr>
2186
2187<!--END_NARROWING_MATCHERS -->
2188</table>
2189
2190<!-- ======================================================================= -->
2191<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2192<!-- ======================================================================= -->
2193
2194<p>Traversal matchers specify the relationship to other nodes that are
2195reachable from the current node.</p>
2196
2197<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2198forEachDescendant) which work on all nodes and allow users to write more generic
2199match expressions.</p>
2200
2201<table>
2202<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2203<!-- START_TRAVERSAL_MATCHERS -->
2204
Manuel Klimek152ea0e2013-02-04 10:59:20 +00002205<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>
2206<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2207
2208Unlike anyOf, eachOf will generate a match result for each
2209matching submatcher.
2210
2211For example, in:
2212 class A { int a; int b; };
2213The matcher:
2214 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2215 has(fieldDecl(hasName("b")).bind("v"))))
2216will generate two results binding "v", the first of which binds
2217the field declaration of a, the second the field declaration of
2218b.
2219
2220Usable as: Any Matcher
2221</pre></td></tr>
2222
2223
2224<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>
2225<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
2226
2227Generates results for each match.
2228
2229For example, in:
2230 class A { class B {}; class C {}; };
2231The matcher:
2232 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
2233will generate results for A, B and C.
2234
2235Usable as: Any Matcher
2236</pre></td></tr>
2237
2238
Manuel Klimek67619ff2012-09-07 13:10:32 +00002239<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 +00002240<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2241provided matcher.
2242
Manuel Klimeke44a0062012-08-26 23:55:24 +00002243Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002244 class X {}; Matches X, because X::X is a class of name X inside X.
2245 class Y { class X {}; };
2246 class Z { class Y { class X {}; }; }; Does not match Z.
2247
2248ChildT must be an AST base type.
2249
2250As opposed to 'has', 'forEach' will cause a match for each result that
2251matches instead of only on the first one.
2252
2253Usable as: Any Matcher
2254</pre></td></tr>
2255
2256
Manuel Klimek67619ff2012-09-07 13:10:32 +00002257<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 +00002258<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2259provided matcher.
2260
2261Example matches X, A, B, C
Manuel Klimeke44a0062012-08-26 23:55:24 +00002262 (matcher = recordDecl(forEachDescendant(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 A { class X {}; };
2265 class B { class C { class X {}; }; };
2266
2267DescendantT must be an AST base type.
2268
2269As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2270each result that matches instead of only on the first one.
2271
2272Note: Recursively combined ForEachDescendant can cause many matches:
Manuel Klimeke44a0062012-08-26 23:55:24 +00002273 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002274will match 10 times (plus injected class name matches) on:
2275 class A { class B { class C { class D { class E {}; }; }; }; };
2276
2277Usable as: Any Matcher
2278</pre></td></tr>
2279
2280
Manuel Klimek67619ff2012-09-07 13:10:32 +00002281<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 +00002282<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2283provided matcher.
2284
Manuel Klimeke44a0062012-08-26 23:55:24 +00002285Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
Manuel Klimek1da79332012-08-20 20:54:03 +00002286 class X {}; Matches X, because X::X is a class of name X inside X.
2287 class Y { class X {}; };
2288 class Z { class Y { class X {}; }; }; Does not match Z.
2289
2290ChildT must be an AST base type.
2291
2292Usable as: Any Matcher
2293</pre></td></tr>
2294
2295
Manuel Klimek67619ff2012-09-07 13:10:32 +00002296<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>
2297<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2298matcher.
2299
2300Given
2301void f() { if (true) { int x = 42; } }
2302void g() { for (;;) { int x = 43; } }
Daniel Jaspere0b89972012-12-04 12:08:08 +00002303expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Manuel Klimek67619ff2012-09-07 13:10:32 +00002304
2305Usable as: Any Matcher
2306</pre></td></tr>
2307
2308
2309<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 +00002310<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2311provided matcher.
2312
2313Example matches X, Y, Z
Manuel Klimeke44a0062012-08-26 23:55:24 +00002314 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002315 class X {}; Matches X, because X::X is a class of name X inside X.
2316 class Y { class X {}; };
2317 class Z { class Y { class X {}; }; };
2318
2319DescendantT must be an AST base type.
2320
2321Usable as: Any Matcher
2322</pre></td></tr>
2323
2324
Daniel Jaspere0b89972012-12-04 12:08:08 +00002325<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>
2326<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2327matcher.
2328
2329Given
2330void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2331compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2332
2333Usable as: Any Matcher
2334</pre></td></tr>
2335
2336
Manuel Klimek67619ff2012-09-07 13:10:32 +00002337<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002338<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2339
2340Given
2341 int i[5];
2342 void f() { i[1] = 42; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002343arraySubscriptExpression(hasBase(implicitCastExpr(
2344 hasSourceExpression(declRefExpr()))))
2345 matches i[1] with the declRefExpr() matching i
Manuel Klimek1da79332012-08-20 20:54:03 +00002346</pre></td></tr>
2347
2348
Manuel Klimek67619ff2012-09-07 13:10:32 +00002349<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 +00002350<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2351
2352Given
2353 int i[5];
2354 void f() { i[1] = 42; }
2355arraySubscriptExpression(hasIndex(integerLiteral()))
2356 matches i[1] with the integerLiteral() matching 1
2357</pre></td></tr>
2358
2359
Manuel Klimek41df16e2013-01-09 09:38:21 +00002360<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>
2361<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2362type.
2363
2364Given
2365 struct A {};
2366 A a[7];
2367 int b[7];
2368arrayType(hasElementType(builtinType()))
2369 matches "int b[7]"
2370
2371Usable 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;
2372</pre></td></tr>
2373
2374
2375<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>
2376<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2377type.
2378
2379Given
2380 struct A {};
2381 A a[7];
2382 int b[7];
2383arrayType(hasElementType(builtinType()))
2384 matches "int b[7]"
2385
2386Usable 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;
2387</pre></td></tr>
2388
2389
2390<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>
2391<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2392
2393Given
2394 _Atomic(int) i;
2395 _Atomic(float) f;
2396atomicType(hasValueType(isInteger()))
2397 matches "_Atomic(int) i"
2398
2399Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2400</pre></td></tr>
2401
2402
2403<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>
2404<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2405
2406Given
2407 _Atomic(int) i;
2408 _Atomic(float) f;
2409atomicType(hasValueType(isInteger()))
2410 matches "_Atomic(int) i"
2411
2412Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2413</pre></td></tr>
2414
2415
2416<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>
2417<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2418
2419Note: There is no TypeLoc for the deduced type and thus no
2420getDeducedLoc() matcher.
2421
2422Given
2423 auto a = 1;
2424 auto b = 2.0;
2425autoType(hasDeducedType(isInteger()))
2426 matches "auto a"
2427
2428Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2429</pre></td></tr>
2430
2431
Manuel Klimek67619ff2012-09-07 13:10:32 +00002432<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 +00002433<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2434binary operator matches.
2435</pre></td></tr>
2436
2437
Manuel Klimek67619ff2012-09-07 13:10:32 +00002438<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002439<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2440
2441Example matches a (matcher = binaryOperator(hasLHS()))
2442 a || b
2443</pre></td></tr>
2444
2445
Manuel Klimek67619ff2012-09-07 13:10:32 +00002446<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 +00002447<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2448
2449Example matches b (matcher = binaryOperator(hasRHS()))
2450 a || b
2451</pre></td></tr>
2452
2453
Manuel Klimek41df16e2013-01-09 09:38:21 +00002454<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>
2455<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
2456pointee matches a given matcher.
2457
2458Given
2459 int *a;
2460 int const *b;
2461 float const *f;
2462pointerType(pointee(isConstQualified(), isInteger()))
2463 matches "int const *b"
2464
2465Usable 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;,
2466 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;
2467</pre></td></tr>
2468
2469
2470<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>
2471<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
2472pointee matches a given matcher.
2473
2474Given
2475 int *a;
2476 int const *b;
2477 float const *f;
2478pointerType(pointee(isConstQualified(), isInteger()))
2479 matches "int const *b"
2480
2481Usable 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;,
2482 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;
2483</pre></td></tr>
2484
2485
Edwin Vane3abf7782013-02-25 14:49:29 +00002486<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 +00002487<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
2488matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002489
Manuel Klimek03a83232013-06-10 08:52:15 +00002490The associated declaration is:
2491- for type nodes, the declaration of the underlying type
2492- for CallExpr, the declaration of the callee
2493- for MemberExpr, the declaration of the referenced member
2494- for CXXConstructExpr, the declaration of the constructor
2495
2496Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2497function. e.g. various subtypes of clang::Type and various expressions.
2498FIXME: Add all node types for which this is matcher is usable due to
2499getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002500
Daniel Jaspere0b89972012-12-04 12:08:08 +00002501Usable 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 +00002502 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;,
2503 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002504</pre></td></tr>
2505
2506
Manuel Klimek67619ff2012-09-07 13:10:32 +00002507<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 +00002508<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2509
2510Given
2511 struct Foo {
2512 Foo() : foo_(1) { }
2513 int foo_;
2514 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002515recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002516 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2517</pre></td></tr>
2518
2519
Manuel Klimek67619ff2012-09-07 13:10:32 +00002520<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 +00002521<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2522
2523Given
2524 struct Foo {
2525 Foo() : foo_(1) { }
2526 int foo_;
2527 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002528recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002529 forField(hasName("foo_"))))))
2530 matches Foo
2531with forField matching foo_
2532</pre></td></tr>
2533
2534
Manuel Klimek67619ff2012-09-07 13:10:32 +00002535<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002536<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2537
2538Given
2539 struct Foo {
2540 Foo() : foo_(1) { }
2541 int foo_;
2542 };
Manuel Klimeke44a0062012-08-26 23:55:24 +00002543recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
Manuel Klimek1da79332012-08-20 20:54:03 +00002544 withInitializer(integerLiteral(equals(1)))))))
2545 matches Foo
2546with withInitializer matching (1)
2547</pre></td></tr>
2548
2549
Manuel Klimek67619ff2012-09-07 13:10:32 +00002550<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002551<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2552
Manuel Klimeke44a0062012-08-26 23:55:24 +00002553Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002554 class Y { public: void x(); };
2555 void z() { Y y; y.x(); }",
2556
2557FIXME: Overload to allow directly matching types?
2558</pre></td></tr>
2559
2560
Manuel Klimek67619ff2012-09-07 13:10:32 +00002561<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 +00002562<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2563
2564
Manuel Klimek67619ff2012-09-07 13:10:32 +00002565<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 +00002566<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2567</pre></td></tr>
2568
2569
Manuel Klimek67619ff2012-09-07 13:10:32 +00002570<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 +00002571<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2572belongs to.
2573
2574FIXME: Generalize this for other kinds of declarations.
2575FIXME: What other kind of declarations would we need to generalize
2576this to?
2577
2578Example matches A() in the last line
Manuel Klimeke44a0062012-08-26 23:55:24 +00002579 (matcher = constructExpr(hasDeclaration(methodDecl(
Manuel Klimek1da79332012-08-20 20:54:03 +00002580 ofClass(hasName("A"))))))
2581 class A {
2582 public:
2583 A();
2584 };
2585 A a = A();
2586</pre></td></tr>
2587
2588
Edwin Vane6a19a972013-03-06 17:02:57 +00002589<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>
2590<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2591
2592Given:
2593 class A { void func(); };
2594 class B { void member(); };
2595
2596recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2597but not B.
2598</pre></td></tr>
2599
2600
Manuel Klimek67619ff2012-09-07 13:10:32 +00002601<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 +00002602<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2603a class matching Base.
2604
Manuel Klimek67619ff2012-09-07 13:10:32 +00002605Note that a class is not considered to be derived from itself.
Manuel Klimek1da79332012-08-20 20:54:03 +00002606
Manuel Klimek67619ff2012-09-07 13:10:32 +00002607Example matches Y, Z, C (Base == hasName("X"))
2608 class X;
Manuel Klimek1da79332012-08-20 20:54:03 +00002609 class Y : public X {}; directly derived
2610 class Z : public Y {}; indirectly derived
2611 typedef X A;
2612 typedef A B;
2613 class C : public B {}; derived from a typedef of X
2614
2615In the following example, Bar matches isDerivedFrom(hasName("X")):
2616 class Foo;
2617 typedef Foo X;
2618 class Bar : public Foo {}; derived from a type that X is a typedef of
2619</pre></td></tr>
2620
2621
Daniel Jaspere0b89972012-12-04 12:08:08 +00002622<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>
2623<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2624match Base.
2625</pre></td></tr>
2626
2627
Manuel Klimek67619ff2012-09-07 13:10:32 +00002628<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 +00002629<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2630given matcher.
2631
Manuel Klimeke44a0062012-08-26 23:55:24 +00002632Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002633 class Y { public: void x(); };
2634 void z() { Y y; y.x();
2635</pre></td></tr>
2636
2637
Manuel Klimek67619ff2012-09-07 13:10:32 +00002638<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002639<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2640expression.
2641
2642Given
2643 void x(int, int, int) { int y; x(1, y, 42); }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002644callExpr(hasAnyArgument(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002645 matches x(1, y, 42)
2646with hasAnyArgument(...)
2647 matching y
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002648
2649FIXME: Currently this will ignore parentheses and implicit casts on
2650the argument before applying the inner matcher. We'll want to remove
2651this to allow for greater control by the user once ignoreImplicit()
2652has been implemented.
Manuel Klimek1da79332012-08-20 20:54:03 +00002653</pre></td></tr>
2654
2655
Manuel Klimek67619ff2012-09-07 13:10:32 +00002656<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 +00002657<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2658call expression.
2659
2660Example matches y in x(y)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002661 (matcher = callExpr(hasArgument(0, declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002662 void x(int) { int y; x(y); }
2663</pre></td></tr>
2664
2665
Edwin Vane3abf7782013-02-25 14:49:29 +00002666<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 +00002667<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
2668matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00002669
Manuel Klimek03a83232013-06-10 08:52:15 +00002670The associated declaration is:
2671- for type nodes, the declaration of the underlying type
2672- for CallExpr, the declaration of the callee
2673- for MemberExpr, the declaration of the referenced member
2674- for CXXConstructExpr, the declaration of the constructor
2675
2676Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2677function. e.g. various subtypes of clang::Type and various expressions.
2678FIXME: Add all node types for which this is matcher is usable due to
2679getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00002680
Daniel Jaspere0b89972012-12-04 12:08:08 +00002681Usable 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 +00002682 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;,
2683 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00002684</pre></td></tr>
2685
2686
Manuel Klimek03a83232013-06-10 08:52:15 +00002687<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>
2688<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2689extension, matches the constant given in the statement.
2690
2691Given
2692 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2693caseStmt(hasCaseConstant(integerLiteral()))
2694 matches "case 1:"
2695</pre></td></tr>
2696
2697
Manuel Klimek67619ff2012-09-07 13:10:32 +00002698<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 +00002699<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2700
2701Example: matches "a string" (matcher =
Manuel Klimeke44a0062012-08-26 23:55:24 +00002702 hasSourceExpression(constructExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002703class URL { URL(string); };
2704URL url = "a string";
2705</pre></td></tr>
2706
2707
Manuel Klimek67619ff2012-09-07 13:10:32 +00002708<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 +00002709<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2710TemplateArgument matching the given InnerMatcher.
2711
2712Given
2713 template&lt;typename T&gt; class A {};
2714 template&lt;&gt; class A&lt;double&gt; {};
2715 A&lt;int&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002716classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002717 refersToType(asString("int"))))
2718 matches the specialization A&lt;int&gt;
2719</pre></td></tr>
2720
2721
Manuel Klimek67619ff2012-09-07 13:10:32 +00002722<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 +00002723<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2724matches the given InnerMatcher.
2725
2726Given
2727 template&lt;typename T, typename U&gt; class A {};
2728 A&lt;bool, int&gt; b;
2729 A&lt;int, bool&gt; c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002730classTemplateSpecializationDecl(hasTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00002731 1, refersToType(asString("int"))))
2732 matches the specialization A&lt;bool, int&gt;
2733</pre></td></tr>
2734
2735
Manuel Klimek41df16e2013-01-09 09:38:21 +00002736<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>
2737<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2738type.
2739
2740Given
2741 struct A {};
2742 A a[7];
2743 int b[7];
2744arrayType(hasElementType(builtinType()))
2745 matches "int b[7]"
2746
2747Usable 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;
2748</pre></td></tr>
2749
2750
2751<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>
2752<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2753type.
2754
2755Given
2756 struct A {};
2757 A a[7];
2758 int b[7];
2759arrayType(hasElementType(builtinType()))
2760 matches "int b[7]"
2761
2762Usable 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;
2763</pre></td></tr>
2764
2765
Manuel Klimek67619ff2012-09-07 13:10:32 +00002766<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002767<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2768a given matcher.
2769
2770Given
2771 { {}; 1+2; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002772hasAnySubstatement(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002773 matches '{ {}; 1+2; }'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002774with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002775 matching '{}'
2776</pre></td></tr>
2777
2778
Manuel Klimek67619ff2012-09-07 13:10:32 +00002779<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 +00002780<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2781or conditional operator.
2782
2783Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2784 if (true) {}
2785</pre></td></tr>
2786
2787
Manuel Klimek67619ff2012-09-07 13:10:32 +00002788<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 +00002789<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2790
2791Example matches b
2792 condition ? a : b
2793</pre></td></tr>
2794
2795
Manuel Klimek67619ff2012-09-07 13:10:32 +00002796<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 +00002797<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2798
2799Example matches a
2800 condition ? a : b
2801</pre></td></tr>
2802
2803
Manuel Klimek67619ff2012-09-07 13:10:32 +00002804<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002805<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2806specific using shadow declaration.
2807
2808FIXME: This currently only works for functions. Fix.
2809
2810Given
2811 namespace a { void f() {} }
2812 using a::f;
2813 void g() {
2814 f(); Matches this ..
2815 a::f(); .. but not this.
2816 }
Manuel Klimeke44a0062012-08-26 23:55:24 +00002817declRefExpr(throughUsingDeclaration(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002818 matches f()
2819</pre></td></tr>
2820
2821
Manuel Klimek67619ff2012-09-07 13:10:32 +00002822<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002823<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2824specified matcher.
2825
2826Example matches x in if(x)
Manuel Klimeke44a0062012-08-26 23:55:24 +00002827 (matcher = declRefExpr(to(varDecl(hasName("x")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002828 bool x;
2829 if (x) {}
2830</pre></td></tr>
2831
2832
Manuel Klimek67619ff2012-09-07 13:10:32 +00002833<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 +00002834<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2835
2836Note that this does not work for global declarations because the AST
2837breaks up multiple-declaration DeclStmt's into multiple single-declaration
2838DeclStmt's.
2839Example: Given non-global declarations
2840 int a, b = 0;
2841 int c;
2842 int d = 2, e;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002843declStmt(containsDeclaration(
2844 0, varDecl(hasInitializer(anything()))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002845 matches only 'int d = 2, e;', and
Manuel Klimeke44a0062012-08-26 23:55:24 +00002846declStmt(containsDeclaration(1, varDecl()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002847 matches 'int a, b = 0' as well as 'int d = 2, e;'
2848 but 'int c;' is not matched.
2849</pre></td></tr>
2850
2851
Manuel Klimek67619ff2012-09-07 13:10:32 +00002852<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 +00002853<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2854
2855Given
2856 int a, b;
2857 int c;
Manuel Klimeke44a0062012-08-26 23:55:24 +00002858declStmt(hasSingleDecl(anything()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002859 matches 'int c;' but not 'int a, b;'.
2860</pre></td></tr>
2861
2862
Manuel Klimek1a68afd2013-06-20 13:08:29 +00002863<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>
2864<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
2865the inner matcher.
2866
2867Given
2868 int x;
2869declaratorDecl(hasTypeLoc(loc(asString("int"))))
2870 matches int x
2871</pre></td></tr>
2872
2873
Edwin Vane742d9e72013-02-25 20:43:32 +00002874<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>
2875<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
2876Decl, matches InnerMatcher.
2877
2878Given
2879 namespace N {
2880 namespace M {
2881 class D {};
2882 }
2883 }
2884
2885recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
2886declaration of class D.
2887</pre></td></tr>
2888
2889
Manuel Klimek67619ff2012-09-07 13:10:32 +00002890<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002891<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2892a given body.
2893
2894Given
2895 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00002896hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00002897 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00002898with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00002899 matching '{}'
2900</pre></td></tr>
2901
2902
Manuel Klimek67619ff2012-09-07 13:10:32 +00002903<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 +00002904<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2905or conditional operator.
2906
2907Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2908 if (true) {}
2909</pre></td></tr>
2910
2911
Edwin Vane742d9e72013-02-25 20:43:32 +00002912<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>
2913<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
Edwin Vaneaec89ac2013-03-04 17:51:00 +00002914matches InnerMatcher if the qualifier exists.
Edwin Vane742d9e72013-02-25 20:43:32 +00002915
2916Given
2917 namespace N {
2918 namespace M {
2919 class D {};
2920 }
2921 }
2922 N::M::D d;
2923
2924elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
2925matches the type of the variable declaration of d.
2926</pre></td></tr>
2927
2928
2929<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>
2930<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
2931
2932Given
2933 namespace N {
2934 namespace M {
2935 class D {};
2936 }
2937 }
2938 N::M::D d;
2939
2940elaboratedType(namesType(recordType(
2941hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
2942declaration of d.
2943</pre></td></tr>
2944
2945
Manuel Klimek67619ff2012-09-07 13:10:32 +00002946<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 +00002947<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2948
2949(Note: Clang's AST refers to other conversions as "casts" too, and calls
2950actual casts "explicit" casts.)
2951</pre></td></tr>
2952
2953
Manuel Klimek67619ff2012-09-07 13:10:32 +00002954<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002955<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2956declaration's type.
2957
2958In case of a value declaration (for example a variable declaration),
2959this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00002960declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2961while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00002962of x."
2963
Manuel Klimeke44a0062012-08-26 23:55:24 +00002964Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2965 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00002966 class X {};
2967 void y(X &amp;x) { x; X z; }
2968
2969Usable 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;
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('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 +00002974<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2975are stripped off.
2976
2977Parentheses and explicit casts are not discarded.
2978Given
2979 int arr[5];
2980 int a = 0;
2981 char b = 0;
2982 const int c = a;
2983 int *d = arr;
2984 long e = (long) 0l;
2985The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00002986 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2987 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00002988would match the declarations for a, b, c, and d, but not e.
2989While
Manuel Klimeke44a0062012-08-26 23:55:24 +00002990 varDecl(hasInitializer(integerLiteral()))
2991 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00002992only match the declarations for b, c, and d.
2993</pre></td></tr>
2994
2995
Manuel Klimek67619ff2012-09-07 13:10:32 +00002996<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 +00002997<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2998casts are stripped off.
2999
3000Implicit and non-C Style casts are also discarded.
3001Given
3002 int a = 0;
3003 char b = (0);
3004 void* c = reinterpret_cast&lt;char*&gt;(0);
3005 char d = char(0);
3006The matcher
Manuel Klimeke44a0062012-08-26 23:55:24 +00003007 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003008would match the declarations for a, b, c, and d.
3009while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003010 varDecl(hasInitializer(integerLiteral()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003011only 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_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 +00003016<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
3017parentheses are stripped off.
3018
3019Explicit casts are not discarded.
3020Given
3021 int arr[5];
3022 int a = 0;
3023 char b = (0);
3024 const int c = a;
3025 int *d = (arr);
3026 long e = ((long) 0l);
3027The matchers
Manuel Klimeke44a0062012-08-26 23:55:24 +00003028 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3029 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003030would match the declarations for a, b, c, and d, but not e.
3031while
Manuel Klimeke44a0062012-08-26 23:55:24 +00003032 varDecl(hasInitializer(integerLiteral()))
3033 varDecl(hasInitializer(declRefExpr()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003034would only match the declaration for a.
3035</pre></td></tr>
3036
3037
Manuel Klimek67619ff2012-09-07 13:10:32 +00003038<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 +00003039<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3040a given body.
3041
3042Given
3043 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003044hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003045 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003046with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003047 matching '{}'
3048</pre></td></tr>
3049
3050
Manuel Klimek67619ff2012-09-07 13:10:32 +00003051<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 +00003052<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3053or conditional operator.
3054
3055Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3056 if (true) {}
3057</pre></td></tr>
3058
3059
Manuel Klimek67619ff2012-09-07 13:10:32 +00003060<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 +00003061<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3062
3063Example:
3064 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3065matches '++x' in
3066 for (x; x &lt; N; ++x) { }
3067</pre></td></tr>
3068
3069
Manuel Klimek67619ff2012-09-07 13:10:32 +00003070<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 +00003071<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3072
3073Example:
Manuel Klimeke44a0062012-08-26 23:55:24 +00003074 forStmt(hasLoopInit(declStmt()))
Manuel Klimek1da79332012-08-20 20:54:03 +00003075matches 'int x = 0' in
3076 for (int x = 0; x &lt; N; ++x) { }
3077</pre></td></tr>
3078
3079
Manuel Klimek67619ff2012-09-07 13:10:32 +00003080<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 +00003081<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3082
3083Does not match the 'this' parameter of a method.
3084
3085Given
3086 class X { void f(int x, int y, int z) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003087methodDecl(hasAnyParameter(hasName("y")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003088 matches f(int x, int y, int z) {}
3089with hasAnyParameter(...)
3090 matching int y
3091</pre></td></tr>
3092
3093
Manuel Klimek67619ff2012-09-07 13:10:32 +00003094<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 +00003095<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3096
3097Given
3098 class X { void f(int x) {} };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003099methodDecl(hasParameter(0, hasType(varDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003100 matches f(int x) {}
3101with hasParameter(...)
3102 matching int x
3103</pre></td></tr>
3104
3105
Manuel Klimek67619ff2012-09-07 13:10:32 +00003106<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003107<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3108
3109Given:
3110 class X { int f() { return 1; } };
Manuel Klimeke44a0062012-08-26 23:55:24 +00003111methodDecl(returns(asString("int")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003112 matches int f() { return 1; }
3113</pre></td></tr>
3114
3115
Manuel Klimek67619ff2012-09-07 13:10:32 +00003116<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 +00003117<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3118or conditional operator.
3119
3120Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3121 if (true) {}
3122</pre></td></tr>
3123
3124
Manuel Klimek67619ff2012-09-07 13:10:32 +00003125<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 +00003126<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3127
3128Given
3129 if (A* a = GetAPointer()) {}
3130hasConditionVariableStatment(...)
3131 matches 'A* a = GetAPointer()'.
3132</pre></td></tr>
3133
3134
Manuel Klimek67619ff2012-09-07 13:10:32 +00003135<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 +00003136<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3137matcher.
3138
3139FIXME: Unit test this matcher
3140</pre></td></tr>
3141
3142
Edwin Vane3abf7782013-02-25 14:49:29 +00003143<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 +00003144<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3145matches the given matcher.
Daniel Jaspere0b89972012-12-04 12:08:08 +00003146
Manuel Klimek03a83232013-06-10 08:52:15 +00003147The associated declaration is:
3148- for type nodes, the declaration of the underlying type
3149- for CallExpr, the declaration of the callee
3150- for MemberExpr, the declaration of the referenced member
3151- for CXXConstructExpr, the declaration of the constructor
3152
3153Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3154function. e.g. various subtypes of clang::Type and various expressions.
3155FIXME: Add all node types for which this is matcher is usable due to
3156getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003157
Daniel Jaspere0b89972012-12-04 12:08:08 +00003158Usable 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 +00003159 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;,
3160 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003161</pre></td></tr>
3162
3163
Manuel Klimek67619ff2012-09-07 13:10:32 +00003164<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 +00003165<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3166matched by a given matcher.
3167
3168Given
3169 struct X { int m; };
3170 void f(X x) { x.m; m; }
Manuel Klimeke44a0062012-08-26 23:55:24 +00003171memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003172 matches "x.m" and "m"
3173with hasObjectExpression(...)
3174 matching "x" and the implicit object expression of "m" which has type X*.
3175</pre></td></tr>
3176
3177
Manuel Klimek67619ff2012-09-07 13:10:32 +00003178<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 +00003179<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3180given matcher.
3181
3182Given
3183 struct { int first, second; } first, second;
3184 int i(second.first);
3185 int j(first.second);
Manuel Klimeke44a0062012-08-26 23:55:24 +00003186memberExpr(member(hasName("first")))
Manuel Klimek1da79332012-08-20 20:54:03 +00003187 matches second.first
3188 but not first.second (because the member name there is "second").
3189</pre></td></tr>
3190
3191
Manuel Klimek41df16e2013-01-09 09:38:21 +00003192<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>
3193<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
3194pointee matches a given matcher.
3195
3196Given
3197 int *a;
3198 int const *b;
3199 float const *f;
3200pointerType(pointee(isConstQualified(), isInteger()))
3201 matches "int const *b"
3202
3203Usable 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;,
3204 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;
3205</pre></td></tr>
3206
3207
3208<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>
3209<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
3210pointee matches a given matcher.
3211
3212Given
3213 int *a;
3214 int const *b;
3215 float const *f;
3216pointerType(pointee(isConstQualified(), isInteger()))
3217 matches "int const *b"
3218
3219Usable 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;,
3220 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;
3221</pre></td></tr>
3222
3223
Manuel Klimek415514d2013-02-06 20:36:22 +00003224<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 +00003225<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3226
3227Given
3228 struct A { struct B { struct C {}; }; };
3229 A::B::C c;
3230nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3231 matches "A::"
3232</pre></td></tr>
3233
3234
Manuel Klimek41df16e2013-01-09 09:38:21 +00003235<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>
3236<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
3237NestedNameSpecifier-matcher matches.
3238</pre></td></tr>
3239
3240
Daniel Jaspere0b89972012-12-04 12:08:08 +00003241<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>
3242<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3243given TypeLoc.
3244
3245Given
3246 struct A { struct B { struct C {}; }; };
3247 A::B::C c;
3248nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3249 hasDeclaration(recordDecl(hasName("A")))))))
3250 matches "A::"
3251</pre></td></tr>
3252
3253
Manuel Klimek415514d2013-02-06 20:36:22 +00003254<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 +00003255<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3256
3257Given
3258 struct A { struct B { struct C {}; }; };
3259 A::B::C c;
3260nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3261 matches "A::"
3262</pre></td></tr>
3263
3264
3265<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>
3266<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3267given namespace matcher.
3268
3269Given
3270 namespace ns { struct A {}; }
3271 ns::A a;
3272nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3273 matches "ns::"
3274</pre></td></tr>
3275
3276
3277<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>
3278<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3279given QualType matcher without qualifiers.
3280
3281Given
3282 struct A { struct B { struct C {}; }; };
3283 A::B::C c;
3284nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3285 matches "A::"
3286</pre></td></tr>
3287
3288
Edwin Vane88be2fd2013-04-01 18:33:34 +00003289<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>
3290<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3291
3292Given
3293 int (*ptr_to_array)[4];
3294 int (*ptr_to_func)(int);
3295
3296varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3297ptr_to_func but not ptr_to_array.
3298
3299Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3300</pre></td></tr>
3301
3302
Manuel Klimek41df16e2013-01-09 09:38:21 +00003303<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>
3304<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3305pointee matches a given matcher.
3306
3307Given
3308 int *a;
3309 int const *b;
3310 float const *f;
3311pointerType(pointee(isConstQualified(), isInteger()))
3312 matches "int const *b"
3313
3314Usable 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;,
3315 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;
3316</pre></td></tr>
3317
3318
3319<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>
3320<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3321pointee matches a given matcher.
3322
3323Given
3324 int *a;
3325 int const *b;
3326 float const *f;
3327pointerType(pointee(isConstQualified(), isInteger()))
3328 matches "int const *b"
3329
3330Usable 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;,
3331 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;
3332</pre></td></tr>
3333
3334
Edwin Vane6a19a972013-03-06 17:02:57 +00003335<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>
3336<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3337
3338Given:
3339 typedef int &amp;int_ref;
3340 int a;
3341 int_ref b = a;
3342
3343varDecl(hasType(qualType(referenceType()))))) will not match the
3344declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3345</pre></td></tr>
3346
3347
Edwin Vane3abf7782013-02-25 14:49:29 +00003348<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 +00003349<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3350matches the given matcher.
Manuel Klimek1da79332012-08-20 20:54:03 +00003351
Manuel Klimek03a83232013-06-10 08:52:15 +00003352The associated declaration is:
3353- for type nodes, the declaration of the underlying type
3354- for CallExpr, the declaration of the callee
3355- for MemberExpr, the declaration of the referenced member
3356- for CXXConstructExpr, the declaration of the constructor
3357
3358Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3359function. e.g. various subtypes of clang::Type and various expressions.
3360FIXME: Add all node types for which this is matcher is usable due to
3361getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003362
Daniel Jaspere0b89972012-12-04 12:08:08 +00003363Usable 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 +00003364 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;,
3365 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Manuel Klimek1da79332012-08-20 20:54:03 +00003366</pre></td></tr>
3367
3368
Manuel Klimek67619ff2012-09-07 13:10:32 +00003369<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003370<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3371</pre></td></tr>
3372
3373
Manuel Klimek67619ff2012-09-07 13:10:32 +00003374<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 +00003375<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3376</pre></td></tr>
3377
3378
Manuel Klimek41df16e2013-01-09 09:38:21 +00003379<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>
3380<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3381pointee matches a given matcher.
3382
3383Given
3384 int *a;
3385 int const *b;
3386 float const *f;
3387pointerType(pointee(isConstQualified(), isInteger()))
3388 matches "int const *b"
3389
3390Usable 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;,
3391 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;
3392</pre></td></tr>
3393
3394
3395<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>
3396<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3397pointee matches a given matcher.
3398
3399Given
3400 int *a;
3401 int const *b;
3402 float const *f;
3403pointerType(pointee(isConstQualified(), isInteger()))
3404 matches "int const *b"
3405
3406Usable 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;,
3407 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;
3408</pre></td></tr>
3409
3410
Manuel Klimek67619ff2012-09-07 13:10:32 +00003411<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 +00003412<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3413alignof.
3414</pre></td></tr>
3415
3416
Manuel Klimek67619ff2012-09-07 13:10:32 +00003417<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 +00003418<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3419sizeof.
3420</pre></td></tr>
3421
3422
Manuel Klimek03a83232013-06-10 08:52:15 +00003423<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>
3424<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3425statement. This matcher may produce multiple matches.
3426
3427Given
3428 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3429switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3430 matches four times, with "c" binding each of "case 1:", "case 2:",
3431"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3432"switch (1)", "switch (2)" and "switch (2)".
3433</pre></td></tr>
3434
3435
Manuel Klimek67619ff2012-09-07 13:10:32 +00003436<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 +00003437<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
3438
3439Given
3440 template&lt;typename T&gt; struct A {};
3441 struct B { B* next; };
3442 A&lt;&amp;B::next&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003443classTemplateSpecializationDecl(hasAnyTemplateArgument(
3444 refersToDeclaration(fieldDecl(hasName("next"))))
3445 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
Manuel Klimek1da79332012-08-20 20:54:03 +00003446 B::next
3447</pre></td></tr>
3448
3449
Manuel Klimek67619ff2012-09-07 13:10:32 +00003450<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 +00003451<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3452
3453Given
3454 struct X {};
3455 template&lt;typename T&gt; struct A {};
3456 A&lt;X&gt; a;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003457classTemplateSpecializationDecl(hasAnyTemplateArgument(
Manuel Klimek1da79332012-08-20 20:54:03 +00003458 refersToType(class(hasName("X")))))
3459 matches the specialization A&lt;X&gt;
3460</pre></td></tr>
3461
3462
Edwin Vane3abf7782013-02-25 14:49:29 +00003463<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 +00003464<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
3465matches the given matcher.
Edwin Vane52380602013-02-19 17:14:34 +00003466
Manuel Klimek03a83232013-06-10 08:52:15 +00003467The associated declaration is:
3468- for type nodes, the declaration of the underlying type
3469- for CallExpr, the declaration of the callee
3470- for MemberExpr, the declaration of the referenced member
3471- for CXXConstructExpr, the declaration of the constructor
3472
3473Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3474function. e.g. various subtypes of clang::Type and various expressions.
3475FIXME: Add all node types for which this is matcher is usable due to
3476getDecl().
Edwin Vane52380602013-02-19 17:14:34 +00003477
3478Usable 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 +00003479 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;,
3480 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
3481</pre></td></tr>
3482
3483
3484<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>
3485<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
3486QualType-matcher matches.
3487</pre></td></tr>
3488
3489
3490<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 +00003491<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
3492matches the given matcher.
Edwin Vane3abf7782013-02-25 14:49:29 +00003493
Manuel Klimek03a83232013-06-10 08:52:15 +00003494The associated declaration is:
3495- for type nodes, the declaration of the underlying type
3496- for CallExpr, the declaration of the callee
3497- for MemberExpr, the declaration of the referenced member
3498- for CXXConstructExpr, the declaration of the constructor
3499
3500Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3501function. e.g. various subtypes of clang::Type and various expressions.
3502FIXME: Add all node types for which this is matcher is usable due to
3503getDecl().
Edwin Vane3abf7782013-02-25 14:49:29 +00003504
3505Usable 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;,
3506 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;,
3507 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;
Daniel Jaspere0b89972012-12-04 12:08:08 +00003508</pre></td></tr>
3509
3510
Manuel Klimek67619ff2012-09-07 13:10:32 +00003511<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 +00003512<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
3513
3514Given
3515 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
3516unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
3517 matches sizeof(a) and alignof(c)
3518</pre></td></tr>
3519
3520
Manuel Klimek67619ff2012-09-07 13:10:32 +00003521<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 +00003522<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
3523
Daniel Jaspere0b89972012-12-04 12:08:08 +00003524Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003525 !true
3526</pre></td></tr>
3527
3528
Manuel Klimek67619ff2012-09-07 13:10:32 +00003529<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 +00003530<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
3531
3532Given
3533 namespace X { void b(); }
3534 using X::b;
3535usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
3536 matches using X::b </pre></td></tr>
3537
3538
Manuel Klimek67619ff2012-09-07 13:10:32 +00003539<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 +00003540<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
3541matched by the given matcher.
3542
3543Given
3544 namespace X { int a; void b(); }
3545 using X::a;
3546 using X::b;
Manuel Klimeke44a0062012-08-26 23:55:24 +00003547usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003548 matches using X::b but not using X::a </pre></td></tr>
3549
3550
Manuel Klimek67619ff2012-09-07 13:10:32 +00003551<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 +00003552<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3553declaration's type.
3554
3555In case of a value declaration (for example a variable declaration),
3556this resolves one layer of indirection. For example, in the value
Manuel Klimeke44a0062012-08-26 23:55:24 +00003557declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3558while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
Manuel Klimek1da79332012-08-20 20:54:03 +00003559of x."
3560
Manuel Klimeke44a0062012-08-26 23:55:24 +00003561Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3562 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
Manuel Klimek1da79332012-08-20 20:54:03 +00003563 class X {};
3564 void y(X &amp;x) { x; X z; }
3565
3566Usable 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;
3567</pre></td></tr>
3568
3569
Manuel Klimek67619ff2012-09-07 13:10:32 +00003570<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 +00003571<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
3572that matches the given matcher.
3573
Manuel Klimeke44a0062012-08-26 23:55:24 +00003574Example matches x (matcher = varDecl(hasInitializer(callExpr())))
Manuel Klimek1da79332012-08-20 20:54:03 +00003575 bool y() { return true; }
3576 bool x = y();
3577</pre></td></tr>
3578
3579
Daniel Jaspere0b89972012-12-04 12:08:08 +00003580<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>
3581<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
3582expression.
3583
3584Given
3585 void f(int b) {
3586 int a[b];
3587 }
3588variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3589 varDecl(hasName("b")))))))
3590 matches "int a[b]"
3591</pre></td></tr>
3592
3593
Manuel Klimek67619ff2012-09-07 13:10:32 +00003594<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 +00003595<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
3596a given body.
3597
3598Given
3599 for (;;) {}
Manuel Klimeke44a0062012-08-26 23:55:24 +00003600hasBody(compoundStmt())
Manuel Klimek1da79332012-08-20 20:54:03 +00003601 matches 'for (;;) {}'
Manuel Klimeke44a0062012-08-26 23:55:24 +00003602with compoundStmt()
Manuel Klimek1da79332012-08-20 20:54:03 +00003603 matching '{}'
3604</pre></td></tr>
3605
3606
Manuel Klimek67619ff2012-09-07 13:10:32 +00003607<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 +00003608<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
3609or conditional operator.
3610
3611Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3612 if (true) {}
3613</pre></td></tr>
3614
3615<!--END_TRAVERSAL_MATCHERS -->
3616</table>
3617
3618</div>
3619</body>
3620</html>
3621
3622