blob: fff5366775cd2a08718fac8877ac1718c1b7bfa0 [file] [log] [blame]
Benjamin Kramer7d0cc232015-11-20 07:57:46 +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) {
23 if (!id) return;
24 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>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<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
72<!-- ======================================================================= -->
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
88<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
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000101<!-- START_DECL_MATCHERS -->
102
Aaron Ballman672dde22016-01-22 23:15:00 +0000103<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107 class C {
108 C() : i(42) {}
109 int i;
110 };
111</pre></td></tr>
112
113
Aaron Ballman672dde22016-01-22 23:15:00 +0000114<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118 class C {
119 public:
120 int a;
121 };
122accessSpecDecl()
123 matches 'public:'
124</pre></td></tr>
125
126
Aaron Ballman672dde22016-01-22 23:15:00 +0000127<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000128<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
129
130Example matches Z
131 template&lt;class T&gt; class Z {};
132</pre></td></tr>
133
134
Aaron Ballman672dde22016-01-22 23:15:00 +0000135<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000136<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
137
138Given
139 template&lt;typename T&gt; class A {};
140 template&lt;&gt; class A&lt;double&gt; {};
141 A&lt;int&gt; a;
142classTemplateSpecializationDecl()
143 matches the specializations A&lt;int&gt; and A&lt;double&gt;
144</pre></td></tr>
145
146
Aaron Ballman672dde22016-01-22 23:15:00 +0000147<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000148<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
149
150Example matches Foo::Foo() and Foo::Foo(int)
151 class Foo {
152 public:
153 Foo();
154 Foo(int);
155 int DoSomething();
156 };
157</pre></td></tr>
158
159
Aaron Ballman672dde22016-01-22 23:15:00 +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('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000161<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
162
163Example matches the operator.
164 class X { operator int() const; };
165</pre></td></tr>
166
167
Aaron Ballman672dde22016-01-22 23:15:00 +0000168<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000169<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
170
171Example matches Foo::~Foo()
172 class Foo {
173 public:
174 virtual ~Foo();
175 };
176</pre></td></tr>
177
178
Aaron Ballman672dde22016-01-22 23:15:00 +0000179<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000180<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
181
182Example matches y
183 class X { void y(); };
184</pre></td></tr>
185
186
Aaron Ballman672dde22016-01-22 23:15:00 +0000187<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000188<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
189
190Example matches X, Z
191 class X;
192 template&lt;class T&gt; class Z {};
193</pre></td></tr>
194
195
Aaron Ballman672dde22016-01-22 23:15:00 +0000196<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000197<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
198
199Examples matches X, C, and the friend declaration inside C;
200 void X();
201 class C {
202 friend X;
203 };
204</pre></td></tr>
205
206
Aaron Ballman672dde22016-01-22 23:15:00 +0000207<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000208<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
209and non-type template parameter declarations).
210
211Given
212 class X { int y; };
213declaratorDecl()
214 matches int y.
215</pre></td></tr>
216
217
Aaron Ballman672dde22016-01-22 23:15:00 +0000218<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000219<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
220
221Example matches A, B, C
222 enum X {
223 A, B, C
224 };
225</pre></td></tr>
226
227
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000229<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
230
231Example matches X
232 enum X {
233 A, B, C
234 };
235</pre></td></tr>
236
237
Aaron Ballman672dde22016-01-22 23:15:00 +0000238<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000239<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
240
241Given
242 class X { int m; };
243fieldDecl()
244 matches 'm'.
245</pre></td></tr>
246
247
Aaron Ballman672dde22016-01-22 23:15:00 +0000248<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000249<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
250
251Given
252 class X { friend void foo(); };
253friendDecl()
254 matches 'friend void foo()'.
255</pre></td></tr>
256
257
Aaron Ballman672dde22016-01-22 23:15:00 +0000258<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000259<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
260
261Example matches f
262 void f();
263</pre></td></tr>
264
265
Aaron Ballman672dde22016-01-22 23:15:00 +0000266<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000267<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
268
269Example matches f
270 template&lt;class T&gt; void f(T t) {}
271</pre></td></tr>
272
273
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000274<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
275<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
276
277Given
278 goto FOO;
279 FOO: bar();
280labelDecl()
281 matches 'FOO:'
282</pre></td></tr>
283
284
Aaron Ballman672dde22016-01-22 23:15:00 +0000285<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000286<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
287
288Given
289 extern "C" {}
290linkageSpecDecl()
291 matches "extern "C" {}"
292</pre></td></tr>
293
294
Aaron Ballman672dde22016-01-22 23:15:00 +0000295<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000296<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
297
298Example matches X, S, the anonymous union type, i, and U;
299 typedef int X;
300 struct S {
301 union {
302 int i;
303 } U;
304 };
305</pre></td></tr>
306
307
Aaron Ballman672dde22016-01-22 23:15:00 +0000308<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000309<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
310
311Given
312 namespace test {}
313 namespace alias = ::test;
314namespaceAliasDecl()
315 matches "namespace alias" but not "namespace test"
316</pre></td></tr>
317
318
Aaron Ballman672dde22016-01-22 23:15:00 +0000319<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000320<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
321
322Given
323 namespace {}
324 namespace test {}
325namespaceDecl()
326 matches "namespace {}" and "namespace test {}"
327</pre></td></tr>
328
329
Aaron Ballman672dde22016-01-22 23:15:00 +0000330<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000331<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
332
333Given
334 template &lt;typename T, int N&gt; struct C {};
335nonTypeTemplateParmDecl()
336 matches 'N', but not 'T'.
337</pre></td></tr>
338
339
Aaron Ballman672dde22016-01-22 23:15:00 +0000340<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000341<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
342
343Example matches Foo
344 @interface Foo
345 @end
346</pre></td></tr>
347
348
Aaron Ballman672dde22016-01-22 23:15:00 +0000349<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000350<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
351
352Given
353 void f(int x);
354parmVarDecl()
355 matches int x.
356</pre></td></tr>
357
358
Aaron Ballman672dde22016-01-22 23:15:00 +0000359<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_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000360<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
361
362Example matches X, Z, U, and S
363 class X;
364 template&lt;class T&gt; class Z {};
365 struct S {};
366 union U {};
367</pre></td></tr>
368
369
Aaron Ballman672dde22016-01-22 23:15:00 +0000370<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000371<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
372
373Example:
374 staticAssertExpr()
375matches
376 static_assert(sizeof(S) == sizeof(int))
377in
378 struct S {
379 int x;
380 };
381 static_assert(sizeof(S) == sizeof(int));
382</pre></td></tr>
383
384
Aaron Ballman672dde22016-01-22 23:15:00 +0000385<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000386<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
387
388Given
389 template &lt;typename T, int N&gt; struct C {};
390templateTypeParmDecl()
391 matches 'T', but not 'N'.
392</pre></td></tr>
393
394
Aaron Ballman672dde22016-01-22 23:15:00 +0000395<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000396<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
397
398Given
399 int X;
400 namespace NS {
401 int Y;
402 } namespace NS
403decl(hasDeclContext(translationUnitDecl()))
404 matches "int X", but not "int Y".
405</pre></td></tr>
406
407
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000408<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
409<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
410
411Given
412 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000413 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000414typeAliasDecl()
415 matches "using Y = int", but not "typedef int X"
416</pre></td></tr>
417
418
Aaron Ballman672dde22016-01-22 23:15:00 +0000419<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000420<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
421
422Given
423 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000424 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000425typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000426 matches "typedef int X", but not "using Y = int"
427</pre></td></tr>
428
429
430<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
431<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
432
433Given
434 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000435 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000436typedefNameDecl()
437 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000438</pre></td></tr>
439
440
Aaron Ballman672dde22016-01-22 23:15:00 +0000441<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000442<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
443typename.
444
445Given
446 template &lt;typename T&gt;
447 struct Base { typedef T Foo; };
448
449 template&lt;typename T&gt;
450 struct S : private Base&lt;T&gt; {
451 using typename Base&lt;T&gt;::Foo;
452 };
453unresolvedUsingTypenameDecl()
454 matches using Base&lt;T&gt;::Foo </pre></td></tr>
455
456
Aaron Ballman672dde22016-01-22 23:15:00 +0000457<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000458<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
459
460Given
461 template&lt;typename X&gt;
462 class C : private X {
463 using X::x;
464 };
465unresolvedUsingValueDecl()
466 matches using X::x </pre></td></tr>
467
468
Aaron Ballman672dde22016-01-22 23:15:00 +0000469<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000470<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
471
472Given
473 namespace X { int x; }
474 using X::x;
475usingDecl()
476 matches using X::x </pre></td></tr>
477
478
Aaron Ballman672dde22016-01-22 23:15:00 +0000479<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000480<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
481
482Given
483 namespace X { int x; }
484 using namespace X;
485usingDirectiveDecl()
486 matches using namespace X </pre></td></tr>
487
488
Aaron Ballman672dde22016-01-22 23:15:00 +0000489<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000490<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
491
492Example matches A, B, C and F
493 enum X { A, B, C };
494 void F();
495</pre></td></tr>
496
497
Aaron Ballman672dde22016-01-22 23:15:00 +0000498<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000499<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
500
501Note: this does not match declarations of member variables, which are
502"field" declarations in Clang parlance.
503
504Example matches a
505 int a;
506</pre></td></tr>
507
508
Aaron Ballman672dde22016-01-22 23:15:00 +0000509<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000510<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
511</pre></td></tr>
512
513
Aaron Ballman672dde22016-01-22 23:15:00 +0000514<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000515<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
516
517Given
518 namespace ns {
519 struct A { static void f(); };
520 void A::f() {}
521 void g() { A::f(); }
522 }
523 ns::A a;
524nestedNameSpecifier()
525 matches "ns::" and both "A::"
526</pre></td></tr>
527
528
Aaron Ballman672dde22016-01-22 23:15:00 +0000529<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000530<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
531</pre></td></tr>
532
533
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000534<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
535<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
536
537Given
538 FOO: bar();
539 void *ptr = &amp;&amp;FOO;
540 goto *bar;
541addrLabelExpr()
542 matches '&amp;&amp;FOO'
543</pre></td></tr>
544
545
Aaron Ballman672dde22016-01-22 23:15:00 +0000546<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000547<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
548
549Given
550 int i = a[1];
551arraySubscriptExpr()
552 matches "a[1]"
553</pre></td></tr>
554
555
Aaron Ballman672dde22016-01-22 23:15:00 +0000556<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000557<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
558
559 int i = 100;
560 __asm("mov al, 2");
561asmStmt()
562 matches '__asm("mov al, 2")'
563</pre></td></tr>
564
565
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000566<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
567<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
568Example matches __atomic_load_n(ptr, 1)
569 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
570</pre></td></tr>
571
572
573<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
574<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
575
576Example matches a ?: b
577 (a ?: b) + 42;
578</pre></td></tr>
579
580
Aaron Ballman672dde22016-01-22 23:15:00 +0000581<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000582<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
583
584Example matches a || b
585 !(a || b)
586</pre></td></tr>
587
588
Aaron Ballman672dde22016-01-22 23:15:00 +0000589<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000590<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
591
592Given
593 while (true) { break; }
594breakStmt()
595 matches 'break'
596</pre></td></tr>
597
598
Aaron Ballman672dde22016-01-22 23:15:00 +0000599<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000600<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
601
602Example: Matches (int*) 2.2f in
603 int i = (int) 2.2f;
604</pre></td></tr>
605
606
Aaron Ballman672dde22016-01-22 23:15:00 +0000607<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000608<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
609
610Example matches x.y() and y()
611 X x;
612 x.y();
613 y();
614</pre></td></tr>
615
616
Aaron Ballman672dde22016-01-22 23:15:00 +0000617<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000618<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
619
620Given
621 switch(a) { case 42: break; default: break; }
622caseStmt()
623 matches 'case 42: break;'.
624</pre></td></tr>
625
626
Aaron Ballman672dde22016-01-22 23:15:00 +0000627<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000628<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
629
630Example: castExpr() matches each of the following:
631 (int) 3;
632 const_cast&lt;Expr *&gt;(SubExpr);
633 char c = 0;
634but does not match
635 int i = (0);
636 int k = 0;
637</pre></td></tr>
638
639
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000641<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
642
643Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
644though.
645
646Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000647 char ch = 'a';
648 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000649</pre></td></tr>
650
651
Aaron Ballman672dde22016-01-22 23:15:00 +0000652<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000653<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
654
655Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000656 int array[4] = {1};
657 vector int myvec = (vector int)(1, 2);
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000658</pre></td></tr>
659
660
Aaron Ballman672dde22016-01-22 23:15:00 +0000661<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000662<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
663
664Example matches '{}' and '{{}}'in 'for (;;) {{}}'
665 for (;;) {{}}
666</pre></td></tr>
667
668
Aaron Ballman672dde22016-01-22 23:15:00 +0000669<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000670<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
671
672Example matches a ? b : c
673 (a ? b : c) + 42
674</pre></td></tr>
675
676
Aaron Ballman672dde22016-01-22 23:15:00 +0000677<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000678<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
679
680Given
681 while (true) { continue; }
682continueStmt()
683 matches 'continue'
684</pre></td></tr>
685
686
Aaron Ballman672dde22016-01-22 23:15:00 +0000687<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000688<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
689
690Example matches,
691 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
692</pre></td></tr>
693
694
Aaron Ballman672dde22016-01-22 23:15:00 +0000695<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000696<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
697
698Example matches FunctionTakesString(GetStringByValue())
699 (matcher = cxxBindTemporaryExpr())
700 FunctionTakesString(GetStringByValue());
701 FunctionTakesStringByPointer(GetStringPointer());
702</pre></td></tr>
703
704
Aaron Ballman672dde22016-01-22 23:15:00 +0000705<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000706<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
707
708Example matches true
709 true
710</pre></td></tr>
711
712
Aaron Ballman672dde22016-01-22 23:15:00 +0000713<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000714<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
715
716 try {} catch(int i) {}
717cxxCatchStmt()
718 matches 'catch(int i)'
719</pre></td></tr>
720
721
Aaron Ballman672dde22016-01-22 23:15:00 +0000722<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000723<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
724
725Example: Matches const_cast&lt;int*&gt;(&amp;r) in
726 int n = 42;
727 const int &amp;r(n);
728 int* p = const_cast&lt;int*&gt;(&amp;r);
729</pre></td></tr>
730
731
Aaron Ballman672dde22016-01-22 23:15:00 +0000732<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000733<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
734
735Example matches string(ptr, n) and ptr within arguments of f
736 (matcher = cxxConstructExpr())
737 void f(const string &amp;a, const string &amp;b);
738 char *ptr;
739 int n;
740 f(string(ptr, n), ptr);
741</pre></td></tr>
742
743
Aaron Ballman672dde22016-01-22 23:15:00 +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('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000745<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
746
747Example matches the CXXDefaultArgExpr placeholder inserted for the
748 default value of the second parameter in the call expression f(42)
749 (matcher = cxxDefaultArgExpr())
750 void f(int x, int y = 0);
751 f(42);
752</pre></td></tr>
753
754
Aaron Ballman672dde22016-01-22 23:15:00 +0000755<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000756<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
757
758Given
759 delete X;
760cxxDeleteExpr()
761 matches 'delete X'.
762</pre></td></tr>
763
764
Aaron Ballman672dde22016-01-22 23:15:00 +0000765<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000766<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
767
768Example:
769 cxxDynamicCastExpr()
770matches
771 dynamic_cast&lt;D*&gt;(&amp;b);
772in
773 struct B { virtual ~B() {} }; struct D : B {};
774 B b;
775 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
776</pre></td></tr>
777
778
Aaron Ballman672dde22016-01-22 23:15:00 +0000779<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000780<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
781
782cxxForRangeStmt() matches 'for (auto a : i)'
783 int i[] = {1, 2, 3}; for (auto a : i);
784 for(int j = 0; j &lt; 5; ++j);
785</pre></td></tr>
786
787
Aaron Ballman672dde22016-01-22 23:15:00 +0000788<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000789<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
790
791Example: Matches Foo(bar);
792 Foo f = bar;
793 Foo g = (Foo) bar;
794 Foo h = Foo(bar);
795</pre></td></tr>
796
797
Aaron Ballman672dde22016-01-22 23:15:00 +0000798<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000799<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
800
801Example matches x.y()
802 X x;
803 x.y();
804</pre></td></tr>
805
806
Aaron Ballman672dde22016-01-22 23:15:00 +0000807<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000808<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
809
810Given
811 new X;
812cxxNewExpr()
813 matches 'new X'.
814</pre></td></tr>
815
816
Aaron Ballman672dde22016-01-22 23:15:00 +0000817<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000818<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
819</pre></td></tr>
820
821
Aaron Ballman672dde22016-01-22 23:15:00 +0000822<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000823<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
824
825Note that if an operator isn't overloaded, it won't match. Instead, use
826binaryOperator matcher.
827Currently it does not match operators such as new delete.
828FIXME: figure out why these do not match?
829
830Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
831 (matcher = cxxOperatorCallExpr())
832 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
833 ostream &amp;o; int b = 1, c = 1;
834 o &lt;&lt; b &lt;&lt; c;
835</pre></td></tr>
836
837
Aaron Ballman672dde22016-01-22 23:15:00 +0000838<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000839<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
840
841Either the source expression or the destination type can be matched
842using has(), but hasDestinationType() is more specific and can be
843more readable.
844
845Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
846 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
847</pre></td></tr>
848
849
Aaron Ballman672dde22016-01-22 23:15:00 +0000850<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000851<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
852
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000853See also: hasDestinationType
854See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000855
856Example:
857 cxxStaticCastExpr()
858matches
859 static_cast&lt;long&gt;(8)
860in
861 long eight(static_cast&lt;long&gt;(8));
862</pre></td></tr>
863
864
Aaron Ballman672dde22016-01-22 23:15:00 +0000865<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000866<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
867
868Example: Matches Foo(bar, bar)
869 Foo h = Foo(bar, bar);
870</pre></td></tr>
871
872
Aaron Ballman672dde22016-01-22 23:15:00 +0000873<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000874<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
875
876Example matches the implicit this expression in "return i".
877 (matcher = cxxThisExpr())
878struct foo {
879 int i;
880 int f() { return i; }
881};
882</pre></td></tr>
883
884
Aaron Ballman672dde22016-01-22 23:15:00 +0000885<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000886<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
887
888 try { throw 5; } catch(int i) {}
889cxxThrowExpr()
890 matches 'throw 5'
891</pre></td></tr>
892
893
Aaron Ballman672dde22016-01-22 23:15:00 +0000894<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000895<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
896
897 try {} catch(int i) {}
898cxxTryStmt()
899 matches 'try {}'
900</pre></td></tr>
901
902
Aaron Ballman672dde22016-01-22 23:15:00 +0000903<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000904<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
905
906Example matches T(t) in return statement of f
907 (matcher = cxxUnresolvedConstructExpr())
908 template &lt;typename T&gt;
909 void f(const T&amp; t) { return T(t); }
910</pre></td></tr>
911
912
Aaron Ballman672dde22016-01-22 23:15:00 +0000913<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000914<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
915
916Example matches x in if (x)
917 bool x;
918 if (x) {}
919</pre></td></tr>
920
921
Aaron Ballman672dde22016-01-22 23:15:00 +0000922<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000923<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
924
925Given
926 int a;
927declStmt()
928 matches 'int a'.
929</pre></td></tr>
930
931
Aaron Ballman672dde22016-01-22 23:15:00 +0000932<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000933<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
934
935Given
936 switch(a) { case 42: break; default: break; }
937defaultStmt()
938 matches 'default: break;'.
939</pre></td></tr>
940
941
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000942<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
943<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
944
945Example: Matches { [2].y = 1.0, [0].x = 1.0 }
946 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
947</pre></td></tr>
948
949
Aaron Ballman672dde22016-01-22 23:15:00 +0000950<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000951<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
952
953Given
954 do {} while (true);
955doStmt()
956 matches 'do {} while(true)'
957</pre></td></tr>
958
959
Aaron Ballman672dde22016-01-22 23:15:00 +0000960<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000961<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
962
963Matches any cast expression written in user code, whether it be a
964C-style cast, a functional-style cast, or a keyword cast.
965
966Does not match implicit conversions.
967
968Note: the name "explicitCast" is chosen to match Clang's terminology, as
969Clang uses the term "cast" to apply to implicit conversions as well as to
970actual cast expressions.
971
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000972See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000973
974Example: matches all five of the casts in
975 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
976but does not match the implicit conversion in
977 long ell = 42;
978</pre></td></tr>
979
980
Aaron Ballman672dde22016-01-22 23:15:00 +0000981<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000982<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
983
984Example matches x()
985 void f() { x(); }
986</pre></td></tr>
987
988
Aaron Ballman672dde22016-01-22 23:15:00 +0000989<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000990<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
991of the sub-expression's evaluation.
992
993Example matches std::string()
994 const std::string str = std::string();
995</pre></td></tr>
996
997
Aaron Ballman672dde22016-01-22 23:15:00 +0000998<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000999<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10001.0, 1.0f, 1.0L and 1e10.
1001
1002Does not match implicit conversions such as
1003 float a = 10;
1004</pre></td></tr>
1005
1006
Aaron Ballman672dde22016-01-22 23:15:00 +00001007<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001008<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1009
1010Example matches 'for (;;) {}'
1011 for (;;) {}
1012 int i[] = {1, 2, 3}; for (auto a : i);
1013</pre></td></tr>
1014
1015
Aaron Ballman672dde22016-01-22 23:15:00 +00001016<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001017<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1018</pre></td></tr>
1019
1020
Aaron Ballman672dde22016-01-22 23:15:00 +00001021<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001022<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1023
1024Given
1025 goto FOO;
1026 FOO: bar();
1027gotoStmt()
1028 matches 'goto FOO'
1029</pre></td></tr>
1030
1031
Aaron Ballman672dde22016-01-22 23:15:00 +00001032<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001033<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1034
1035Example matches 'if (x) {}'
1036 if (x) {}
1037</pre></td></tr>
1038
1039
Aaron Ballman672dde22016-01-22 23:15:00 +00001040<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001041<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1042
1043This matches many different places, including function call return value
1044eliding, as well as any type conversions.
1045</pre></td></tr>
1046
1047
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001048<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1049<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1050
1051Given
1052 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1053implicitValueInitExpr()
1054 matches "[0].y" (implicitly)
1055</pre></td></tr>
1056
1057
Aaron Ballman672dde22016-01-22 23:15:00 +00001058<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001059<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1060
1061Given
1062 int a[] = { 1, 2 };
1063 struct B { int x, y; };
1064 B b = { 5, 6 };
1065initListExpr()
1066 matches "{ 1, 2 }" and "{ 5, 6 }"
1067</pre></td></tr>
1068
1069
Aaron Ballman672dde22016-01-22 23:15:00 +00001070<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001071<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
10721, 1L, 0x1 and 1U.
1073
1074Does not match character-encoded integers such as L'a'.
1075</pre></td></tr>
1076
1077
Aaron Ballman672dde22016-01-22 23:15:00 +00001078<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001079<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1080
1081Given
1082 goto FOO;
1083 FOO: bar();
1084labelStmt()
1085 matches 'FOO:'
1086</pre></td></tr>
1087
1088
Aaron Ballman672dde22016-01-22 23:15:00 +00001089<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001090<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1091
1092Example matches [&amp;](){return 5;}
1093 [&amp;](){return 5;}
1094</pre></td></tr>
1095
1096
Aaron Ballman672dde22016-01-22 23:15:00 +00001097<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001098<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1099
1100Example: Given
1101 struct T {void func()};
1102 T f();
1103 void g(T);
1104materializeTemporaryExpr() matches 'f()' in these statements
1105 T u(f());
1106 g(f());
1107but does not match
1108 f();
1109 f().func();
1110</pre></td></tr>
1111
1112
Aaron Ballman672dde22016-01-22 23:15:00 +00001113<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001114<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1115
1116Given
1117 class Y {
1118 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1119 int a; static int b;
1120 };
1121memberExpr()
1122 matches this-&gt;x, x, y.x, a, this-&gt;b
1123</pre></td></tr>
1124
1125
Aaron Ballman672dde22016-01-22 23:15:00 +00001126<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001127<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1128
1129 foo();;
1130nullStmt()
1131 matches the second ';'
1132</pre></td></tr>
1133
1134
Aaron Ballman672dde22016-01-22 23:15:00 +00001135<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001136<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1137
1138The innermost message send invokes the "alloc" class method on the
1139NSString class, while the outermost message send invokes the
1140"initWithString" instance method on the object returned from
1141NSString's "alloc". This matcher should match both message sends.
1142 [[NSString alloc] initWithString:@"Hello"]
1143</pre></td></tr>
1144
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001145
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001146<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
1147<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1148to reference another expressions and can be met
1149in BinaryConditionalOperators, for example.
1150
1151Example matches 'a'
1152 (a ?: c) + 42;
1153</pre></td></tr>
1154
1155
Aaron Ballman672dde22016-01-22 23:15:00 +00001156<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
Aaron Ballmane8295d72016-01-20 16:17:39 +00001157<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1158
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001159Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001160 int foo() { return 1; }
1161 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001162</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001163
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001164
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001165<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
1166<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1167ParenListExprs don't have a predefined type and are used for late parsing.
1168In the final AST, they can be met in template declarations.
1169
1170Given
1171 template&lt;typename T&gt; class X {
1172 void f() {
1173 X x(*this);
1174 int a = 0, b = 1; int i = (a, b);
1175 }
1176 };
1177parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1178has a predefined type and is a ParenExpr, not a ParenListExpr.
1179</pre></td></tr>
1180
1181
1182<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
1183<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1184
1185Example: Matches __func__
1186 printf("%s", __func__);
1187</pre></td></tr>
1188
1189
Aaron Ballman672dde22016-01-22 23:15:00 +00001190<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001191<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1192
1193Given
1194 return 1;
1195returnStmt()
1196 matches 'return 1'
1197</pre></td></tr>
1198
1199
Aaron Ballman672dde22016-01-22 23:15:00 +00001200<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001201<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1202
1203Given
1204 { ++a; }
1205stmt()
1206 matches both the compound statement '{ ++a; }' and '++a'.
1207</pre></td></tr>
1208
1209
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001210<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
1211<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1212
1213Example match: ({ int X = 4; X; })
1214 int C = ({ int X = 4; X; });
1215</pre></td></tr>
1216
1217
Aaron Ballman672dde22016-01-22 23:15:00 +00001218<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001219<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1220
1221Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001222 char *s = "abcd";
1223 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001224</pre></td></tr>
1225
1226
Aaron Ballman672dde22016-01-22 23:15:00 +00001227<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001228<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1229
1230Given
1231 template &lt;int N&gt;
1232 struct A { static const int n = N; };
1233 struct B : public A&lt;42&gt; {};
1234substNonTypeTemplateParmExpr()
1235 matches "N" in the right-hand side of "static const int n = N;"
1236</pre></td></tr>
1237
1238
Aaron Ballman672dde22016-01-22 23:15:00 +00001239<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001240<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1241
1242Given
1243 switch(a) { case 42: break; default: break; }
1244switchCase()
1245 matches 'case 42: break;' and 'default: break;'.
1246</pre></td></tr>
1247
1248
Aaron Ballman672dde22016-01-22 23:15:00 +00001249<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001250<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1251
1252Given
1253 switch(a) { case 42: break; default: break; }
1254switchStmt()
1255 matches 'switch(a)'.
1256</pre></td></tr>
1257
1258
Aaron Ballman672dde22016-01-22 23:15:00 +00001259<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001260<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1261
1262Given
1263 Foo x = bar;
1264 int y = sizeof(x) + alignof(x);
1265unaryExprOrTypeTraitExpr()
1266 matches sizeof(x) and alignof(x)
1267</pre></td></tr>
1268
1269
Aaron Ballman672dde22016-01-22 23:15:00 +00001270<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001271<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1272
1273Example matches !a
1274 !a || b
1275</pre></td></tr>
1276
1277
Haojian Wu7751c922016-05-18 12:53:59 +00001278<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
1279<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1280but could not be resolved to a specific declaration.
1281
1282Given
1283 template&lt;typename T&gt;
1284 T foo() { T a; return a; }
1285 template&lt;typename T&gt;
1286 void bar() {
1287 foo&lt;T&gt;();
1288 }
1289unresolvedLookupExpr()
1290 matches foo&lt;T&gt;() </pre></td></tr>
1291
1292
Aaron Ballman672dde22016-01-22 23:15:00 +00001293<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001294<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1295
1296Example match: "foo"_suffix
1297</pre></td></tr>
1298
1299
Aaron Ballman672dde22016-01-22 23:15:00 +00001300<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001301<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1302
1303Given
1304 while (true) {}
1305whileStmt()
1306 matches 'while (true) {}'.
1307</pre></td></tr>
1308
1309
Aaron Ballman672dde22016-01-22 23:15:00 +00001310<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001311<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1312
1313Given
1314 template &lt;typename T&gt; struct C {};
1315 C&lt;int&gt; c;
1316templateArgument()
1317 matches 'int' in C&lt;int&gt;.
1318</pre></td></tr>
1319
1320
Aaron Ballman672dde22016-01-22 23:15:00 +00001321<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001322<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1323</pre></td></tr>
1324
1325
Aaron Ballman672dde22016-01-22 23:15:00 +00001326<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001327<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1328
1329Given
1330 int a[] = { 2, 3 };
1331 int b[4];
1332 void f() { int c[a[0]]; }
1333arrayType()
1334 matches "int a[]", "int b[4]" and "int c[a[0]]";
1335</pre></td></tr>
1336
1337
Aaron Ballman672dde22016-01-22 23:15:00 +00001338<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001339<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1340
1341Given
1342 _Atomic(int) i;
1343atomicType()
1344 matches "_Atomic(int) i"
1345</pre></td></tr>
1346
1347
Aaron Ballman672dde22016-01-22 23:15:00 +00001348<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001349<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1350
1351Given:
1352 auto n = 4;
1353 int v[] = { 2, 3 }
1354 for (auto i : v) { }
1355autoType()
1356 matches "auto n" and "auto i"
1357</pre></td></tr>
1358
1359
Aaron Ballman672dde22016-01-22 23:15:00 +00001360<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001361<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1362"void (^)(int)".
1363
1364The pointee is always required to be a FunctionType.
1365</pre></td></tr>
1366
1367
Aaron Ballman672dde22016-01-22 23:15:00 +00001368<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001369<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1370
1371Given
1372 struct A {};
1373 A a;
1374 int b;
1375 float c;
1376 bool d;
1377builtinType()
1378 matches "int b", "float c" and "bool d"
1379</pre></td></tr>
1380
1381
Aaron Ballman672dde22016-01-22 23:15:00 +00001382<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001383<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1384
1385Given
1386 _Complex float f;
1387complexType()
1388 matches "_Complex float f"
1389</pre></td></tr>
1390
1391
Aaron Ballman672dde22016-01-22 23:15:00 +00001392<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001393<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1394
1395Given
1396 void() {
1397 int a[2];
1398 int b[] = { 2, 3 };
1399 int c[b[0]];
1400 }
1401constantArrayType()
1402 matches "int a[2]"
1403</pre></td></tr>
1404
1405
Aaron Ballman672dde22016-01-22 23:15:00 +00001406<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001407<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1408Example matches i[] in declaration of f.
1409 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1410Example matches i[1].
1411 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1412 void f(int i[]) {
1413 i[1] = 0;
1414 }
1415</pre></td></tr>
1416
1417
Aaron Ballman672dde22016-01-22 23:15:00 +00001418<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001419<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1420
1421Given
1422 template&lt;typename T, int Size&gt;
1423 class array {
1424 T data[Size];
1425 };
1426dependentSizedArrayType
1427 matches "T data[Size]"
1428</pre></td></tr>
1429
1430
Aaron Ballman672dde22016-01-22 23:15:00 +00001431<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001432<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1433qualified name.
1434
1435Given
1436 namespace N {
1437 namespace M {
1438 class D {};
1439 }
1440 }
1441 class C {};
1442
1443 class C c;
1444 N::M::D d;
1445
1446elaboratedType() matches the type of the variable declarations of both
1447c and d.
1448</pre></td></tr>
1449
1450
Haojian Wue775de82016-06-30 07:50:01 +00001451<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
1452<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1453
1454Given
1455 enum C { Green };
1456 enum S { Red };
1457
1458 C c;
1459 S s;
1460
1461enumType() matches the type of the variable declarations of both c and
1462s.
1463</pre></td></tr>
1464
1465
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001466<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1467<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1468
1469Given
1470 int (*f)(int);
1471 void g();
1472functionProtoType()
1473 matches "int (*f)(int)" and the type of "g" in C++ mode.
1474 In C mode, "g" is not matched because it does not contain a prototype.
1475</pre></td></tr>
1476
1477
Aaron Ballman672dde22016-01-22 23:15:00 +00001478<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001479<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1480
1481Given
1482 int (*f)(int);
1483 void g();
1484functionType()
1485 matches "int (*f)(int)" and the type of "g".
1486</pre></td></tr>
1487
1488
Aaron Ballman672dde22016-01-22 23:15:00 +00001489<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001490<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1491
1492Given
1493 int a[] = { 2, 3 };
1494 int b[42];
1495 void f(int c[]) { int d[a[0]]; };
1496incompleteArrayType()
1497 matches "int a[]" and "int c[]"
1498</pre></td></tr>
1499
1500
Aaron Ballman672dde22016-01-22 23:15:00 +00001501<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001502<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1503
1504Example matches S s, but not S&lt;T&gt; s.
1505 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1506 template &lt;typename T&gt; struct S {
1507 void f(S s);
1508 void g(S&lt;T&gt; s);
1509 };
1510</pre></td></tr>
1511
1512
Aaron Ballman672dde22016-01-22 23:15:00 +00001513<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001514<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1515
1516Given:
1517 int *a;
1518 int &amp;b = *a;
1519 int &amp;&amp;c = 1;
1520 auto &amp;d = b;
1521 auto &amp;&amp;e = c;
1522 auto &amp;&amp;f = 2;
1523 int g = 5;
1524
1525lValueReferenceType() matches the types of b, d, and e. e is
1526matched since the type is deduced as int&amp; by reference collapsing rules.
1527</pre></td></tr>
1528
1529
Aaron Ballman672dde22016-01-22 23:15:00 +00001530<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001531<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1532Given
1533 struct A { int i; }
1534 A::* ptr = A::i;
1535memberPointerType()
1536 matches "A::* ptr"
1537</pre></td></tr>
1538
1539
Aaron Ballman672dde22016-01-22 23:15:00 +00001540<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001541<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1542a pointer type, despite being syntactically similar.
1543
1544Given
1545 int *a;
1546
1547 @interface Foo
1548 @end
1549 Foo *f;
1550pointerType()
1551 matches "Foo *f", but does not match "int *a".
1552</pre></td></tr>
1553
1554
Aaron Ballman672dde22016-01-22 23:15:00 +00001555<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001556<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1557
1558Given
1559 int (*ptr_to_array)[4];
1560 int *array_of_ptrs[4];
1561
1562varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1563array_of_ptrs.
1564</pre></td></tr>
1565
1566
Aaron Ballman672dde22016-01-22 23:15:00 +00001567<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001568<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1569types.
1570
1571Given
1572 int *a;
1573 int &amp;b = *a;
1574 int c = 5;
1575
1576 @interface Foo
1577 @end
1578 Foo *f;
1579pointerType()
1580 matches "int *a", but does not match "Foo *f".
1581</pre></td></tr>
1582
1583
Aaron Ballman672dde22016-01-22 23:15:00 +00001584<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001585<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1586
1587Given:
1588 int *a;
1589 int &amp;b = *a;
1590 int &amp;&amp;c = 1;
1591 auto &amp;d = b;
1592 auto &amp;&amp;e = c;
1593 auto &amp;&amp;f = 2;
1594 int g = 5;
1595
1596rValueReferenceType() matches the types of c and f. e is not
1597matched as it is deduced to int&amp; by reference collapsing rules.
1598</pre></td></tr>
1599
1600
Aaron Ballman672dde22016-01-22 23:15:00 +00001601<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001602<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1603
1604Given
1605 class C {};
1606 struct S {};
1607
1608 C c;
1609 S s;
1610
1611recordType() matches the type of the variable declarations of both c
1612and s.
1613</pre></td></tr>
1614
1615
Aaron Ballman672dde22016-01-22 23:15:00 +00001616<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001617<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1618
1619Given
1620 int *a;
1621 int &amp;b = *a;
1622 int &amp;&amp;c = 1;
1623 auto &amp;d = b;
1624 auto &amp;&amp;e = c;
1625 auto &amp;&amp;f = 2;
1626 int g = 5;
1627
1628referenceType() matches the types of b, c, d, e, and f.
1629</pre></td></tr>
1630
1631
Aaron Ballman672dde22016-01-22 23:15:00 +00001632<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001633<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1634template type parameter.
1635
1636Given
1637 template &lt;typename T&gt;
1638 void F(T t) {
1639 int i = 1 + t;
1640 }
1641
1642substTemplateTypeParmType() matches the type of 't' but not '1'
1643</pre></td></tr>
1644
1645
Aaron Ballman672dde22016-01-22 23:15:00 +00001646<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001647<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1648
1649Given
1650 template &lt;typename T&gt;
1651 class C { };
1652
1653 template class C&lt;int&gt;; A
1654 C&lt;char&gt; var; B
1655
1656templateSpecializationType() matches the type of the explicit
1657instantiation in A and the type of the variable declaration in B.
1658</pre></td></tr>
1659
1660
Aaron Ballman672dde22016-01-22 23:15:00 +00001661<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001662<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1663
1664Example matches T, but not int.
1665 (matcher = templateTypeParmType())
1666 template &lt;typename T&gt; void f(int i);
1667</pre></td></tr>
1668
1669
Aaron Ballman672dde22016-01-22 23:15:00 +00001670<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001671<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1672</pre></td></tr>
1673
1674
Aaron Ballman672dde22016-01-22 23:15:00 +00001675<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001676<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1677
1678Given
1679 typedef int X;
1680typedefType()
1681 matches "typedef int X"
1682</pre></td></tr>
1683
1684
Aaron Ballman672dde22016-01-22 23:15:00 +00001685<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001686<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1687
1688Given:
1689 typedef __underlying_type(T) type;
1690unaryTransformType()
1691 matches "__underlying_type(T)"
1692</pre></td></tr>
1693
1694
Aaron Ballman672dde22016-01-22 23:15:00 +00001695<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001696<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1697integer-constant-expression.
1698
1699Given
1700 void f() {
1701 int a[] = { 2, 3 }
1702 int b[42];
1703 int c[a[0]];
1704 }
1705variableArrayType()
1706 matches "int c[a[0]]"
1707</pre></td></tr>
1708
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001709<!--END_DECL_MATCHERS -->
1710</table>
1711
1712<!-- ======================================================================= -->
1713<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1714<!-- ======================================================================= -->
1715
1716<p>Narrowing matchers match certain attributes on the current node, thus
1717narrowing down the set of nodes of the current type to match on.</p>
1718
1719<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1720which allow users to create more powerful match expressions.</p>
1721
1722<table>
1723<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001724<!-- START_NARROWING_MATCHERS -->
1725
1726<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
1727<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1728
1729Usable as: Any Matcher
1730</pre></td></tr>
1731
1732
1733<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
1734<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1735
1736Usable as: Any Matcher
1737</pre></td></tr>
1738
1739
1740<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1741<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1742
1743Useful when another matcher requires a child matcher, but there's no
1744additional constraint. This will often be used with an explicit conversion
1745to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1746
1747Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1748"int* p" and "void f()" in
1749 int* p;
1750 void f();
1751
1752Usable as: Any Matcher
1753</pre></td></tr>
1754
1755
1756<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1757<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1758
1759Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1760 class X {};
1761 class Y {};
1762
1763Usable as: Any Matcher
1764</pre></td></tr>
1765
1766
Aaron Ballman672dde22016-01-22 23:15:00 +00001767<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001768<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1769unary).
1770
1771Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1772 !(a || b)
1773</pre></td></tr>
1774
1775
1776<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
1777<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1778
1779Example matches true (matcher = cxxBoolLiteral(equals(true)))
1780 true
1781
Aaron Ballman672dde22016-01-22 23:15:00 +00001782Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1783 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001784</pre></td></tr>
1785
1786
Aaron Ballman672dde22016-01-22 23:15:00 +00001787<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001788<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1789
1790Given
1791 try {
1792 ...
1793 } catch (int) {
1794 ...
1795 } catch (...) {
1796 ...
1797 }
1798endcode
1799cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1800</pre></td></tr>
1801
1802
Aaron Ballman672dde22016-01-22 23:15:00 +00001803<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001804<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1805a specific number of arguments (including absent default arguments).
1806
1807Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1808 void f(int x, int y);
1809 f(0, 0);
1810</pre></td></tr>
1811
1812
Aaron Ballman672dde22016-01-22 23:15:00 +00001813<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001814<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1815</pre></td></tr>
1816
1817
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001818<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
1819<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1820zero initialization.
1821
1822Given
1823void foo() {
1824 struct point { double x; double y; };
1825 point pt[2] = { { 1.0, 2.0 } };
1826}
1827initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1828will match the implicit array filler for pt[1].
1829</pre></td></tr>
1830
1831
Aaron Ballman672dde22016-01-22 23:15:00 +00001832<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001833<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1834
1835Given
1836 struct S {
1837 S(); #1
1838 S(const S &amp;); #2
1839 S(S &amp;&amp;); #3
1840 };
1841cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1842</pre></td></tr>
1843
1844
Aaron Ballman672dde22016-01-22 23:15:00 +00001845<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001846<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1847
1848Given
1849 struct S {
1850 S(); #1
1851 S(const S &amp;); #2
1852 S(S &amp;&amp;); #3
1853 };
1854cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1855</pre></td></tr>
1856
1857
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00001858<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
1859<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1860
1861Given
1862 struct S {
1863 S(); #1
1864 S(int) {} #2
1865 S(S &amp;&amp;) : S() {} #3
1866 };
1867 S::S() : S(0) {} #4
1868cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1869#1 or #2.
1870</pre></td></tr>
1871
1872
Aaron Ballman672dde22016-01-22 23:15:00 +00001873<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001874<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1875the explicit keyword.
1876
1877Given
1878 struct S {
1879 S(int); #1
1880 explicit S(double); #2
1881 operator int(); #3
1882 explicit operator bool(); #4
1883 };
1884cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1885cxxConversionDecl(isExplicit()) will match #4, but not #3.
1886</pre></td></tr>
1887
1888
Aaron Ballman672dde22016-01-22 23:15:00 +00001889<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001890<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
1891
1892Given
1893 struct S {
1894 S(); #1
1895 S(const S &amp;); #2
1896 S(S &amp;&amp;); #3
1897 };
1898cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
1899</pre></td></tr>
1900
1901
Aaron Ballman672dde22016-01-22 23:15:00 +00001902<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001903<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
1904the explicit keyword.
1905
1906Given
1907 struct S {
1908 S(int); #1
1909 explicit S(double); #2
1910 operator int(); #3
1911 explicit operator bool(); #4
1912 };
1913cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1914cxxConversionDecl(isExplicit()) will match #4, but not #3.
1915</pre></td></tr>
1916
1917
Aaron Ballman672dde22016-01-22 23:15:00 +00001918<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001919<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
1920opposed to a member.
1921
1922Given
1923 struct B {};
1924 struct D : B {
1925 int I;
1926 D(int i) : I(i) {}
1927 };
1928 struct E : B {
1929 E() : B() {}
1930 };
1931cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
1932 will match E(), but not match D(int).
1933</pre></td></tr>
1934
1935
Aaron Ballman672dde22016-01-22 23:15:00 +00001936<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001937<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
1938opposed to a base.
1939
1940Given
1941 struct B {};
1942 struct D : B {
1943 int I;
1944 D(int i) : I(i) {}
1945 };
1946 struct E : B {
1947 E() : B() {}
1948 };
1949cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
1950 will match D(int), but not match E().
1951</pre></td></tr>
1952
1953
Aaron Ballman672dde22016-01-22 23:15:00 +00001954<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001955<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
1956code (as opposed to implicitly added by the compiler).
1957
1958Given
1959 struct Foo {
1960 Foo() { }
1961 Foo(int) : foo_("A") { }
1962 string foo_;
1963 };
1964cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
1965 will match Foo(int), but not Foo()
1966</pre></td></tr>
1967
1968
Aaron Ballman672dde22016-01-22 23:15:00 +00001969<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001970<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1971
1972Given
1973struct A {
1974 void foo() const;
1975 void bar();
1976};
1977
1978cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
1979</pre></td></tr>
1980
1981
Aaron Ballman672dde22016-01-22 23:15:00 +00001982<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001983<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
1984operator.
1985
1986Given
1987struct A {
1988 A &amp;operator=(const A &amp;);
1989 A &amp;operator=(A &amp;&amp;);
1990};
1991
1992cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
1993the second one.
1994</pre></td></tr>
1995
1996
Aaron Ballman672dde22016-01-22 23:15:00 +00001997<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001998<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
1999
2000Given:
2001 class A final {};
2002
2003 struct B {
2004 virtual void f();
2005 };
2006
2007 struct C : B {
2008 void f() final;
2009 };
2010matches A and C::f, but not B, C, or B::f
2011</pre></td></tr>
2012
2013
Aaron Ballman672dde22016-01-22 23:15:00 +00002014<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
Aaron Ballman31bde872016-01-22 22:37:09 +00002015<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2016operator.
2017
2018Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002019struct A {
2020 A &amp;operator=(const A &amp;);
2021 A &amp;operator=(A &amp;&amp;);
2022};
2023
2024cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2025the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002026</pre></td></tr>
2027
2028
Aaron Ballman672dde22016-01-22 23:15:00 +00002029<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002030<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2031
2032Given
2033 class A {
2034 public:
2035 virtual void x();
2036 };
2037 class B : public A {
2038 public:
2039 virtual void x();
2040 };
2041 matches B::x
2042</pre></td></tr>
2043
2044
Aaron Ballman672dde22016-01-22 23:15:00 +00002045<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002046<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2047
2048Given
2049 class A {
2050 public:
2051 virtual void x() = 0;
2052 };
2053 matches A::x
2054</pre></td></tr>
2055
2056
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002057<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2058<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2059
2060Given
2061 struct S {
2062 S(); #1
2063 S(const S &amp;) = default; #2
2064 S(S &amp;&amp;) = delete; #3
2065 };
2066cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2067</pre></td></tr>
2068
2069
Aaron Ballman672dde22016-01-22 23:15:00 +00002070<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002071<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2072
2073Given
2074 class A {
2075 public:
2076 virtual void x();
2077 };
2078 matches A::x
2079</pre></td></tr>
2080
Aaron Ballman672dde22016-01-22 23:15:00 +00002081
2082<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
Nico Webera415a1d2016-01-21 17:56:24 +00002083<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2084
2085Given
2086 class A {
2087 public:
2088 virtual void x();
2089 };
2090 class B : public A {
2091 public:
2092 void x();
2093 };
2094 matches A::x but not B::x
2095</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002096
Aaron Ballman672dde22016-01-22 23:15:00 +00002097
2098<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002099<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2100
2101Matches overloaded operator names specified in strings without the
2102"operator" prefix: e.g. "&lt;&lt;".
2103
2104Given:
2105 class A { int operator*(); };
2106 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2107 A a;
2108 a &lt;&lt; a; &lt;-- This matches
2109
2110cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2111specified line and
2112cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2113matches the declaration of A.
2114
Aaron Ballman672dde22016-01-22 23:15:00 +00002115Usable 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_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002116</pre></td></tr>
2117
2118
Aaron Ballman672dde22016-01-22 23:15:00 +00002119<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>std::string BaseName</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002120<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2121</pre></td></tr>
2122
2123
Aaron Ballman672dde22016-01-22 23:15:00 +00002124<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002125<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2126static member variable template instantiations.
2127
2128Given
2129 template&lt;typename T&gt; void A(T t) { }
2130 template&lt;&gt; void A(int N) { }
2131functionDecl(isExplicitTemplateSpecialization())
2132 matches the specialization A&lt;int&gt;().
2133
Aaron Ballman672dde22016-01-22 23:15:00 +00002134Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002135</pre></td></tr>
2136
2137
Aaron Ballman672dde22016-01-22 23:15:00 +00002138<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002139<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2140
2141Given:
2142 class A final {};
2143
2144 struct B {
2145 virtual void f();
2146 };
2147
2148 struct C : B {
2149 void f() final;
2150 };
2151matches A and C::f, but not B, C, or B::f
2152</pre></td></tr>
2153
2154
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002155<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2156<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2157
2158Given:
2159 auto x = []{};
2160
2161cxxRecordDecl(isLambda()) matches the implicit class declaration of
2162decltype(x)
2163</pre></td></tr>
2164
2165
Aaron Ballman672dde22016-01-22 23:15:00 +00002166<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>std::string BaseName</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002167<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2168isSameOrDerivedFrom(hasName(...)).
2169</pre></td></tr>
2170
2171
Aaron Ballman672dde22016-01-22 23:15:00 +00002172<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002173<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2174member variable template instantiations.
2175
2176Given
2177 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2178or
2179 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2180cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2181 matches the template instantiation of X&lt;A&gt;.
2182
2183But given
2184 template &lt;typename T&gt; class X {}; class A {};
2185 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2186cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2187 does not match, as X&lt;A&gt; is an explicit template specialization.
2188
Aaron Ballman672dde22016-01-22 23:15:00 +00002189Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002190</pre></td></tr>
2191
2192
Aaron Ballman672dde22016-01-22 23:15:00 +00002193<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002194<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2195a specific number of arguments (including absent default arguments).
2196
2197Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2198 void f(int x, int y);
2199 f(0, 0);
2200</pre></td></tr>
2201
2202
Etienne Bergeron75e52722016-05-13 19:36:55 +00002203<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2204<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2205
2206Example: matches the implicit cast around 0
2207(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2208 int *p = 0;
2209</pre></td></tr>
2210
2211
Aaron Ballman672dde22016-01-22 23:15:00 +00002212<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002213<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
2214
2215Example matches true (matcher = cxxBoolLiteral(equals(true)))
2216 true
2217
Aaron Ballman672dde22016-01-22 23:15:00 +00002218Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2219 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002220</pre></td></tr>
2221
2222
Aaron Ballman672dde22016-01-22 23:15:00 +00002223<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002224<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2225
2226Given
2227 template&lt;typename T&gt; struct C {};
2228 C&lt;int&gt; c;
2229classTemplateSpecializationDecl(templateArgumentCountIs(1))
2230 matches C&lt;int&gt;.
2231</pre></td></tr>
2232
2233
Aaron Ballman672dde22016-01-22 23:15:00 +00002234<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002235<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2236child statements.
2237
2238Example: Given
2239 { for (;;) {} }
2240compoundStmt(statementCountIs(0)))
2241 matches '{}'
2242 but does not match the outer compound statement.
2243</pre></td></tr>
2244
2245
Aaron Ballman672dde22016-01-22 23:15:00 +00002246<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>
Etienne Bergeron3588be72016-05-12 04:20:04 +00002247<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002248
2249Given
2250 int a[42];
2251 int b[2 * 21];
2252 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002253 char *s = "abcd";
2254 wchar_t *ws = L"abcd";
2255 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002256constantArrayType(hasSize(42))
2257 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002258stringLiteral(hasSize(4))
2259 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002260</pre></td></tr>
2261
2262
Aaron Ballman672dde22016-01-22 23:15:00 +00002263<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002264<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2265declarations.
2266
2267Example: Given
2268 int a, b;
2269 int c;
2270 int d = 2, e;
2271declCountIs(2)
2272 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2273</pre></td></tr>
2274
2275
Aaron Ballman672dde22016-01-22 23:15:00 +00002276<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002277<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2278
2279Matches a node if it equals the node previously bound to ID.
2280
2281Given
2282 class X { int a; int b; };
2283cxxRecordDecl(
2284 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2285 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2286 matches the class X, as a and b have the same type.
2287
2288Note that when multiple matches are involved via forEach* matchers,
2289equalsBoundNodes acts as a filter.
2290For example:
2291compoundStmt(
2292 forEachDescendant(varDecl().bind("d")),
2293 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2294will trigger a match for each combination of variable declaration
2295and reference to that variable declaration within a compound statement.
2296</pre></td></tr>
2297
2298
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002299<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>const Decl* Other</td></tr>
2300<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2301
2302Decl has pointer identity in the AST.
2303</pre></td></tr>
2304
2305
Aaron Ballman672dde22016-01-22 23:15:00 +00002306<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002307<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2308
2309Given
2310 __attribute__((device)) void f() { ... }
2311decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2312f. If the matcher is use from clang-query, attr::Kind parameter should be
2313passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2314</pre></td></tr>
2315
2316
Aaron Ballman672dde22016-01-22 23:15:00 +00002317<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002318<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2319partially matching a given regex.
2320
2321Example matches Y but not X
2322 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2323 #include "ASTMatcher.h"
2324 class X {};
2325ASTMatcher.h:
2326 class Y {};
2327
Aaron Ballman672dde22016-01-22 23:15:00 +00002328Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002329</pre></td></tr>
2330
2331
Aaron Ballman672dde22016-01-22 23:15:00 +00002332<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002333<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2334
2335Example matches X but not Y
2336 (matcher = cxxRecordDecl(isExpansionInMainFile())
2337 #include &lt;Y.h&gt;
2338 class X {};
2339Y.h:
2340 class Y {};
2341
Aaron Ballman672dde22016-01-22 23:15:00 +00002342Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002343</pre></td></tr>
2344
2345
Aaron Ballman672dde22016-01-22 23:15:00 +00002346<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002347<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2348
2349Example matches Y but not X
2350 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2351 #include &lt;SystemHeader.h&gt;
2352 class X {};
2353SystemHeader.h:
2354 class Y {};
2355
Aaron Ballman672dde22016-01-22 23:15:00 +00002356Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002357</pre></td></tr>
2358
2359
Aaron Ballman672dde22016-01-22 23:15:00 +00002360<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002361<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2362by the compiler (eg. implicit defaultcopy constructors).
2363</pre></td></tr>
2364
2365
Aaron Ballman672dde22016-01-22 23:15:00 +00002366<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002367<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2368
2369Given
2370 class C {
2371 public: int a;
2372 protected: int b;
2373 private: int c;
2374 };
2375fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002376 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002377</pre></td></tr>
2378
2379
Aaron Ballman672dde22016-01-22 23:15:00 +00002380<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002381<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2382
2383Given
2384 class C {
2385 public: int a;
2386 protected: int b;
2387 private: int c;
2388 };
2389fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002390 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002391</pre></td></tr>
2392
2393
Aaron Ballman672dde22016-01-22 23:15:00 +00002394<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002395<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2396
2397Given
2398 class C {
2399 public: int a;
2400 protected: int b;
2401 private: int c;
2402 };
2403fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002404 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002405</pre></td></tr>
2406
2407
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002408<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
2409<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2410a specific number of designators.
2411
2412Example: Given
2413 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2414 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2415designatorCountIs(2)
2416 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2417 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2418</pre></td></tr>
2419
2420
Aaron Ballman672dde22016-01-22 23:15:00 +00002421<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002422<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
2423
2424Example matches true (matcher = cxxBoolLiteral(equals(true)))
2425 true
2426
Aaron Ballman672dde22016-01-22 23:15:00 +00002427Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2428 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002429</pre></td></tr>
2430
2431
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002432<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2433<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2434
2435Given:
2436 void f();
2437 void g() noexcept;
2438 void h() noexcept(true);
2439 void i() noexcept(false);
2440 void j() throw();
2441 void k() throw(int);
2442 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002443functionDecl(hasDynamicExceptionSpec()) and
2444 functionProtoType(hasDynamicExceptionSpec())
2445 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002446</pre></td></tr>
2447
2448
Aaron Ballman672dde22016-01-22 23:15:00 +00002449<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002450<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2451
2452Matches overloaded operator names specified in strings without the
2453"operator" prefix: e.g. "&lt;&lt;".
2454
2455Given:
2456 class A { int operator*(); };
2457 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2458 A a;
2459 a &lt;&lt; a; &lt;-- This matches
2460
2461cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2462specified line and
2463cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2464matches the declaration of A.
2465
Aaron Ballman672dde22016-01-22 23:15:00 +00002466Usable 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_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002467</pre></td></tr>
2468
2469
Aaron Ballman672dde22016-01-22 23:15:00 +00002470<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002471<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2472
2473Given:
2474 constexpr int foo = 42;
2475 constexpr int bar();
2476varDecl(isConstexpr())
2477 matches the declaration of foo.
2478functionDecl(isConstexpr())
2479 matches the declaration of bar.
2480</pre></td></tr>
2481
2482
Aaron Ballman672dde22016-01-22 23:15:00 +00002483<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
Aaron Ballmanc35724c2016-01-21 15:18:25 +00002484<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2485
2486Given:
2487 class A { ~A(); };
2488 class B { ~B() = default; };
2489functionDecl(isDefaulted())
2490 matches the declaration of ~B, but not ~A.
2491</pre></td></tr>
2492
2493
Aaron Ballman672dde22016-01-22 23:15:00 +00002494<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002495<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2496
2497Example matches A, va, fa
2498 class A {};
2499 class B; Doesn't match, as it has no body.
2500 int va;
2501 extern int vb; Doesn't match, as it doesn't define the variable.
2502 void fa() {}
2503 void fb(); Doesn't match, as it has no body.
2504
Aaron Ballman672dde22016-01-22 23:15:00 +00002505Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002506</pre></td></tr>
2507
2508
Aaron Ballman672dde22016-01-22 23:15:00 +00002509<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002510<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2511
2512Given:
2513 void Func();
2514 void DeletedFunc() = delete;
2515functionDecl(isDeleted())
2516 matches the declaration of DeletedFunc, but not Func.
2517</pre></td></tr>
2518
2519
Aaron Ballman672dde22016-01-22 23:15:00 +00002520<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002521<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2522static member variable template instantiations.
2523
2524Given
2525 template&lt;typename T&gt; void A(T t) { }
2526 template&lt;&gt; void A(int N) { }
2527functionDecl(isExplicitTemplateSpecialization())
2528 matches the specialization A&lt;int&gt;().
2529
Aaron Ballman672dde22016-01-22 23:15:00 +00002530Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002531</pre></td></tr>
2532
2533
Aaron Ballman672dde22016-01-22 23:15:00 +00002534<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002535<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2536
2537Given:
2538 extern "C" void f() {}
2539 extern "C" { void g() {} }
2540 void h() {}
2541functionDecl(isExternC())
2542 matches the declaration of f and g, but not the declaration h
2543</pre></td></tr>
2544
2545
Aaron Ballman672dde22016-01-22 23:15:00 +00002546<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002547<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2548the inline keyword.
2549
2550Given
2551 inline void f();
2552 void g();
2553 namespace n {
2554 inline namespace m {}
2555 }
2556functionDecl(isInline()) will match ::f().
2557namespaceDecl(isInline()) will match n::m.
2558</pre></td></tr>
2559
2560
Aaron Ballman672dde22016-01-22 23:15:00 +00002561<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002562<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2563
2564Given:
2565 void f();
2566 void g() noexcept;
2567 void h() throw();
2568 void i() throw(int);
2569 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002570functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2571 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002572</pre></td></tr>
2573
2574
Aaron Ballman672dde22016-01-22 23:15:00 +00002575<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002576<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2577member variable template instantiations.
2578
2579Given
2580 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2581or
2582 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2583cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2584 matches the template instantiation of X&lt;A&gt;.
2585
2586But given
2587 template &lt;typename T&gt; class X {}; class A {};
2588 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2589cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2590 does not match, as X&lt;A&gt; is an explicit template specialization.
2591
Aaron Ballman672dde22016-01-22 23:15:00 +00002592Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002593</pre></td></tr>
2594
2595
Aaron Ballman672dde22016-01-22 23:15:00 +00002596<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002597<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2598
2599Example matches f, but not g or h. The function i will not match, even when
2600compiled in C mode.
2601 void f(...);
2602 void g(int);
2603 template &lt;typename... Ts&gt; void h(Ts...);
2604 void i();
2605</pre></td></tr>
2606
2607
Aaron Ballman672dde22016-01-22 23:15:00 +00002608<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>
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002609<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2610specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002611
2612Given
2613 void f(int i) {}
2614 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002615 void h(int i, int j);
2616 void j(int i);
2617 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002618functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002619 matches void g(int i, int j) {}
2620functionProtoType(parameterCountIs(2))
2621 matches void h(int i, int j)
2622functionProtoType(parameterCountIs(3))
2623 matches void k(int x, int y, int z, ...);
2624</pre></td></tr>
2625
2626
Aaron Ballman230ad972016-06-07 17:34:45 +00002627<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2628<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2629
2630Given:
2631 void f();
2632 void g() noexcept;
2633 void h() noexcept(true);
2634 void i() noexcept(false);
2635 void j() throw();
2636 void k() throw(int);
2637 void l() throw(...);
2638functionDecl(hasDynamicExceptionSpec()) and
2639 functionProtoType(hasDynamicExceptionSpec())
2640 match the declarations of j, k, and l, but not f, g, h, or i.
2641</pre></td></tr>
2642
2643
2644<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
2645<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2646
2647Given:
2648 void f();
2649 void g() noexcept;
2650 void h() throw();
2651 void i() throw(int);
2652 void j() noexcept(false);
2653functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2654 match the declarations of g, and h, but not f, i or j.
2655</pre></td></tr>
2656
2657
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002658<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
2659<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2660specific parameter count.
2661
2662Given
2663 void f(int i) {}
2664 void g(int i, int j) {}
2665 void h(int i, int j);
2666 void j(int i);
2667 void k(int x, int y, int z, ...);
2668functionDecl(parameterCountIs(2))
2669 matches void g(int i, int j) {}
2670functionProtoType(parameterCountIs(2))
2671 matches void h(int i, int j)
2672functionProtoType(parameterCountIs(3))
2673 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002674</pre></td></tr>
2675
2676
Aaron Ballman672dde22016-01-22 23:15:00 +00002677<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002678<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
2679
2680Example matches true (matcher = cxxBoolLiteral(equals(true)))
2681 true
2682
Aaron Ballman672dde22016-01-22 23:15:00 +00002683Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2684 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002685</pre></td></tr>
2686
2687
Aaron Ballman672dde22016-01-22 23:15:00 +00002688<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002689<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2690to '.'.
2691
2692Member calls on the implicit this pointer match as called with '-&gt;'.
2693
2694Given
2695 class Y {
2696 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2697 int a;
2698 static int b;
2699 };
2700memberExpr(isArrow())
2701 matches this-&gt;x, x, y.x, a, this-&gt;b
2702</pre></td></tr>
2703
2704
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002705<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002706<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2707
2708Supports specifying enclosing namespaces or classes by prefixing the name
2709with '&lt;enclosing&gt;::'.
2710Does not match typedefs of an underlying type with the given name.
2711
2712Example matches X (Name == "X")
2713 class X;
2714
2715Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2716 namespace a { namespace b { class X; } }
2717</pre></td></tr>
2718
2719
Aaron Ballman672dde22016-01-22 23:15:00 +00002720<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002721<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2722a substring matched by the given RegExp.
2723
2724Supports specifying enclosing namespaces or classes by
2725prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2726of an underlying type with the given name.
2727
2728Example matches X (regexp == "::X")
2729 class X;
2730
2731Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2732 namespace foo { namespace bar { class X; } }
2733</pre></td></tr>
2734
2735
Aaron Ballman672dde22016-01-22 23:15:00 +00002736<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002737<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2738
2739Given
2740 namespace n {
2741 namespace {} #1
2742 }
2743namespaceDecl(isAnonymous()) will match #1 but not ::n.
2744</pre></td></tr>
2745
2746
Aaron Ballman672dde22016-01-22 23:15:00 +00002747<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002748<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2749the inline keyword.
2750
2751Given
2752 inline void f();
2753 void g();
2754 namespace n {
2755 inline namespace m {}
2756 }
2757functionDecl(isInline()) will match ::f().
2758namespaceDecl(isInline()) will match n::m.
2759</pre></td></tr>
2760
2761
Aaron Ballman672dde22016-01-22 23:15:00 +00002762<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002763<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
2764a specific number of arguments (including absent default arguments).
2765
2766Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2767 void f(int x, int y);
2768 f(0, 0);
2769</pre></td></tr>
2770
2771
Aaron Ballman672dde22016-01-22 23:15:00 +00002772<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002773<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
2774
2775objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
2776message expression in
2777
2778 UIWebView *webView = ...;
2779 CGRect bodyFrame = webView.frame;
2780 bodyFrame.size.height = self.bodyContentHeight;
2781 webView.frame = bodyFrame;
2782 ^---- matches here
2783</pre></td></tr>
2784
2785
Aaron Ballman672dde22016-01-22 23:15:00 +00002786<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002787<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
2788
2789Matches only when the selector of the objCMessageExpr is NULL. This may
2790represent an error condition in the tree!
2791</pre></td></tr>
2792
2793
Aaron Ballman672dde22016-01-22 23:15:00 +00002794<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002795<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
2796
2797 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
2798 matches the outer message expr in the code below, but NOT the message
2799 invocation for self.bodyView.
2800 [self.bodyView loadHTMLString:html baseURL:NULL];
2801</pre></td></tr>
2802
2803
Aaron Ballman672dde22016-01-22 23:15:00 +00002804<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002805<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
2806
2807 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
2808 matches self.bodyView in the code below, but NOT the outer message
2809 invocation of "loadHTMLString:baseURL:".
2810 [self.bodyView loadHTMLString:html baseURL:NULL];
2811</pre></td></tr>
2812
2813
Aaron Ballman672dde22016-01-22 23:15:00 +00002814<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002815<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
2816a substring matched by the given RegExp.
2817 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
2818 invocation for self.bodyView.
2819 [self.bodyView loadHTMLString:html baseURL:NULL];
2820</pre></td></tr>
2821
2822
Aaron Ballman672dde22016-01-22 23:15:00 +00002823<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002824<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
2825
2826 matcher = objCMessageExpr(numSelectorArgs(0));
2827 matches self.bodyView in the code below
2828
2829 matcher = objCMessageExpr(numSelectorArgs(2));
2830 matches the invocation of "loadHTMLString:baseURL:" but not that
2831 of self.bodyView
2832 [self.bodyView loadHTMLString:html baseURL:NULL];
2833</pre></td></tr>
2834
2835
Aaron Ballman672dde22016-01-22 23:15:00 +00002836<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002837<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
2838
2839Given
2840 class Y { public: void x(); };
2841 void z() { Y* y; y-&gt;x(); }
2842cxxMemberCallExpr(on(hasType(asString("class Y *"))))
2843 matches y-&gt;x()
2844</pre></td></tr>
2845
2846
Aaron Ballman672dde22016-01-22 23:15:00 +00002847<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002848<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
2849
2850Matches a node if it equals the node previously bound to ID.
2851
2852Given
2853 class X { int a; int b; };
2854cxxRecordDecl(
2855 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2856 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2857 matches the class X, as a and b have the same type.
2858
2859Note that when multiple matches are involved via forEach* matchers,
2860equalsBoundNodes acts as a filter.
2861For example:
2862compoundStmt(
2863 forEachDescendant(varDecl().bind("d")),
2864 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2865will trigger a match for each combination of variable declaration
2866and reference to that variable declaration within a compound statement.
2867</pre></td></tr>
2868
2869
Aaron Ballman672dde22016-01-22 23:15:00 +00002870<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002871<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
2872the node, not hidden within a typedef.
2873
2874Given
2875 typedef const int const_int;
2876 const_int i;
2877 int *const j;
2878 int *volatile k;
2879 int m;
2880varDecl(hasType(hasLocalQualifiers())) matches only j and k.
2881i is const-qualified but the qualifier is not local.
2882</pre></td></tr>
2883
2884
Aaron Ballman672dde22016-01-22 23:15:00 +00002885<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
Samuel Benzaquen30747f72015-12-22 21:06:36 +00002886<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
2887
2888Given
2889 void a(char);
2890 void b(wchar_t);
2891 void c(double);
2892functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
2893matches "a(char)", "b(wchar_t)", but not "c(double)".
2894</pre></td></tr>
2895
2896
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002897<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002898<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
2899the Objective-C object pointer type, which is different despite being
2900syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002901
2902Given
2903 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002904
2905 @interface Foo
2906 @end
2907 Foo *f;
2908
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002909 int j;
2910varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002911 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002912</pre></td></tr>
2913
2914
Aaron Ballman672dde22016-01-22 23:15:00 +00002915<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002916<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2917include "top-level" const.
2918
2919Given
2920 void a(int);
2921 void b(int const);
2922 void c(const int);
2923 void d(const int*);
2924 void e(int const) {};
2925functionDecl(hasAnyParameter(hasType(isConstQualified())))
2926 matches "void b(int const)", "void c(const int)" and
2927 "void e(int const) {}". It does not match d as there
2928 is no top-level const on the parameter type "const int *".
2929</pre></td></tr>
2930
2931
Aaron Ballman672dde22016-01-22 23:15:00 +00002932<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002933<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2934
2935Given
2936 void a(int);
2937 void b(long);
2938 void c(double);
2939functionDecl(hasAnyParameter(hasType(isInteger())))
2940matches "a(int)", "b(long)", but not "c(double)".
2941</pre></td></tr>
2942
2943
Aaron Ballman672dde22016-01-22 23:15:00 +00002944<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
Aaron Ballman6290fc92015-11-23 17:09:24 +00002945<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
2946include "top-level" volatile.
2947
2948Given
2949 void a(int);
2950 void b(int volatile);
2951 void c(volatile int);
2952 void d(volatile int*);
2953 void e(int volatile) {};
2954functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
2955 matches "void b(int volatile)", "void c(volatile int)" and
2956 "void e(int volatile) {}". It does not match d as there
2957 is no top-level volatile on the parameter type "volatile int *".
2958</pre></td></tr>
2959
2960
Aaron Ballman672dde22016-01-22 23:15:00 +00002961<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002962<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
2963
2964Example matches C, but not S or U.
2965 struct S {};
2966 class C {};
2967 union U {};
2968</pre></td></tr>
2969
2970
Aaron Ballman672dde22016-01-22 23:15:00 +00002971<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002972<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
2973
2974Example matches S, but not C or U.
2975 struct S {};
2976 class C {};
2977 union U {};
2978</pre></td></tr>
2979
2980
Aaron Ballman672dde22016-01-22 23:15:00 +00002981<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002982<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
2983
2984Example matches U, but not C or S.
2985 struct S {};
2986 class C {};
2987 union U {};
2988</pre></td></tr>
2989
2990
Aaron Ballman672dde22016-01-22 23:15:00 +00002991<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002992<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2993
2994Matches a node if it equals the node previously bound to ID.
2995
2996Given
2997 class X { int a; int b; };
2998cxxRecordDecl(
2999 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3000 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3001 matches the class X, as a and b have the same type.
3002
3003Note that when multiple matches are involved via forEach* matchers,
3004equalsBoundNodes acts as a filter.
3005For example:
3006compoundStmt(
3007 forEachDescendant(varDecl().bind("d")),
3008 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3009will trigger a match for each combination of variable declaration
3010and reference to that variable declaration within a compound statement.
3011</pre></td></tr>
3012
3013
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003014<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>const Stmt* Other</td></tr>
3015<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3016
3017Stmt has pointer identity in the AST.
3018</pre></td></tr>
3019
3020
Aaron Ballman672dde22016-01-22 23:15:00 +00003021<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003022<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3023partially matching a given regex.
3024
3025Example matches Y but not X
3026 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3027 #include "ASTMatcher.h"
3028 class X {};
3029ASTMatcher.h:
3030 class Y {};
3031
Aaron Ballman672dde22016-01-22 23:15:00 +00003032Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003033</pre></td></tr>
3034
3035
Aaron Ballman672dde22016-01-22 23:15:00 +00003036<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003037<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3038
3039Example matches X but not Y
3040 (matcher = cxxRecordDecl(isExpansionInMainFile())
3041 #include &lt;Y.h&gt;
3042 class X {};
3043Y.h:
3044 class Y {};
3045
Aaron Ballman672dde22016-01-22 23:15:00 +00003046Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003047</pre></td></tr>
3048
3049
Aaron Ballman672dde22016-01-22 23:15:00 +00003050<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003051<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3052
3053Example matches Y but not X
3054 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3055 #include &lt;SystemHeader.h&gt;
3056 class X {};
3057SystemHeader.h:
3058 class Y {};
3059
Aaron Ballman672dde22016-01-22 23:15:00 +00003060Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003061</pre></td></tr>
3062
3063
Etienne Bergeron3588be72016-05-12 04:20:04 +00003064<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
3065<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3066
3067Given
3068 int a[42];
3069 int b[2 * 21];
3070 int c[41], d[43];
3071 char *s = "abcd";
3072 wchar_t *ws = L"abcd";
3073 char *w = "a";
3074constantArrayType(hasSize(42))
3075 matches "int a[42]" and "int b[2 * 21]"
3076stringLiteral(hasSize(4))
3077 matches "abcd", L"abcd"
3078</pre></td></tr>
3079
3080
Aaron Ballman672dde22016-01-22 23:15:00 +00003081<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003082<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3083
3084Example matches A, va, fa
3085 class A {};
3086 class B; Doesn't match, as it has no body.
3087 int va;
3088 extern int vb; Doesn't match, as it doesn't define the variable.
3089 void fa() {}
3090 void fb(); Doesn't match, as it has no body.
3091
Aaron Ballman672dde22016-01-22 23:15:00 +00003092Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003093</pre></td></tr>
3094
3095
Aaron Ballman672dde22016-01-22 23:15:00 +00003096<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003097<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3098
3099Note that 'Value' is a string as the template argument's value is
3100an arbitrary precision integer. 'Value' must be euqal to the canonical
3101representation of that integral value in base 10.
3102
3103Given
3104 template&lt;int T&gt; struct A {};
3105 C&lt;42&gt; c;
3106classTemplateSpecializationDecl(
3107 hasAnyTemplateArgument(equalsIntegralValue("42")))
3108 matches the implicit instantiation of C in C&lt;42&gt;.
3109</pre></td></tr>
3110
3111
Aaron Ballman672dde22016-01-22 23:15:00 +00003112<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003113<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3114
3115Given
3116 template&lt;int T&gt; struct A {};
3117 C&lt;42&gt; c;
3118classTemplateSpecializationDecl(
3119 hasAnyTemplateArgument(isIntegral()))
3120 matches the implicit instantiation of C in C&lt;42&gt;
3121 with isIntegral() matching 42.
3122</pre></td></tr>
3123
3124
Aaron Ballman672dde22016-01-22 23:15:00 +00003125<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003126<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3127
3128Given
3129 template&lt;typename T&gt; struct C {};
3130 C&lt;int&gt; c;
3131classTemplateSpecializationDecl(templateArgumentCountIs(1))
3132 matches C&lt;int&gt;.
3133</pre></td></tr>
3134
3135
Aaron Ballman672dde22016-01-22 23:15:00 +00003136<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003137<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3138partially matching a given regex.
3139
3140Example matches Y but not X
3141 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3142 #include "ASTMatcher.h"
3143 class X {};
3144ASTMatcher.h:
3145 class Y {};
3146
Aaron Ballman672dde22016-01-22 23:15:00 +00003147Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003148</pre></td></tr>
3149
3150
Aaron Ballman672dde22016-01-22 23:15:00 +00003151<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003152<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3153
3154Example matches X but not Y
3155 (matcher = cxxRecordDecl(isExpansionInMainFile())
3156 #include &lt;Y.h&gt;
3157 class X {};
3158Y.h:
3159 class Y {};
3160
Aaron Ballman672dde22016-01-22 23:15:00 +00003161Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003162</pre></td></tr>
3163
3164
Aaron Ballman672dde22016-01-22 23:15:00 +00003165<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003166<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3167
3168Example matches Y but not X
3169 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3170 #include &lt;SystemHeader.h&gt;
3171 class X {};
3172SystemHeader.h:
3173 class Y {};
3174
Aaron Ballman672dde22016-01-22 23:15:00 +00003175Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003176</pre></td></tr>
3177
3178
Aaron Ballman672dde22016-01-22 23:15:00 +00003179<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
Samuel Benzaquen30747f72015-12-22 21:06:36 +00003180<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3181
3182Given
3183 struct S { bool func(); };
3184functionDecl(returns(booleanType()))
3185 matches "bool func();"
3186</pre></td></tr>
3187
3188
Aaron Ballman672dde22016-01-22 23:15:00 +00003189<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003190<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3191
3192Matches a node if it equals the node previously bound to ID.
3193
3194Given
3195 class X { int a; int b; };
3196cxxRecordDecl(
3197 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3198 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3199 matches the class X, as a and b have the same type.
3200
3201Note that when multiple matches are involved via forEach* matchers,
3202equalsBoundNodes acts as a filter.
3203For example:
3204compoundStmt(
3205 forEachDescendant(varDecl().bind("d")),
3206 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3207will trigger a match for each combination of variable declaration
3208and reference to that variable declaration within a compound statement.
3209</pre></td></tr>
3210
3211
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003212<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
3213<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3214
3215Type has pointer identity in the AST.
3216</pre></td></tr>
3217
3218
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003219<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
3220<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3221
3222Given
3223 int i;
3224 float f;
3225realFloatingPointType()
3226 matches "float f" but not "int i"
3227</pre></td></tr>
3228
3229
Aaron Ballman672dde22016-01-22 23:15:00 +00003230<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003231<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3232
3233Given
3234 struct S { void func(); };
3235functionDecl(returns(voidType()))
3236 matches "void func();"
3237</pre></td></tr>
3238
3239
Aaron Ballman672dde22016-01-22 23:15:00 +00003240<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003241<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3242
3243Given
3244 int x;
3245 int s = sizeof(x) + alignof(x)
3246unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3247 matches sizeof(x)
3248</pre></td></tr>
3249
3250
Aaron Ballman672dde22016-01-22 23:15:00 +00003251<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003252<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3253unary).
3254
3255Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3256 !(a || b)
3257</pre></td></tr>
3258
3259
Aaron Ballman672dde22016-01-22 23:15:00 +00003260<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003261<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3262
3263Example matches x, but not y, z, or a.
3264(matcher = varDecl(hasAutomaticStorageDuration())
3265void f() {
3266 int x;
3267 static int y;
3268 thread_local int z;
3269}
3270int a;
3271</pre></td></tr>
3272
3273
Aaron Ballman672dde22016-01-22 23:15:00 +00003274<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003275<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3276
3277Example matches y and z (matcher = varDecl(hasGlobalStorage())
3278void f() {
3279 int x;
3280 static int y;
3281}
3282int z;
3283</pre></td></tr>
3284
3285
Aaron Ballman672dde22016-01-22 23:15:00 +00003286<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003287<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3288non-static local variable.
3289
3290Example matches x (matcher = varDecl(hasLocalStorage())
3291void f() {
3292 int x;
3293 static int y;
3294}
3295int z;
3296</pre></td></tr>
3297
3298
Aaron Ballman672dde22016-01-22 23:15:00 +00003299<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003300<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
3301
3302Example matches y and a, but not x or z.
3303(matcher = varDecl(hasStaticStorageDuration())
3304void f() {
3305 int x;
3306 static int y;
3307 thread_local int z;
3308}
3309int a;
3310</pre></td></tr>
3311
3312
Aaron Ballman672dde22016-01-22 23:15:00 +00003313<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003314<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3315
3316Example matches z, but not x, z, or a.
3317(matcher = varDecl(hasThreadStorageDuration())
3318void f() {
3319 int x;
3320 static int y;
3321 thread_local int z;
3322}
3323int a;
3324</pre></td></tr>
3325
3326
Aaron Ballman672dde22016-01-22 23:15:00 +00003327<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003328<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3329
3330Given:
3331 constexpr int foo = 42;
3332 constexpr int bar();
3333varDecl(isConstexpr())
3334 matches the declaration of foo.
3335functionDecl(isConstexpr())
3336 matches the declaration of bar.
3337</pre></td></tr>
3338
3339
Aaron Ballman672dde22016-01-22 23:15:00 +00003340<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003341<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3342
3343Example matches A, va, fa
3344 class A {};
3345 class B; Doesn't match, as it has no body.
3346 int va;
3347 extern int vb; Doesn't match, as it doesn't define the variable.
3348 void fa() {}
3349 void fb(); Doesn't match, as it has no body.
3350
Aaron Ballman672dde22016-01-22 23:15:00 +00003351Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003352</pre></td></tr>
3353
3354
Aaron Ballman672dde22016-01-22 23:15:00 +00003355<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003356<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3357a C++ catch block, or an Objective-C statement.
3358
3359Example matches x (matcher = varDecl(isExceptionVariable())
3360void f(int y) {
3361 try {
3362 } catch (int x) {
3363 }
3364}
3365</pre></td></tr>
3366
3367
Aaron Ballman672dde22016-01-22 23:15:00 +00003368<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003369<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3370static member variable template instantiations.
3371
3372Given
3373 template&lt;typename T&gt; void A(T t) { }
3374 template&lt;&gt; void A(int N) { }
3375functionDecl(isExplicitTemplateSpecialization())
3376 matches the specialization A&lt;int&gt;().
3377
Aaron Ballman672dde22016-01-22 23:15:00 +00003378Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003379</pre></td></tr>
3380
3381
Aaron Ballman672dde22016-01-22 23:15:00 +00003382<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003383<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3384member variable template instantiations.
3385
3386Given
3387 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3388or
3389 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3390cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3391 matches the template instantiation of X&lt;A&gt;.
3392
3393But given
3394 template &lt;typename T&gt; class X {}; class A {};
3395 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3396cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3397 does not match, as X&lt;A&gt; is an explicit template specialization.
3398
Aaron Ballman672dde22016-01-22 23:15:00 +00003399Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003400</pre></td></tr>
3401
3402
Aaron Ballman672dde22016-01-22 23:15:00 +00003403<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003404<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3405template instantiations.
3406
3407Given
3408 template&lt;typename T&gt; void A(T t) { T i; }
3409 A(0);
3410 A(0U);
3411functionDecl(isInstantiated())
3412 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3413</pre></td></tr>
3414
3415
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003416<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3417<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3418GNU's __null, C++11's nullptr, or C's NULL macro.
3419
3420Given:
3421 void *v1 = NULL;
3422 void *v2 = nullptr;
3423 void *v3 = __null; GNU extension
3424 char *cp = (char *)0;
3425 int *ip = 0;
3426 int i = 0;
3427expr(nullPointerConstant())
3428 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3429 initializer for i.
3430</pre></td></tr>
3431
3432
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003433<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
3434<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3435
3436This matcher is only provided as a performance optimization of hasName.
3437 hasAnyName(a, b, c)
3438 is equivalent to, but faster than
3439 anyOf(hasName(a), hasName(b), hasName(c))
3440</pre></td></tr>
3441
3442
Aaron Ballman672dde22016-01-22 23:15:00 +00003443<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003444<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3445
3446Given
3447 int j;
3448 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3449 A(0);
3450 A(0U);
3451declStmt(isInTemplateInstantiation())
3452 matches 'int i;' and 'unsigned i'.
3453unless(stmt(isInTemplateInstantiation()))
3454 will NOT match j += 42; as it's shared between the template definition and
3455 instantiation.
3456</pre></td></tr>
3457
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003458<!--END_NARROWING_MATCHERS -->
3459</table>
3460
3461<!-- ======================================================================= -->
3462<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3463<!-- ======================================================================= -->
3464
3465<p>Traversal matchers specify the relationship to other nodes that are
3466reachable from the current node.</p>
3467
3468<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3469forEachDescendant) which work on all nodes and allow users to write more generic
3470match expressions.</p>
3471
3472<table>
3473<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003474<!-- START_TRAVERSAL_MATCHERS -->
3475
3476<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
3477<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3478
3479Unlike anyOf, eachOf will generate a match result for each
3480matching submatcher.
3481
3482For example, in:
3483 class A { int a; int b; };
3484The matcher:
3485 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3486 has(fieldDecl(hasName("b")).bind("v"))))
3487will generate two results binding "v", the first of which binds
3488the field declaration of a, the second the field declaration of
3489b.
3490
3491Usable as: Any Matcher
3492</pre></td></tr>
3493
3494
3495<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3496<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3497provided matcher.
3498
3499Example matches X, A, B, C
3500 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3501 class X {}; Matches X, because X::X is a class of name X inside X.
3502 class A { class X {}; };
3503 class B { class C { class X {}; }; };
3504
3505DescendantT must be an AST base type.
3506
3507As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3508each result that matches instead of only on the first one.
3509
3510Note: Recursively combined ForEachDescendant can cause many matches:
3511 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3512 forEachDescendant(cxxRecordDecl())
3513 )))
3514will match 10 times (plus injected class name matches) on:
3515 class A { class B { class C { class D { class E {}; }; }; }; };
3516
3517Usable as: Any Matcher
3518</pre></td></tr>
3519
3520
3521<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3522<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3523provided matcher.
3524
3525Example matches X, Y
3526 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3527 class X {}; Matches X, because X::X is a class of name X inside X.
3528 class Y { class X {}; };
3529 class Z { class Y { class X {}; }; }; Does not match Z.
3530
3531ChildT must be an AST base type.
3532
3533As opposed to 'has', 'forEach' will cause a match for each result that
3534matches instead of only on the first one.
3535
3536Usable as: Any Matcher
3537</pre></td></tr>
3538
3539
3540<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3541<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3542matcher.
3543
3544Given
3545void f() { if (true) { int x = 42; } }
3546void g() { for (;;) { int x = 43; } }
3547expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3548
3549Usable as: Any Matcher
3550</pre></td></tr>
3551
3552
3553<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3554<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3555provided matcher.
3556
3557Example matches X, Y, Z
3558 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3559 class X {}; Matches X, because X::X is a class of name X inside X.
3560 class Y { class X {}; };
3561 class Z { class Y { class X {}; }; };
3562
3563DescendantT must be an AST base type.
3564
3565Usable as: Any Matcher
3566</pre></td></tr>
3567
3568
3569<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3570<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3571provided matcher.
3572
3573Example matches X, Y
3574 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3575 class X {}; Matches X, because X::X is a class of name X inside X.
3576 class Y { class X {}; };
3577 class Z { class Y { class X {}; }; }; Does not match Z.
3578
3579ChildT must be an AST base type.
3580
3581Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003582Note that has is direct matcher, so it also matches things like implicit
3583casts and paren casts. If you are matching with expr then you should
3584probably consider using ignoringParenImpCasts like:
3585has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003586</pre></td></tr>
3587
3588
3589<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3590<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3591matcher.
3592
3593Given
3594void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3595compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3596
3597Usable as: Any Matcher
3598</pre></td></tr>
3599
3600
Etienne Bergeron5500f952016-05-30 15:25:25 +00003601<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3602<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3603switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003604
3605Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3606 if (true) {}
3607</pre></td></tr>
3608
3609
3610<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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>
3611<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3612(binary or ternary).
3613
3614Example matches b
3615 condition ? a : b
3616 condition ?: b
3617</pre></td></tr>
3618
3619
3620<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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>
3621<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3622
3623Example 1 (conditional ternary operator): matches a
3624 condition ? a : b
3625
3626Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3627 condition ?: b
3628</pre></td></tr>
3629
3630
3631<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3632<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3633matches the given matcher.
3634
3635The associated declaration is:
3636- for type nodes, the declaration of the underlying type
3637- for CallExpr, the declaration of the callee
3638- for MemberExpr, the declaration of the referenced member
3639- for CXXConstructExpr, the declaration of the constructor
3640
3641Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3642function. e.g. various subtypes of clang::Type and various expressions.
3643
3644Usable as: 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;,
3645 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3646 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
3647 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3648 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3649 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3650</pre></td></tr>
3651
3652
Aaron Ballman672dde22016-01-22 23:15:00 +00003653<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003654<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3655
3656Given
3657 int i[5];
3658 void f() { i[1] = 42; }
3659arraySubscriptExpression(hasBase(implicitCastExpr(
3660 hasSourceExpression(declRefExpr()))))
3661 matches i[1] with the declRefExpr() matching i
3662</pre></td></tr>
3663
3664
Aaron Ballman672dde22016-01-22 23:15:00 +00003665<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003666<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3667
3668Given
3669 int i[5];
3670 void f() { i[1] = 42; }
3671arraySubscriptExpression(hasIndex(integerLiteral()))
3672 matches i[1] with the integerLiteral() matching 1
3673</pre></td></tr>
3674
3675
Aaron Ballman672dde22016-01-22 23:15:00 +00003676<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003677<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
3678
3679Example matches a (matcher = binaryOperator(hasLHS()))
3680 a || b
3681</pre></td></tr>
3682
3683
Aaron Ballman672dde22016-01-22 23:15:00 +00003684<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003685<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
3686
3687Example matches b (matcher = binaryOperator(hasRHS()))
3688 a || b
3689</pre></td></tr>
3690
3691
Aaron Ballman672dde22016-01-22 23:15:00 +00003692<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003693<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
3694type.
3695
3696Given
3697 struct A {};
3698 A a[7];
3699 int b[7];
3700arrayType(hasElementType(builtinType()))
3701 matches "int b[7]"
3702
Aaron Ballman672dde22016-01-22 23:15:00 +00003703Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003704</pre></td></tr>
3705
3706
Aaron Ballman672dde22016-01-22 23:15:00 +00003707<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003708<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
3709type.
3710
3711Given
3712 struct A {};
3713 A a[7];
3714 int b[7];
3715arrayType(hasElementType(builtinType()))
3716 matches "int b[7]"
3717
Aaron Ballman672dde22016-01-22 23:15:00 +00003718Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003719</pre></td></tr>
3720
3721
Aaron Ballman672dde22016-01-22 23:15:00 +00003722<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003723<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
3724
3725Given
3726 _Atomic(int) i;
3727 _Atomic(float) f;
3728atomicType(hasValueType(isInteger()))
3729 matches "_Atomic(int) i"
3730
Aaron Ballman672dde22016-01-22 23:15:00 +00003731Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003732</pre></td></tr>
3733
3734
Aaron Ballman672dde22016-01-22 23:15:00 +00003735<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003736<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
3737
3738Given
3739 _Atomic(int) i;
3740 _Atomic(float) f;
3741atomicType(hasValueType(isInteger()))
3742 matches "_Atomic(int) i"
3743
Aaron Ballman672dde22016-01-22 23:15:00 +00003744Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003745</pre></td></tr>
3746
3747
Aaron Ballman672dde22016-01-22 23:15:00 +00003748<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003749<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
3750
3751Note: There is no TypeLoc for the deduced type and thus no
3752getDeducedLoc() matcher.
3753
3754Given
3755 auto a = 1;
3756 auto b = 2.0;
3757autoType(hasDeducedType(isInteger()))
3758 matches "auto a"
3759
Aaron Ballman672dde22016-01-22 23:15:00 +00003760Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003761</pre></td></tr>
3762
3763
Aaron Ballman672dde22016-01-22 23:15:00 +00003764<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003765<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
3766binary operator matches.
3767</pre></td></tr>
3768
3769
Aaron Ballman672dde22016-01-22 23:15:00 +00003770<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003771<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
3772
3773Example matches a (matcher = binaryOperator(hasLHS()))
3774 a || b
3775</pre></td></tr>
3776
3777
Aaron Ballman672dde22016-01-22 23:15:00 +00003778<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003779<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
3780
3781Example matches b (matcher = binaryOperator(hasRHS()))
3782 a || b
3783</pre></td></tr>
3784
3785
Aaron Ballman672dde22016-01-22 23:15:00 +00003786<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003787<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3788pointee matches a given matcher.
3789
3790Given
3791 int *a;
3792 int const *b;
3793 float const *f;
3794pointerType(pointee(isConstQualified(), isInteger()))
3795 matches "int const *b"
3796
Aaron Ballman672dde22016-01-22 23:15:00 +00003797Usable 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;,
3798 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003799</pre></td></tr>
3800
3801
Aaron Ballman672dde22016-01-22 23:15:00 +00003802<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003803<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3804pointee matches a given matcher.
3805
3806Given
3807 int *a;
3808 int const *b;
3809 float const *f;
3810pointerType(pointee(isConstQualified(), isInteger()))
3811 matches "int const *b"
3812
Aaron Ballman672dde22016-01-22 23:15:00 +00003813Usable 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;,
3814 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003815</pre></td></tr>
3816
3817
Aaron Ballman672dde22016-01-22 23:15:00 +00003818<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
Aaron Ballmand7b18b92016-01-18 20:28:57 +00003819<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
3820
3821Given
3822 void f(int i);
3823 int y;
3824 f(y);
3825callExpr(declRefExpr(to(varDecl(hasName("y")))),
3826parmVarDecl(hasType(isInteger())))
3827 matches f(y);
3828with declRefExpr(...)
3829 matching int y
3830and parmVarDecl(...)
3831 matching int i
3832</pre></td></tr>
3833
3834
Aaron Ballman672dde22016-01-22 23:15:00 +00003835<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003836<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
3837expression.
3838
3839Given
3840 void x(int, int, int) { int y; x(1, y, 42); }
3841callExpr(hasAnyArgument(declRefExpr()))
3842 matches x(1, y, 42)
3843with hasAnyArgument(...)
3844 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003845</pre></td></tr>
3846
3847
Aaron Ballman672dde22016-01-22 23:15:00 +00003848<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003849<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
3850call expression.
3851
3852Example matches y in x(y)
3853 (matcher = callExpr(hasArgument(0, declRefExpr())))
3854 void x(int) { int y; x(y); }
3855</pre></td></tr>
3856
3857
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003858<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3859<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003860matches the given matcher.
3861
3862The associated declaration is:
3863- for type nodes, the declaration of the underlying type
3864- for CallExpr, the declaration of the callee
3865- for MemberExpr, the declaration of the referenced member
3866- for CXXConstructExpr, the declaration of the constructor
3867
3868Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3869function. e.g. various subtypes of clang::Type and various expressions.
3870
Aaron Ballman672dde22016-01-22 23:15:00 +00003871Usable as: 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;,
3872 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003873 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
3874 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00003875 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3876 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003877</pre></td></tr>
3878
3879
Aaron Ballman672dde22016-01-22 23:15:00 +00003880<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003881<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
3882
3883Given
3884 class A { A() : i(42), j(42) {} int i; int j; };
3885cxxConstructorDecl(forEachConstructorInitializer(
3886 forField(decl().bind("x"))
3887))
3888 will trigger two matches, binding for 'i' and 'j' respectively.
3889</pre></td></tr>
3890
3891
Aaron Ballman672dde22016-01-22 23:15:00 +00003892<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003893<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
3894
3895Given
3896 struct Foo {
3897 Foo() : foo_(1) { }
3898 int foo_;
3899 };
3900cxxRecordDecl(has(cxxConstructorDecl(
3901 hasAnyConstructorInitializer(anything())
3902)))
3903 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
3904</pre></td></tr>
3905
3906
Aaron Ballman672dde22016-01-22 23:15:00 +00003907<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003908<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
3909
3910Given
3911 struct Foo {
3912 Foo() : foo_(1) { }
3913 int foo_;
3914 };
3915cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
3916 forField(hasName("foo_"))))))
3917 matches Foo
3918with forField matching foo_
3919</pre></td></tr>
3920
3921
Aaron Ballman672dde22016-01-22 23:15:00 +00003922<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003923<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
3924
3925Given
3926 struct Foo {
3927 Foo() : foo_(1) { }
3928 int foo_;
3929 };
3930cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
3931 withInitializer(integerLiteral(equals(1)))))))
3932 matches Foo
3933with withInitializer matching (1)
3934</pre></td></tr>
3935
3936
Aaron Ballman672dde22016-01-22 23:15:00 +00003937<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00003938<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
3939definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003940
3941Given
3942 for (;;) {}
3943hasBody(compoundStmt())
3944 matches 'for (;;) {}'
3945with compoundStmt()
3946 matching '{}'
3947</pre></td></tr>
3948
3949
Aaron Ballman672dde22016-01-22 23:15:00 +00003950<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003951<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
3952
3953Example:
3954 forStmt(hasLoopVariable(anything()))
3955matches 'int x' in
3956 for (int x : a) { }
3957</pre></td></tr>
3958
3959
Aaron Ballman672dde22016-01-22 23:15:00 +00003960<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003961<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
3962
3963Example:
3964 forStmt(hasRangeInit(anything()))
3965matches 'a' in
3966 for (int x : a) { }
3967</pre></td></tr>
3968
3969
Aaron Ballman672dde22016-01-22 23:15:00 +00003970<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003971<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
3972
3973
Aaron Ballman672dde22016-01-22 23:15:00 +00003974<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003975<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
3976
3977Example matches y.x()
3978 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
3979 class Y { public: void x(); };
3980 void z() { Y y; y.x(); }",
3981
3982FIXME: Overload to allow directly matching types?
3983</pre></td></tr>
3984
3985
Aaron Ballman672dde22016-01-22 23:15:00 +00003986<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003987<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
3988</pre></td></tr>
3989
3990
Aaron Ballman672dde22016-01-22 23:15:00 +00003991<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003992<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
3993matcher, or is a pointer to a type that matches the InnerMatcher.
3994</pre></td></tr>
3995
3996
Clement Courbet6ecaec82016-07-05 07:49:31 +00003997<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
3998<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may
3999produce multiple matches.
4000
4001Given
4002 class A { virtual void f(); };
4003 class B : public A { void f(); };
4004 class C : public B { void f(); };
4005cxxMethodDecl(ofClass(hasName("C")),
4006 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4007 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4008 that B::f is not overridden by C::f).
4009
4010The check can produce multiple matches in case of multiple inheritance, e.g.
4011 class A1 { virtual void f(); };
4012 class A2 { virtual void f(); };
4013 class C : public A1, public A2 { void f(); };
4014cxxMethodDecl(ofClass(hasName("C")),
4015 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4016 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4017 once with "b" binding "A2::f" and "d" binding "C::f".
4018</pre></td></tr>
4019
4020
Aaron Ballman672dde22016-01-22 23:15:00 +00004021<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004022<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4023belongs to.
4024
4025FIXME: Generalize this for other kinds of declarations.
4026FIXME: What other kind of declarations would we need to generalize
4027this to?
4028
4029Example matches A() in the last line
4030 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4031 ofClass(hasName("A"))))))
4032 class A {
4033 public:
4034 A();
4035 };
4036 A a = A();
4037</pre></td></tr>
4038
4039
Aaron Ballman672dde22016-01-22 23:15:00 +00004040<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004041<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4042
4043Given:
4044 class A { void func(); };
4045 class B { void member(); };
4046
4047cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4048A but not B.
4049</pre></td></tr>
4050
4051
Aaron Ballman672dde22016-01-22 23:15:00 +00004052<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004053<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4054a class matching Base.
4055
4056Note that a class is not considered to be derived from itself.
4057
4058Example matches Y, Z, C (Base == hasName("X"))
4059 class X;
4060 class Y : public X {}; directly derived
4061 class Z : public Y {}; indirectly derived
4062 typedef X A;
4063 typedef A B;
4064 class C : public B {}; derived from a typedef of X
4065
4066In the following example, Bar matches isDerivedFrom(hasName("X")):
4067 class Foo;
4068 typedef Foo X;
4069 class Bar : public Foo {}; derived from a type that X is a typedef of
4070</pre></td></tr>
4071
4072
Aaron Ballman672dde22016-01-22 23:15:00 +00004073<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004074<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4075match Base.
4076</pre></td></tr>
4077
4078
Aaron Ballman672dde22016-01-22 23:15:00 +00004079<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004080<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4081given matcher.
4082
4083Example matches y.x() (matcher = callExpr(callee(
4084 cxxMethodDecl(hasName("x")))))
4085 class Y { public: void x(); };
4086 void z() { Y y; y.x(); }
4087</pre></td></tr>
4088
4089
Aaron Ballman672dde22016-01-22 23:15:00 +00004090<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004091<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4092
4093Given
4094 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4095 void f() { f(); }
4096callExpr(callee(expr()))
4097 matches this-&gt;x(), x(), y.x(), f()
4098with callee(...)
4099 matching this-&gt;x, x, y.x, f respectively
4100
Aaron Ballman672dde22016-01-22 23:15:00 +00004101Note: Callee cannot take the more general internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004102because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004103internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004104implemented in terms of implicit casts.
4105</pre></td></tr>
4106
4107
Aaron Ballman672dde22016-01-22 23:15:00 +00004108<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004109<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4110
4111Given
4112 void f(int i);
4113 int y;
4114 f(y);
4115callExpr(declRefExpr(to(varDecl(hasName("y")))),
4116parmVarDecl(hasType(isInteger())))
4117 matches f(y);
4118with declRefExpr(...)
4119 matching int y
4120and parmVarDecl(...)
4121 matching int i
4122</pre></td></tr>
4123
4124
Aaron Ballman672dde22016-01-22 23:15:00 +00004125<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004126<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4127expression.
4128
4129Given
4130 void x(int, int, int) { int y; x(1, y, 42); }
4131callExpr(hasAnyArgument(declRefExpr()))
4132 matches x(1, y, 42)
4133with hasAnyArgument(...)
4134 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004135</pre></td></tr>
4136
4137
Aaron Ballman672dde22016-01-22 23:15:00 +00004138<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004139<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4140call expression.
4141
4142Example matches y in x(y)
4143 (matcher = callExpr(hasArgument(0, declRefExpr())))
4144 void x(int) { int y; x(y); }
4145</pre></td></tr>
4146
4147
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004148<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4149<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004150matches the given matcher.
4151
4152The associated declaration is:
4153- for type nodes, the declaration of the underlying type
4154- for CallExpr, the declaration of the callee
4155- for MemberExpr, the declaration of the referenced member
4156- for CXXConstructExpr, the declaration of the constructor
4157
4158Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4159function. e.g. various subtypes of clang::Type and various expressions.
4160
Aaron Ballman672dde22016-01-22 23:15:00 +00004161Usable as: 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;,
4162 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004163 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4164 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00004165 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4166 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004167</pre></td></tr>
4168
4169
Aaron Ballman672dde22016-01-22 23:15:00 +00004170<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004171<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4172extension, matches the constant given in the statement.
4173
4174Given
4175 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4176caseStmt(hasCaseConstant(integerLiteral()))
4177 matches "case 1:"
4178</pre></td></tr>
4179
4180
Aaron Ballman672dde22016-01-22 23:15:00 +00004181<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>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004182<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004183
4184
Aaron Ballman672dde22016-01-22 23:15:00 +00004185<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004186<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
4187TemplateArgument matching the given InnerMatcher.
4188
4189Given
4190 template&lt;typename T&gt; class A {};
4191 template&lt;&gt; class A&lt;double&gt; {};
4192 A&lt;int&gt; a;
4193classTemplateSpecializationDecl(hasAnyTemplateArgument(
4194 refersToType(asString("int"))))
4195 matches the specialization A&lt;int&gt;
4196</pre></td></tr>
4197
4198
Aaron Ballman672dde22016-01-22 23:15:00 +00004199<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004200<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
4201matches the given InnerMatcher.
4202
4203Given
4204 template&lt;typename T, typename U&gt; class A {};
4205 A&lt;bool, int&gt; b;
4206 A&lt;int, bool&gt; c;
4207classTemplateSpecializationDecl(hasTemplateArgument(
4208 1, refersToType(asString("int"))))
4209 matches the specialization A&lt;bool, int&gt;
4210</pre></td></tr>
4211
4212
Aaron Ballman672dde22016-01-22 23:15:00 +00004213<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004214<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4215type.
4216
4217Given
4218 struct A {};
4219 A a[7];
4220 int b[7];
4221arrayType(hasElementType(builtinType()))
4222 matches "int b[7]"
4223
Aaron Ballman672dde22016-01-22 23:15:00 +00004224Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004225</pre></td></tr>
4226
4227
Aaron Ballman672dde22016-01-22 23:15:00 +00004228<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004229<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4230type.
4231
4232Given
4233 struct A {};
4234 A a[7];
4235 int b[7];
4236arrayType(hasElementType(builtinType()))
4237 matches "int b[7]"
4238
Aaron Ballman672dde22016-01-22 23:15:00 +00004239Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004240</pre></td></tr>
4241
4242
Aaron Ballman672dde22016-01-22 23:15:00 +00004243<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004244<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004245a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004246
4247Given
4248 { {}; 1+2; }
4249hasAnySubstatement(compoundStmt())
4250 matches '{ {}; 1+2; }'
4251with compoundStmt()
4252 matching '{}'
4253</pre></td></tr>
4254
4255
Aaron Ballman672dde22016-01-22 23:15:00 +00004256<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004257<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4258</pre></td></tr>
4259
4260
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004261<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4262<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004263matches the given matcher.
4264
4265The associated declaration is:
4266- for type nodes, the declaration of the underlying type
4267- for CallExpr, the declaration of the callee
4268- for MemberExpr, the declaration of the referenced member
4269- for CXXConstructExpr, the declaration of the constructor
4270
4271Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4272function. e.g. various subtypes of clang::Type and various expressions.
4273
Aaron Ballman672dde22016-01-22 23:15:00 +00004274Usable as: 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;,
4275 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004276 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4277 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00004278 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4279 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004280</pre></td></tr>
4281
4282
Aaron Ballman672dde22016-01-22 23:15:00 +00004283<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004284<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4285specific using shadow declaration.
4286
4287Given
4288 namespace a { void f() {} }
4289 using a::f;
4290 void g() {
4291 f(); Matches this ..
4292 a::f(); .. but not this.
4293 }
4294declRefExpr(throughUsingDecl(anything()))
4295 matches f()
4296</pre></td></tr>
4297
4298
Aaron Ballman672dde22016-01-22 23:15:00 +00004299<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004300<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4301specified matcher.
4302
4303Example matches x in if(x)
4304 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4305 bool x;
4306 if (x) {}
4307</pre></td></tr>
4308
4309
Aaron Ballman672dde22016-01-22 23:15:00 +00004310<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004311<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4312
4313Note that this does not work for global declarations because the AST
4314breaks up multiple-declaration DeclStmt's into multiple single-declaration
4315DeclStmt's.
4316Example: Given non-global declarations
4317 int a, b = 0;
4318 int c;
4319 int d = 2, e;
4320declStmt(containsDeclaration(
4321 0, varDecl(hasInitializer(anything()))))
4322 matches only 'int d = 2, e;', and
4323declStmt(containsDeclaration(1, varDecl()))
4324 matches 'int a, b = 0' as well as 'int d = 2, e;'
4325 but 'int c;' is not matched.
4326</pre></td></tr>
4327
4328
Aaron Ballman672dde22016-01-22 23:15:00 +00004329<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004330<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4331
4332Given
4333 int a, b;
4334 int c;
4335declStmt(hasSingleDecl(anything()))
4336 matches 'int c;' but not 'int a, b;'.
4337</pre></td></tr>
4338
4339
Aaron Ballman672dde22016-01-22 23:15:00 +00004340<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004341<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4342the inner matcher.
4343
4344Given
4345 int x;
4346declaratorDecl(hasTypeLoc(loc(asString("int"))))
4347 matches int x
4348</pre></td></tr>
4349
4350
Aaron Ballman672dde22016-01-22 23:15:00 +00004351<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004352<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4353Decl, matches InnerMatcher.
4354
4355Given
4356 namespace N {
4357 namespace M {
4358 class D {};
4359 }
4360 }
4361
4362cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4363declaration of class D.
4364</pre></td></tr>
4365
4366
Aaron Ballman672dde22016-01-22 23:15:00 +00004367<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>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00004368<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4369definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004370
4371Given
4372 for (;;) {}
4373hasBody(compoundStmt())
4374 matches 'for (;;) {}'
4375with compoundStmt()
4376 matching '{}'
4377</pre></td></tr>
4378
4379
Aaron Ballman672dde22016-01-22 23:15:00 +00004380<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004381<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
Etienne Bergeron5500f952016-05-30 15:25:25 +00004382switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004383
4384Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4385 if (true) {}
4386</pre></td></tr>
4387
4388
Aaron Ballman672dde22016-01-22 23:15:00 +00004389<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004390<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4391matches InnerMatcher if the qualifier exists.
4392
4393Given
4394 namespace N {
4395 namespace M {
4396 class D {};
4397 }
4398 }
4399 N::M::D d;
4400
4401elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4402matches the type of the variable declaration of d.
4403</pre></td></tr>
4404
4405
Aaron Ballman672dde22016-01-22 23:15:00 +00004406<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004407<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4408
4409Given
4410 namespace N {
4411 namespace M {
4412 class D {};
4413 }
4414 }
4415 N::M::D d;
4416
4417elaboratedType(namesType(recordType(
4418hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4419declaration of d.
4420</pre></td></tr>
4421
4422
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004423<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4424<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004425matches the given matcher.
4426
4427The associated declaration is:
4428- for type nodes, the declaration of the underlying type
4429- for CallExpr, the declaration of the callee
4430- for MemberExpr, the declaration of the referenced member
4431- for CXXConstructExpr, the declaration of the constructor
4432
4433Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4434function. e.g. various subtypes of clang::Type and various expressions.
4435
Aaron Ballman672dde22016-01-22 23:15:00 +00004436Usable as: 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;,
4437 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004438 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4439 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00004440 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4441 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004442</pre></td></tr>
4443
4444
Aaron Ballman672dde22016-01-22 23:15:00 +00004445<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004446<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4447
4448(Note: Clang's AST refers to other conversions as "casts" too, and calls
4449actual casts "explicit" casts.)
4450</pre></td></tr>
4451
4452
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004453<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>
4454<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004455declaration's type.
4456
4457In case of a value declaration (for example a variable declaration),
4458this resolves one layer of indirection. For example, in the value
4459declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4460X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4461declaration of x.
4462
4463Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4464 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4465 class X {};
4466 void y(X &amp;x) { x; X z; }
4467
Aaron Ballman672dde22016-01-22 23:15:00 +00004468Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004469</pre></td></tr>
4470
4471
Aaron Ballman672dde22016-01-22 23:15:00 +00004472<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004473<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4474matcher.
4475
4476Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4477 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004478 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004479 class X {};
4480 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004481 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004482</pre></td></tr>
4483
4484
Aaron Ballman672dde22016-01-22 23:15:00 +00004485<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004486<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4487are stripped off.
4488
4489Parentheses and explicit casts are not discarded.
4490Given
4491 int arr[5];
4492 int a = 0;
4493 char b = 0;
4494 const int c = a;
4495 int *d = arr;
4496 long e = (long) 0l;
4497The matchers
4498 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4499 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4500would match the declarations for a, b, c, and d, but not e.
4501While
4502 varDecl(hasInitializer(integerLiteral()))
4503 varDecl(hasInitializer(declRefExpr()))
4504only match the declarations for b, c, and d.
4505</pre></td></tr>
4506
4507
Cong Liu8a02efb2016-06-24 09:38:03 +00004508<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>ast_matchers::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4509<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4510nodes are stripped off.
4511
4512Parentheses and explicit casts are not discarded.
4513Given
4514 class C {};
4515 C a = C();
4516 C b;
4517 C c = b;
4518The matchers
4519 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4520would match the declarations for a, b, and c.
4521While
4522 varDecl(hasInitializer(cxxConstructExpr()))
4523only match the declarations for b and c.
4524</pre></td></tr>
4525
4526
Aaron Ballman672dde22016-01-22 23:15:00 +00004527<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004528<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4529casts are stripped off.
4530
4531Implicit and non-C Style casts are also discarded.
4532Given
4533 int a = 0;
4534 char b = (0);
4535 void* c = reinterpret_cast&lt;char*&gt;(0);
4536 char d = char(0);
4537The matcher
4538 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4539would match the declarations for a, b, c, and d.
4540while
4541 varDecl(hasInitializer(integerLiteral()))
4542only match the declaration for a.
4543</pre></td></tr>
4544
4545
Aaron Ballman672dde22016-01-22 23:15:00 +00004546<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004547<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4548parentheses are stripped off.
4549
4550Explicit casts are not discarded.
4551Given
4552 int arr[5];
4553 int a = 0;
4554 char b = (0);
4555 const int c = a;
4556 int *d = (arr);
4557 long e = ((long) 0l);
4558The matchers
4559 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4560 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4561would match the declarations for a, b, c, and d, but not e.
4562while
4563 varDecl(hasInitializer(integerLiteral()))
4564 varDecl(hasInitializer(declRefExpr()))
4565would only match the declaration for a.
4566</pre></td></tr>
4567
4568
Aaron Ballman672dde22016-01-22 23:15:00 +00004569<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>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00004570<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4571definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004572
4573Given
4574 for (;;) {}
4575hasBody(compoundStmt())
4576 matches 'for (;;) {}'
4577with compoundStmt()
4578 matching '{}'
4579</pre></td></tr>
4580
4581
Aaron Ballman672dde22016-01-22 23:15:00 +00004582<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004583<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
Etienne Bergeron5500f952016-05-30 15:25:25 +00004584switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004585
4586Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4587 if (true) {}
4588</pre></td></tr>
4589
4590
Aaron Ballman672dde22016-01-22 23:15:00 +00004591<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004592<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4593
4594Example:
4595 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4596matches '++x' in
4597 for (x; x &lt; N; ++x) { }
4598</pre></td></tr>
4599
4600
Aaron Ballman672dde22016-01-22 23:15:00 +00004601<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004602<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
4603
4604Example:
4605 forStmt(hasLoopInit(declStmt()))
4606matches 'int x = 0' in
4607 for (int x = 0; x &lt; N; ++x) { }
4608</pre></td></tr>
4609
4610
Aaron Ballman672dde22016-01-22 23:15:00 +00004611<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004612<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
4613
4614Does not match the 'this' parameter of a method.
4615
4616Given
4617 class X { void f(int x, int y, int z) {} };
4618cxxMethodDecl(hasAnyParameter(hasName("y")))
4619 matches f(int x, int y, int z) {}
4620with hasAnyParameter(...)
4621 matching int y
4622</pre></td></tr>
4623
4624
Aaron Ballman672dde22016-01-22 23:15:00 +00004625<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00004626<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
4627definition that has a given body.
4628
4629Given
4630 for (;;) {}
4631hasBody(compoundStmt())
4632 matches 'for (;;) {}'
4633with compoundStmt()
4634 matching '{}'
4635</pre></td></tr>
4636
4637
Aaron Ballman672dde22016-01-22 23:15:00 +00004638<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004639<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
4640
4641Given
4642 class X { void f(int x) {} };
4643cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4644 matches f(int x) {}
4645with hasParameter(...)
4646 matching int x
4647</pre></td></tr>
4648
4649
Aaron Ballman672dde22016-01-22 23:15:00 +00004650<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004651<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
4652
4653Given:
4654 class X { int f() { return 1; } };
4655cxxMethodDecl(returns(asString("int")))
4656 matches int f() { return 1; }
4657</pre></td></tr>
4658
4659
Aaron Ballman672dde22016-01-22 23:15:00 +00004660<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004661<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
Etienne Bergeron5500f952016-05-30 15:25:25 +00004662switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004663
4664Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4665 if (true) {}
4666</pre></td></tr>
4667
4668
Aaron Ballman672dde22016-01-22 23:15:00 +00004669<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004670<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
4671
4672Given
4673 if (A* a = GetAPointer()) {}
4674hasConditionVariableStatement(...)
4675 matches 'A* a = GetAPointer()'.
4676</pre></td></tr>
4677
4678
Aaron Ballman672dde22016-01-22 23:15:00 +00004679<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004680<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
4681
4682Examples matches the if statement
4683 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
4684 if (false) false; else true;
4685</pre></td></tr>
4686
4687
Aaron Ballman672dde22016-01-22 23:15:00 +00004688<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004689<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
4690
4691Examples matches the if statement
4692 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
4693 if (false) true; else false;
4694</pre></td></tr>
4695
4696
Aaron Ballman672dde22016-01-22 23:15:00 +00004697<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004698<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
4699matcher.
4700
4701FIXME: Unit test this matcher
4702</pre></td></tr>
4703
4704
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004705<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4706<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
4707(if expression have it).
4708</pre></td></tr>
4709
4710
4711<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4712<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
4713matches the given matcher.
4714
4715The associated declaration is:
4716- for type nodes, the declaration of the underlying type
4717- for CallExpr, the declaration of the callee
4718- for MemberExpr, the declaration of the referenced member
4719- for CXXConstructExpr, the declaration of the constructor
4720
4721Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4722function. e.g. various subtypes of clang::Type and various expressions.
4723
4724Usable as: 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;,
4725 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4726 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4727 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4728 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4729 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4730</pre></td></tr>
4731
4732
4733<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004734<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
4735matches the given matcher.
4736
4737The associated declaration is:
4738- for type nodes, the declaration of the underlying type
4739- for CallExpr, the declaration of the callee
4740- for MemberExpr, the declaration of the referenced member
4741- for CXXConstructExpr, the declaration of the constructor
4742
4743Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4744function. e.g. various subtypes of clang::Type and various expressions.
4745
Aaron Ballman672dde22016-01-22 23:15:00 +00004746Usable as: 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;,
4747 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004748 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4749 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00004750 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4751 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004752</pre></td></tr>
4753
4754
Aaron Ballman672dde22016-01-22 23:15:00 +00004755<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004756<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
4757matches the given matcher.
4758
4759The associated declaration is:
4760- for type nodes, the declaration of the underlying type
4761- for CallExpr, the declaration of the callee
4762- for MemberExpr, the declaration of the referenced member
4763- for CXXConstructExpr, the declaration of the constructor
4764
4765Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4766function. e.g. various subtypes of clang::Type and various expressions.
4767
Aaron Ballman672dde22016-01-22 23:15:00 +00004768Usable as: 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;,
4769 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004770 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4771 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00004772 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4773 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004774</pre></td></tr>
4775
4776
Aaron Ballman672dde22016-01-22 23:15:00 +00004777<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004778<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
4779matched by a given matcher.
4780
4781Given
4782 struct X { int m; };
4783 void f(X x) { x.m; m; }
4784memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
4785 matches "x.m" and "m"
4786with hasObjectExpression(...)
4787 matching "x" and the implicit object expression of "m" which has type X*.
4788</pre></td></tr>
4789
4790
Aaron Ballman672dde22016-01-22 23:15:00 +00004791<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004792<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
4793given matcher.
4794
4795Given
4796 struct { int first, second; } first, second;
4797 int i(second.first);
4798 int j(first.second);
4799memberExpr(member(hasName("first")))
4800 matches second.first
4801 but not first.second (because the member name there is "second").
4802</pre></td></tr>
4803
4804
Aaron Ballman672dde22016-01-22 23:15:00 +00004805<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004806<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
4807pointee matches a given matcher.
4808
4809Given
4810 int *a;
4811 int const *b;
4812 float const *f;
4813pointerType(pointee(isConstQualified(), isInteger()))
4814 matches "int const *b"
4815
Aaron Ballman672dde22016-01-22 23:15:00 +00004816Usable 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;,
4817 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004818</pre></td></tr>
4819
4820
Aaron Ballman672dde22016-01-22 23:15:00 +00004821<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004822<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
4823pointee matches a given matcher.
4824
4825Given
4826 int *a;
4827 int const *b;
4828 float const *f;
4829pointerType(pointee(isConstQualified(), isInteger()))
4830 matches "int const *b"
4831
Aaron Ballman672dde22016-01-22 23:15:00 +00004832Usable 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;,
4833 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004834</pre></td></tr>
4835
4836
Aaron Ballman672dde22016-01-22 23:15:00 +00004837<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004838<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
4839
4840Given
4841 struct A { struct B { struct C {}; }; };
4842 A::B::C c;
4843nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
4844 matches "A::"
4845</pre></td></tr>
4846
4847
Aaron Ballman672dde22016-01-22 23:15:00 +00004848<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004849<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
4850given TypeLoc.
4851
4852Given
4853 struct A { struct B { struct C {}; }; };
4854 A::B::C c;
4855nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
4856 hasDeclaration(cxxRecordDecl(hasName("A")))))))
4857 matches "A::"
4858</pre></td></tr>
4859
4860
Aaron Ballman672dde22016-01-22 23:15:00 +00004861<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004862<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
4863
4864Given
4865 struct A { struct B { struct C {}; }; };
4866 A::B::C c;
4867nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
4868 matches "A::"
4869</pre></td></tr>
4870
4871
Aaron Ballman672dde22016-01-22 23:15:00 +00004872<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004873<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
4874given namespace matcher.
4875
4876Given
4877 namespace ns { struct A {}; }
4878 ns::A a;
4879nestedNameSpecifier(specifiesNamespace(hasName("ns")))
4880 matches "ns::"
4881</pre></td></tr>
4882
4883
Aaron Ballman672dde22016-01-22 23:15:00 +00004884<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004885<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
4886given QualType matcher without qualifiers.
4887
4888Given
4889 struct A { struct B { struct C {}; }; };
4890 A::B::C c;
4891nestedNameSpecifier(specifiesType(
4892 hasDeclaration(cxxRecordDecl(hasName("A")))
4893))
4894 matches "A::"
4895</pre></td></tr>
4896
4897
Aaron Ballman672dde22016-01-22 23:15:00 +00004898<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004899<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
4900call expression.
4901
4902Example matches y in x(y)
4903 (matcher = callExpr(hasArgument(0, declRefExpr())))
4904 void x(int) { int y; x(y); }
4905</pre></td></tr>
4906
4907
Aaron Ballman672dde22016-01-22 23:15:00 +00004908<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004909<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
4910
4911Example
4912matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *")));
4913matches the [webView ...] message invocation.
4914 NSString *webViewJavaScript = ...
4915 UIWebView *webView = ...
4916 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
4917</pre></td></tr>
4918
4919
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004920<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4921<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
4922
4923
Aaron Ballman672dde22016-01-22 23:15:00 +00004924<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004925<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
4926
4927Given
4928 int (*ptr_to_array)[4];
4929 int (*ptr_to_func)(int);
4930
4931varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
4932ptr_to_func but not ptr_to_array.
4933
Aaron Ballman672dde22016-01-22 23:15:00 +00004934Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004935</pre></td></tr>
4936
4937
Aaron Ballman672dde22016-01-22 23:15:00 +00004938<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004939<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
4940pointee matches a given matcher.
4941
4942Given
4943 int *a;
4944 int const *b;
4945 float const *f;
4946pointerType(pointee(isConstQualified(), isInteger()))
4947 matches "int const *b"
4948
Aaron Ballman672dde22016-01-22 23:15:00 +00004949Usable 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;,
4950 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004951</pre></td></tr>
4952
4953
Aaron Ballman672dde22016-01-22 23:15:00 +00004954<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004955<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
4956pointee matches a given matcher.
4957
4958Given
4959 int *a;
4960 int const *b;
4961 float const *f;
4962pointerType(pointee(isConstQualified(), isInteger()))
4963 matches "int const *b"
4964
Aaron Ballman672dde22016-01-22 23:15:00 +00004965Usable 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;,
4966 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004967</pre></td></tr>
4968
4969
Aaron Ballman672dde22016-01-22 23:15:00 +00004970<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004971<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
4972
4973Given:
4974 typedef int &amp;int_ref;
4975 int a;
4976 int_ref b = a;
4977
4978varDecl(hasType(qualType(referenceType()))))) will not match the
4979declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
4980</pre></td></tr>
4981
4982
Aaron Ballman672dde22016-01-22 23:15:00 +00004983<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004984<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
4985matches the given matcher.
4986
4987The associated declaration is:
4988- for type nodes, the declaration of the underlying type
4989- for CallExpr, the declaration of the callee
4990- for MemberExpr, the declaration of the referenced member
4991- for CXXConstructExpr, the declaration of the constructor
4992
4993Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4994function. e.g. various subtypes of clang::Type and various expressions.
4995
Aaron Ballman672dde22016-01-22 23:15:00 +00004996Usable as: 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;,
4997 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004998 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4999 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00005000 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5001 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005002</pre></td></tr>
5003
5004
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005005<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5006<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5007
5008Given
5009 void (*fp)(void);
5010The matcher
5011 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5012would match the declaration for fp.
5013</pre></td></tr>
5014
5015
Aaron Ballman672dde22016-01-22 23:15:00 +00005016<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005017<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5018</pre></td></tr>
5019
5020
Aaron Ballman672dde22016-01-22 23:15:00 +00005021<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005022<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5023matches the specified matcher.
5024
5025Example matches y-&gt;x()
5026 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5027 cxxRecordDecl(hasName("Y")))))))
5028 class Y { public: void x(); };
5029 void z() { Y *y; y-&gt;x(); }
5030</pre></td></tr>
5031
5032
Aaron Ballman672dde22016-01-22 23:15:00 +00005033<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005034<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5035</pre></td></tr>
5036
5037
Aaron Ballman672dde22016-01-22 23:15:00 +00005038<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005039<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5040type matches the specified matcher.
5041
5042Example matches X &amp;x and const X &amp;y
5043 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5044 class X {
5045 void a(X b) {
5046 X &amp;x = b;
5047 const X &amp;y = b;
5048 }
5049 };
5050</pre></td></tr>
5051
5052
Aaron Ballman672dde22016-01-22 23:15:00 +00005053<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005054<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5055matches the given matcher.
5056
5057The associated declaration is:
5058- for type nodes, the declaration of the underlying type
5059- for CallExpr, the declaration of the callee
5060- for MemberExpr, the declaration of the referenced member
5061- for CXXConstructExpr, the declaration of the constructor
5062
5063Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5064function. e.g. various subtypes of clang::Type and various expressions.
5065
Aaron Ballman672dde22016-01-22 23:15:00 +00005066Usable as: 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;,
5067 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005068 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5069 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00005070 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5071 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005072</pre></td></tr>
5073
5074
Aaron Ballman672dde22016-01-22 23:15:00 +00005075<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005076<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5077pointee matches a given matcher.
5078
5079Given
5080 int *a;
5081 int const *b;
5082 float const *f;
5083pointerType(pointee(isConstQualified(), isInteger()))
5084 matches "int const *b"
5085
Aaron Ballman672dde22016-01-22 23:15:00 +00005086Usable 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;,
5087 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005088</pre></td></tr>
5089
5090
Aaron Ballman672dde22016-01-22 23:15:00 +00005091<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005092<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5093pointee matches a given matcher.
5094
5095Given
5096 int *a;
5097 int const *b;
5098 float const *f;
5099pointerType(pointee(isConstQualified(), isInteger()))
5100 matches "int const *b"
5101
Aaron Ballman672dde22016-01-22 23:15:00 +00005102Usable 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;,
5103 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005104</pre></td></tr>
5105
5106
Alexander Kornienko976921d2016-03-22 11:03:03 +00005107<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5108<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5109
5110Given
5111 return a + b;
5112hasReturnValue(binaryOperator())
5113 matches 'return a + b'
5114with binaryOperator()
5115 matching 'a + b'
5116</pre></td></tr>
5117
5118
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005119<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
5120<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5121a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5122
5123Given
5124 { {}; 1+2; }
5125hasAnySubstatement(compoundStmt())
5126 matches '{ {}; 1+2; }'
5127with compoundStmt()
5128 matching '{}'
5129</pre></td></tr>
5130
5131
Aaron Ballman672dde22016-01-22 23:15:00 +00005132<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005133<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5134alignof.
5135</pre></td></tr>
5136
5137
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005138<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
5139<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statemenet belongs to
5140
5141Given:
5142F&amp; operator=(const F&amp; o) {
5143 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5144 return *this;
5145}
5146returnStmt(forFunction(hasName("operator=")))
5147 matches 'return *this'
5148 but does match 'return &gt; 0'
5149</pre></td></tr>
5150
5151
Aaron Ballman672dde22016-01-22 23:15:00 +00005152<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005153<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5154sizeof.
5155</pre></td></tr>
5156
5157
Aaron Ballman672dde22016-01-22 23:15:00 +00005158<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005159<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5160statement. This matcher may produce multiple matches.
5161
5162Given
5163 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5164switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5165 matches four times, with "c" binding each of "case 1:", "case 2:",
5166"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5167"switch (1)", "switch (2)" and "switch (2)".
5168</pre></td></tr>
5169
5170
Etienne Bergeron5500f952016-05-30 15:25:25 +00005171<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</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>
5172<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5173switch statement or conditional operator.
5174
5175Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5176 if (true) {}
5177</pre></td></tr>
5178
5179
Aaron Ballman672dde22016-01-22 23:15:00 +00005180<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005181<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5182matches the given matcher.
5183
5184The associated declaration is:
5185- for type nodes, the declaration of the underlying type
5186- for CallExpr, the declaration of the callee
5187- for MemberExpr, the declaration of the referenced member
5188- for CXXConstructExpr, the declaration of the constructor
5189
5190Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5191function. e.g. various subtypes of clang::Type and various expressions.
5192
Aaron Ballman672dde22016-01-22 23:15:00 +00005193Usable as: 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;,
5194 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005195 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5196 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00005197 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5198 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005199</pre></td></tr>
5200
5201
Aaron Ballman672dde22016-01-22 23:15:00 +00005202<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005203<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5204
5205Given
5206 template&lt;typename T&gt; struct A {};
5207 struct B { B* next; };
5208 A&lt;&amp;B::next&gt; a;
5209templateSpecializationType(hasAnyTemplateArgument(
5210 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5211 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5212 B::next
5213</pre></td></tr>
5214
5215
Aaron Ballman672dde22016-01-22 23:15:00 +00005216<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005217<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5218declaration.
5219
5220Given
5221 template&lt;typename T&gt; struct A {};
5222 struct B { B* next; };
5223 A&lt;&amp;B::next&gt; a;
5224classTemplateSpecializationDecl(hasAnyTemplateArgument(
5225 refersToDeclaration(fieldDecl(hasName("next"))))
5226 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5227 B::next
5228</pre></td></tr>
5229
5230
Aaron Ballman672dde22016-01-22 23:15:00 +00005231<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005232<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5233
5234Given
5235 template&lt;int T&gt; struct A {};
5236 C&lt;42&gt; c;
5237classTemplateSpecializationDecl(
5238 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5239 matches the implicit instantiation of C in C&lt;42&gt;.
5240</pre></td></tr>
5241
5242
Aaron Ballman672dde22016-01-22 23:15:00 +00005243<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005244<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5245
5246Given
5247 struct X {};
5248 template&lt;typename T&gt; struct A {};
5249 A&lt;X&gt; a;
5250classTemplateSpecializationDecl(hasAnyTemplateArgument(
5251 refersToType(class(hasName("X")))))
5252 matches the specialization A&lt;X&gt;
5253</pre></td></tr>
5254
5255
Aaron Ballman672dde22016-01-22 23:15:00 +00005256<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005257<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
5258TemplateArgument matching the given InnerMatcher.
5259
5260Given
5261 template&lt;typename T&gt; class A {};
5262 template&lt;&gt; class A&lt;double&gt; {};
5263 A&lt;int&gt; a;
5264classTemplateSpecializationDecl(hasAnyTemplateArgument(
5265 refersToType(asString("int"))))
5266 matches the specialization A&lt;int&gt;
5267</pre></td></tr>
5268
5269
Aaron Ballman672dde22016-01-22 23:15:00 +00005270<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005271<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5272matches the given matcher.
5273
5274The associated declaration is:
5275- for type nodes, the declaration of the underlying type
5276- for CallExpr, the declaration of the callee
5277- for MemberExpr, the declaration of the referenced member
5278- for CXXConstructExpr, the declaration of the constructor
5279
5280Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5281function. e.g. various subtypes of clang::Type and various expressions.
5282
Aaron Ballman672dde22016-01-22 23:15:00 +00005283Usable as: 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;,
5284 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005285 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5286 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00005287 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5288 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005289</pre></td></tr>
5290
5291
Aaron Ballman672dde22016-01-22 23:15:00 +00005292<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005293<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
5294matches the given InnerMatcher.
5295
5296Given
5297 template&lt;typename T, typename U&gt; class A {};
5298 A&lt;bool, int&gt; b;
5299 A&lt;int, bool&gt; c;
5300classTemplateSpecializationDecl(hasTemplateArgument(
5301 1, refersToType(asString("int"))))
5302 matches the specialization A&lt;bool, int&gt;
5303</pre></td></tr>
5304
5305
Aaron Ballman672dde22016-01-22 23:15:00 +00005306<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005307<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5308matches the given matcher.
5309
5310The associated declaration is:
5311- for type nodes, the declaration of the underlying type
5312- for CallExpr, the declaration of the callee
5313- for MemberExpr, the declaration of the referenced member
5314- for CXXConstructExpr, the declaration of the constructor
5315
5316Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5317function. e.g. various subtypes of clang::Type and various expressions.
5318
Aaron Ballman672dde22016-01-22 23:15:00 +00005319Usable as: 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;,
5320 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005321 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5322 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00005323 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5324 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005325</pre></td></tr>
5326
5327
5328<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt; Matcher</td></tr>
5329<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5330
5331Generates results for each match.
5332
5333For example, in:
5334 class A { class B {}; class C {}; };
5335The matcher:
5336 cxxRecordDecl(hasName("::A"),
5337 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5338will generate results for A, B and C.
5339
5340Usable as: Any Matcher
5341</pre></td></tr>
5342
5343
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005344<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005345<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5346matcher.
5347
5348Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5349 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5350 and U (matcher = typedefDecl(hasType(asString("int")))
5351 class X {};
5352 void y(X &amp;x) { x; X z; }
5353 typedef int U;
5354</pre></td></tr>
5355
5356
Aaron Ballman672dde22016-01-22 23:15:00 +00005357<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005358<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5359matches the given matcher.
5360
5361The associated declaration is:
5362- for type nodes, the declaration of the underlying type
5363- for CallExpr, the declaration of the callee
5364- for MemberExpr, the declaration of the referenced member
5365- for CXXConstructExpr, the declaration of the constructor
5366
5367Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5368function. e.g. various subtypes of clang::Type and various expressions.
5369
Aaron Ballman672dde22016-01-22 23:15:00 +00005370Usable as: 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;,
5371 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005372 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5373 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00005374 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5375 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005376</pre></td></tr>
5377
5378
Aaron Ballman672dde22016-01-22 23:15:00 +00005379<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005380<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5381
5382Given
5383 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5384unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5385 matches sizeof(a) and alignof(c)
5386</pre></td></tr>
5387
5388
Aaron Ballman672dde22016-01-22 23:15:00 +00005389<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005390<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5391
5392Example matches true (matcher = hasUnaryOperand(
5393 cxxBoolLiteral(equals(true))))
5394 !true
5395</pre></td></tr>
5396
5397
Aaron Ballman672dde22016-01-22 23:15:00 +00005398<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005399<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5400matches the given matcher.
5401
5402The associated declaration is:
5403- for type nodes, the declaration of the underlying type
5404- for CallExpr, the declaration of the callee
5405- for MemberExpr, the declaration of the referenced member
5406- for CXXConstructExpr, the declaration of the constructor
5407
5408Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5409function. e.g. various subtypes of clang::Type and various expressions.
5410
Aaron Ballman672dde22016-01-22 23:15:00 +00005411Usable as: 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;,
5412 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005413 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5414 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_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00005415 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5416 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005417</pre></td></tr>
5418
5419
Aaron Ballman672dde22016-01-22 23:15:00 +00005420<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005421<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5422
5423Given
5424 namespace X { void b(); }
5425 using X::b;
5426usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5427 matches using X::b </pre></td></tr>
5428
5429
Aaron Ballman672dde22016-01-22 23:15:00 +00005430<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005431<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5432matched by the given matcher.
5433
5434Given
5435 namespace X { int a; void b(); }
5436 using X::a;
5437 using X::b;
5438usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5439 matches using X::b but not using X::a </pre></td></tr>
5440
5441
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005442<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5443<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005444declaration's type.
5445
5446In case of a value declaration (for example a variable declaration),
5447this resolves one layer of indirection. For example, in the value
5448declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5449X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5450declaration of x.
5451
5452Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5453 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5454 class X {};
5455 void y(X &amp;x) { x; X z; }
5456
Aaron Ballman672dde22016-01-22 23:15:00 +00005457Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005458</pre></td></tr>
5459
5460
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005461<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_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5462<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005463matcher.
5464
5465Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5466 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005467 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005468 class X {};
5469 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005470 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005471</pre></td></tr>
5472
5473
Aaron Ballman672dde22016-01-22 23:15:00 +00005474<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005475<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
5476that matches the given matcher.
5477
5478Example matches x (matcher = varDecl(hasInitializer(callExpr())))
5479 bool y() { return true; }
5480 bool x = y();
5481</pre></td></tr>
5482
5483
Aaron Ballman672dde22016-01-22 23:15:00 +00005484<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005485<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
5486expression.
5487
5488Given
5489 void f(int b) {
5490 int a[b];
5491 }
5492variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
5493 varDecl(hasName("b")))))))
5494 matches "int a[b]"
5495</pre></td></tr>
5496
5497
Aaron Ballman672dde22016-01-22 23:15:00 +00005498<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>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00005499<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
5500definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005501
5502Given
5503 for (;;) {}
5504hasBody(compoundStmt())
5505 matches 'for (;;) {}'
5506with compoundStmt()
5507 matching '{}'
5508</pre></td></tr>
5509
5510
Aaron Ballman672dde22016-01-22 23:15:00 +00005511<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005512<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
Etienne Bergeron5500f952016-05-30 15:25:25 +00005513switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005514
5515Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5516 if (true) {}
5517</pre></td></tr>
5518
5519
Aaron Ballman672dde22016-01-22 23:15:00 +00005520<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005521<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
5522NestedNameSpecifier-matcher matches.
5523</pre></td></tr>
5524
5525
Aaron Ballman672dde22016-01-22 23:15:00 +00005526<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005527<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
5528QualType-matcher matches.
5529</pre></td></tr>
5530
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00005531<!--END_TRAVERSAL_MATCHERS -->
5532</table>
5533
5534</div>
5535</body>
5536</html>
5537
5538