blob: 2a8d864c3c5c1a36f584c0a0c3129eb16267f6df [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
Artem Dergachevded92a92016-11-11 22:34:53 +0000602Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000603 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
Haojian Wub33b02e2016-07-29 15:45:11 +00001321<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
1322<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1323
1324Given
1325 template &lt;typename T&gt; class X { };
1326 X&lt;int&gt; xi;
1327templateName()
1328 matches 'X' in X&lt;int&gt;.
1329</pre></td></tr>
1330
1331
Aaron Ballman672dde22016-01-22 23:15:00 +00001332<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 +00001333<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1334</pre></td></tr>
1335
1336
Aaron Ballman672dde22016-01-22 23:15:00 +00001337<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 +00001338<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1339
1340Given
1341 int a[] = { 2, 3 };
1342 int b[4];
1343 void f() { int c[a[0]]; }
1344arrayType()
1345 matches "int a[]", "int b[4]" and "int c[a[0]]";
1346</pre></td></tr>
1347
1348
Aaron Ballman672dde22016-01-22 23:15:00 +00001349<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 +00001350<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1351
1352Given
1353 _Atomic(int) i;
1354atomicType()
1355 matches "_Atomic(int) i"
1356</pre></td></tr>
1357
1358
Aaron Ballman672dde22016-01-22 23:15:00 +00001359<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 +00001360<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1361
1362Given:
1363 auto n = 4;
1364 int v[] = { 2, 3 }
1365 for (auto i : v) { }
1366autoType()
1367 matches "auto n" and "auto i"
1368</pre></td></tr>
1369
1370
Aaron Ballman672dde22016-01-22 23:15:00 +00001371<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 +00001372<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1373"void (^)(int)".
1374
1375The pointee is always required to be a FunctionType.
1376</pre></td></tr>
1377
1378
Aaron Ballman672dde22016-01-22 23:15:00 +00001379<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 +00001380<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1381
1382Given
1383 struct A {};
1384 A a;
1385 int b;
1386 float c;
1387 bool d;
1388builtinType()
1389 matches "int b", "float c" and "bool d"
1390</pre></td></tr>
1391
1392
Aaron Ballman672dde22016-01-22 23:15:00 +00001393<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 +00001394<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1395
1396Given
1397 _Complex float f;
1398complexType()
1399 matches "_Complex float f"
1400</pre></td></tr>
1401
1402
Aaron Ballman672dde22016-01-22 23:15:00 +00001403<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 +00001404<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1405
1406Given
1407 void() {
1408 int a[2];
1409 int b[] = { 2, 3 };
1410 int c[b[0]];
1411 }
1412constantArrayType()
1413 matches "int a[2]"
1414</pre></td></tr>
1415
1416
Aaron Ballman672dde22016-01-22 23:15:00 +00001417<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 +00001418<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1419Example matches i[] in declaration of f.
1420 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1421Example matches i[1].
1422 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1423 void f(int i[]) {
1424 i[1] = 0;
1425 }
1426</pre></td></tr>
1427
1428
Aaron Ballman672dde22016-01-22 23:15:00 +00001429<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001430<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1431
1432Given
1433 template&lt;typename T, int Size&gt;
1434 class array {
1435 T data[Size];
1436 };
1437dependentSizedArrayType
1438 matches "T data[Size]"
1439</pre></td></tr>
1440
1441
Aaron Ballman672dde22016-01-22 23:15:00 +00001442<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 +00001443<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1444qualified name.
1445
1446Given
1447 namespace N {
1448 namespace M {
1449 class D {};
1450 }
1451 }
1452 class C {};
1453
1454 class C c;
1455 N::M::D d;
1456
1457elaboratedType() matches the type of the variable declarations of both
1458c and d.
1459</pre></td></tr>
1460
1461
Haojian Wue775de82016-06-30 07:50:01 +00001462<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>
1463<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1464
1465Given
1466 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001467 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001468
1469 C c;
1470 S s;
1471
1472enumType() matches the type of the variable declarations of both c and
1473s.
1474</pre></td></tr>
1475
1476
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001477<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>
1478<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1479
1480Given
1481 int (*f)(int);
1482 void g();
1483functionProtoType()
1484 matches "int (*f)(int)" and the type of "g" in C++ mode.
1485 In C mode, "g" is not matched because it does not contain a prototype.
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('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 +00001490<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1491
1492Given
1493 int (*f)(int);
1494 void g();
1495functionType()
1496 matches "int (*f)(int)" and the type of "g".
1497</pre></td></tr>
1498
1499
Aaron Ballman672dde22016-01-22 23:15:00 +00001500<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 +00001501<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1502
1503Given
1504 int a[] = { 2, 3 };
1505 int b[42];
1506 void f(int c[]) { int d[a[0]]; };
1507incompleteArrayType()
1508 matches "int a[]" and "int c[]"
1509</pre></td></tr>
1510
1511
Aaron Ballman672dde22016-01-22 23:15:00 +00001512<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 +00001513<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1514
1515Example matches S s, but not S&lt;T&gt; s.
1516 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1517 template &lt;typename T&gt; struct S {
1518 void f(S s);
1519 void g(S&lt;T&gt; s);
1520 };
1521</pre></td></tr>
1522
1523
Aaron Ballman672dde22016-01-22 23:15:00 +00001524<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 +00001525<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1526
1527Given:
1528 int *a;
1529 int &amp;b = *a;
1530 int &amp;&amp;c = 1;
1531 auto &amp;d = b;
1532 auto &amp;&amp;e = c;
1533 auto &amp;&amp;f = 2;
1534 int g = 5;
1535
1536lValueReferenceType() matches the types of b, d, and e. e is
1537matched since the type is deduced as int&amp; by reference collapsing rules.
1538</pre></td></tr>
1539
1540
Aaron Ballman672dde22016-01-22 23:15:00 +00001541<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 +00001542<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1543Given
1544 struct A { int i; }
1545 A::* ptr = A::i;
1546memberPointerType()
1547 matches "A::* ptr"
1548</pre></td></tr>
1549
1550
Aaron Ballman672dde22016-01-22 23:15:00 +00001551<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 +00001552<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1553a pointer type, despite being syntactically similar.
1554
1555Given
1556 int *a;
1557
1558 @interface Foo
1559 @end
1560 Foo *f;
1561pointerType()
1562 matches "Foo *f", but does not match "int *a".
1563</pre></td></tr>
1564
1565
Aaron Ballman672dde22016-01-22 23:15:00 +00001566<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 +00001567<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1568
1569Given
1570 int (*ptr_to_array)[4];
1571 int *array_of_ptrs[4];
1572
1573varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1574array_of_ptrs.
1575</pre></td></tr>
1576
1577
Aaron Ballman672dde22016-01-22 23:15:00 +00001578<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 +00001579<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1580types.
1581
1582Given
1583 int *a;
1584 int &amp;b = *a;
1585 int c = 5;
1586
1587 @interface Foo
1588 @end
1589 Foo *f;
1590pointerType()
1591 matches "int *a", but does not match "Foo *f".
1592</pre></td></tr>
1593
1594
Aaron Ballman672dde22016-01-22 23:15:00 +00001595<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 +00001596<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1597
1598Given:
1599 int *a;
1600 int &amp;b = *a;
1601 int &amp;&amp;c = 1;
1602 auto &amp;d = b;
1603 auto &amp;&amp;e = c;
1604 auto &amp;&amp;f = 2;
1605 int g = 5;
1606
1607rValueReferenceType() matches the types of c and f. e is not
1608matched as it is deduced to int&amp; by reference collapsing rules.
1609</pre></td></tr>
1610
1611
Aaron Ballman672dde22016-01-22 23:15:00 +00001612<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 +00001613<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1614
1615Given
1616 class C {};
1617 struct S {};
1618
1619 C c;
1620 S s;
1621
1622recordType() matches the type of the variable declarations of both c
1623and s.
1624</pre></td></tr>
1625
1626
Aaron Ballman672dde22016-01-22 23:15:00 +00001627<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 +00001628<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1629
1630Given
1631 int *a;
1632 int &amp;b = *a;
1633 int &amp;&amp;c = 1;
1634 auto &amp;d = b;
1635 auto &amp;&amp;e = c;
1636 auto &amp;&amp;f = 2;
1637 int g = 5;
1638
1639referenceType() matches the types of b, c, d, e, and f.
1640</pre></td></tr>
1641
1642
Aaron Ballman672dde22016-01-22 23:15:00 +00001643<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 +00001644<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1645template type parameter.
1646
1647Given
1648 template &lt;typename T&gt;
1649 void F(T t) {
1650 int i = 1 + t;
1651 }
1652
1653substTemplateTypeParmType() matches the type of 't' but not '1'
1654</pre></td></tr>
1655
1656
Aaron Ballman672dde22016-01-22 23:15:00 +00001657<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 +00001658<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1659
1660Given
1661 template &lt;typename T&gt;
1662 class C { };
1663
1664 template class C&lt;int&gt;; A
1665 C&lt;char&gt; var; B
1666
1667templateSpecializationType() matches the type of the explicit
1668instantiation in A and the type of the variable declaration in B.
1669</pre></td></tr>
1670
1671
Aaron Ballman672dde22016-01-22 23:15:00 +00001672<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 +00001673<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1674
1675Example matches T, but not int.
1676 (matcher = templateTypeParmType())
1677 template &lt;typename T&gt; void f(int i);
1678</pre></td></tr>
1679
1680
Aaron Ballman672dde22016-01-22 23:15:00 +00001681<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 +00001682<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1683</pre></td></tr>
1684
1685
Aaron Ballman672dde22016-01-22 23:15:00 +00001686<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 +00001687<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1688
1689Given
1690 typedef int X;
1691typedefType()
1692 matches "typedef int X"
1693</pre></td></tr>
1694
1695
Aaron Ballman672dde22016-01-22 23:15:00 +00001696<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 +00001697<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1698
1699Given:
1700 typedef __underlying_type(T) type;
1701unaryTransformType()
1702 matches "__underlying_type(T)"
1703</pre></td></tr>
1704
1705
Aaron Ballman672dde22016-01-22 23:15:00 +00001706<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 +00001707<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1708integer-constant-expression.
1709
1710Given
1711 void f() {
1712 int a[] = { 2, 3 }
1713 int b[42];
1714 int c[a[0]];
1715 }
1716variableArrayType()
1717 matches "int c[a[0]]"
1718</pre></td></tr>
1719
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001720<!--END_DECL_MATCHERS -->
1721</table>
1722
1723<!-- ======================================================================= -->
1724<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1725<!-- ======================================================================= -->
1726
1727<p>Narrowing matchers match certain attributes on the current node, thus
1728narrowing down the set of nodes of the current type to match on.</p>
1729
1730<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1731which allow users to create more powerful match expressions.</p>
1732
1733<table>
1734<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001735<!-- START_NARROWING_MATCHERS -->
1736
1737<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>
1738<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1739
1740Usable as: Any Matcher
1741</pre></td></tr>
1742
1743
1744<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>
1745<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1746
1747Usable as: Any Matcher
1748</pre></td></tr>
1749
1750
1751<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1752<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1753
1754Useful when another matcher requires a child matcher, but there's no
1755additional constraint. This will often be used with an explicit conversion
1756to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1757
1758Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1759"int* p" and "void f()" in
1760 int* p;
1761 void f();
1762
1763Usable as: Any Matcher
1764</pre></td></tr>
1765
1766
1767<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1768<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1769
1770Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1771 class X {};
1772 class Y {};
1773
1774Usable as: Any Matcher
1775</pre></td></tr>
1776
1777
Aaron Ballman672dde22016-01-22 23:15:00 +00001778<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 +00001779<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1780unary).
1781
1782Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1783 !(a || b)
1784</pre></td></tr>
1785
1786
1787<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
1788<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1789
1790Example matches true (matcher = cxxBoolLiteral(equals(true)))
1791 true
1792
Aaron Ballman672dde22016-01-22 23:15:00 +00001793Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1794 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 +00001795</pre></td></tr>
1796
1797
Aaron Ballman672dde22016-01-22 23:15:00 +00001798<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 +00001799<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1800
1801Given
1802 try {
1803 ...
1804 } catch (int) {
1805 ...
1806 } catch (...) {
1807 ...
1808 }
1809endcode
1810cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1811</pre></td></tr>
1812
1813
Aaron Ballman672dde22016-01-22 23:15:00 +00001814<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 +00001815<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1816a specific number of arguments (including absent default arguments).
1817
1818Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1819 void f(int x, int y);
1820 f(0, 0);
1821</pre></td></tr>
1822
1823
Aaron Ballman672dde22016-01-22 23:15:00 +00001824<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 +00001825<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1826</pre></td></tr>
1827
1828
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001829<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>
1830<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1831zero initialization.
1832
1833Given
1834void foo() {
1835 struct point { double x; double y; };
1836 point pt[2] = { { 1.0, 2.0 } };
1837}
1838initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1839will match the implicit array filler for pt[1].
1840</pre></td></tr>
1841
1842
Aaron Ballman672dde22016-01-22 23:15:00 +00001843<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 +00001844<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1845
1846Given
1847 struct S {
1848 S(); #1
1849 S(const S &amp;); #2
1850 S(S &amp;&amp;); #3
1851 };
1852cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1853</pre></td></tr>
1854
1855
Aaron Ballman672dde22016-01-22 23:15:00 +00001856<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 +00001857<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1858
1859Given
1860 struct S {
1861 S(); #1
1862 S(const S &amp;); #2
1863 S(S &amp;&amp;); #3
1864 };
1865cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1866</pre></td></tr>
1867
1868
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00001869<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>
1870<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1871
1872Given
1873 struct S {
1874 S(); #1
1875 S(int) {} #2
1876 S(S &amp;&amp;) : S() {} #3
1877 };
1878 S::S() : S(0) {} #4
1879cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1880#1 or #2.
1881</pre></td></tr>
1882
1883
Aaron Ballman672dde22016-01-22 23:15:00 +00001884<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 +00001885<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1886the explicit keyword.
1887
1888Given
1889 struct S {
1890 S(int); #1
1891 explicit S(double); #2
1892 operator int(); #3
1893 explicit operator bool(); #4
1894 };
1895cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1896cxxConversionDecl(isExplicit()) will match #4, but not #3.
1897</pre></td></tr>
1898
1899
Aaron Ballman672dde22016-01-22 23:15:00 +00001900<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 +00001901<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
1902
1903Given
1904 struct S {
1905 S(); #1
1906 S(const S &amp;); #2
1907 S(S &amp;&amp;); #3
1908 };
1909cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
1910</pre></td></tr>
1911
1912
Aaron Ballman672dde22016-01-22 23:15:00 +00001913<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 +00001914<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
1915the explicit keyword.
1916
1917Given
1918 struct S {
1919 S(int); #1
1920 explicit S(double); #2
1921 operator int(); #3
1922 explicit operator bool(); #4
1923 };
1924cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1925cxxConversionDecl(isExplicit()) will match #4, but not #3.
1926</pre></td></tr>
1927
1928
Aaron Ballman672dde22016-01-22 23:15:00 +00001929<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 +00001930<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
1931opposed to a member.
1932
1933Given
1934 struct B {};
1935 struct D : B {
1936 int I;
1937 D(int i) : I(i) {}
1938 };
1939 struct E : B {
1940 E() : B() {}
1941 };
1942cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
1943 will match E(), but not match D(int).
1944</pre></td></tr>
1945
1946
Aaron Ballman672dde22016-01-22 23:15:00 +00001947<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 +00001948<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
1949opposed to a base.
1950
1951Given
1952 struct B {};
1953 struct D : B {
1954 int I;
1955 D(int i) : I(i) {}
1956 };
1957 struct E : B {
1958 E() : B() {}
1959 };
1960cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
1961 will match D(int), but not match E().
1962</pre></td></tr>
1963
1964
Aaron Ballman672dde22016-01-22 23:15:00 +00001965<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 +00001966<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
1967code (as opposed to implicitly added by the compiler).
1968
1969Given
1970 struct Foo {
1971 Foo() { }
1972 Foo(int) : foo_("A") { }
1973 string foo_;
1974 };
1975cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
1976 will match Foo(int), but not Foo()
1977</pre></td></tr>
1978
1979
Aaron Ballman672dde22016-01-22 23:15:00 +00001980<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 +00001981<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1982
1983Given
1984struct A {
1985 void foo() const;
1986 void bar();
1987};
1988
1989cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
1990</pre></td></tr>
1991
1992
Aaron Ballman672dde22016-01-22 23:15:00 +00001993<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 +00001994<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
1995operator.
1996
1997Given
1998struct A {
1999 A &amp;operator=(const A &amp;);
2000 A &amp;operator=(A &amp;&amp;);
2001};
2002
2003cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2004the second one.
2005</pre></td></tr>
2006
2007
Aaron Ballman672dde22016-01-22 23:15:00 +00002008<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 +00002009<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2010
2011Given:
2012 class A final {};
2013
2014 struct B {
2015 virtual void f();
2016 };
2017
2018 struct C : B {
2019 void f() final;
2020 };
2021matches A and C::f, but not B, C, or B::f
2022</pre></td></tr>
2023
2024
Aaron Ballman672dde22016-01-22 23:15:00 +00002025<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 +00002026<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2027operator.
2028
2029Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002030struct A {
2031 A &amp;operator=(const A &amp;);
2032 A &amp;operator=(A &amp;&amp;);
2033};
2034
2035cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2036the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002037</pre></td></tr>
2038
2039
Aaron Ballman672dde22016-01-22 23:15:00 +00002040<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 +00002041<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2042
2043Given
2044 class A {
2045 public:
2046 virtual void x();
2047 };
2048 class B : public A {
2049 public:
2050 virtual void x();
2051 };
2052 matches B::x
2053</pre></td></tr>
2054
2055
Aaron Ballman672dde22016-01-22 23:15:00 +00002056<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 +00002057<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2058
2059Given
2060 class A {
2061 public:
2062 virtual void x() = 0;
2063 };
2064 matches A::x
2065</pre></td></tr>
2066
2067
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002068<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>
2069<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2070
2071Given
2072 struct S {
2073 S(); #1
2074 S(const S &amp;) = default; #2
2075 S(S &amp;&amp;) = delete; #3
2076 };
2077cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2078</pre></td></tr>
2079
2080
Aaron Ballman672dde22016-01-22 23:15:00 +00002081<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 +00002082<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2083
2084Given
2085 class A {
2086 public:
2087 virtual void x();
2088 };
2089 matches A::x
2090</pre></td></tr>
2091
Aaron Ballman672dde22016-01-22 23:15:00 +00002092
2093<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 +00002094<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2095
2096Given
2097 class A {
2098 public:
2099 virtual void x();
2100 };
2101 class B : public A {
2102 public:
2103 void x();
2104 };
2105 matches A::x but not B::x
2106</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002107
Aaron Ballman672dde22016-01-22 23:15:00 +00002108
2109<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 +00002110<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2111
2112Matches overloaded operator names specified in strings without the
2113"operator" prefix: e.g. "&lt;&lt;".
2114
2115Given:
2116 class A { int operator*(); };
2117 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2118 A a;
2119 a &lt;&lt; a; &lt;-- This matches
2120
2121cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2122specified line and
2123cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2124matches the declaration of A.
2125
Aaron Ballman672dde22016-01-22 23:15:00 +00002126Usable 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 +00002127</pre></td></tr>
2128
2129
Aaron Ballman672dde22016-01-22 23:15:00 +00002130<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 +00002131<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2132</pre></td></tr>
2133
2134
Aaron Ballman672dde22016-01-22 23:15:00 +00002135<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 +00002136<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2137static member variable template instantiations.
2138
2139Given
2140 template&lt;typename T&gt; void A(T t) { }
2141 template&lt;&gt; void A(int N) { }
2142functionDecl(isExplicitTemplateSpecialization())
2143 matches the specialization A&lt;int&gt;().
2144
Aaron Ballman672dde22016-01-22 23:15:00 +00002145Usable 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 +00002146</pre></td></tr>
2147
2148
Aaron Ballman672dde22016-01-22 23:15:00 +00002149<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 +00002150<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2151
2152Given:
2153 class A final {};
2154
2155 struct B {
2156 virtual void f();
2157 };
2158
2159 struct C : B {
2160 void f() final;
2161 };
2162matches A and C::f, but not B, C, or B::f
2163</pre></td></tr>
2164
2165
Samuel Benzaquen49385c72016-06-28 14:08:56 +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('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2167<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2168
2169Given:
2170 auto x = []{};
2171
2172cxxRecordDecl(isLambda()) matches the implicit class declaration of
2173decltype(x)
2174</pre></td></tr>
2175
2176
Aaron Ballman672dde22016-01-22 23:15:00 +00002177<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 +00002178<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2179isSameOrDerivedFrom(hasName(...)).
2180</pre></td></tr>
2181
2182
Aaron Ballman672dde22016-01-22 23:15:00 +00002183<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 +00002184<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2185member variable template instantiations.
2186
2187Given
2188 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2189or
2190 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2191cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2192 matches the template instantiation of X&lt;A&gt;.
2193
2194But given
2195 template &lt;typename T&gt; class X {}; class A {};
2196 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2197cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2198 does not match, as X&lt;A&gt; is an explicit template specialization.
2199
Aaron Ballman672dde22016-01-22 23:15:00 +00002200Usable 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 +00002201</pre></td></tr>
2202
2203
Aaron Ballman672dde22016-01-22 23:15:00 +00002204<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 +00002205<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2206a specific number of arguments (including absent default arguments).
2207
2208Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2209 void f(int x, int y);
2210 f(0, 0);
2211</pre></td></tr>
2212
2213
Etienne Bergeron75e52722016-05-13 19:36:55 +00002214<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>
2215<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2216
2217Example: matches the implicit cast around 0
2218(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2219 int *p = 0;
2220</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_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 +00002224<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
2225
2226Example matches true (matcher = cxxBoolLiteral(equals(true)))
2227 true
2228
Aaron Ballman672dde22016-01-22 23:15:00 +00002229Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2230 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 +00002231</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_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 +00002235<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2236
2237Given
2238 template&lt;typename T&gt; struct C {};
2239 C&lt;int&gt; c;
2240classTemplateSpecializationDecl(templateArgumentCountIs(1))
2241 matches C&lt;int&gt;.
2242</pre></td></tr>
2243
2244
Aaron Ballman672dde22016-01-22 23:15:00 +00002245<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 +00002246<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2247child statements.
2248
2249Example: Given
2250 { for (;;) {} }
2251compoundStmt(statementCountIs(0)))
2252 matches '{}'
2253 but does not match the outer compound statement.
2254</pre></td></tr>
2255
2256
Aaron Ballman672dde22016-01-22 23:15:00 +00002257<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 +00002258<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002259
2260Given
2261 int a[42];
2262 int b[2 * 21];
2263 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002264 char *s = "abcd";
2265 wchar_t *ws = L"abcd";
2266 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002267constantArrayType(hasSize(42))
2268 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002269stringLiteral(hasSize(4))
2270 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002271</pre></td></tr>
2272
2273
Aaron Ballman672dde22016-01-22 23:15:00 +00002274<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 +00002275<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2276declarations.
2277
2278Example: Given
2279 int a, b;
2280 int c;
2281 int d = 2, e;
2282declCountIs(2)
2283 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2284</pre></td></tr>
2285
2286
Aaron Ballman672dde22016-01-22 23:15:00 +00002287<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 +00002288<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2289
2290Matches a node if it equals the node previously bound to ID.
2291
2292Given
2293 class X { int a; int b; };
2294cxxRecordDecl(
2295 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2296 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2297 matches the class X, as a and b have the same type.
2298
2299Note that when multiple matches are involved via forEach* matchers,
2300equalsBoundNodes acts as a filter.
2301For example:
2302compoundStmt(
2303 forEachDescendant(varDecl().bind("d")),
2304 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2305will trigger a match for each combination of variable declaration
2306and reference to that variable declaration within a compound statement.
2307</pre></td></tr>
2308
2309
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002310<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>
2311<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2312
2313Decl has pointer identity in the AST.
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('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002318<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2319
2320Given
2321 __attribute__((device)) void f() { ... }
2322decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2323f. If the matcher is use from clang-query, attr::Kind parameter should be
2324passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2325</pre></td></tr>
2326
2327
Aaron Ballman672dde22016-01-22 23:15:00 +00002328<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 +00002329<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2330partially matching a given regex.
2331
2332Example matches Y but not X
2333 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2334 #include "ASTMatcher.h"
2335 class X {};
2336ASTMatcher.h:
2337 class Y {};
2338
Aaron Ballman672dde22016-01-22 23:15:00 +00002339Usable 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 +00002340</pre></td></tr>
2341
2342
Aaron Ballman672dde22016-01-22 23:15:00 +00002343<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 +00002344<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2345
2346Example matches X but not Y
2347 (matcher = cxxRecordDecl(isExpansionInMainFile())
2348 #include &lt;Y.h&gt;
2349 class X {};
2350Y.h:
2351 class Y {};
2352
Aaron Ballman672dde22016-01-22 23:15:00 +00002353Usable 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 +00002354</pre></td></tr>
2355
2356
Aaron Ballman672dde22016-01-22 23:15:00 +00002357<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 +00002358<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2359
2360Example matches Y but not X
2361 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2362 #include &lt;SystemHeader.h&gt;
2363 class X {};
2364SystemHeader.h:
2365 class Y {};
2366
Aaron Ballman672dde22016-01-22 23:15:00 +00002367Usable 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 +00002368</pre></td></tr>
2369
2370
Aaron Ballman672dde22016-01-22 23:15:00 +00002371<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 +00002372<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2373by the compiler (eg. implicit defaultcopy constructors).
2374</pre></td></tr>
2375
2376
Aaron Ballman672dde22016-01-22 23:15:00 +00002377<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 +00002378<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2379
2380Given
2381 class C {
2382 public: int a;
2383 protected: int b;
2384 private: int c;
2385 };
2386fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002387 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002388</pre></td></tr>
2389
2390
Aaron Ballman672dde22016-01-22 23:15:00 +00002391<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 +00002392<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2393
2394Given
2395 class C {
2396 public: int a;
2397 protected: int b;
2398 private: int c;
2399 };
2400fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002401 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002402</pre></td></tr>
2403
2404
Aaron Ballman672dde22016-01-22 23:15:00 +00002405<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 +00002406<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2407
2408Given
2409 class C {
2410 public: int a;
2411 protected: int b;
2412 private: int c;
2413 };
2414fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002415 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002416</pre></td></tr>
2417
2418
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002419<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>
2420<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2421a specific number of designators.
2422
2423Example: Given
2424 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2425 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2426designatorCountIs(2)
2427 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2428 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2429</pre></td></tr>
2430
2431
Aaron Ballman5c574342016-07-06 18:25:16 +00002432<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
2433<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields.
2434
2435Given
2436 class C {
2437 int a : 2;
2438 int b : 4;
2439 int c : 2;
2440 };
2441fieldDecl(isBitField())
2442 matches 'int a;' and 'int c;' but not 'int b;'.
2443</pre></td></tr>
2444
2445
2446<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
2447<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2448
2449Given
2450 class C {
2451 int a : 2;
2452 int b;
2453 };
2454fieldDecl(isBitField())
2455 matches 'int a;' but not 'int b;'.
2456</pre></td></tr>
2457
2458
Aaron Ballman672dde22016-01-22 23:15:00 +00002459<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 +00002460<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
2461
2462Example matches true (matcher = cxxBoolLiteral(equals(true)))
2463 true
2464
Aaron Ballman672dde22016-01-22 23:15:00 +00002465Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2466 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 +00002467</pre></td></tr>
2468
2469
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +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('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2471<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2472
2473Given:
2474 void f();
2475 void g() noexcept;
2476 void h() noexcept(true);
2477 void i() noexcept(false);
2478 void j() throw();
2479 void k() throw(int);
2480 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002481functionDecl(hasDynamicExceptionSpec()) and
2482 functionProtoType(hasDynamicExceptionSpec())
2483 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002484</pre></td></tr>
2485
2486
Aaron Ballman672dde22016-01-22 23:15:00 +00002487<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 +00002488<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2489
2490Matches overloaded operator names specified in strings without the
2491"operator" prefix: e.g. "&lt;&lt;".
2492
2493Given:
2494 class A { int operator*(); };
2495 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2496 A a;
2497 a &lt;&lt; a; &lt;-- This matches
2498
2499cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2500specified line and
2501cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2502matches the declaration of A.
2503
Aaron Ballman672dde22016-01-22 23:15:00 +00002504Usable 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 +00002505</pre></td></tr>
2506
2507
Aaron Ballman672dde22016-01-22 23:15:00 +00002508<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 +00002509<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2510
2511Given:
2512 constexpr int foo = 42;
2513 constexpr int bar();
2514varDecl(isConstexpr())
2515 matches the declaration of foo.
2516functionDecl(isConstexpr())
2517 matches the declaration of bar.
2518</pre></td></tr>
2519
2520
Aaron Ballman672dde22016-01-22 23:15:00 +00002521<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 +00002522<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2523
2524Given:
2525 class A { ~A(); };
2526 class B { ~B() = default; };
2527functionDecl(isDefaulted())
2528 matches the declaration of ~B, but not ~A.
2529</pre></td></tr>
2530
2531
Aaron Ballman672dde22016-01-22 23:15:00 +00002532<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 +00002533<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2534
2535Example matches A, va, fa
2536 class A {};
2537 class B; Doesn't match, as it has no body.
2538 int va;
2539 extern int vb; Doesn't match, as it doesn't define the variable.
2540 void fa() {}
2541 void fb(); Doesn't match, as it has no body.
2542
Aaron Ballman672dde22016-01-22 23:15:00 +00002543Usable 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 +00002544</pre></td></tr>
2545
2546
Aaron Ballman672dde22016-01-22 23:15:00 +00002547<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 +00002548<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2549
2550Given:
2551 void Func();
2552 void DeletedFunc() = delete;
2553functionDecl(isDeleted())
2554 matches the declaration of DeletedFunc, but not Func.
2555</pre></td></tr>
2556
2557
Aaron Ballman672dde22016-01-22 23:15:00 +00002558<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 +00002559<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2560static member variable template instantiations.
2561
2562Given
2563 template&lt;typename T&gt; void A(T t) { }
2564 template&lt;&gt; void A(int N) { }
2565functionDecl(isExplicitTemplateSpecialization())
2566 matches the specialization A&lt;int&gt;().
2567
Aaron Ballman672dde22016-01-22 23:15:00 +00002568Usable 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 +00002569</pre></td></tr>
2570
2571
Aaron Ballman672dde22016-01-22 23:15:00 +00002572<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 +00002573<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2574
2575Given:
2576 extern "C" void f() {}
2577 extern "C" { void g() {} }
2578 void h() {}
2579functionDecl(isExternC())
2580 matches the declaration of f and g, but not the declaration h
2581</pre></td></tr>
2582
2583
Aaron Ballman672dde22016-01-22 23:15:00 +00002584<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 +00002585<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2586the inline keyword.
2587
2588Given
2589 inline void f();
2590 void g();
2591 namespace n {
2592 inline namespace m {}
2593 }
2594functionDecl(isInline()) will match ::f().
2595namespaceDecl(isInline()) will match n::m.
2596</pre></td></tr>
2597
2598
Aaron Ballman672dde22016-01-22 23:15:00 +00002599<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 +00002600<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2601
2602Given:
2603 void f();
2604 void g() noexcept;
2605 void h() throw();
2606 void i() throw(int);
2607 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002608functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2609 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002610</pre></td></tr>
2611
2612
Haojian Wub3d25462016-09-26 16:01:52 +00002613<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
Haojian Wu398a8ea2016-09-27 07:53:20 +00002614<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2615class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002616
2617Given:
2618 static void f() {}
2619 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002620 extern int j;
2621 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002622functionDecl(isStaticStorageClass())
2623 matches the function declaration f.
2624varDecl(isStaticStorageClass())
2625 matches the variable declaration i.
2626</pre></td></tr>
2627
2628
Aaron Ballman672dde22016-01-22 23:15:00 +00002629<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 +00002630<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2631member variable template instantiations.
2632
2633Given
2634 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2635or
2636 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2637cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2638 matches the template instantiation of X&lt;A&gt;.
2639
2640But given
2641 template &lt;typename T&gt; class X {}; class A {};
2642 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2643cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2644 does not match, as X&lt;A&gt; is an explicit template specialization.
2645
Aaron Ballman672dde22016-01-22 23:15:00 +00002646Usable 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 +00002647</pre></td></tr>
2648
2649
Aaron Ballman672dde22016-01-22 23:15:00 +00002650<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 +00002651<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2652
2653Example matches f, but not g or h. The function i will not match, even when
2654compiled in C mode.
2655 void f(...);
2656 void g(int);
2657 template &lt;typename... Ts&gt; void h(Ts...);
2658 void i();
2659</pre></td></tr>
2660
2661
Aaron Ballman672dde22016-01-22 23:15:00 +00002662<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 +00002663<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2664specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002665
2666Given
2667 void f(int i) {}
2668 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002669 void h(int i, int j);
2670 void j(int i);
2671 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002672functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002673 matches void g(int i, int j) {}
2674functionProtoType(parameterCountIs(2))
2675 matches void h(int i, int j)
2676functionProtoType(parameterCountIs(3))
2677 matches void k(int x, int y, int z, ...);
2678</pre></td></tr>
2679
2680
Aaron Ballman230ad972016-06-07 17:34:45 +00002681<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>
2682<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2683
2684Given:
2685 void f();
2686 void g() noexcept;
2687 void h() noexcept(true);
2688 void i() noexcept(false);
2689 void j() throw();
2690 void k() throw(int);
2691 void l() throw(...);
2692functionDecl(hasDynamicExceptionSpec()) and
2693 functionProtoType(hasDynamicExceptionSpec())
2694 match the declarations of j, k, and l, but not f, g, h, or i.
2695</pre></td></tr>
2696
2697
2698<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>
2699<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2700
2701Given:
2702 void f();
2703 void g() noexcept;
2704 void h() throw();
2705 void i() throw(int);
2706 void j() noexcept(false);
2707functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2708 match the declarations of g, and h, but not f, i or j.
2709</pre></td></tr>
2710
2711
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002712<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>
2713<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2714specific parameter count.
2715
2716Given
2717 void f(int i) {}
2718 void g(int i, int j) {}
2719 void h(int i, int j);
2720 void j(int i);
2721 void k(int x, int y, int z, ...);
2722functionDecl(parameterCountIs(2))
2723 matches void g(int i, int j) {}
2724functionProtoType(parameterCountIs(2))
2725 matches void h(int i, int j)
2726functionProtoType(parameterCountIs(3))
2727 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002728</pre></td></tr>
2729
2730
Aaron Ballman672dde22016-01-22 23:15:00 +00002731<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 +00002732<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
2733
2734Example matches true (matcher = cxxBoolLiteral(equals(true)))
2735 true
2736
Aaron Ballman672dde22016-01-22 23:15:00 +00002737Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2738 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 +00002739</pre></td></tr>
2740
2741
Aaron Ballman672dde22016-01-22 23:15:00 +00002742<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 +00002743<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2744to '.'.
2745
2746Member calls on the implicit this pointer match as called with '-&gt;'.
2747
2748Given
2749 class Y {
2750 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2751 int a;
2752 static int b;
2753 };
2754memberExpr(isArrow())
2755 matches this-&gt;x, x, y.x, a, this-&gt;b
2756</pre></td></tr>
2757
2758
Aaron Ballmana086b9f2016-08-17 13:10:42 +00002759<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
2760<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2761
2762Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2763void f() {
2764 int x;
2765 static int y;
2766}
2767int z;
2768
2769Example matches f() because it has external formal linkage despite being
2770unique to the translation unit as though it has internal likage
2771(matcher = functionDecl(hasExternalFormalLinkage()))
2772
2773namespace {
2774void f() {}
2775}
2776</pre></td></tr>
2777
2778
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002779<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 +00002780<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2781
2782Supports specifying enclosing namespaces or classes by prefixing the name
2783with '&lt;enclosing&gt;::'.
2784Does not match typedefs of an underlying type with the given name.
2785
2786Example matches X (Name == "X")
2787 class X;
2788
2789Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2790 namespace a { namespace b { class X; } }
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_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 +00002795<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2796a substring matched by the given RegExp.
2797
2798Supports specifying enclosing namespaces or classes by
2799prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2800of an underlying type with the given name.
2801
2802Example matches X (regexp == "::X")
2803 class X;
2804
2805Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2806 namespace foo { namespace bar { class X; } }
2807</pre></td></tr>
2808
2809
Aaron Ballman672dde22016-01-22 23:15:00 +00002810<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 +00002811<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2812
2813Given
2814 namespace n {
2815 namespace {} #1
2816 }
2817namespaceDecl(isAnonymous()) will match #1 but not ::n.
2818</pre></td></tr>
2819
2820
Aaron Ballman672dde22016-01-22 23:15:00 +00002821<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 +00002822<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2823the inline keyword.
2824
2825Given
2826 inline void f();
2827 void g();
2828 namespace n {
2829 inline namespace m {}
2830 }
2831functionDecl(isInline()) will match ::f().
2832namespaceDecl(isInline()) will match n::m.
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_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 +00002837<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
2838a specific number of arguments (including absent default arguments).
2839
2840Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2841 void f(int x, int y);
2842 f(0, 0);
2843</pre></td></tr>
2844
2845
Aaron Ballman672dde22016-01-22 23:15:00 +00002846<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 +00002847<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
2848
2849objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
2850message expression in
2851
2852 UIWebView *webView = ...;
2853 CGRect bodyFrame = webView.frame;
2854 bodyFrame.size.height = self.bodyContentHeight;
2855 webView.frame = bodyFrame;
2856 ^---- matches here
2857</pre></td></tr>
2858
2859
Aaron Ballman672dde22016-01-22 23:15:00 +00002860<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 +00002861<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
2862
2863Matches only when the selector of the objCMessageExpr is NULL. This may
2864represent an error condition in the tree!
2865</pre></td></tr>
2866
2867
Aaron Ballman672dde22016-01-22 23:15:00 +00002868<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 +00002869<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
2870
2871 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
2872 matches the outer message expr in the code below, but NOT the message
2873 invocation for self.bodyView.
2874 [self.bodyView loadHTMLString:html baseURL:NULL];
2875</pre></td></tr>
2876
2877
Aaron Ballman672dde22016-01-22 23:15:00 +00002878<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 +00002879<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
2880
2881 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
2882 matches self.bodyView in the code below, but NOT the outer message
2883 invocation of "loadHTMLString:baseURL:".
2884 [self.bodyView loadHTMLString:html baseURL:NULL];
2885</pre></td></tr>
2886
2887
Aaron Ballman672dde22016-01-22 23:15:00 +00002888<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 +00002889<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
2890a substring matched by the given RegExp.
2891 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
2892 invocation for self.bodyView.
2893 [self.bodyView loadHTMLString:html baseURL:NULL];
2894</pre></td></tr>
2895
2896
Aaron Ballman672dde22016-01-22 23:15:00 +00002897<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 +00002898<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
2899
2900 matcher = objCMessageExpr(numSelectorArgs(0));
2901 matches self.bodyView in the code below
2902
2903 matcher = objCMessageExpr(numSelectorArgs(2));
2904 matches the invocation of "loadHTMLString:baseURL:" but not that
2905 of self.bodyView
2906 [self.bodyView loadHTMLString:html baseURL:NULL];
2907</pre></td></tr>
2908
2909
Aaron Ballman672dde22016-01-22 23:15:00 +00002910<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 +00002911<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
2912
2913Given
2914 class Y { public: void x(); };
2915 void z() { Y* y; y-&gt;x(); }
2916cxxMemberCallExpr(on(hasType(asString("class Y *"))))
2917 matches y-&gt;x()
2918</pre></td></tr>
2919
2920
Aaron Ballman672dde22016-01-22 23:15:00 +00002921<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 +00002922<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
2923
2924Matches a node if it equals the node previously bound to ID.
2925
2926Given
2927 class X { int a; int b; };
2928cxxRecordDecl(
2929 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2930 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2931 matches the class X, as a and b have the same type.
2932
2933Note that when multiple matches are involved via forEach* matchers,
2934equalsBoundNodes acts as a filter.
2935For example:
2936compoundStmt(
2937 forEachDescendant(varDecl().bind("d")),
2938 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2939will trigger a match for each combination of variable declaration
2940and reference to that variable declaration within a compound statement.
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('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002945<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
2946the node, not hidden within a typedef.
2947
2948Given
2949 typedef const int const_int;
2950 const_int i;
2951 int *const j;
2952 int *volatile k;
2953 int m;
2954varDecl(hasType(hasLocalQualifiers())) matches only j and k.
2955i is const-qualified but the qualifier is not local.
2956</pre></td></tr>
2957
2958
Aaron Ballman672dde22016-01-22 23:15:00 +00002959<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 +00002960<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
2961
2962Given
2963 void a(char);
2964 void b(wchar_t);
2965 void c(double);
2966functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
2967matches "a(char)", "b(wchar_t)", but not "c(double)".
2968</pre></td></tr>
2969
2970
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002971<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 +00002972<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
2973the Objective-C object pointer type, which is different despite being
2974syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002975
2976Given
2977 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002978
2979 @interface Foo
2980 @end
2981 Foo *f;
2982
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002983 int j;
2984varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002985 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002986</pre></td></tr>
2987
2988
Aaron Ballman672dde22016-01-22 23:15:00 +00002989<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 +00002990<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2991include "top-level" const.
2992
2993Given
2994 void a(int);
2995 void b(int const);
2996 void c(const int);
2997 void d(const int*);
2998 void e(int const) {};
2999functionDecl(hasAnyParameter(hasType(isConstQualified())))
3000 matches "void b(int const)", "void c(const int)" and
3001 "void e(int const) {}". It does not match d as there
3002 is no top-level const on the parameter type "const int *".
3003</pre></td></tr>
3004
3005
Aaron Ballman672dde22016-01-22 23:15:00 +00003006<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 +00003007<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3008
3009Given
3010 void a(int);
3011 void b(long);
3012 void c(double);
3013functionDecl(hasAnyParameter(hasType(isInteger())))
3014matches "a(int)", "b(long)", but not "c(double)".
3015</pre></td></tr>
3016
3017
Clement Courbet42517592016-07-12 06:36:00 +00003018<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
3019<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3020
3021Given
3022 void a(int);
3023 void b(unsigned long);
3024 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003025functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003026matches "a(int)", but not "b(unsigned long)" and "c(double)".
3027</pre></td></tr>
3028
3029
3030<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
3031<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3032
3033Given
3034 void a(int);
3035 void b(unsigned long);
3036 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003037functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003038matches "b(unsigned long)", but not "a(int)" and "c(double)".
3039</pre></td></tr>
3040
3041
Aaron Ballman672dde22016-01-22 23:15:00 +00003042<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 +00003043<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3044include "top-level" volatile.
3045
3046Given
3047 void a(int);
3048 void b(int volatile);
3049 void c(volatile int);
3050 void d(volatile int*);
3051 void e(int volatile) {};
3052functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3053 matches "void b(int volatile)", "void c(volatile int)" and
3054 "void e(int volatile) {}". It does not match d as there
3055 is no top-level volatile on the parameter type "volatile int *".
3056</pre></td></tr>
3057
3058
Aaron Ballman672dde22016-01-22 23:15:00 +00003059<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 +00003060<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3061
3062Example matches C, but not S or U.
3063 struct S {};
3064 class C {};
3065 union U {};
3066</pre></td></tr>
3067
3068
Aaron Ballman672dde22016-01-22 23:15:00 +00003069<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 +00003070<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3071
3072Example matches S, but not C or U.
3073 struct S {};
3074 class C {};
3075 union U {};
3076</pre></td></tr>
3077
3078
Aaron Ballman672dde22016-01-22 23:15:00 +00003079<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 +00003080<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3081
3082Example matches U, but not C or S.
3083 struct S {};
3084 class C {};
3085 union U {};
3086</pre></td></tr>
3087
3088
Aaron Ballman672dde22016-01-22 23:15:00 +00003089<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 +00003090<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3091
3092Matches a node if it equals the node previously bound to ID.
3093
3094Given
3095 class X { int a; int b; };
3096cxxRecordDecl(
3097 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3098 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3099 matches the class X, as a and b have the same type.
3100
3101Note that when multiple matches are involved via forEach* matchers,
3102equalsBoundNodes acts as a filter.
3103For example:
3104compoundStmt(
3105 forEachDescendant(varDecl().bind("d")),
3106 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3107will trigger a match for each combination of variable declaration
3108and reference to that variable declaration within a compound statement.
3109</pre></td></tr>
3110
3111
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003112<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>
3113<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3114
3115Stmt has pointer identity in the AST.
3116</pre></td></tr>
3117
3118
Aaron Ballman672dde22016-01-22 23:15:00 +00003119<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 +00003120<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3121partially matching a given regex.
3122
3123Example matches Y but not X
3124 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3125 #include "ASTMatcher.h"
3126 class X {};
3127ASTMatcher.h:
3128 class Y {};
3129
Aaron Ballman672dde22016-01-22 23:15:00 +00003130Usable 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 +00003131</pre></td></tr>
3132
3133
Aaron Ballman672dde22016-01-22 23:15:00 +00003134<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 +00003135<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3136
3137Example matches X but not Y
3138 (matcher = cxxRecordDecl(isExpansionInMainFile())
3139 #include &lt;Y.h&gt;
3140 class X {};
3141Y.h:
3142 class Y {};
3143
Aaron Ballman672dde22016-01-22 23:15:00 +00003144Usable 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 +00003145</pre></td></tr>
3146
3147
Aaron Ballman672dde22016-01-22 23:15:00 +00003148<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003149<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3150
3151Example matches Y but not X
3152 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3153 #include &lt;SystemHeader.h&gt;
3154 class X {};
3155SystemHeader.h:
3156 class Y {};
3157
Aaron Ballman672dde22016-01-22 23:15:00 +00003158Usable 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 +00003159</pre></td></tr>
3160
3161
Etienne Bergeron3588be72016-05-12 04:20:04 +00003162<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>
3163<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3164
3165Given
3166 int a[42];
3167 int b[2 * 21];
3168 int c[41], d[43];
3169 char *s = "abcd";
3170 wchar_t *ws = L"abcd";
3171 char *w = "a";
3172constantArrayType(hasSize(42))
3173 matches "int a[42]" and "int b[2 * 21]"
3174stringLiteral(hasSize(4))
3175 matches "abcd", L"abcd"
3176</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_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 +00003180<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3181
3182Example matches A, va, fa
3183 class A {};
3184 class B; Doesn't match, as it has no body.
3185 int va;
3186 extern int vb; Doesn't match, as it doesn't define the variable.
3187 void fa() {}
3188 void fb(); Doesn't match, as it has no body.
3189
Aaron Ballman672dde22016-01-22 23:15:00 +00003190Usable 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 +00003191</pre></td></tr>
3192
3193
Aaron Ballman672dde22016-01-22 23:15:00 +00003194<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 +00003195<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3196
3197Note that 'Value' is a string as the template argument's value is
3198an arbitrary precision integer. 'Value' must be euqal to the canonical
3199representation of that integral value in base 10.
3200
3201Given
3202 template&lt;int T&gt; struct A {};
3203 C&lt;42&gt; c;
3204classTemplateSpecializationDecl(
3205 hasAnyTemplateArgument(equalsIntegralValue("42")))
3206 matches the implicit instantiation of C in C&lt;42&gt;.
3207</pre></td></tr>
3208
3209
Aaron Ballman672dde22016-01-22 23:15:00 +00003210<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 +00003211<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3212
3213Given
3214 template&lt;int T&gt; struct A {};
3215 C&lt;42&gt; c;
3216classTemplateSpecializationDecl(
3217 hasAnyTemplateArgument(isIntegral()))
3218 matches the implicit instantiation of C in C&lt;42&gt;
3219 with isIntegral() matching 42.
3220</pre></td></tr>
3221
3222
Aaron Ballman672dde22016-01-22 23:15:00 +00003223<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 +00003224<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3225
3226Given
3227 template&lt;typename T&gt; struct C {};
3228 C&lt;int&gt; c;
3229classTemplateSpecializationDecl(templateArgumentCountIs(1))
3230 matches C&lt;int&gt;.
3231</pre></td></tr>
3232
3233
Aaron Ballman672dde22016-01-22 23:15:00 +00003234<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 +00003235<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3236partially matching a given regex.
3237
3238Example matches Y but not X
3239 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3240 #include "ASTMatcher.h"
3241 class X {};
3242ASTMatcher.h:
3243 class Y {};
3244
Aaron Ballman672dde22016-01-22 23:15:00 +00003245Usable 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 +00003246</pre></td></tr>
3247
3248
Aaron Ballman672dde22016-01-22 23:15:00 +00003249<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 +00003250<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3251
3252Example matches X but not Y
3253 (matcher = cxxRecordDecl(isExpansionInMainFile())
3254 #include &lt;Y.h&gt;
3255 class X {};
3256Y.h:
3257 class Y {};
3258
Aaron Ballman672dde22016-01-22 23:15:00 +00003259Usable 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 +00003260</pre></td></tr>
3261
3262
Aaron Ballman672dde22016-01-22 23:15:00 +00003263<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 +00003264<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3265
3266Example matches Y but not X
3267 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3268 #include &lt;SystemHeader.h&gt;
3269 class X {};
3270SystemHeader.h:
3271 class Y {};
3272
Aaron Ballman672dde22016-01-22 23:15:00 +00003273Usable 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 +00003274</pre></td></tr>
3275
3276
Aaron Ballman672dde22016-01-22 23:15:00 +00003277<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 +00003278<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3279
3280Given
3281 struct S { bool func(); };
3282functionDecl(returns(booleanType()))
3283 matches "bool func();"
3284</pre></td></tr>
3285
3286
Aaron Ballman672dde22016-01-22 23:15:00 +00003287<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 +00003288<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3289
3290Matches a node if it equals the node previously bound to ID.
3291
3292Given
3293 class X { int a; int b; };
3294cxxRecordDecl(
3295 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3296 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3297 matches the class X, as a and b have the same type.
3298
3299Note that when multiple matches are involved via forEach* matchers,
3300equalsBoundNodes acts as a filter.
3301For example:
3302compoundStmt(
3303 forEachDescendant(varDecl().bind("d")),
3304 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3305will trigger a match for each combination of variable declaration
3306and reference to that variable declaration within a compound statement.
3307</pre></td></tr>
3308
3309
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003310<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>
3311<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3312
3313Type has pointer identity in the AST.
3314</pre></td></tr>
3315
3316
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003317<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>
3318<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3319
3320Given
3321 int i;
3322 float f;
3323realFloatingPointType()
3324 matches "float f" but not "int i"
3325</pre></td></tr>
3326
3327
Aaron Ballman672dde22016-01-22 23:15:00 +00003328<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 +00003329<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3330
3331Given
3332 struct S { void func(); };
3333functionDecl(returns(voidType()))
3334 matches "void func();"
3335</pre></td></tr>
3336
3337
Aaron Ballman672dde22016-01-22 23:15:00 +00003338<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 +00003339<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3340
3341Given
3342 int x;
3343 int s = sizeof(x) + alignof(x)
3344unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3345 matches sizeof(x)
3346</pre></td></tr>
3347
3348
Aaron Ballman672dde22016-01-22 23:15:00 +00003349<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 +00003350<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3351unary).
3352
3353Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3354 !(a || b)
3355</pre></td></tr>
3356
3357
Aaron Ballman672dde22016-01-22 23:15:00 +00003358<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 +00003359<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3360
3361Example matches x, but not y, z, or a.
3362(matcher = varDecl(hasAutomaticStorageDuration())
3363void f() {
3364 int x;
3365 static int y;
3366 thread_local int z;
3367}
3368int a;
3369</pre></td></tr>
3370
3371
Aaron Ballman672dde22016-01-22 23:15:00 +00003372<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 +00003373<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3374
3375Example matches y and z (matcher = varDecl(hasGlobalStorage())
3376void f() {
3377 int x;
3378 static int y;
3379}
3380int z;
3381</pre></td></tr>
3382
3383
Aaron Ballman672dde22016-01-22 23:15:00 +00003384<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 +00003385<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3386non-static local variable.
3387
3388Example matches x (matcher = varDecl(hasLocalStorage())
3389void f() {
3390 int x;
3391 static int y;
3392}
3393int z;
3394</pre></td></tr>
3395
3396
Aaron Ballman672dde22016-01-22 23:15:00 +00003397<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 +00003398<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
Haojian Wu398a8ea2016-09-27 07:53:20 +00003399It includes the variable declared at namespace scope and those declared
3400with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003401
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003402void f() {
3403 int x;
3404 static int y;
3405 thread_local int z;
3406}
3407int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003408static int b;
3409extern int c;
3410varDecl(hasStaticStorageDuration())
3411 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003412</pre></td></tr>
3413
3414
Aaron Ballman672dde22016-01-22 23:15:00 +00003415<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 +00003416<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3417
3418Example matches z, but not x, z, or a.
3419(matcher = varDecl(hasThreadStorageDuration())
3420void f() {
3421 int x;
3422 static int y;
3423 thread_local int z;
3424}
3425int a;
3426</pre></td></tr>
3427
3428
Aaron Ballman672dde22016-01-22 23:15:00 +00003429<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 +00003430<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3431
3432Given:
3433 constexpr int foo = 42;
3434 constexpr int bar();
3435varDecl(isConstexpr())
3436 matches the declaration of foo.
3437functionDecl(isConstexpr())
3438 matches the declaration of bar.
3439</pre></td></tr>
3440
3441
Aaron Ballman672dde22016-01-22 23:15:00 +00003442<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 +00003443<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3444
3445Example matches A, va, fa
3446 class A {};
3447 class B; Doesn't match, as it has no body.
3448 int va;
3449 extern int vb; Doesn't match, as it doesn't define the variable.
3450 void fa() {}
3451 void fb(); Doesn't match, as it has no body.
3452
Aaron Ballman672dde22016-01-22 23:15:00 +00003453Usable 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 +00003454</pre></td></tr>
3455
3456
Aaron Ballman672dde22016-01-22 23:15:00 +00003457<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 +00003458<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3459a C++ catch block, or an Objective-C statement.
3460
3461Example matches x (matcher = varDecl(isExceptionVariable())
3462void f(int y) {
3463 try {
3464 } catch (int x) {
3465 }
3466}
3467</pre></td></tr>
3468
3469
Aaron Ballman672dde22016-01-22 23:15:00 +00003470<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 +00003471<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3472static member variable template instantiations.
3473
3474Given
3475 template&lt;typename T&gt; void A(T t) { }
3476 template&lt;&gt; void A(int N) { }
3477functionDecl(isExplicitTemplateSpecialization())
3478 matches the specialization A&lt;int&gt;().
3479
Aaron Ballman672dde22016-01-22 23:15:00 +00003480Usable 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 +00003481</pre></td></tr>
3482
3483
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003484<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
3485<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations.
3486
3487Given:
3488 extern "C" void f() {}
3489 extern "C" { void g() {} }
3490 void h() {}
3491functionDecl(isExternC())
3492 matches the declaration of f and g, but not the declaration h
3493</pre></td></tr>
3494
3495
Haojian Wub3d25462016-09-26 16:01:52 +00003496<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
Haojian Wu398a8ea2016-09-27 07:53:20 +00003497<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3498class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003499
3500Given:
3501 static void f() {}
3502 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003503 extern int j;
3504 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003505functionDecl(isStaticStorageClass())
3506 matches the function declaration f.
3507varDecl(isStaticStorageClass())
3508 matches the variable declaration i.
3509</pre></td></tr>
3510
3511
Aaron Ballman672dde22016-01-22 23:15:00 +00003512<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 +00003513<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3514member variable template instantiations.
3515
3516Given
3517 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3518or
3519 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3520cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3521 matches the template instantiation of X&lt;A&gt;.
3522
3523But given
3524 template &lt;typename T&gt; class X {}; class A {};
3525 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3526cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3527 does not match, as X&lt;A&gt; is an explicit template specialization.
3528
Aaron Ballman672dde22016-01-22 23:15:00 +00003529Usable 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 +00003530</pre></td></tr>
3531
3532
Aaron Ballman672dde22016-01-22 23:15:00 +00003533<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 +00003534<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3535template instantiations.
3536
3537Given
3538 template&lt;typename T&gt; void A(T t) { T i; }
3539 A(0);
3540 A(0U);
3541functionDecl(isInstantiated())
3542 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3543</pre></td></tr>
3544
3545
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003546<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>
3547<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3548GNU's __null, C++11's nullptr, or C's NULL macro.
3549
3550Given:
3551 void *v1 = NULL;
3552 void *v2 = nullptr;
3553 void *v3 = __null; GNU extension
3554 char *cp = (char *)0;
3555 int *ip = 0;
3556 int i = 0;
3557expr(nullPointerConstant())
3558 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3559 initializer for i.
3560</pre></td></tr>
3561
3562
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003563<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>
3564<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3565
3566This matcher is only provided as a performance optimization of hasName.
3567 hasAnyName(a, b, c)
3568 is equivalent to, but faster than
3569 anyOf(hasName(a), hasName(b), hasName(c))
3570</pre></td></tr>
3571
3572
Aaron Ballman672dde22016-01-22 23:15:00 +00003573<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 +00003574<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3575
3576Given
3577 int j;
3578 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3579 A(0);
3580 A(0U);
3581declStmt(isInTemplateInstantiation())
3582 matches 'int i;' and 'unsigned i'.
3583unless(stmt(isInTemplateInstantiation()))
3584 will NOT match j += 42; as it's shared between the template definition and
3585 instantiation.
3586</pre></td></tr>
3587
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003588<!--END_NARROWING_MATCHERS -->
3589</table>
3590
3591<!-- ======================================================================= -->
3592<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3593<!-- ======================================================================= -->
3594
3595<p>Traversal matchers specify the relationship to other nodes that are
3596reachable from the current node.</p>
3597
3598<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3599forEachDescendant) which work on all nodes and allow users to write more generic
3600match expressions.</p>
3601
3602<table>
3603<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003604<!-- START_TRAVERSAL_MATCHERS -->
3605
3606<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>
3607<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3608
3609Unlike anyOf, eachOf will generate a match result for each
3610matching submatcher.
3611
3612For example, in:
3613 class A { int a; int b; };
3614The matcher:
3615 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3616 has(fieldDecl(hasName("b")).bind("v"))))
3617will generate two results binding "v", the first of which binds
3618the field declaration of a, the second the field declaration of
3619b.
3620
3621Usable as: Any Matcher
3622</pre></td></tr>
3623
3624
3625<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3626<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3627provided matcher.
3628
3629Example matches X, A, B, C
3630 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3631 class X {}; Matches X, because X::X is a class of name X inside X.
3632 class A { class X {}; };
3633 class B { class C { class X {}; }; };
3634
3635DescendantT must be an AST base type.
3636
3637As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3638each result that matches instead of only on the first one.
3639
3640Note: Recursively combined ForEachDescendant can cause many matches:
3641 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3642 forEachDescendant(cxxRecordDecl())
3643 )))
3644will match 10 times (plus injected class name matches) on:
3645 class A { class B { class C { class D { class E {}; }; }; }; };
3646
3647Usable as: Any Matcher
3648</pre></td></tr>
3649
3650
3651<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3652<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3653provided matcher.
3654
3655Example matches X, Y
3656 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3657 class X {}; Matches X, because X::X is a class of name X inside X.
3658 class Y { class X {}; };
3659 class Z { class Y { class X {}; }; }; Does not match Z.
3660
3661ChildT must be an AST base type.
3662
3663As opposed to 'has', 'forEach' will cause a match for each result that
3664matches instead of only on the first one.
3665
3666Usable as: Any Matcher
3667</pre></td></tr>
3668
3669
3670<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3671<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3672matcher.
3673
3674Given
3675void f() { if (true) { int x = 42; } }
3676void g() { for (;;) { int x = 43; } }
3677expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3678
3679Usable as: Any Matcher
3680</pre></td></tr>
3681
3682
3683<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3684<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3685provided matcher.
3686
3687Example matches X, Y, Z
3688 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3689 class X {}; Matches X, because X::X is a class of name X inside X.
3690 class Y { class X {}; };
3691 class Z { class Y { class X {}; }; };
3692
3693DescendantT must be an AST base type.
3694
3695Usable as: Any Matcher
3696</pre></td></tr>
3697
3698
3699<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3700<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3701provided matcher.
3702
3703Example matches X, Y
3704 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3705 class X {}; Matches X, because X::X is a class of name X inside X.
3706 class Y { class X {}; };
3707 class Z { class Y { class X {}; }; }; Does not match Z.
3708
3709ChildT must be an AST base type.
3710
3711Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003712Note that has is direct matcher, so it also matches things like implicit
3713casts and paren casts. If you are matching with expr then you should
3714probably consider using ignoringParenImpCasts like:
3715has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003716</pre></td></tr>
3717
3718
3719<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3720<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3721matcher.
3722
3723Given
3724void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3725compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3726
3727Usable as: Any Matcher
3728</pre></td></tr>
3729
3730
Etienne Bergeron5500f952016-05-30 15:25:25 +00003731<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>
3732<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3733switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003734
3735Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3736 if (true) {}
3737</pre></td></tr>
3738
3739
3740<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>
3741<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3742(binary or ternary).
3743
3744Example matches b
3745 condition ? a : b
3746 condition ?: b
3747</pre></td></tr>
3748
3749
3750<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>
3751<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3752
3753Example 1 (conditional ternary operator): matches a
3754 condition ? a : b
3755
3756Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3757 condition ?: b
3758</pre></td></tr>
3759
3760
Manuel Klimeka37e1102016-12-01 15:45:06 +00003761<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3762<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003763matches the given matcher.
3764
3765The associated declaration is:
3766- for type nodes, the declaration of the underlying type
3767- for CallExpr, the declaration of the callee
3768- for MemberExpr, the declaration of the referenced member
3769- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00003770- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003771
3772Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3773function. e.g. various subtypes of clang::Type and various expressions.
3774
Manuel Klimeka37e1102016-12-01 15:45:06 +00003775Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
3776 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
3777 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
3778 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
3779 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
3780 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3781 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003782</pre></td></tr>
3783
3784
Aaron Ballman672dde22016-01-22 23:15:00 +00003785<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 +00003786<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3787
3788Given
3789 int i[5];
3790 void f() { i[1] = 42; }
3791arraySubscriptExpression(hasBase(implicitCastExpr(
3792 hasSourceExpression(declRefExpr()))))
3793 matches i[1] with the declRefExpr() matching i
3794</pre></td></tr>
3795
3796
Aaron Ballman672dde22016-01-22 23:15:00 +00003797<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 +00003798<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3799
3800Given
3801 int i[5];
3802 void f() { i[1] = 42; }
3803arraySubscriptExpression(hasIndex(integerLiteral()))
3804 matches i[1] with the integerLiteral() matching 1
3805</pre></td></tr>
3806
3807
Aaron Ballman672dde22016-01-22 23:15:00 +00003808<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 +00003809<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
3810
3811Example matches a (matcher = binaryOperator(hasLHS()))
3812 a || b
3813</pre></td></tr>
3814
3815
Aaron Ballman672dde22016-01-22 23:15:00 +00003816<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 +00003817<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
3818
3819Example matches b (matcher = binaryOperator(hasRHS()))
3820 a || b
3821</pre></td></tr>
3822
3823
Aaron Ballman672dde22016-01-22 23:15:00 +00003824<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 +00003825<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
3826type.
3827
3828Given
3829 struct A {};
3830 A a[7];
3831 int b[7];
3832arrayType(hasElementType(builtinType()))
3833 matches "int b[7]"
3834
Aaron Ballman672dde22016-01-22 23:15:00 +00003835Usable 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 +00003836</pre></td></tr>
3837
3838
Aaron Ballman672dde22016-01-22 23:15:00 +00003839<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 +00003840<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
3841type.
3842
3843Given
3844 struct A {};
3845 A a[7];
3846 int b[7];
3847arrayType(hasElementType(builtinType()))
3848 matches "int b[7]"
3849
Aaron Ballman672dde22016-01-22 23:15:00 +00003850Usable 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 +00003851</pre></td></tr>
3852
3853
Aaron Ballman672dde22016-01-22 23:15:00 +00003854<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 +00003855<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
3856
3857Given
3858 _Atomic(int) i;
3859 _Atomic(float) f;
3860atomicType(hasValueType(isInteger()))
3861 matches "_Atomic(int) i"
3862
Aaron Ballman672dde22016-01-22 23:15:00 +00003863Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003864</pre></td></tr>
3865
3866
Aaron Ballman672dde22016-01-22 23:15:00 +00003867<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 +00003868<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
3869
3870Given
3871 _Atomic(int) i;
3872 _Atomic(float) f;
3873atomicType(hasValueType(isInteger()))
3874 matches "_Atomic(int) i"
3875
Aaron Ballman672dde22016-01-22 23:15:00 +00003876Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</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_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 +00003881<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
3882
3883Note: There is no TypeLoc for the deduced type and thus no
3884getDeducedLoc() matcher.
3885
3886Given
3887 auto a = 1;
3888 auto b = 2.0;
3889autoType(hasDeducedType(isInteger()))
3890 matches "auto a"
3891
Aaron Ballman672dde22016-01-22 23:15:00 +00003892Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003893</pre></td></tr>
3894
3895
Aaron Ballman672dde22016-01-22 23:15:00 +00003896<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 +00003897<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
3898binary operator matches.
3899</pre></td></tr>
3900
3901
Aaron Ballman672dde22016-01-22 23:15:00 +00003902<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 +00003903<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
3904
3905Example matches a (matcher = binaryOperator(hasLHS()))
3906 a || b
3907</pre></td></tr>
3908
3909
Aaron Ballman672dde22016-01-22 23:15:00 +00003910<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 +00003911<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
3912
3913Example matches b (matcher = binaryOperator(hasRHS()))
3914 a || b
3915</pre></td></tr>
3916
3917
Aaron Ballman672dde22016-01-22 23:15:00 +00003918<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 +00003919<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3920pointee matches a given matcher.
3921
3922Given
3923 int *a;
3924 int const *b;
3925 float const *f;
3926pointerType(pointee(isConstQualified(), isInteger()))
3927 matches "int const *b"
3928
Aaron Ballman672dde22016-01-22 23:15:00 +00003929Usable 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;,
3930 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 +00003931</pre></td></tr>
3932
3933
Aaron Ballman672dde22016-01-22 23:15:00 +00003934<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 +00003935<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3936pointee matches a given matcher.
3937
3938Given
3939 int *a;
3940 int const *b;
3941 float const *f;
3942pointerType(pointee(isConstQualified(), isInteger()))
3943 matches "int const *b"
3944
Aaron Ballman672dde22016-01-22 23:15:00 +00003945Usable 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;,
3946 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 +00003947</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_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 +00003951<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
3952
3953Given
3954 void f(int i);
3955 int y;
3956 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00003957callExpr(
3958 forEachArgumentWithParam(
3959 declRefExpr(to(varDecl(hasName("y")))),
3960 parmVarDecl(hasType(isInteger()))
3961))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00003962 matches f(y);
3963with declRefExpr(...)
3964 matching int y
3965and parmVarDecl(...)
3966 matching int i
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_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 +00003971<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
3972expression.
3973
3974Given
3975 void x(int, int, int) { int y; x(1, y, 42); }
3976callExpr(hasAnyArgument(declRefExpr()))
3977 matches x(1, y, 42)
3978with hasAnyArgument(...)
3979 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003980</pre></td></tr>
3981
3982
Aaron Ballman672dde22016-01-22 23:15:00 +00003983<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 +00003984<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
3985call expression.
3986
3987Example matches y in x(y)
3988 (matcher = callExpr(hasArgument(0, declRefExpr())))
3989 void x(int) { int y; x(y); }
3990</pre></td></tr>
3991
3992
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003993<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>
3994<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 +00003995matches the given matcher.
3996
3997The associated declaration is:
3998- for type nodes, the declaration of the underlying type
3999- for CallExpr, the declaration of the callee
4000- for MemberExpr, the declaration of the referenced member
4001- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004002- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004003
4004Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4005function. e.g. various subtypes of clang::Type and various expressions.
4006
Manuel Klimeka37e1102016-12-01 15:45:06 +00004007Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
4008 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4009 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4010 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4011 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4012 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4013 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004014</pre></td></tr>
4015
4016
Aaron Ballman672dde22016-01-22 23:15:00 +00004017<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 +00004018<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4019
4020Given
4021 class A { A() : i(42), j(42) {} int i; int j; };
4022cxxConstructorDecl(forEachConstructorInitializer(
4023 forField(decl().bind("x"))
4024))
4025 will trigger two matches, binding for 'i' and 'j' respectively.
4026</pre></td></tr>
4027
4028
Aaron Ballman672dde22016-01-22 23:15:00 +00004029<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 +00004030<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4031
4032Given
4033 struct Foo {
4034 Foo() : foo_(1) { }
4035 int foo_;
4036 };
4037cxxRecordDecl(has(cxxConstructorDecl(
4038 hasAnyConstructorInitializer(anything())
4039)))
4040 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4041</pre></td></tr>
4042
4043
Aaron Ballman672dde22016-01-22 23:15:00 +00004044<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 +00004045<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4046
4047Given
4048 struct Foo {
4049 Foo() : foo_(1) { }
4050 int foo_;
4051 };
4052cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4053 forField(hasName("foo_"))))))
4054 matches Foo
4055with forField matching foo_
4056</pre></td></tr>
4057
4058
Aaron Ballman672dde22016-01-22 23:15:00 +00004059<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 +00004060<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4061
4062Given
4063 struct Foo {
4064 Foo() : foo_(1) { }
4065 int foo_;
4066 };
4067cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4068 withInitializer(integerLiteral(equals(1)))))))
4069 matches Foo
4070with withInitializer matching (1)
4071</pre></td></tr>
4072
4073
Aaron Ballman672dde22016-01-22 23:15:00 +00004074<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 +00004075<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4076definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004077
4078Given
4079 for (;;) {}
4080hasBody(compoundStmt())
4081 matches 'for (;;) {}'
4082with compoundStmt()
4083 matching '{}'
4084</pre></td></tr>
4085
4086
Aaron Ballman672dde22016-01-22 23:15:00 +00004087<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 +00004088<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4089
4090Example:
4091 forStmt(hasLoopVariable(anything()))
4092matches 'int x' in
4093 for (int x : a) { }
4094</pre></td></tr>
4095
4096
Aaron Ballman672dde22016-01-22 23:15:00 +00004097<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 +00004098<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4099
4100Example:
4101 forStmt(hasRangeInit(anything()))
4102matches 'a' in
4103 for (int x : a) { }
4104</pre></td></tr>
4105
4106
Aaron Ballman672dde22016-01-22 23:15:00 +00004107<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 +00004108<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4109
4110
Aaron Ballman672dde22016-01-22 23:15:00 +00004111<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 +00004112<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4113
4114Example matches y.x()
4115 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4116 class Y { public: void x(); };
4117 void z() { Y y; y.x(); }",
4118
4119FIXME: Overload to allow directly matching types?
4120</pre></td></tr>
4121
4122
Aaron Ballman672dde22016-01-22 23:15:00 +00004123<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 +00004124<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4125</pre></td></tr>
4126
4127
Aaron Ballman672dde22016-01-22 23:15:00 +00004128<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 +00004129<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4130matcher, or is a pointer to a type that matches the InnerMatcher.
4131</pre></td></tr>
4132
4133
Clement Courbet6ecaec82016-07-05 07:49:31 +00004134<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>
Haojian Wub3d25462016-09-26 16:01:52 +00004135<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may
Clement Courbet6ecaec82016-07-05 07:49:31 +00004136produce multiple matches.
4137
4138Given
4139 class A { virtual void f(); };
4140 class B : public A { void f(); };
4141 class C : public B { void f(); };
4142cxxMethodDecl(ofClass(hasName("C")),
4143 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4144 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4145 that B::f is not overridden by C::f).
4146
4147The check can produce multiple matches in case of multiple inheritance, e.g.
4148 class A1 { virtual void f(); };
4149 class A2 { virtual void f(); };
4150 class C : public A1, public A2 { void f(); };
4151cxxMethodDecl(ofClass(hasName("C")),
4152 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4153 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4154 once with "b" binding "A2::f" and "d" binding "C::f".
4155</pre></td></tr>
4156
4157
Aaron Ballman672dde22016-01-22 23:15:00 +00004158<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 +00004159<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4160belongs to.
4161
4162FIXME: Generalize this for other kinds of declarations.
4163FIXME: What other kind of declarations would we need to generalize
4164this to?
4165
4166Example matches A() in the last line
4167 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4168 ofClass(hasName("A"))))))
4169 class A {
4170 public:
4171 A();
4172 };
4173 A a = A();
4174</pre></td></tr>
4175
4176
Manuel Klimeka37e1102016-12-01 15:45:06 +00004177<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</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>
4178<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004179matches the given matcher.
4180
4181The associated declaration is:
4182- for type nodes, the declaration of the underlying type
4183- for CallExpr, the declaration of the callee
4184- for MemberExpr, the declaration of the referenced member
4185- for CXXConstructExpr, the declaration of the constructor
4186- for CXXNewExpr, the declaration of the operator new
4187
4188Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4189function. e.g. various subtypes of clang::Type and various expressions.
4190
Manuel Klimeka37e1102016-12-01 15:45:06 +00004191Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
4192 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4193 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4194 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4195 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4196 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4197 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004198</pre></td></tr>
4199
4200
Aaron Ballman672dde22016-01-22 23:15:00 +00004201<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 +00004202<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4203
4204Given:
4205 class A { void func(); };
4206 class B { void member(); };
4207
4208cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4209A but not B.
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_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 +00004214<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4215a class matching Base.
4216
4217Note that a class is not considered to be derived from itself.
4218
4219Example matches Y, Z, C (Base == hasName("X"))
4220 class X;
4221 class Y : public X {}; directly derived
4222 class Z : public Y {}; indirectly derived
4223 typedef X A;
4224 typedef A B;
4225 class C : public B {}; derived from a typedef of X
4226
4227In the following example, Bar matches isDerivedFrom(hasName("X")):
4228 class Foo;
4229 typedef Foo X;
4230 class Bar : public Foo {}; derived from a type that X is a typedef of
4231</pre></td></tr>
4232
4233
Aaron Ballman672dde22016-01-22 23:15:00 +00004234<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 +00004235<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4236match Base.
4237</pre></td></tr>
4238
4239
Aaron Ballman672dde22016-01-22 23:15:00 +00004240<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 +00004241<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4242given matcher.
4243
4244Example matches y.x() (matcher = callExpr(callee(
4245 cxxMethodDecl(hasName("x")))))
4246 class Y { public: void x(); };
4247 void z() { Y y; y.x(); }
4248</pre></td></tr>
4249
4250
Aaron Ballman672dde22016-01-22 23:15:00 +00004251<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 +00004252<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4253
4254Given
4255 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4256 void f() { f(); }
4257callExpr(callee(expr()))
4258 matches this-&gt;x(), x(), y.x(), f()
4259with callee(...)
4260 matching this-&gt;x, x, y.x, f respectively
4261
Aaron Ballman672dde22016-01-22 23:15:00 +00004262Note: 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 +00004263because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004264internal::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 +00004265implemented in terms of implicit casts.
4266</pre></td></tr>
4267
4268
Aaron Ballman672dde22016-01-22 23:15:00 +00004269<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 +00004270<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4271
4272Given
4273 void f(int i);
4274 int y;
4275 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004276callExpr(
4277 forEachArgumentWithParam(
4278 declRefExpr(to(varDecl(hasName("y")))),
4279 parmVarDecl(hasType(isInteger()))
4280))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004281 matches f(y);
4282with declRefExpr(...)
4283 matching int y
4284and parmVarDecl(...)
4285 matching int i
4286</pre></td></tr>
4287
4288
Aaron Ballman672dde22016-01-22 23:15:00 +00004289<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 +00004290<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4291expression.
4292
4293Given
4294 void x(int, int, int) { int y; x(1, y, 42); }
4295callExpr(hasAnyArgument(declRefExpr()))
4296 matches x(1, y, 42)
4297with hasAnyArgument(...)
4298 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004299</pre></td></tr>
4300
4301
Aaron Ballman672dde22016-01-22 23:15:00 +00004302<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 +00004303<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4304call expression.
4305
4306Example matches y in x(y)
4307 (matcher = callExpr(hasArgument(0, declRefExpr())))
4308 void x(int) { int y; x(y); }
4309</pre></td></tr>
4310
4311
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004312<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>
4313<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 +00004314matches the given matcher.
4315
4316The associated declaration is:
4317- for type nodes, the declaration of the underlying type
4318- for CallExpr, the declaration of the callee
4319- for MemberExpr, the declaration of the referenced member
4320- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004321- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004322
4323Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4324function. e.g. various subtypes of clang::Type and various expressions.
4325
Manuel Klimeka37e1102016-12-01 15:45:06 +00004326Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
4327 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4328 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4329 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4330 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4331 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4332 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004333</pre></td></tr>
4334
4335
Aaron Ballman672dde22016-01-22 23:15:00 +00004336<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 +00004337<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4338extension, matches the constant given in the statement.
4339
4340Given
4341 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4342caseStmt(hasCaseConstant(integerLiteral()))
4343 matches "case 1:"
4344</pre></td></tr>
4345
4346
Aaron Ballman672dde22016-01-22 23:15:00 +00004347<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 +00004348<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004349
4350
Aaron Ballman672dde22016-01-22 23:15:00 +00004351<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>
Haojian Wud898b092016-07-29 13:57:27 +00004352<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4353functionDecl that have at least one TemplateArgument matching the given
4354InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004355
4356Given
4357 template&lt;typename T&gt; class A {};
4358 template&lt;&gt; class A&lt;double&gt; {};
4359 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004360
Haojian Wu99e39a72016-07-29 17:30:13 +00004361 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004362 void func() { f&lt;int&gt;(); };
4363
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004364classTemplateSpecializationDecl(hasAnyTemplateArgument(
4365 refersToType(asString("int"))))
4366 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004367
4368functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4369 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004370</pre></td></tr>
4371
4372
Aaron Ballman672dde22016-01-22 23:15:00 +00004373<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>
Haojian Wud898b092016-07-29 13:57:27 +00004374<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4375functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004376
4377Given
4378 template&lt;typename T, typename U&gt; class A {};
4379 A&lt;bool, int&gt; b;
4380 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004381
Haojian Wu99e39a72016-07-29 17:30:13 +00004382 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004383 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004384classTemplateSpecializationDecl(hasTemplateArgument(
4385 1, refersToType(asString("int"))))
4386 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004387
4388functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4389 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004390</pre></td></tr>
4391
4392
Aaron Ballman672dde22016-01-22 23:15:00 +00004393<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 +00004394<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4395type.
4396
4397Given
4398 struct A {};
4399 A a[7];
4400 int b[7];
4401arrayType(hasElementType(builtinType()))
4402 matches "int b[7]"
4403
Aaron Ballman672dde22016-01-22 23:15:00 +00004404Usable 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 +00004405</pre></td></tr>
4406
4407
Aaron Ballman672dde22016-01-22 23:15:00 +00004408<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 +00004409<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4410type.
4411
4412Given
4413 struct A {};
4414 A a[7];
4415 int b[7];
4416arrayType(hasElementType(builtinType()))
4417 matches "int b[7]"
4418
Aaron Ballman672dde22016-01-22 23:15:00 +00004419Usable 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 +00004420</pre></td></tr>
4421
4422
Aaron Ballman672dde22016-01-22 23:15:00 +00004423<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 +00004424<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 +00004425a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004426
4427Given
4428 { {}; 1+2; }
4429hasAnySubstatement(compoundStmt())
4430 matches '{ {}; 1+2; }'
4431with compoundStmt()
4432 matching '{}'
4433</pre></td></tr>
4434
4435
Aaron Ballman672dde22016-01-22 23:15:00 +00004436<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 +00004437<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4438</pre></td></tr>
4439
4440
Manuel Klimeka37e1102016-12-01 15:45:06 +00004441<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</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>
4442<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 +00004443matches the given matcher.
4444
4445The associated declaration is:
4446- for type nodes, the declaration of the underlying type
4447- for CallExpr, the declaration of the callee
4448- for MemberExpr, the declaration of the referenced member
4449- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004450- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004451
4452Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4453function. e.g. various subtypes of clang::Type and various expressions.
4454
Manuel Klimeka37e1102016-12-01 15:45:06 +00004455Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
4456 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4457 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4458 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4459 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4460 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4461 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004462</pre></td></tr>
4463
4464
Aaron Ballman672dde22016-01-22 23:15:00 +00004465<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 +00004466<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4467specific using shadow declaration.
4468
4469Given
4470 namespace a { void f() {} }
4471 using a::f;
4472 void g() {
4473 f(); Matches this ..
4474 a::f(); .. but not this.
4475 }
4476declRefExpr(throughUsingDecl(anything()))
4477 matches f()
4478</pre></td></tr>
4479
4480
Aaron Ballman672dde22016-01-22 23:15:00 +00004481<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 +00004482<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4483specified matcher.
4484
4485Example matches x in if(x)
4486 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4487 bool x;
4488 if (x) {}
4489</pre></td></tr>
4490
4491
Aaron Ballman672dde22016-01-22 23:15:00 +00004492<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 +00004493<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4494
4495Note that this does not work for global declarations because the AST
4496breaks up multiple-declaration DeclStmt's into multiple single-declaration
4497DeclStmt's.
4498Example: Given non-global declarations
4499 int a, b = 0;
4500 int c;
4501 int d = 2, e;
4502declStmt(containsDeclaration(
4503 0, varDecl(hasInitializer(anything()))))
4504 matches only 'int d = 2, e;', and
4505declStmt(containsDeclaration(1, varDecl()))
4506 matches 'int a, b = 0' as well as 'int d = 2, e;'
4507 but 'int c;' is not matched.
4508</pre></td></tr>
4509
4510
Aaron Ballman672dde22016-01-22 23:15:00 +00004511<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 +00004512<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4513
4514Given
4515 int a, b;
4516 int c;
4517declStmt(hasSingleDecl(anything()))
4518 matches 'int c;' but not 'int a, b;'.
4519</pre></td></tr>
4520
4521
Aaron Ballman672dde22016-01-22 23:15:00 +00004522<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 +00004523<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4524the inner matcher.
4525
4526Given
4527 int x;
4528declaratorDecl(hasTypeLoc(loc(asString("int"))))
4529 matches int x
4530</pre></td></tr>
4531
4532
Aaron Ballman672dde22016-01-22 23:15:00 +00004533<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 +00004534<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4535Decl, matches InnerMatcher.
4536
4537Given
4538 namespace N {
4539 namespace M {
4540 class D {};
4541 }
4542 }
4543
4544cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4545declaration of class D.
4546</pre></td></tr>
4547
4548
Aaron Ballman672dde22016-01-22 23:15:00 +00004549<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 +00004550<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4551definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004552
4553Given
4554 for (;;) {}
4555hasBody(compoundStmt())
4556 matches 'for (;;) {}'
4557with compoundStmt()
4558 matching '{}'
4559</pre></td></tr>
4560
4561
Aaron Ballman672dde22016-01-22 23:15:00 +00004562<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 +00004563<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 +00004564switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004565
4566Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4567 if (true) {}
4568</pre></td></tr>
4569
4570
Aaron Ballman672dde22016-01-22 23:15:00 +00004571<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 +00004572<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4573matches InnerMatcher if the qualifier exists.
4574
4575Given
4576 namespace N {
4577 namespace M {
4578 class D {};
4579 }
4580 }
4581 N::M::D d;
4582
4583elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4584matches the type of the variable declaration of d.
4585</pre></td></tr>
4586
4587
Aaron Ballman672dde22016-01-22 23:15:00 +00004588<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 +00004589<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4590
4591Given
4592 namespace N {
4593 namespace M {
4594 class D {};
4595 }
4596 }
4597 N::M::D d;
4598
4599elaboratedType(namesType(recordType(
4600hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4601declaration of d.
4602</pre></td></tr>
4603
4604
Manuel Klimeka37e1102016-12-01 15:45:06 +00004605<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</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>
4606<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004607matches the given matcher.
4608
4609The associated declaration is:
4610- for type nodes, the declaration of the underlying type
4611- for CallExpr, the declaration of the callee
4612- for MemberExpr, the declaration of the referenced member
4613- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004614- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004615
4616Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4617function. e.g. various subtypes of clang::Type and various expressions.
4618
Manuel Klimeka37e1102016-12-01 15:45:06 +00004619Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
4620 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4621 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4622 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4623 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4624 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4625 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004626</pre></td></tr>
4627
4628
Aaron Ballman672dde22016-01-22 23:15:00 +00004629<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 +00004630<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4631
4632(Note: Clang's AST refers to other conversions as "casts" too, and calls
4633actual casts "explicit" casts.)
4634</pre></td></tr>
4635
4636
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004637<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>
4638<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 +00004639declaration's type.
4640
4641In case of a value declaration (for example a variable declaration),
4642this resolves one layer of indirection. For example, in the value
4643declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4644X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4645declaration of x.
4646
4647Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4648 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4649 class X {};
4650 void y(X &amp;x) { x; X z; }
4651
Aaron Ballman672dde22016-01-22 23:15:00 +00004652Usable 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 +00004653</pre></td></tr>
4654
4655
Aaron Ballman672dde22016-01-22 23:15:00 +00004656<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 +00004657<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4658matcher.
4659
4660Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4661 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004662 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004663 class X {};
4664 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004665 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004666</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_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 +00004670<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4671are stripped off.
4672
4673Parentheses and explicit casts are not discarded.
4674Given
4675 int arr[5];
4676 int a = 0;
4677 char b = 0;
4678 const int c = a;
4679 int *d = arr;
4680 long e = (long) 0l;
4681The matchers
4682 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4683 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4684would match the declarations for a, b, c, and d, but not e.
4685While
4686 varDecl(hasInitializer(integerLiteral()))
4687 varDecl(hasInitializer(declRefExpr()))
4688only match the declarations for b, c, and d.
4689</pre></td></tr>
4690
4691
Cong Liu8a02efb2016-06-24 09:38:03 +00004692<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>
4693<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4694nodes are stripped off.
4695
4696Parentheses and explicit casts are not discarded.
4697Given
4698 class C {};
4699 C a = C();
4700 C b;
4701 C c = b;
4702The matchers
4703 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4704would match the declarations for a, b, and c.
4705While
4706 varDecl(hasInitializer(cxxConstructExpr()))
4707only match the declarations for b and c.
4708</pre></td></tr>
4709
4710
Aaron Ballman672dde22016-01-22 23:15:00 +00004711<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 +00004712<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4713casts are stripped off.
4714
4715Implicit and non-C Style casts are also discarded.
4716Given
4717 int a = 0;
4718 char b = (0);
4719 void* c = reinterpret_cast&lt;char*&gt;(0);
4720 char d = char(0);
4721The matcher
4722 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4723would match the declarations for a, b, c, and d.
4724while
4725 varDecl(hasInitializer(integerLiteral()))
4726only match the declaration for a.
4727</pre></td></tr>
4728
4729
Aaron Ballman672dde22016-01-22 23:15:00 +00004730<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 +00004731<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4732parentheses are stripped off.
4733
4734Explicit casts are not discarded.
4735Given
4736 int arr[5];
4737 int a = 0;
4738 char b = (0);
4739 const int c = a;
4740 int *d = (arr);
4741 long e = ((long) 0l);
4742The matchers
4743 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4744 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4745would match the declarations for a, b, c, and d, but not e.
4746while
4747 varDecl(hasInitializer(integerLiteral()))
4748 varDecl(hasInitializer(declRefExpr()))
4749would only match the declaration for a.
4750</pre></td></tr>
4751
4752
Aaron Ballman672dde22016-01-22 23:15:00 +00004753<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 +00004754<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4755definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004756
4757Given
4758 for (;;) {}
4759hasBody(compoundStmt())
4760 matches 'for (;;) {}'
4761with compoundStmt()
4762 matching '{}'
4763</pre></td></tr>
4764
4765
Aaron Ballman672dde22016-01-22 23:15:00 +00004766<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 +00004767<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 +00004768switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004769
4770Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4771 if (true) {}
4772</pre></td></tr>
4773
4774
Aaron Ballman672dde22016-01-22 23:15:00 +00004775<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 +00004776<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4777
4778Example:
4779 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4780matches '++x' in
4781 for (x; x &lt; N; ++x) { }
4782</pre></td></tr>
4783
4784
Aaron Ballman672dde22016-01-22 23:15:00 +00004785<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 +00004786<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
4787
4788Example:
4789 forStmt(hasLoopInit(declStmt()))
4790matches 'int x = 0' in
4791 for (int x = 0; x &lt; N; ++x) { }
4792</pre></td></tr>
4793
4794
Aaron Ballman672dde22016-01-22 23:15:00 +00004795<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 +00004796<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
4797
4798Does not match the 'this' parameter of a method.
4799
4800Given
4801 class X { void f(int x, int y, int z) {} };
4802cxxMethodDecl(hasAnyParameter(hasName("y")))
4803 matches f(int x, int y, int z) {}
4804with hasAnyParameter(...)
4805 matching int y
4806</pre></td></tr>
4807
4808
Haojian Wud898b092016-07-29 13:57:27 +00004809<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
4810<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4811functionDecl that have at least one TemplateArgument matching the given
4812InnerMatcher.
4813
4814Given
4815 template&lt;typename T&gt; class A {};
4816 template&lt;&gt; class A&lt;double&gt; {};
4817 A&lt;int&gt; a;
4818
Haojian Wu99e39a72016-07-29 17:30:13 +00004819 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004820 void func() { f&lt;int&gt;(); };
4821
4822classTemplateSpecializationDecl(hasAnyTemplateArgument(
4823 refersToType(asString("int"))))
4824 matches the specialization A&lt;int&gt;
4825
4826functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4827 matches the specialization f&lt;int&gt;
4828</pre></td></tr>
4829
4830
Aaron Ballman672dde22016-01-22 23:15:00 +00004831<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 +00004832<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
4833definition that has a given body.
4834
4835Given
4836 for (;;) {}
4837hasBody(compoundStmt())
4838 matches 'for (;;) {}'
4839with compoundStmt()
4840 matching '{}'
4841</pre></td></tr>
4842
4843
Aaron Ballman672dde22016-01-22 23:15:00 +00004844<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 +00004845<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
4846
4847Given
4848 class X { void f(int x) {} };
4849cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4850 matches f(int x) {}
4851with hasParameter(...)
4852 matching int x
4853</pre></td></tr>
4854
4855
Haojian Wud898b092016-07-29 13:57:27 +00004856<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">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>
4857<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4858functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
4859
4860Given
4861 template&lt;typename T, typename U&gt; class A {};
4862 A&lt;bool, int&gt; b;
4863 A&lt;int, bool&gt; c;
4864
Haojian Wu99e39a72016-07-29 17:30:13 +00004865 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004866 void func() { f&lt;int&gt;(); };
4867classTemplateSpecializationDecl(hasTemplateArgument(
4868 1, refersToType(asString("int"))))
4869 matches the specialization A&lt;bool, int&gt;
4870
4871functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4872 matches the specialization f&lt;int&gt;
4873</pre></td></tr>
4874
4875
Aaron Ballman672dde22016-01-22 23:15:00 +00004876<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 +00004877<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
4878
4879Given:
4880 class X { int f() { return 1; } };
4881cxxMethodDecl(returns(asString("int")))
4882 matches int f() { return 1; }
4883</pre></td></tr>
4884
4885
Aaron Ballman672dde22016-01-22 23:15:00 +00004886<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 +00004887<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 +00004888switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004889
4890Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4891 if (true) {}
4892</pre></td></tr>
4893
4894
Aaron Ballman672dde22016-01-22 23:15:00 +00004895<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 +00004896<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
4897
4898Given
4899 if (A* a = GetAPointer()) {}
4900hasConditionVariableStatement(...)
4901 matches 'A* a = GetAPointer()'.
4902</pre></td></tr>
4903
4904
Aaron Ballman672dde22016-01-22 23:15:00 +00004905<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 +00004906<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
4907
4908Examples matches the if statement
4909 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
4910 if (false) false; else true;
4911</pre></td></tr>
4912
4913
Aaron Ballman672dde22016-01-22 23:15:00 +00004914<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 +00004915<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
4916
4917Examples matches the if statement
4918 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
4919 if (false) true; else false;
4920</pre></td></tr>
4921
4922
Aaron Ballman672dde22016-01-22 23:15:00 +00004923<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 +00004924<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
4925matcher.
4926
4927FIXME: Unit test this matcher
4928</pre></td></tr>
4929
4930
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004931<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>
4932<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
4933(if expression have it).
4934</pre></td></tr>
4935
4936
Manuel Klimeka37e1102016-12-01 15:45:06 +00004937<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</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 +00004938<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
4939matches the given matcher.
4940
4941The associated declaration is:
4942- for type nodes, the declaration of the underlying type
4943- for CallExpr, the declaration of the callee
4944- for MemberExpr, the declaration of the referenced member
4945- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004946- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004947
4948Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4949function. e.g. various subtypes of clang::Type and various expressions.
4950
Manuel Klimeka37e1102016-12-01 15:45:06 +00004951Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
4952 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4953 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4954 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4955 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4956 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4957 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4958</pre></td></tr>
4959
4960
4961<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</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>
4962<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
4963matches the given matcher.
4964
4965The associated declaration is:
4966- for type nodes, the declaration of the underlying type
4967- for CallExpr, the declaration of the callee
4968- for MemberExpr, the declaration of the referenced member
4969- for CXXConstructExpr, the declaration of the constructor
4970- for CXXNewExpr, the declaration of the operator new
4971
4972Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4973function. e.g. various subtypes of clang::Type and various expressions.
4974
4975Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
4976 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4977 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4978 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4979 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4980 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4981 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004982</pre></td></tr>
4983
4984
Aaron Ballman672dde22016-01-22 23:15:00 +00004985<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 +00004986<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
4987matches the given matcher.
4988
4989The associated declaration is:
4990- for type nodes, the declaration of the underlying type
4991- for CallExpr, the declaration of the callee
4992- for MemberExpr, the declaration of the referenced member
4993- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004994- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004995
4996Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4997function. e.g. various subtypes of clang::Type and various expressions.
4998
Manuel Klimeka37e1102016-12-01 15:45:06 +00004999Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5000 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5001 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5002 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5003 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5004 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5005 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005006</pre></td></tr>
5007
5008
Aaron Ballman672dde22016-01-22 23:15:00 +00005009<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 +00005010<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5011matched by a given matcher.
5012
5013Given
5014 struct X { int m; };
5015 void f(X x) { x.m; m; }
5016memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5017 matches "x.m" and "m"
5018with hasObjectExpression(...)
5019 matching "x" and the implicit object expression of "m" which has type X*.
5020</pre></td></tr>
5021
5022
Aaron Ballman672dde22016-01-22 23:15:00 +00005023<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 +00005024<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5025given matcher.
5026
5027Given
5028 struct { int first, second; } first, second;
5029 int i(second.first);
5030 int j(first.second);
5031memberExpr(member(hasName("first")))
5032 matches second.first
5033 but not first.second (because the member name there is "second").
5034</pre></td></tr>
5035
5036
Aaron Ballman672dde22016-01-22 23:15:00 +00005037<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 +00005038<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5039pointee matches a given matcher.
5040
5041Given
5042 int *a;
5043 int const *b;
5044 float const *f;
5045pointerType(pointee(isConstQualified(), isInteger()))
5046 matches "int const *b"
5047
Aaron Ballman672dde22016-01-22 23:15:00 +00005048Usable 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;,
5049 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 +00005050</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_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 +00005054<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5055pointee matches a given matcher.
5056
5057Given
5058 int *a;
5059 int const *b;
5060 float const *f;
5061pointerType(pointee(isConstQualified(), isInteger()))
5062 matches "int const *b"
5063
Aaron Ballman672dde22016-01-22 23:15:00 +00005064Usable 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;,
5065 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 +00005066</pre></td></tr>
5067
5068
Martin Bohme8cef2c22016-08-09 15:07:52 +00005069<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
5070<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5071matcher.
5072
5073Given
5074 namespace N { template&lt;class T&gt; void f(T t); }
5075 template &lt;class T&gt; void g() { using N::f; f(T()); }
5076unresolvedLookupExpr(hasAnyDeclaration(
5077 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5078 matches the use of f in g() .
5079</pre></td></tr>
5080
5081
Aaron Ballman672dde22016-01-22 23:15:00 +00005082<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 +00005083<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5084
5085Given
5086 struct A { struct B { struct C {}; }; };
5087 A::B::C c;
5088nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5089 matches "A::"
5090</pre></td></tr>
5091
5092
Aaron Ballman672dde22016-01-22 23:15:00 +00005093<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 +00005094<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5095given TypeLoc.
5096
5097Given
5098 struct A { struct B { struct C {}; }; };
5099 A::B::C c;
5100nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5101 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5102 matches "A::"
5103</pre></td></tr>
5104
5105
Aaron Ballman672dde22016-01-22 23:15:00 +00005106<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 +00005107<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5108
5109Given
5110 struct A { struct B { struct C {}; }; };
5111 A::B::C c;
5112nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5113 matches "A::"
5114</pre></td></tr>
5115
5116
Aaron Ballman672dde22016-01-22 23:15:00 +00005117<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 +00005118<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5119given namespace matcher.
5120
5121Given
5122 namespace ns { struct A {}; }
5123 ns::A a;
5124nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5125 matches "ns::"
5126</pre></td></tr>
5127
5128
Aaron Ballman672dde22016-01-22 23:15:00 +00005129<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 +00005130<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5131given QualType matcher without qualifiers.
5132
5133Given
5134 struct A { struct B { struct C {}; }; };
5135 A::B::C c;
5136nestedNameSpecifier(specifiesType(
5137 hasDeclaration(cxxRecordDecl(hasName("A")))
5138))
5139 matches "A::"
5140</pre></td></tr>
5141
5142
Aaron Ballman672dde22016-01-22 23:15:00 +00005143<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 +00005144<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5145call expression.
5146
5147Example matches y in x(y)
5148 (matcher = callExpr(hasArgument(0, declRefExpr())))
5149 void x(int) { int y; x(y); }
5150</pre></td></tr>
5151
5152
Aaron Ballman672dde22016-01-22 23:15:00 +00005153<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 +00005154<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5155
5156Example
5157matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *")));
5158matches the [webView ...] message invocation.
5159 NSString *webViewJavaScript = ...
5160 UIWebView *webView = ...
5161 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5162</pre></td></tr>
5163
5164
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005165<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>
5166<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5167
5168
Martin Bohme8cef2c22016-08-09 15:07:52 +00005169<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5170<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5171overloads matches the given matcher.
5172
5173Given
5174 template &lt;typename T&gt; void foo(T);
5175 template &lt;typename T&gt; void bar(T);
5176 template &lt;typename T&gt; void baz(T t) {
5177 foo(t);
5178 bar(t);
5179 }
5180unresolvedLookupExpr(hasAnyDeclaration(
5181 functionTemplateDecl(hasName("foo"))))
5182 matches foo in foo(t); but not bar in bar(t);
5183</pre></td></tr>
5184
5185
Aaron Ballman672dde22016-01-22 23:15:00 +00005186<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 +00005187<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5188
5189Given
5190 int (*ptr_to_array)[4];
5191 int (*ptr_to_func)(int);
5192
5193varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5194ptr_to_func but not ptr_to_array.
5195
Aaron Ballman672dde22016-01-22 23:15:00 +00005196Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005197</pre></td></tr>
5198
5199
Aaron Ballman672dde22016-01-22 23:15:00 +00005200<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 +00005201<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5202pointee matches a given matcher.
5203
5204Given
5205 int *a;
5206 int const *b;
5207 float const *f;
5208pointerType(pointee(isConstQualified(), isInteger()))
5209 matches "int const *b"
5210
Aaron Ballman672dde22016-01-22 23:15:00 +00005211Usable 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;,
5212 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 +00005213</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_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 +00005217<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5218pointee matches a given matcher.
5219
5220Given
5221 int *a;
5222 int const *b;
5223 float const *f;
5224pointerType(pointee(isConstQualified(), isInteger()))
5225 matches "int const *b"
5226
Aaron Ballman672dde22016-01-22 23:15:00 +00005227Usable 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;,
5228 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 +00005229</pre></td></tr>
5230
5231
Aaron Ballman672dde22016-01-22 23:15:00 +00005232<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 +00005233<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5234
5235Given:
5236 typedef int &amp;int_ref;
5237 int a;
5238 int_ref b = a;
5239
5240varDecl(hasType(qualType(referenceType()))))) will not match the
5241declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5242</pre></td></tr>
5243
5244
Aaron Ballman672dde22016-01-22 23:15:00 +00005245<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 +00005246<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5247matches the given matcher.
5248
5249The associated declaration is:
5250- for type nodes, the declaration of the underlying type
5251- for CallExpr, the declaration of the callee
5252- for MemberExpr, the declaration of the referenced member
5253- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005254- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005255
5256Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5257function. e.g. various subtypes of clang::Type and various expressions.
5258
Manuel Klimeka37e1102016-12-01 15:45:06 +00005259Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5260 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5261 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5262 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5263 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5264 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5265 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005266</pre></td></tr>
5267
5268
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005269<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>
5270<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5271
5272Given
5273 void (*fp)(void);
5274The matcher
5275 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5276would match the declaration for fp.
5277</pre></td></tr>
5278
5279
Aaron Ballman672dde22016-01-22 23:15:00 +00005280<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 +00005281<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5282</pre></td></tr>
5283
5284
Aaron Ballman672dde22016-01-22 23:15:00 +00005285<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 +00005286<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5287matches the specified matcher.
5288
5289Example matches y-&gt;x()
5290 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5291 cxxRecordDecl(hasName("Y")))))))
5292 class Y { public: void x(); };
5293 void z() { Y *y; y-&gt;x(); }
5294</pre></td></tr>
5295
5296
Aaron Ballman672dde22016-01-22 23:15:00 +00005297<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 +00005298<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5299</pre></td></tr>
5300
5301
Aaron Ballman672dde22016-01-22 23:15:00 +00005302<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 +00005303<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5304type matches the specified matcher.
5305
5306Example matches X &amp;x and const X &amp;y
5307 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5308 class X {
5309 void a(X b) {
5310 X &amp;x = b;
5311 const X &amp;y = b;
5312 }
5313 };
5314</pre></td></tr>
5315
5316
Aaron Ballman672dde22016-01-22 23:15:00 +00005317<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 +00005318<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5319matches the given matcher.
5320
5321The associated declaration is:
5322- for type nodes, the declaration of the underlying type
5323- for CallExpr, the declaration of the callee
5324- for MemberExpr, the declaration of the referenced member
5325- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005326- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005327
5328Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5329function. e.g. various subtypes of clang::Type and various expressions.
5330
Manuel Klimeka37e1102016-12-01 15:45:06 +00005331Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5332 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5333 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5334 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5335 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5336 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5337 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005338</pre></td></tr>
5339
5340
Aaron Ballman672dde22016-01-22 23:15:00 +00005341<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 +00005342<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5343pointee matches a given matcher.
5344
5345Given
5346 int *a;
5347 int const *b;
5348 float const *f;
5349pointerType(pointee(isConstQualified(), isInteger()))
5350 matches "int const *b"
5351
Aaron Ballman672dde22016-01-22 23:15:00 +00005352Usable 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;,
5353 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 +00005354</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_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 +00005358<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5359pointee matches a given matcher.
5360
5361Given
5362 int *a;
5363 int const *b;
5364 float const *f;
5365pointerType(pointee(isConstQualified(), isInteger()))
5366 matches "int const *b"
5367
Aaron Ballman672dde22016-01-22 23:15:00 +00005368Usable 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;,
5369 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 +00005370</pre></td></tr>
5371
5372
Alexander Kornienko976921d2016-03-22 11:03:03 +00005373<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>
5374<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5375
5376Given
5377 return a + b;
5378hasReturnValue(binaryOperator())
5379 matches 'return a + b'
5380with binaryOperator()
5381 matching 'a + b'
5382</pre></td></tr>
5383
5384
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005385<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>
5386<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5387a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5388
5389Given
5390 { {}; 1+2; }
5391hasAnySubstatement(compoundStmt())
5392 matches '{ {}; 1+2; }'
5393with compoundStmt()
5394 matching '{}'
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_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 +00005399<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5400alignof.
5401</pre></td></tr>
5402
5403
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005404<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>
5405<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statemenet belongs to
5406
5407Given:
5408F&amp; operator=(const F&amp; o) {
5409 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5410 return *this;
5411}
5412returnStmt(forFunction(hasName("operator=")))
5413 matches 'return *this'
5414 but does match 'return &gt; 0'
5415</pre></td></tr>
5416
5417
Aaron Ballman672dde22016-01-22 23:15:00 +00005418<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 +00005419<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5420sizeof.
5421</pre></td></tr>
5422
5423
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005424<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5425<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5426type that matches the provided matcher.
5427
5428Given
5429 template &lt;typename T&gt;
5430 double F(T t);
5431 int i;
5432 double j = F(i);
5433
5434substTemplateTypeParmType(hasReplacementType(type())) matches int
5435</pre></td></tr>
5436
5437
Aaron Ballman672dde22016-01-22 23:15:00 +00005438<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 +00005439<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5440statement. This matcher may produce multiple matches.
5441
5442Given
5443 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5444switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5445 matches four times, with "c" binding each of "case 1:", "case 2:",
5446"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5447"switch (1)", "switch (2)" and "switch (2)".
5448</pre></td></tr>
5449
5450
Etienne Bergeron5500f952016-05-30 15:25:25 +00005451<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>
5452<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5453switch statement or conditional operator.
5454
5455Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5456 if (true) {}
5457</pre></td></tr>
5458
5459
Aaron Ballman672dde22016-01-22 23:15:00 +00005460<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 +00005461<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5462matches the given matcher.
5463
5464The associated declaration is:
5465- for type nodes, the declaration of the underlying type
5466- for CallExpr, the declaration of the callee
5467- for MemberExpr, the declaration of the referenced member
5468- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005469- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005470
5471Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5472function. e.g. various subtypes of clang::Type and various expressions.
5473
Manuel Klimeka37e1102016-12-01 15:45:06 +00005474Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5475 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5476 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5477 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5478 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5479 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5480 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005481</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_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 +00005485<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5486
5487Given
5488 template&lt;typename T&gt; struct A {};
5489 struct B { B* next; };
5490 A&lt;&amp;B::next&gt; a;
5491templateSpecializationType(hasAnyTemplateArgument(
5492 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5493 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5494 B::next
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_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 +00005499<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5500declaration.
5501
5502Given
5503 template&lt;typename T&gt; struct A {};
5504 struct B { B* next; };
5505 A&lt;&amp;B::next&gt; a;
5506classTemplateSpecializationDecl(hasAnyTemplateArgument(
5507 refersToDeclaration(fieldDecl(hasName("next"))))
5508 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5509 B::next
5510</pre></td></tr>
5511
5512
Aaron Ballman672dde22016-01-22 23:15:00 +00005513<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 +00005514<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5515
5516Given
5517 template&lt;int T&gt; struct A {};
5518 C&lt;42&gt; c;
5519classTemplateSpecializationDecl(
5520 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5521 matches the implicit instantiation of C in C&lt;42&gt;.
5522</pre></td></tr>
5523
5524
Haojian Wub33b02e2016-07-29 15:45:11 +00005525<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
5526<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5527
5528Given
5529 template&lt;template &lt;typename&gt; class S&gt; class X {};
5530 template&lt;typename T&gt; class Y {};"
5531 X&lt;Y&gt; xi;
5532classTemplateSpecializationDecl(hasAnyTemplateArgument(
5533 refersToTemplate(templateName())))
5534 matches the specialization X&lt;Y&gt;
5535</pre></td></tr>
5536
5537
Aaron Ballman672dde22016-01-22 23:15:00 +00005538<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 +00005539<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5540
5541Given
5542 struct X {};
5543 template&lt;typename T&gt; struct A {};
5544 A&lt;X&gt; a;
5545classTemplateSpecializationDecl(hasAnyTemplateArgument(
5546 refersToType(class(hasName("X")))))
5547 matches the specialization A&lt;X&gt;
5548</pre></td></tr>
5549
5550
Aaron Ballman672dde22016-01-22 23:15:00 +00005551<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>
Haojian Wud898b092016-07-29 13:57:27 +00005552<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5553functionDecl that have at least one TemplateArgument matching the given
5554InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005555
5556Given
5557 template&lt;typename T&gt; class A {};
5558 template&lt;&gt; class A&lt;double&gt; {};
5559 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005560
Haojian Wu99e39a72016-07-29 17:30:13 +00005561 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005562 void func() { f&lt;int&gt;(); };
5563
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005564classTemplateSpecializationDecl(hasAnyTemplateArgument(
5565 refersToType(asString("int"))))
5566 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005567
5568functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5569 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005570</pre></td></tr>
5571
5572
Aaron Ballman672dde22016-01-22 23:15:00 +00005573<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 +00005574<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5575matches the given matcher.
5576
5577The associated declaration is:
5578- for type nodes, the declaration of the underlying type
5579- for CallExpr, the declaration of the callee
5580- for MemberExpr, the declaration of the referenced member
5581- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005582- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005583
5584Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5585function. e.g. various subtypes of clang::Type and various expressions.
5586
Manuel Klimeka37e1102016-12-01 15:45:06 +00005587Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5588 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5589 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5590 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5591 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5592 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5593 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005594</pre></td></tr>
5595
5596
Aaron Ballman672dde22016-01-22 23:15:00 +00005597<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>
Haojian Wud898b092016-07-29 13:57:27 +00005598<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5599functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005600
5601Given
5602 template&lt;typename T, typename U&gt; class A {};
5603 A&lt;bool, int&gt; b;
5604 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005605
Haojian Wu99e39a72016-07-29 17:30:13 +00005606 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005607 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005608classTemplateSpecializationDecl(hasTemplateArgument(
5609 1, refersToType(asString("int"))))
5610 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005611
5612functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5613 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005614</pre></td></tr>
5615
5616
Aaron Ballman672dde22016-01-22 23:15:00 +00005617<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 +00005618<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5619matches the given matcher.
5620
5621The associated declaration is:
5622- for type nodes, the declaration of the underlying type
5623- for CallExpr, the declaration of the callee
5624- for MemberExpr, the declaration of the referenced member
5625- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005626- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005627
5628Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5629function. e.g. various subtypes of clang::Type and various expressions.
5630
Manuel Klimeka37e1102016-12-01 15:45:06 +00005631Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5632 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5633 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5634 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5635 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5636 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5637 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005638</pre></td></tr>
5639
5640
5641<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>
5642<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5643
5644Generates results for each match.
5645
5646For example, in:
5647 class A { class B {}; class C {}; };
5648The matcher:
5649 cxxRecordDecl(hasName("::A"),
5650 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5651will generate results for A, B and C.
5652
5653Usable as: Any Matcher
5654</pre></td></tr>
5655
5656
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005657<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 +00005658<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5659matcher.
5660
5661Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5662 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5663 and U (matcher = typedefDecl(hasType(asString("int")))
5664 class X {};
5665 void y(X &amp;x) { x; X z; }
5666 typedef int U;
5667</pre></td></tr>
5668
5669
Aaron Ballman672dde22016-01-22 23:15:00 +00005670<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 +00005671<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5672matches the given matcher.
5673
5674The associated declaration is:
5675- for type nodes, the declaration of the underlying type
5676- for CallExpr, the declaration of the callee
5677- for MemberExpr, the declaration of the referenced member
5678- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005679- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005680
5681Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5682function. e.g. various subtypes of clang::Type and various expressions.
5683
Manuel Klimeka37e1102016-12-01 15:45:06 +00005684Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5685 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5686 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5687 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5688 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5689 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5690 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5691</pre></td></tr>
5692
5693
5694<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
5695<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5696type of the matched node.
5697
5698For example, in:
5699 class A {};
5700 using B = A;
5701The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5702both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005703</pre></td></tr>
5704
5705
Aaron Ballman672dde22016-01-22 23:15:00 +00005706<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 +00005707<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5708
5709Given
5710 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5711unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5712 matches sizeof(a) and alignof(c)
5713</pre></td></tr>
5714
5715
Aaron Ballman672dde22016-01-22 23:15:00 +00005716<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 +00005717<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5718
5719Example matches true (matcher = hasUnaryOperand(
5720 cxxBoolLiteral(equals(true))))
5721 !true
5722</pre></td></tr>
5723
5724
Aaron Ballman672dde22016-01-22 23:15:00 +00005725<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 +00005726<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5727matches the given matcher.
5728
5729The associated declaration is:
5730- for type nodes, the declaration of the underlying type
5731- for CallExpr, the declaration of the callee
5732- for MemberExpr, the declaration of the referenced member
5733- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005734- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005735
5736Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5737function. e.g. various subtypes of clang::Type and various expressions.
5738
Manuel Klimeka37e1102016-12-01 15:45:06 +00005739Usable as: 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_1CallExpr.html">CallExpr</a>&gt;,
5740 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5741 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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5742 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5743 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5744 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5745 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005746</pre></td></tr>
5747
5748
Aaron Ballman672dde22016-01-22 23:15:00 +00005749<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 +00005750<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5751
5752Given
5753 namespace X { void b(); }
5754 using X::b;
5755usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5756 matches using X::b </pre></td></tr>
5757
5758
Aaron Ballman672dde22016-01-22 23:15:00 +00005759<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 +00005760<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5761matched by the given matcher.
5762
5763Given
5764 namespace X { int a; void b(); }
5765 using X::a;
5766 using X::b;
5767usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5768 matches using X::b but not using X::a </pre></td></tr>
5769
5770
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005771<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>
5772<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 +00005773declaration's type.
5774
5775In case of a value declaration (for example a variable declaration),
5776this resolves one layer of indirection. For example, in the value
5777declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5778X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5779declaration of x.
5780
5781Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5782 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5783 class X {};
5784 void y(X &amp;x) { x; X z; }
5785
Aaron Ballman672dde22016-01-22 23:15:00 +00005786Usable 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 +00005787</pre></td></tr>
5788
5789
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005790<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>
5791<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 +00005792matcher.
5793
5794Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5795 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005796 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005797 class X {};
5798 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005799 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005800</pre></td></tr>
5801
5802
Aaron Ballman672dde22016-01-22 23:15:00 +00005803<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 +00005804<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
5805that matches the given matcher.
5806
5807Example matches x (matcher = varDecl(hasInitializer(callExpr())))
5808 bool y() { return true; }
5809 bool x = y();
5810</pre></td></tr>
5811
5812
Aaron Ballman672dde22016-01-22 23:15:00 +00005813<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 +00005814<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
5815expression.
5816
5817Given
5818 void f(int b) {
5819 int a[b];
5820 }
5821variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
5822 varDecl(hasName("b")))))))
5823 matches "int a[b]"
5824</pre></td></tr>
5825
5826
Aaron Ballman672dde22016-01-22 23:15:00 +00005827<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 +00005828<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
5829definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005830
5831Given
5832 for (;;) {}
5833hasBody(compoundStmt())
5834 matches 'for (;;) {}'
5835with compoundStmt()
5836 matching '{}'
5837</pre></td></tr>
5838
5839
Aaron Ballman672dde22016-01-22 23:15:00 +00005840<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 +00005841<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 +00005842switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005843
5844Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5845 if (true) {}
5846</pre></td></tr>
5847
5848
Aaron Ballman672dde22016-01-22 23:15:00 +00005849<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 +00005850<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
5851NestedNameSpecifier-matcher matches.
5852</pre></td></tr>
5853
5854
Aaron Ballman672dde22016-01-22 23:15:00 +00005855<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 +00005856<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
5857QualType-matcher matches.
5858</pre></td></tr>
5859
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00005860<!--END_TRAVERSAL_MATCHERS -->
5861</table>
5862
5863</div>
5864</body>
5865</html>
5866
5867