blob: dd29149e6346ded4c33e21ac3a9e5226ab25fa99 [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 Ballman9fd6ee62017-03-15 20:14:25 +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('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
341<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
342
343Example matches Foo (Additions)
344 @interface Foo (Additions)
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('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 +0000350<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
351
352Example matches Foo
353 @interface Foo
354 @end
355</pre></td></tr>
356
357
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000358<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
359<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
360
361Example matches _enabled
362 @implementation Foo {
363 BOOL _enabled;
364 }
365 @end
366</pre></td></tr>
367
368
369<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
370<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
371
372Example matches both declaration and definition of -[Foo method]
373 @interface Foo
374 - (void)method;
375 @end
376
377 @implementation Foo
378 - (void)method {}
379 @end
380</pre></td></tr>
381
382
383<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
384<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
385
386Example matches enabled
387 @interface Foo
388 @property BOOL enabled;
389 @end
390</pre></td></tr>
391
392
393<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
394<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
395
396Example matches FooDelegate
397 @protocol FooDelegate
398 @end
399</pre></td></tr>
400
401
Aaron Ballman672dde22016-01-22 23:15:00 +0000402<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 +0000403<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
404
405Given
406 void f(int x);
407parmVarDecl()
408 matches int x.
409</pre></td></tr>
410
411
Aaron Ballman672dde22016-01-22 23:15:00 +0000412<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 +0000413<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
414
415Example matches X, Z, U, and S
416 class X;
417 template&lt;class T&gt; class Z {};
418 struct S {};
419 union U {};
420</pre></td></tr>
421
422
Aaron Ballman672dde22016-01-22 23:15:00 +0000423<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 +0000424<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
425
426Example:
427 staticAssertExpr()
428matches
429 static_assert(sizeof(S) == sizeof(int))
430in
431 struct S {
432 int x;
433 };
434 static_assert(sizeof(S) == sizeof(int));
435</pre></td></tr>
436
437
Aaron Ballman672dde22016-01-22 23:15:00 +0000438<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 +0000439<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
440
441Given
442 template &lt;typename T, int N&gt; struct C {};
443templateTypeParmDecl()
444 matches 'T', but not 'N'.
445</pre></td></tr>
446
447
Aaron Ballman672dde22016-01-22 23:15:00 +0000448<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 +0000449<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
450
451Given
452 int X;
453 namespace NS {
454 int Y;
455 } namespace NS
456decl(hasDeclContext(translationUnitDecl()))
457 matches "int X", but not "int Y".
458</pre></td></tr>
459
460
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000461<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>
462<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
463
464Given
465 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000466 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000467typeAliasDecl()
468 matches "using Y = int", but not "typedef int X"
469</pre></td></tr>
470
471
Aaron Ballman672dde22016-01-22 23:15:00 +0000472<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 +0000473<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
474
475Given
476 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000477 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000478typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000479 matches "typedef int X", but not "using Y = int"
480</pre></td></tr>
481
482
483<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>
484<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
485
486Given
487 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000488 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000489typedefNameDecl()
490 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000491</pre></td></tr>
492
493
Aaron Ballman672dde22016-01-22 23:15:00 +0000494<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 +0000495<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
496typename.
497
498Given
499 template &lt;typename T&gt;
500 struct Base { typedef T Foo; };
501
502 template&lt;typename T&gt;
503 struct S : private Base&lt;T&gt; {
504 using typename Base&lt;T&gt;::Foo;
505 };
506unresolvedUsingTypenameDecl()
507 matches using Base&lt;T&gt;::Foo </pre></td></tr>
508
509
Aaron Ballman672dde22016-01-22 23:15:00 +0000510<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 +0000511<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
512
513Given
514 template&lt;typename X&gt;
515 class C : private X {
516 using X::x;
517 };
518unresolvedUsingValueDecl()
519 matches using X::x </pre></td></tr>
520
521
Aaron Ballman672dde22016-01-22 23:15:00 +0000522<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 +0000523<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
524
525Given
526 namespace X { int x; }
527 using X::x;
528usingDecl()
529 matches using X::x </pre></td></tr>
530
531
Aaron Ballman672dde22016-01-22 23:15:00 +0000532<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 +0000533<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
534
535Given
536 namespace X { int x; }
537 using namespace X;
538usingDirectiveDecl()
539 matches using namespace X </pre></td></tr>
540
541
Aaron Ballman672dde22016-01-22 23:15:00 +0000542<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 +0000543<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
544
545Example matches A, B, C and F
546 enum X { A, B, C };
547 void F();
548</pre></td></tr>
549
550
Aaron Ballman672dde22016-01-22 23:15:00 +0000551<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 +0000552<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
553
554Note: this does not match declarations of member variables, which are
555"field" declarations in Clang parlance.
556
557Example matches a
558 int a;
559</pre></td></tr>
560
561
Aaron Ballman672dde22016-01-22 23:15:00 +0000562<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 +0000563<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
564</pre></td></tr>
565
566
Aaron Ballman672dde22016-01-22 23:15:00 +0000567<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 +0000568<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
569
570Given
571 namespace ns {
572 struct A { static void f(); };
573 void A::f() {}
574 void g() { A::f(); }
575 }
576 ns::A a;
577nestedNameSpecifier()
578 matches "ns::" and both "A::"
579</pre></td></tr>
580
581
Aaron Ballman672dde22016-01-22 23:15:00 +0000582<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 +0000583<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
584</pre></td></tr>
585
586
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000587<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
588<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
589
590Given
591 FOO: bar();
592 void *ptr = &amp;&amp;FOO;
593 goto *bar;
594addrLabelExpr()
595 matches '&amp;&amp;FOO'
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('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 +0000600<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
601
602Given
603 int i = a[1];
604arraySubscriptExpr()
605 matches "a[1]"
606</pre></td></tr>
607
608
Aaron Ballman672dde22016-01-22 23:15:00 +0000609<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 +0000610<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
611
612 int i = 100;
613 __asm("mov al, 2");
614asmStmt()
615 matches '__asm("mov al, 2")'
616</pre></td></tr>
617
618
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000619<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>
620<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
621Example matches __atomic_load_n(ptr, 1)
622 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
623</pre></td></tr>
624
625
626<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>
627<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
628
629Example matches a ?: b
630 (a ?: b) + 42;
631</pre></td></tr>
632
633
Aaron Ballman672dde22016-01-22 23:15:00 +0000634<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 +0000635<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
636
637Example matches a || b
638 !(a || b)
639</pre></td></tr>
640
641
Aaron Ballman672dde22016-01-22 23:15:00 +0000642<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 +0000643<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
644
645Given
646 while (true) { break; }
647breakStmt()
648 matches 'break'
649</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('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 +0000653<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
654
Artem Dergachevded92a92016-11-11 22:34:53 +0000655Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000656 int i = (int) 2.2f;
657</pre></td></tr>
658
659
Aaron Ballman672dde22016-01-22 23:15:00 +0000660<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 +0000661<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
662
663Example matches x.y() and y()
664 X x;
665 x.y();
666 y();
667</pre></td></tr>
668
669
Aaron Ballman672dde22016-01-22 23:15:00 +0000670<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 +0000671<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
672
673Given
674 switch(a) { case 42: break; default: break; }
675caseStmt()
676 matches 'case 42: break;'.
677</pre></td></tr>
678
679
Aaron Ballman672dde22016-01-22 23:15:00 +0000680<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 +0000681<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
682
683Example: castExpr() matches each of the following:
684 (int) 3;
685 const_cast&lt;Expr *&gt;(SubExpr);
686 char c = 0;
687but does not match
688 int i = (0);
689 int k = 0;
690</pre></td></tr>
691
692
Aaron Ballman672dde22016-01-22 23:15:00 +0000693<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 +0000694<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
695
696Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
697though.
698
699Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000700 char ch = 'a';
701 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000702</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('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 +0000706<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
707
708Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000709 int array[4] = {1};
710 vector int myvec = (vector int)(1, 2);
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000711</pre></td></tr>
712
713
Aaron Ballman672dde22016-01-22 23:15:00 +0000714<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 +0000715<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
716
717Example matches '{}' and '{{}}'in 'for (;;) {{}}'
718 for (;;) {{}}
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('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 +0000723<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
724
725Example matches a ? b : c
726 (a ? b : c) + 42
727</pre></td></tr>
728
729
Aaron Ballman672dde22016-01-22 23:15:00 +0000730<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 +0000731<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
732
733Given
734 while (true) { continue; }
735continueStmt()
736 matches 'continue'
737</pre></td></tr>
738
739
Aaron Ballman672dde22016-01-22 23:15:00 +0000740<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 +0000741<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
742
743Example matches,
744 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
745</pre></td></tr>
746
747
Aaron Ballman672dde22016-01-22 23:15:00 +0000748<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 +0000749<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
750
751Example matches FunctionTakesString(GetStringByValue())
752 (matcher = cxxBindTemporaryExpr())
753 FunctionTakesString(GetStringByValue());
754 FunctionTakesStringByPointer(GetStringPointer());
755</pre></td></tr>
756
757
Aaron Ballman672dde22016-01-22 23:15:00 +0000758<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000759<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
760
761Example matches true
762 true
763</pre></td></tr>
764
765
Aaron Ballman672dde22016-01-22 23:15:00 +0000766<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 +0000767<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
768
769 try {} catch(int i) {}
770cxxCatchStmt()
771 matches 'catch(int i)'
772</pre></td></tr>
773
774
Aaron Ballman672dde22016-01-22 23:15:00 +0000775<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 +0000776<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
777
778Example: Matches const_cast&lt;int*&gt;(&amp;r) in
779 int n = 42;
780 const int &amp;r(n);
781 int* p = const_cast&lt;int*&gt;(&amp;r);
782</pre></td></tr>
783
784
Aaron Ballman672dde22016-01-22 23:15:00 +0000785<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 +0000786<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
787
788Example matches string(ptr, n) and ptr within arguments of f
789 (matcher = cxxConstructExpr())
790 void f(const string &amp;a, const string &amp;b);
791 char *ptr;
792 int n;
793 f(string(ptr, n), ptr);
794</pre></td></tr>
795
796
Aaron Ballman672dde22016-01-22 23:15:00 +0000797<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 +0000798<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
799
800Example matches the CXXDefaultArgExpr placeholder inserted for the
801 default value of the second parameter in the call expression f(42)
802 (matcher = cxxDefaultArgExpr())
803 void f(int x, int y = 0);
804 f(42);
805</pre></td></tr>
806
807
Aaron Ballman672dde22016-01-22 23:15:00 +0000808<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 +0000809<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
810
811Given
812 delete X;
813cxxDeleteExpr()
814 matches 'delete X'.
815</pre></td></tr>
816
817
Aaron Ballman672dde22016-01-22 23:15:00 +0000818<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 +0000819<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
820
821Example:
822 cxxDynamicCastExpr()
823matches
824 dynamic_cast&lt;D*&gt;(&amp;b);
825in
826 struct B { virtual ~B() {} }; struct D : B {};
827 B b;
828 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
829</pre></td></tr>
830
831
Aaron Ballman672dde22016-01-22 23:15:00 +0000832<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 +0000833<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
834
835cxxForRangeStmt() matches 'for (auto a : i)'
836 int i[] = {1, 2, 3}; for (auto a : i);
837 for(int j = 0; j &lt; 5; ++j);
838</pre></td></tr>
839
840
Aaron Ballman672dde22016-01-22 23:15:00 +0000841<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 +0000842<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
843
844Example: Matches Foo(bar);
845 Foo f = bar;
846 Foo g = (Foo) bar;
847 Foo h = Foo(bar);
848</pre></td></tr>
849
850
Aaron Ballman672dde22016-01-22 23:15:00 +0000851<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 +0000852<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
853
854Example matches x.y()
855 X x;
856 x.y();
857</pre></td></tr>
858
859
Aaron Ballman672dde22016-01-22 23:15:00 +0000860<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 +0000861<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
862
863Given
864 new X;
865cxxNewExpr()
866 matches 'new X'.
867</pre></td></tr>
868
869
Aaron Ballman672dde22016-01-22 23:15:00 +0000870<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 +0000871<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
872</pre></td></tr>
873
874
Aaron Ballman672dde22016-01-22 23:15:00 +0000875<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000876<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
877
878Note that if an operator isn't overloaded, it won't match. Instead, use
879binaryOperator matcher.
880Currently it does not match operators such as new delete.
881FIXME: figure out why these do not match?
882
883Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
884 (matcher = cxxOperatorCallExpr())
885 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
886 ostream &amp;o; int b = 1, c = 1;
887 o &lt;&lt; b &lt;&lt; c;
888</pre></td></tr>
889
890
Aaron Ballman672dde22016-01-22 23:15:00 +0000891<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 +0000892<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
893
894Either the source expression or the destination type can be matched
895using has(), but hasDestinationType() is more specific and can be
896more readable.
897
898Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
899 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
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('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 +0000904<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
905
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000906See also: hasDestinationType
907See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000908
909Example:
910 cxxStaticCastExpr()
911matches
912 static_cast&lt;long&gt;(8)
913in
914 long eight(static_cast&lt;long&gt;(8));
915</pre></td></tr>
916
917
Aaron Ballman672dde22016-01-22 23:15:00 +0000918<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 +0000919<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
920
921Example: Matches Foo(bar, bar)
922 Foo h = Foo(bar, bar);
923</pre></td></tr>
924
925
Aaron Ballman672dde22016-01-22 23:15:00 +0000926<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 +0000927<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
928
929Example matches the implicit this expression in "return i".
930 (matcher = cxxThisExpr())
931struct foo {
932 int i;
933 int f() { return i; }
934};
935</pre></td></tr>
936
937
Aaron Ballman672dde22016-01-22 23:15:00 +0000938<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 +0000939<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
940
941 try { throw 5; } catch(int i) {}
942cxxThrowExpr()
943 matches 'throw 5'
944</pre></td></tr>
945
946
Aaron Ballman672dde22016-01-22 23:15:00 +0000947<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 +0000948<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
949
950 try {} catch(int i) {}
951cxxTryStmt()
952 matches 'try {}'
953</pre></td></tr>
954
955
Aaron Ballman672dde22016-01-22 23:15:00 +0000956<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 +0000957<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
958
959Example matches T(t) in return statement of f
960 (matcher = cxxUnresolvedConstructExpr())
961 template &lt;typename T&gt;
962 void f(const T&amp; t) { return T(t); }
963</pre></td></tr>
964
965
Aaron Ballman672dde22016-01-22 23:15:00 +0000966<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 +0000967<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
968
969Example matches x in if (x)
970 bool x;
971 if (x) {}
972</pre></td></tr>
973
974
Aaron Ballman672dde22016-01-22 23:15:00 +0000975<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 +0000976<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
977
978Given
979 int a;
980declStmt()
981 matches 'int a'.
982</pre></td></tr>
983
984
Aaron Ballman672dde22016-01-22 23:15:00 +0000985<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 +0000986<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
987
988Given
989 switch(a) { case 42: break; default: break; }
990defaultStmt()
991 matches 'default: break;'.
992</pre></td></tr>
993
994
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000995<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>
996<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
997
998Example: Matches { [2].y = 1.0, [0].x = 1.0 }
999 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1000</pre></td></tr>
1001
1002
Aaron Ballman672dde22016-01-22 23:15:00 +00001003<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 +00001004<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1005
1006Given
1007 do {} while (true);
1008doStmt()
1009 matches 'do {} while(true)'
1010</pre></td></tr>
1011
1012
Aaron Ballman672dde22016-01-22 23:15:00 +00001013<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 +00001014<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1015
1016Matches any cast expression written in user code, whether it be a
1017C-style cast, a functional-style cast, or a keyword cast.
1018
1019Does not match implicit conversions.
1020
1021Note: the name "explicitCast" is chosen to match Clang's terminology, as
1022Clang uses the term "cast" to apply to implicit conversions as well as to
1023actual cast expressions.
1024
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001025See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001026
1027Example: matches all five of the casts in
1028 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1029but does not match the implicit conversion in
1030 long ell = 42;
1031</pre></td></tr>
1032
1033
Aaron Ballman672dde22016-01-22 23:15:00 +00001034<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 +00001035<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1036
1037Example matches x()
1038 void f() { x(); }
1039</pre></td></tr>
1040
1041
Aaron Ballman672dde22016-01-22 23:15:00 +00001042<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 +00001043<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1044of the sub-expression's evaluation.
1045
1046Example matches std::string()
1047 const std::string str = std::string();
1048</pre></td></tr>
1049
1050
Aaron Ballman672dde22016-01-22 23:15:00 +00001051<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 +00001052<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10531.0, 1.0f, 1.0L and 1e10.
1054
1055Does not match implicit conversions such as
1056 float a = 10;
1057</pre></td></tr>
1058
1059
Aaron Ballman672dde22016-01-22 23:15:00 +00001060<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 +00001061<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1062
1063Example matches 'for (;;) {}'
1064 for (;;) {}
1065 int i[] = {1, 2, 3}; for (auto a : i);
1066</pre></td></tr>
1067
1068
Aaron Ballman672dde22016-01-22 23:15:00 +00001069<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 +00001070<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1071</pre></td></tr>
1072
1073
Aaron Ballman672dde22016-01-22 23:15:00 +00001074<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 +00001075<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1076
1077Given
1078 goto FOO;
1079 FOO: bar();
1080gotoStmt()
1081 matches 'goto FOO'
1082</pre></td></tr>
1083
1084
Aaron Ballman672dde22016-01-22 23:15:00 +00001085<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 +00001086<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1087
1088Example matches 'if (x) {}'
1089 if (x) {}
1090</pre></td></tr>
1091
1092
Aaron Ballman672dde22016-01-22 23:15:00 +00001093<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 +00001094<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1095
1096This matches many different places, including function call return value
1097eliding, as well as any type conversions.
1098</pre></td></tr>
1099
1100
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001101<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>
1102<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1103
1104Given
1105 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1106implicitValueInitExpr()
1107 matches "[0].y" (implicitly)
1108</pre></td></tr>
1109
1110
Aaron Ballman672dde22016-01-22 23:15:00 +00001111<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 +00001112<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1113
1114Given
1115 int a[] = { 1, 2 };
1116 struct B { int x, y; };
1117 B b = { 5, 6 };
1118initListExpr()
1119 matches "{ 1, 2 }" and "{ 5, 6 }"
1120</pre></td></tr>
1121
1122
Aaron Ballman672dde22016-01-22 23:15:00 +00001123<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 +00001124<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11251, 1L, 0x1 and 1U.
1126
1127Does not match character-encoded integers such as L'a'.
1128</pre></td></tr>
1129
1130
Aaron Ballman672dde22016-01-22 23:15:00 +00001131<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 +00001132<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1133
1134Given
1135 goto FOO;
1136 FOO: bar();
1137labelStmt()
1138 matches 'FOO:'
1139</pre></td></tr>
1140
1141
Aaron Ballman672dde22016-01-22 23:15:00 +00001142<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 +00001143<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1144
1145Example matches [&amp;](){return 5;}
1146 [&amp;](){return 5;}
1147</pre></td></tr>
1148
1149
Aaron Ballman672dde22016-01-22 23:15:00 +00001150<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 +00001151<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1152
1153Example: Given
1154 struct T {void func()};
1155 T f();
1156 void g(T);
1157materializeTemporaryExpr() matches 'f()' in these statements
1158 T u(f());
1159 g(f());
1160but does not match
1161 f();
1162 f().func();
1163</pre></td></tr>
1164
1165
Aaron Ballman672dde22016-01-22 23:15:00 +00001166<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 +00001167<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1168
1169Given
1170 class Y {
1171 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1172 int a; static int b;
1173 };
1174memberExpr()
1175 matches this-&gt;x, x, y.x, a, this-&gt;b
1176</pre></td></tr>
1177
1178
Aaron Ballman672dde22016-01-22 23:15:00 +00001179<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 +00001180<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1181
1182 foo();;
1183nullStmt()
1184 matches the second ';'
1185</pre></td></tr>
1186
1187
Aaron Ballman672dde22016-01-22 23:15:00 +00001188<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 +00001189<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1190
1191The innermost message send invokes the "alloc" class method on the
1192NSString class, while the outermost message send invokes the
1193"initWithString" instance method on the object returned from
1194NSString's "alloc". This matcher should match both message sends.
1195 [[NSString alloc] initWithString:@"Hello"]
1196</pre></td></tr>
1197
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001198
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001199<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>
1200<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1201to reference another expressions and can be met
1202in BinaryConditionalOperators, for example.
1203
1204Example matches 'a'
1205 (a ?: c) + 42;
1206</pre></td></tr>
1207
1208
Aaron Ballman672dde22016-01-22 23:15:00 +00001209<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 +00001210<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1211
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001212Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001213 int foo() { return 1; }
1214 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001215</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001216
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001217
Aaron Ballmana35b8fc2016-03-09 17:11:51 +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('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>
1219<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1220ParenListExprs don't have a predefined type and are used for late parsing.
1221In the final AST, they can be met in template declarations.
1222
1223Given
1224 template&lt;typename T&gt; class X {
1225 void f() {
1226 X x(*this);
1227 int a = 0, b = 1; int i = (a, b);
1228 }
1229 };
1230parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1231has a predefined type and is a ParenExpr, not a ParenListExpr.
1232</pre></td></tr>
1233
1234
1235<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>
1236<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1237
1238Example: Matches __func__
1239 printf("%s", __func__);
1240</pre></td></tr>
1241
1242
Aaron Ballman672dde22016-01-22 23:15:00 +00001243<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 +00001244<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1245
1246Given
1247 return 1;
1248returnStmt()
1249 matches 'return 1'
1250</pre></td></tr>
1251
1252
Aaron Ballman672dde22016-01-22 23:15:00 +00001253<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 +00001254<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1255
1256Given
1257 { ++a; }
1258stmt()
1259 matches both the compound statement '{ ++a; }' and '++a'.
1260</pre></td></tr>
1261
1262
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001263<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>
1264<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1265
1266Example match: ({ int X = 4; X; })
1267 int C = ({ int X = 4; X; });
1268</pre></td></tr>
1269
1270
Aaron Ballman672dde22016-01-22 23:15:00 +00001271<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 +00001272<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1273
1274Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001275 char *s = "abcd";
1276 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001277</pre></td></tr>
1278
1279
Aaron Ballman672dde22016-01-22 23:15:00 +00001280<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 +00001281<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1282
1283Given
1284 template &lt;int N&gt;
1285 struct A { static const int n = N; };
1286 struct B : public A&lt;42&gt; {};
1287substNonTypeTemplateParmExpr()
1288 matches "N" in the right-hand side of "static const int n = N;"
1289</pre></td></tr>
1290
1291
Aaron Ballman672dde22016-01-22 23:15:00 +00001292<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 +00001293<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1294
1295Given
1296 switch(a) { case 42: break; default: break; }
1297switchCase()
1298 matches 'case 42: break;' and 'default: break;'.
1299</pre></td></tr>
1300
1301
Aaron Ballman672dde22016-01-22 23:15:00 +00001302<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 +00001303<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1304
1305Given
1306 switch(a) { case 42: break; default: break; }
1307switchStmt()
1308 matches 'switch(a)'.
1309</pre></td></tr>
1310
1311
Aaron Ballman672dde22016-01-22 23:15:00 +00001312<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 +00001313<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1314
1315Given
1316 Foo x = bar;
1317 int y = sizeof(x) + alignof(x);
1318unaryExprOrTypeTraitExpr()
1319 matches sizeof(x) and alignof(x)
1320</pre></td></tr>
1321
1322
Aaron Ballman672dde22016-01-22 23:15:00 +00001323<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 +00001324<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1325
1326Example matches !a
1327 !a || b
1328</pre></td></tr>
1329
1330
Haojian Wu7751c922016-05-18 12:53:59 +00001331<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>
1332<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1333but could not be resolved to a specific declaration.
1334
1335Given
1336 template&lt;typename T&gt;
1337 T foo() { T a; return a; }
1338 template&lt;typename T&gt;
1339 void bar() {
1340 foo&lt;T&gt;();
1341 }
1342unresolvedLookupExpr()
1343 matches foo&lt;T&gt;() </pre></td></tr>
1344
1345
Aaron Ballman672dde22016-01-22 23:15:00 +00001346<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 +00001347<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1348
1349Example match: "foo"_suffix
1350</pre></td></tr>
1351
1352
Aaron Ballman672dde22016-01-22 23:15:00 +00001353<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 +00001354<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1355
1356Given
1357 while (true) {}
1358whileStmt()
1359 matches 'while (true) {}'.
1360</pre></td></tr>
1361
1362
Aaron Ballman672dde22016-01-22 23:15:00 +00001363<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 +00001364<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1365
1366Given
1367 template &lt;typename T&gt; struct C {};
1368 C&lt;int&gt; c;
1369templateArgument()
1370 matches 'int' in C&lt;int&gt;.
1371</pre></td></tr>
1372
1373
Haojian Wub33b02e2016-07-29 15:45:11 +00001374<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>
1375<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1376
1377Given
1378 template &lt;typename T&gt; class X { };
1379 X&lt;int&gt; xi;
1380templateName()
1381 matches 'X' in X&lt;int&gt;.
1382</pre></td></tr>
1383
1384
Aaron Ballman672dde22016-01-22 23:15:00 +00001385<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 +00001386<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1387</pre></td></tr>
1388
1389
Aaron Ballman672dde22016-01-22 23:15:00 +00001390<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001391<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1392
1393Given
1394 int a[] = { 2, 3 };
1395 int b[4];
1396 void f() { int c[a[0]]; }
1397arrayType()
1398 matches "int a[]", "int b[4]" and "int c[a[0]]";
1399</pre></td></tr>
1400
1401
Aaron Ballman672dde22016-01-22 23:15:00 +00001402<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 +00001403<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1404
1405Given
1406 _Atomic(int) i;
1407atomicType()
1408 matches "_Atomic(int) i"
1409</pre></td></tr>
1410
1411
Aaron Ballman672dde22016-01-22 23:15:00 +00001412<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 +00001413<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1414
1415Given:
1416 auto n = 4;
1417 int v[] = { 2, 3 }
1418 for (auto i : v) { }
1419autoType()
1420 matches "auto n" and "auto i"
1421</pre></td></tr>
1422
1423
Aaron Ballman672dde22016-01-22 23:15:00 +00001424<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 +00001425<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1426"void (^)(int)".
1427
1428The pointee is always required to be a FunctionType.
1429</pre></td></tr>
1430
1431
Aaron Ballman672dde22016-01-22 23:15:00 +00001432<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 +00001433<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1434
1435Given
1436 struct A {};
1437 A a;
1438 int b;
1439 float c;
1440 bool d;
1441builtinType()
1442 matches "int b", "float c" and "bool d"
1443</pre></td></tr>
1444
1445
Aaron Ballman672dde22016-01-22 23:15:00 +00001446<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 +00001447<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1448
1449Given
1450 _Complex float f;
1451complexType()
1452 matches "_Complex float f"
1453</pre></td></tr>
1454
1455
Aaron Ballman672dde22016-01-22 23:15:00 +00001456<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 +00001457<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1458
1459Given
1460 void() {
1461 int a[2];
1462 int b[] = { 2, 3 };
1463 int c[b[0]];
1464 }
1465constantArrayType()
1466 matches "int a[2]"
1467</pre></td></tr>
1468
1469
Aaron Ballman672dde22016-01-22 23:15:00 +00001470<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 +00001471<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1472Example matches i[] in declaration of f.
1473 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1474Example matches i[1].
1475 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1476 void f(int i[]) {
1477 i[1] = 0;
1478 }
1479</pre></td></tr>
1480
1481
Aaron Ballman672dde22016-01-22 23:15:00 +00001482<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 +00001483<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1484
1485Given
1486 template&lt;typename T, int Size&gt;
1487 class array {
1488 T data[Size];
1489 };
1490dependentSizedArrayType
1491 matches "T data[Size]"
1492</pre></td></tr>
1493
1494
Aaron Ballman672dde22016-01-22 23:15:00 +00001495<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 +00001496<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1497qualified name.
1498
1499Given
1500 namespace N {
1501 namespace M {
1502 class D {};
1503 }
1504 }
1505 class C {};
1506
1507 class C c;
1508 N::M::D d;
1509
1510elaboratedType() matches the type of the variable declarations of both
1511c and d.
1512</pre></td></tr>
1513
1514
Haojian Wue775de82016-06-30 07:50:01 +00001515<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>
1516<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1517
1518Given
1519 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001520 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001521
1522 C c;
1523 S s;
1524
1525enumType() matches the type of the variable declarations of both c and
1526s.
1527</pre></td></tr>
1528
1529
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001530<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1531<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1532
1533Given
1534 int (*f)(int);
1535 void g();
1536functionProtoType()
1537 matches "int (*f)(int)" and the type of "g" in C++ mode.
1538 In C mode, "g" is not matched because it does not contain a prototype.
1539</pre></td></tr>
1540
1541
Aaron Ballman672dde22016-01-22 23:15:00 +00001542<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 +00001543<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1544
1545Given
1546 int (*f)(int);
1547 void g();
1548functionType()
1549 matches "int (*f)(int)" and the type of "g".
1550</pre></td></tr>
1551
1552
Aaron Ballman672dde22016-01-22 23:15:00 +00001553<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 +00001554<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1555
1556Given
1557 int a[] = { 2, 3 };
1558 int b[42];
1559 void f(int c[]) { int d[a[0]]; };
1560incompleteArrayType()
1561 matches "int a[]" and "int c[]"
1562</pre></td></tr>
1563
1564
Aaron Ballman672dde22016-01-22 23:15:00 +00001565<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 +00001566<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1567
1568Example matches S s, but not S&lt;T&gt; s.
1569 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1570 template &lt;typename T&gt; struct S {
1571 void f(S s);
1572 void g(S&lt;T&gt; s);
1573 };
1574</pre></td></tr>
1575
1576
Aaron Ballman672dde22016-01-22 23:15:00 +00001577<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 +00001578<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1579
1580Given:
1581 int *a;
1582 int &amp;b = *a;
1583 int &amp;&amp;c = 1;
1584 auto &amp;d = b;
1585 auto &amp;&amp;e = c;
1586 auto &amp;&amp;f = 2;
1587 int g = 5;
1588
1589lValueReferenceType() matches the types of b, d, and e. e is
1590matched since the type is deduced as int&amp; by reference collapsing rules.
1591</pre></td></tr>
1592
1593
Aaron Ballman672dde22016-01-22 23:15:00 +00001594<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 +00001595<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1596Given
1597 struct A { int i; }
1598 A::* ptr = A::i;
1599memberPointerType()
1600 matches "A::* ptr"
1601</pre></td></tr>
1602
1603
Aaron Ballman672dde22016-01-22 23:15:00 +00001604<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 +00001605<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1606a pointer type, despite being syntactically similar.
1607
1608Given
1609 int *a;
1610
1611 @interface Foo
1612 @end
1613 Foo *f;
1614pointerType()
1615 matches "Foo *f", but does not match "int *a".
1616</pre></td></tr>
1617
1618
Aaron Ballman672dde22016-01-22 23:15:00 +00001619<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 +00001620<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1621
1622Given
1623 int (*ptr_to_array)[4];
1624 int *array_of_ptrs[4];
1625
1626varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1627array_of_ptrs.
1628</pre></td></tr>
1629
1630
Aaron Ballman672dde22016-01-22 23:15:00 +00001631<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 +00001632<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1633types.
1634
1635Given
1636 int *a;
1637 int &amp;b = *a;
1638 int c = 5;
1639
1640 @interface Foo
1641 @end
1642 Foo *f;
1643pointerType()
1644 matches "int *a", but does not match "Foo *f".
1645</pre></td></tr>
1646
1647
Aaron Ballman672dde22016-01-22 23:15:00 +00001648<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 +00001649<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1650
1651Given:
1652 int *a;
1653 int &amp;b = *a;
1654 int &amp;&amp;c = 1;
1655 auto &amp;d = b;
1656 auto &amp;&amp;e = c;
1657 auto &amp;&amp;f = 2;
1658 int g = 5;
1659
1660rValueReferenceType() matches the types of c and f. e is not
1661matched as it is deduced to int&amp; by reference collapsing rules.
1662</pre></td></tr>
1663
1664
Aaron Ballman672dde22016-01-22 23:15:00 +00001665<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 +00001666<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1667
1668Given
1669 class C {};
1670 struct S {};
1671
1672 C c;
1673 S s;
1674
1675recordType() matches the type of the variable declarations of both c
1676and s.
1677</pre></td></tr>
1678
1679
Aaron Ballman672dde22016-01-22 23:15:00 +00001680<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 +00001681<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1682
1683Given
1684 int *a;
1685 int &amp;b = *a;
1686 int &amp;&amp;c = 1;
1687 auto &amp;d = b;
1688 auto &amp;&amp;e = c;
1689 auto &amp;&amp;f = 2;
1690 int g = 5;
1691
1692referenceType() matches the types of b, c, d, e, and f.
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('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 +00001697<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1698template type parameter.
1699
1700Given
1701 template &lt;typename T&gt;
1702 void F(T t) {
1703 int i = 1 + t;
1704 }
1705
1706substTemplateTypeParmType() matches the type of 't' but not '1'
1707</pre></td></tr>
1708
1709
Aaron Ballman672dde22016-01-22 23:15:00 +00001710<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 +00001711<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1712
1713Given
1714 template &lt;typename T&gt;
1715 class C { };
1716
1717 template class C&lt;int&gt;; A
1718 C&lt;char&gt; var; B
1719
1720templateSpecializationType() matches the type of the explicit
1721instantiation in A and the type of the variable declaration in B.
1722</pre></td></tr>
1723
1724
Aaron Ballman672dde22016-01-22 23:15:00 +00001725<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 +00001726<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1727
1728Example matches T, but not int.
1729 (matcher = templateTypeParmType())
1730 template &lt;typename T&gt; void f(int i);
1731</pre></td></tr>
1732
1733
Aaron Ballman672dde22016-01-22 23:15:00 +00001734<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 +00001735<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1736</pre></td></tr>
1737
1738
Aaron Ballman672dde22016-01-22 23:15:00 +00001739<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 +00001740<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1741
1742Given
1743 typedef int X;
1744typedefType()
1745 matches "typedef int X"
1746</pre></td></tr>
1747
1748
Aaron Ballman672dde22016-01-22 23:15:00 +00001749<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 +00001750<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1751
1752Given:
1753 typedef __underlying_type(T) type;
1754unaryTransformType()
1755 matches "__underlying_type(T)"
1756</pre></td></tr>
1757
1758
Aaron Ballman672dde22016-01-22 23:15:00 +00001759<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 +00001760<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1761integer-constant-expression.
1762
1763Given
1764 void f() {
1765 int a[] = { 2, 3 }
1766 int b[42];
1767 int c[a[0]];
1768 }
1769variableArrayType()
1770 matches "int c[a[0]]"
1771</pre></td></tr>
1772
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001773<!--END_DECL_MATCHERS -->
1774</table>
1775
1776<!-- ======================================================================= -->
1777<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1778<!-- ======================================================================= -->
1779
1780<p>Narrowing matchers match certain attributes on the current node, thus
1781narrowing down the set of nodes of the current type to match on.</p>
1782
1783<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1784which allow users to create more powerful match expressions.</p>
1785
1786<table>
1787<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001788<!-- START_NARROWING_MATCHERS -->
1789
1790<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>
1791<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1792
1793Usable as: Any Matcher
1794</pre></td></tr>
1795
1796
1797<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>
1798<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1799
1800Usable as: Any Matcher
1801</pre></td></tr>
1802
1803
1804<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1805<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1806
1807Useful when another matcher requires a child matcher, but there's no
1808additional constraint. This will often be used with an explicit conversion
1809to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1810
1811Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1812"int* p" and "void f()" in
1813 int* p;
1814 void f();
1815
1816Usable as: Any Matcher
1817</pre></td></tr>
1818
1819
1820<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1821<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1822
1823Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1824 class X {};
1825 class Y {};
1826
1827Usable as: Any Matcher
1828</pre></td></tr>
1829
1830
Aaron Ballman672dde22016-01-22 23:15:00 +00001831<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 +00001832<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1833unary).
1834
1835Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1836 !(a || b)
1837</pre></td></tr>
1838
1839
1840<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
1841<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1842
1843Example matches true (matcher = cxxBoolLiteral(equals(true)))
1844 true
1845
Aaron Ballman672dde22016-01-22 23:15:00 +00001846Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1847 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 +00001848</pre></td></tr>
1849
1850
Aaron Ballman672dde22016-01-22 23:15:00 +00001851<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 +00001852<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1853
1854Given
1855 try {
1856 ...
1857 } catch (int) {
1858 ...
1859 } catch (...) {
1860 ...
1861 }
1862endcode
1863cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1864</pre></td></tr>
1865
1866
Aaron Ballman672dde22016-01-22 23:15:00 +00001867<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 +00001868<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1869a specific number of arguments (including absent default arguments).
1870
1871Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1872 void f(int x, int y);
1873 f(0, 0);
1874</pre></td></tr>
1875
1876
Aaron Ballman672dde22016-01-22 23:15:00 +00001877<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 +00001878<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1879</pre></td></tr>
1880
1881
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001882<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>
1883<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1884zero initialization.
1885
1886Given
1887void foo() {
1888 struct point { double x; double y; };
1889 point pt[2] = { { 1.0, 2.0 } };
1890}
1891initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1892will match the implicit array filler for pt[1].
1893</pre></td></tr>
1894
1895
Aaron Ballman672dde22016-01-22 23:15:00 +00001896<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 +00001897<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1898
1899Given
1900 struct S {
1901 S(); #1
1902 S(const S &amp;); #2
1903 S(S &amp;&amp;); #3
1904 };
1905cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1906</pre></td></tr>
1907
1908
Aaron Ballman672dde22016-01-22 23:15:00 +00001909<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 +00001910<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1911
1912Given
1913 struct S {
1914 S(); #1
1915 S(const S &amp;); #2
1916 S(S &amp;&amp;); #3
1917 };
1918cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1919</pre></td></tr>
1920
1921
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00001922<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>
1923<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1924
1925Given
1926 struct S {
1927 S(); #1
1928 S(int) {} #2
1929 S(S &amp;&amp;) : S() {} #3
1930 };
1931 S::S() : S(0) {} #4
1932cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1933#1 or #2.
1934</pre></td></tr>
1935
1936
Aaron Ballman672dde22016-01-22 23:15:00 +00001937<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 +00001938<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1939the explicit keyword.
1940
1941Given
1942 struct S {
1943 S(int); #1
1944 explicit S(double); #2
1945 operator int(); #3
1946 explicit operator bool(); #4
1947 };
1948cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1949cxxConversionDecl(isExplicit()) will match #4, but not #3.
1950</pre></td></tr>
1951
1952
Aaron Ballman672dde22016-01-22 23:15:00 +00001953<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 +00001954<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
1955
1956Given
1957 struct S {
1958 S(); #1
1959 S(const S &amp;); #2
1960 S(S &amp;&amp;); #3
1961 };
1962cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
1963</pre></td></tr>
1964
1965
Aaron Ballman672dde22016-01-22 23:15:00 +00001966<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 +00001967<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
1968the explicit keyword.
1969
1970Given
1971 struct S {
1972 S(int); #1
1973 explicit S(double); #2
1974 operator int(); #3
1975 explicit operator bool(); #4
1976 };
1977cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1978cxxConversionDecl(isExplicit()) will match #4, but not #3.
1979</pre></td></tr>
1980
1981
Aaron Ballman672dde22016-01-22 23:15:00 +00001982<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001983<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
1984opposed to a member.
1985
1986Given
1987 struct B {};
1988 struct D : B {
1989 int I;
1990 D(int i) : I(i) {}
1991 };
1992 struct E : B {
1993 E() : B() {}
1994 };
1995cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
1996 will match E(), but not match D(int).
1997</pre></td></tr>
1998
1999
Aaron Ballman672dde22016-01-22 23:15:00 +00002000<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 +00002001<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2002opposed to a base.
2003
2004Given
2005 struct B {};
2006 struct D : B {
2007 int I;
2008 D(int i) : I(i) {}
2009 };
2010 struct E : B {
2011 E() : B() {}
2012 };
2013cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2014 will match D(int), but not match E().
2015</pre></td></tr>
2016
2017
Aaron Ballman672dde22016-01-22 23:15:00 +00002018<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 +00002019<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2020code (as opposed to implicitly added by the compiler).
2021
2022Given
2023 struct Foo {
2024 Foo() { }
2025 Foo(int) : foo_("A") { }
2026 string foo_;
2027 };
2028cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2029 will match Foo(int), but not Foo()
2030</pre></td></tr>
2031
2032
Aaron Ballman672dde22016-01-22 23:15:00 +00002033<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 +00002034<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2035
2036Given
2037struct A {
2038 void foo() const;
2039 void bar();
2040};
2041
2042cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2043</pre></td></tr>
2044
2045
Aaron Ballman672dde22016-01-22 23:15:00 +00002046<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 +00002047<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2048operator.
2049
2050Given
2051struct A {
2052 A &amp;operator=(const A &amp;);
2053 A &amp;operator=(A &amp;&amp;);
2054};
2055
2056cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2057the second one.
2058</pre></td></tr>
2059
2060
Aaron Ballman672dde22016-01-22 23:15:00 +00002061<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 +00002062<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2063
2064Given:
2065 class A final {};
2066
2067 struct B {
2068 virtual void f();
2069 };
2070
2071 struct C : B {
2072 void f() final;
2073 };
2074matches A and C::f, but not B, C, or B::f
2075</pre></td></tr>
2076
2077
Aaron Ballman672dde22016-01-22 23:15:00 +00002078<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 +00002079<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2080operator.
2081
2082Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002083struct A {
2084 A &amp;operator=(const A &amp;);
2085 A &amp;operator=(A &amp;&amp;);
2086};
2087
2088cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2089the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002090</pre></td></tr>
2091
2092
Aaron Ballman672dde22016-01-22 23:15:00 +00002093<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 +00002094<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2095
2096Given
2097 class A {
2098 public:
2099 virtual void x();
2100 };
2101 class B : public A {
2102 public:
2103 virtual void x();
2104 };
2105 matches B::x
2106</pre></td></tr>
2107
2108
Aaron Ballman672dde22016-01-22 23:15:00 +00002109<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 +00002110<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2111
2112Given
2113 class A {
2114 public:
2115 virtual void x() = 0;
2116 };
2117 matches A::x
2118</pre></td></tr>
2119
2120
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002121<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>
2122<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2123
2124Given
2125 struct S {
2126 S(); #1
2127 S(const S &amp;) = default; #2
2128 S(S &amp;&amp;) = delete; #3
2129 };
2130cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2131</pre></td></tr>
2132
2133
Aaron Ballman672dde22016-01-22 23:15:00 +00002134<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 +00002135<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2136
2137Given
2138 class A {
2139 public:
2140 virtual void x();
2141 };
2142 matches A::x
2143</pre></td></tr>
2144
Aaron Ballman672dde22016-01-22 23:15:00 +00002145
2146<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 +00002147<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2148
2149Given
2150 class A {
2151 public:
2152 virtual void x();
2153 };
2154 class B : public A {
2155 public:
2156 void x();
2157 };
2158 matches A::x but not B::x
2159</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002160
Aaron Ballman672dde22016-01-22 23:15:00 +00002161
2162<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 +00002163<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2164
2165Matches overloaded operator names specified in strings without the
2166"operator" prefix: e.g. "&lt;&lt;".
2167
2168Given:
2169 class A { int operator*(); };
2170 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2171 A a;
2172 a &lt;&lt; a; &lt;-- This matches
2173
2174cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2175specified line and
2176cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2177matches the declaration of A.
2178
Aaron Ballman672dde22016-01-22 23:15:00 +00002179Usable 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 +00002180</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('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002184<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2185</pre></td></tr>
2186
2187
Aaron Ballman672dde22016-01-22 23:15:00 +00002188<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 +00002189<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2190static member variable template instantiations.
2191
2192Given
2193 template&lt;typename T&gt; void A(T t) { }
2194 template&lt;&gt; void A(int N) { }
2195functionDecl(isExplicitTemplateSpecialization())
2196 matches the specialization A&lt;int&gt;().
2197
Aaron Ballman672dde22016-01-22 23:15:00 +00002198Usable 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 +00002199</pre></td></tr>
2200
2201
Aaron Ballman672dde22016-01-22 23:15:00 +00002202<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 +00002203<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2204
2205Given:
2206 class A final {};
2207
2208 struct B {
2209 virtual void f();
2210 };
2211
2212 struct C : B {
2213 void f() final;
2214 };
2215matches A and C::f, but not B, C, or B::f
2216</pre></td></tr>
2217
2218
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002219<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>
2220<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2221
2222Given:
2223 auto x = []{};
2224
2225cxxRecordDecl(isLambda()) matches the implicit class declaration of
2226decltype(x)
2227</pre></td></tr>
2228
2229
Aaron Ballman672dde22016-01-22 23:15:00 +00002230<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 +00002231<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2232isSameOrDerivedFrom(hasName(...)).
2233</pre></td></tr>
2234
2235
Aaron Ballman672dde22016-01-22 23:15:00 +00002236<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 +00002237<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2238member variable template instantiations.
2239
2240Given
2241 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2242or
2243 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2244cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2245 matches the template instantiation of X&lt;A&gt;.
2246
2247But given
2248 template &lt;typename T&gt; class X {}; class A {};
2249 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2250cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2251 does not match, as X&lt;A&gt; is an explicit template specialization.
2252
Aaron Ballman672dde22016-01-22 23:15:00 +00002253Usable 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 +00002254</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_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 +00002258<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2259a specific number of arguments (including absent default arguments).
2260
2261Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2262 void f(int x, int y);
2263 f(0, 0);
2264</pre></td></tr>
2265
2266
Etienne Bergeron75e52722016-05-13 19:36:55 +00002267<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>
2268<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2269
2270Example: matches the implicit cast around 0
2271(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2272 int *p = 0;
2273</pre></td></tr>
2274
2275
Aaron Ballman672dde22016-01-22 23:15:00 +00002276<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002277<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
2278
2279Example matches true (matcher = cxxBoolLiteral(equals(true)))
2280 true
2281
Aaron Ballman672dde22016-01-22 23:15:00 +00002282Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2283 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 +00002284</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_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 +00002288<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2289
2290Given
2291 template&lt;typename T&gt; struct C {};
2292 C&lt;int&gt; c;
2293classTemplateSpecializationDecl(templateArgumentCountIs(1))
2294 matches C&lt;int&gt;.
2295</pre></td></tr>
2296
2297
Aaron Ballman672dde22016-01-22 23:15:00 +00002298<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 +00002299<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2300child statements.
2301
2302Example: Given
2303 { for (;;) {} }
2304compoundStmt(statementCountIs(0)))
2305 matches '{}'
2306 but does not match the outer compound statement.
2307</pre></td></tr>
2308
2309
Aaron Ballman672dde22016-01-22 23:15:00 +00002310<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 +00002311<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002312
2313Given
2314 int a[42];
2315 int b[2 * 21];
2316 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002317 char *s = "abcd";
2318 wchar_t *ws = L"abcd";
2319 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002320constantArrayType(hasSize(42))
2321 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002322stringLiteral(hasSize(4))
2323 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002324</pre></td></tr>
2325
2326
Aaron Ballman672dde22016-01-22 23:15:00 +00002327<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 +00002328<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2329declarations.
2330
2331Example: Given
2332 int a, b;
2333 int c;
2334 int d = 2, e;
2335declCountIs(2)
2336 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2337</pre></td></tr>
2338
2339
Aaron Ballman672dde22016-01-22 23:15:00 +00002340<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 +00002341<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2342
2343Matches a node if it equals the node previously bound to ID.
2344
2345Given
2346 class X { int a; int b; };
2347cxxRecordDecl(
2348 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2349 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2350 matches the class X, as a and b have the same type.
2351
2352Note that when multiple matches are involved via forEach* matchers,
2353equalsBoundNodes acts as a filter.
2354For example:
2355compoundStmt(
2356 forEachDescendant(varDecl().bind("d")),
2357 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2358will trigger a match for each combination of variable declaration
2359and reference to that variable declaration within a compound statement.
2360</pre></td></tr>
2361
2362
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002363<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>
2364<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2365
2366Decl has pointer identity in the AST.
2367</pre></td></tr>
2368
2369
Aaron Ballman672dde22016-01-22 23:15:00 +00002370<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 +00002371<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2372
2373Given
2374 __attribute__((device)) void f() { ... }
2375decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2376f. If the matcher is use from clang-query, attr::Kind parameter should be
2377passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2378</pre></td></tr>
2379
2380
Aaron Ballman672dde22016-01-22 23:15:00 +00002381<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 +00002382<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2383partially matching a given regex.
2384
2385Example matches Y but not X
2386 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2387 #include "ASTMatcher.h"
2388 class X {};
2389ASTMatcher.h:
2390 class Y {};
2391
Aaron Ballman672dde22016-01-22 23:15:00 +00002392Usable 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 +00002393</pre></td></tr>
2394
2395
Aaron Ballman672dde22016-01-22 23:15:00 +00002396<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 +00002397<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2398
2399Example matches X but not Y
2400 (matcher = cxxRecordDecl(isExpansionInMainFile())
2401 #include &lt;Y.h&gt;
2402 class X {};
2403Y.h:
2404 class Y {};
2405
Aaron Ballman672dde22016-01-22 23:15:00 +00002406Usable 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 +00002407</pre></td></tr>
2408
2409
Aaron Ballman672dde22016-01-22 23:15:00 +00002410<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 +00002411<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2412
2413Example matches Y but not X
2414 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2415 #include &lt;SystemHeader.h&gt;
2416 class X {};
2417SystemHeader.h:
2418 class Y {};
2419
Aaron Ballman672dde22016-01-22 23:15:00 +00002420Usable 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 +00002421</pre></td></tr>
2422
2423
Aaron Ballman672dde22016-01-22 23:15:00 +00002424<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 +00002425<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2426by the compiler (eg. implicit defaultcopy constructors).
2427</pre></td></tr>
2428
2429
Aaron Ballman672dde22016-01-22 23:15:00 +00002430<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 +00002431<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2432
2433Given
2434 class C {
2435 public: int a;
2436 protected: int b;
2437 private: int c;
2438 };
2439fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002440 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002441</pre></td></tr>
2442
2443
Aaron Ballman672dde22016-01-22 23:15:00 +00002444<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 +00002445<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2446
2447Given
2448 class C {
2449 public: int a;
2450 protected: int b;
2451 private: int c;
2452 };
2453fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002454 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002455</pre></td></tr>
2456
2457
Aaron Ballman672dde22016-01-22 23:15:00 +00002458<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 +00002459<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2460
2461Given
2462 class C {
2463 public: int a;
2464 protected: int b;
2465 private: int c;
2466 };
2467fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002468 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002469</pre></td></tr>
2470
2471
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002472<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>
2473<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2474a specific number of designators.
2475
2476Example: Given
2477 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2478 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2479designatorCountIs(2)
2480 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2481 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2482</pre></td></tr>
2483
2484
Aaron Ballman5c574342016-07-06 18:25:16 +00002485<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>
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002486<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2487bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002488
2489Given
2490 class C {
2491 int a : 2;
2492 int b : 4;
2493 int c : 2;
2494 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002495fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002496 matches 'int a;' and 'int c;' but not 'int b;'.
2497</pre></td></tr>
2498
2499
2500<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>
2501<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2502
2503Given
2504 class C {
2505 int a : 2;
2506 int b;
2507 };
2508fieldDecl(isBitField())
2509 matches 'int a;' but not 'int b;'.
2510</pre></td></tr>
2511
2512
Aaron Ballman672dde22016-01-22 23:15:00 +00002513<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 +00002514<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
2515
2516Example matches true (matcher = cxxBoolLiteral(equals(true)))
2517 true
2518
Aaron Ballman672dde22016-01-22 23:15:00 +00002519Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2520 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 +00002521</pre></td></tr>
2522
2523
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002524<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>
2525<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2526
2527Given:
2528 void f();
2529 void g() noexcept;
2530 void h() noexcept(true);
2531 void i() noexcept(false);
2532 void j() throw();
2533 void k() throw(int);
2534 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002535functionDecl(hasDynamicExceptionSpec()) and
2536 functionProtoType(hasDynamicExceptionSpec())
2537 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002538</pre></td></tr>
2539
2540
Aaron Ballman672dde22016-01-22 23:15:00 +00002541<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 +00002542<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2543
2544Matches overloaded operator names specified in strings without the
2545"operator" prefix: e.g. "&lt;&lt;".
2546
2547Given:
2548 class A { int operator*(); };
2549 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2550 A a;
2551 a &lt;&lt; a; &lt;-- This matches
2552
2553cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2554specified line and
2555cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2556matches the declaration of A.
2557
Aaron Ballman672dde22016-01-22 23:15:00 +00002558Usable 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 +00002559</pre></td></tr>
2560
2561
Aaron Ballman672dde22016-01-22 23:15:00 +00002562<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 +00002563<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2564
2565Given:
2566 constexpr int foo = 42;
2567 constexpr int bar();
2568varDecl(isConstexpr())
2569 matches the declaration of foo.
2570functionDecl(isConstexpr())
2571 matches the declaration of bar.
2572</pre></td></tr>
2573
2574
Aaron Ballman672dde22016-01-22 23:15:00 +00002575<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
Aaron Ballmanc35724c2016-01-21 15:18:25 +00002576<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2577
2578Given:
2579 class A { ~A(); };
2580 class B { ~B() = default; };
2581functionDecl(isDefaulted())
2582 matches the declaration of ~B, but not ~A.
2583</pre></td></tr>
2584
2585
Aaron Ballman672dde22016-01-22 23:15:00 +00002586<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 +00002587<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2588
2589Example matches A, va, fa
2590 class A {};
2591 class B; Doesn't match, as it has no body.
2592 int va;
2593 extern int vb; Doesn't match, as it doesn't define the variable.
2594 void fa() {}
2595 void fb(); Doesn't match, as it has no body.
2596
Aaron Ballman672dde22016-01-22 23:15:00 +00002597Usable 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 +00002598</pre></td></tr>
2599
2600
Aaron Ballman672dde22016-01-22 23:15:00 +00002601<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 +00002602<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2603
2604Given:
2605 void Func();
2606 void DeletedFunc() = delete;
2607functionDecl(isDeleted())
2608 matches the declaration of DeletedFunc, but not Func.
2609</pre></td></tr>
2610
2611
Aaron Ballman672dde22016-01-22 23:15:00 +00002612<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 +00002613<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2614static member variable template instantiations.
2615
2616Given
2617 template&lt;typename T&gt; void A(T t) { }
2618 template&lt;&gt; void A(int N) { }
2619functionDecl(isExplicitTemplateSpecialization())
2620 matches the specialization A&lt;int&gt;().
2621
Aaron Ballman672dde22016-01-22 23:15:00 +00002622Usable 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 +00002623</pre></td></tr>
2624
2625
Aaron Ballman672dde22016-01-22 23:15:00 +00002626<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 +00002627<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2628
2629Given:
2630 extern "C" void f() {}
2631 extern "C" { void g() {} }
2632 void h() {}
2633functionDecl(isExternC())
2634 matches the declaration of f and g, but not the declaration h
2635</pre></td></tr>
2636
2637
Aaron Ballman672dde22016-01-22 23:15:00 +00002638<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 +00002639<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2640the inline keyword.
2641
2642Given
2643 inline void f();
2644 void g();
2645 namespace n {
2646 inline namespace m {}
2647 }
2648functionDecl(isInline()) will match ::f().
2649namespaceDecl(isInline()) will match n::m.
2650</pre></td></tr>
2651
2652
Aaron Ballman672dde22016-01-22 23:15:00 +00002653<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 +00002654<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2655
2656Given:
2657 void f();
2658 void g() noexcept;
2659 void h() throw();
2660 void i() throw(int);
2661 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002662functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2663 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002664</pre></td></tr>
2665
2666
Haojian Wub3d25462016-09-26 16:01:52 +00002667<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 +00002668<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2669class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002670
2671Given:
2672 static void f() {}
2673 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002674 extern int j;
2675 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002676functionDecl(isStaticStorageClass())
2677 matches the function declaration f.
2678varDecl(isStaticStorageClass())
2679 matches the variable declaration i.
2680</pre></td></tr>
2681
2682
Aaron Ballman672dde22016-01-22 23:15:00 +00002683<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 +00002684<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2685member variable template instantiations.
2686
2687Given
2688 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2689or
2690 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2691cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2692 matches the template instantiation of X&lt;A&gt;.
2693
2694But given
2695 template &lt;typename T&gt; class X {}; class A {};
2696 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2697cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2698 does not match, as X&lt;A&gt; is an explicit template specialization.
2699
Aaron Ballman672dde22016-01-22 23:15:00 +00002700Usable 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 +00002701</pre></td></tr>
2702
2703
Aaron Ballman672dde22016-01-22 23:15:00 +00002704<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 +00002705<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2706
2707Example matches f, but not g or h. The function i will not match, even when
2708compiled in C mode.
2709 void f(...);
2710 void g(int);
2711 template &lt;typename... Ts&gt; void h(Ts...);
2712 void i();
2713</pre></td></tr>
2714
2715
Aaron Ballman672dde22016-01-22 23:15:00 +00002716<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 +00002717<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2718specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002719
2720Given
2721 void f(int i) {}
2722 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002723 void h(int i, int j);
2724 void j(int i);
2725 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002726functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002727 matches void g(int i, int j) {}
2728functionProtoType(parameterCountIs(2))
2729 matches void h(int i, int j)
2730functionProtoType(parameterCountIs(3))
2731 matches void k(int x, int y, int z, ...);
2732</pre></td></tr>
2733
2734
Aaron Ballman230ad972016-06-07 17:34:45 +00002735<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>
2736<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2737
2738Given:
2739 void f();
2740 void g() noexcept;
2741 void h() noexcept(true);
2742 void i() noexcept(false);
2743 void j() throw();
2744 void k() throw(int);
2745 void l() throw(...);
2746functionDecl(hasDynamicExceptionSpec()) and
2747 functionProtoType(hasDynamicExceptionSpec())
2748 match the declarations of j, k, and l, but not f, g, h, or i.
2749</pre></td></tr>
2750
2751
2752<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>
2753<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2754
2755Given:
2756 void f();
2757 void g() noexcept;
2758 void h() throw();
2759 void i() throw(int);
2760 void j() noexcept(false);
2761functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2762 match the declarations of g, and h, but not f, i or j.
2763</pre></td></tr>
2764
2765
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002766<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>
2767<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2768specific parameter count.
2769
2770Given
2771 void f(int i) {}
2772 void g(int i, int j) {}
2773 void h(int i, int j);
2774 void j(int i);
2775 void k(int x, int y, int z, ...);
2776functionDecl(parameterCountIs(2))
2777 matches void g(int i, int j) {}
2778functionProtoType(parameterCountIs(2))
2779 matches void h(int i, int j)
2780functionProtoType(parameterCountIs(3))
2781 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002782</pre></td></tr>
2783
2784
Aaron Ballman672dde22016-01-22 23:15:00 +00002785<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 +00002786<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
2787
2788Example matches true (matcher = cxxBoolLiteral(equals(true)))
2789 true
2790
Aaron Ballman672dde22016-01-22 23:15:00 +00002791Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2792 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 +00002793</pre></td></tr>
2794
2795
Aaron Ballman672dde22016-01-22 23:15:00 +00002796<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 +00002797<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2798to '.'.
2799
2800Member calls on the implicit this pointer match as called with '-&gt;'.
2801
2802Given
2803 class Y {
2804 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2805 int a;
2806 static int b;
2807 };
2808memberExpr(isArrow())
2809 matches this-&gt;x, x, y.x, a, this-&gt;b
2810</pre></td></tr>
2811
2812
Aaron Ballmana086b9f2016-08-17 13:10:42 +00002813<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>
2814<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2815
2816Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2817void f() {
2818 int x;
2819 static int y;
2820}
2821int z;
2822
2823Example matches f() because it has external formal linkage despite being
2824unique to the translation unit as though it has internal likage
2825(matcher = functionDecl(hasExternalFormalLinkage()))
2826
2827namespace {
2828void f() {}
2829}
2830</pre></td></tr>
2831
2832
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002833<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 +00002834<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2835
2836Supports specifying enclosing namespaces or classes by prefixing the name
2837with '&lt;enclosing&gt;::'.
2838Does not match typedefs of an underlying type with the given name.
2839
2840Example matches X (Name == "X")
2841 class X;
2842
2843Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2844 namespace a { namespace b { class X; } }
2845</pre></td></tr>
2846
2847
Aaron Ballman672dde22016-01-22 23:15:00 +00002848<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 +00002849<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2850a substring matched by the given RegExp.
2851
2852Supports specifying enclosing namespaces or classes by
2853prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2854of an underlying type with the given name.
2855
2856Example matches X (regexp == "::X")
2857 class X;
2858
2859Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2860 namespace foo { namespace bar { class X; } }
2861</pre></td></tr>
2862
2863
Aaron Ballman672dde22016-01-22 23:15:00 +00002864<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 +00002865<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2866
2867Given
2868 namespace n {
2869 namespace {} #1
2870 }
2871namespaceDecl(isAnonymous()) will match #1 but not ::n.
2872</pre></td></tr>
2873
2874
Aaron Ballman672dde22016-01-22 23:15:00 +00002875<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 +00002876<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2877the inline keyword.
2878
2879Given
2880 inline void f();
2881 void g();
2882 namespace n {
2883 inline namespace m {}
2884 }
2885functionDecl(isInline()) will match ::f().
2886namespaceDecl(isInline()) will match n::m.
2887</pre></td></tr>
2888
2889
Aaron Ballman672dde22016-01-22 23:15:00 +00002890<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 +00002891<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
2892a specific number of arguments (including absent default arguments).
2893
2894Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2895 void f(int x, int y);
2896 f(0, 0);
2897</pre></td></tr>
2898
2899
Aaron Ballman672dde22016-01-22 23:15:00 +00002900<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 +00002901<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
2902
2903objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
2904message expression in
2905
2906 UIWebView *webView = ...;
2907 CGRect bodyFrame = webView.frame;
2908 bodyFrame.size.height = self.bodyContentHeight;
2909 webView.frame = bodyFrame;
2910 ^---- matches here
2911</pre></td></tr>
2912
2913
Aaron Ballman672dde22016-01-22 23:15:00 +00002914<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 +00002915<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
2916
2917Matches only when the selector of the objCMessageExpr is NULL. This may
2918represent an error condition in the tree!
2919</pre></td></tr>
2920
2921
Aaron Ballman672dde22016-01-22 23:15:00 +00002922<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 +00002923<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
2924
2925 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
2926 matches the outer message expr in the code below, but NOT the message
2927 invocation for self.bodyView.
2928 [self.bodyView loadHTMLString:html baseURL:NULL];
2929</pre></td></tr>
2930
2931
Aaron Ballman672dde22016-01-22 23:15:00 +00002932<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002933<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
2934
2935 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
2936 matches self.bodyView in the code below, but NOT the outer message
2937 invocation of "loadHTMLString:baseURL:".
2938 [self.bodyView loadHTMLString:html baseURL:NULL];
2939</pre></td></tr>
2940
2941
Aaron Ballman672dde22016-01-22 23:15:00 +00002942<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 +00002943<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
2944a substring matched by the given RegExp.
2945 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
2946 invocation for self.bodyView.
2947 [self.bodyView loadHTMLString:html baseURL:NULL];
2948</pre></td></tr>
2949
2950
Aaron Ballman672dde22016-01-22 23:15:00 +00002951<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 +00002952<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
2953
2954 matcher = objCMessageExpr(numSelectorArgs(0));
2955 matches self.bodyView in the code below
2956
2957 matcher = objCMessageExpr(numSelectorArgs(2));
2958 matches the invocation of "loadHTMLString:baseURL:" but not that
2959 of self.bodyView
2960 [self.bodyView loadHTMLString:html baseURL:NULL];
2961</pre></td></tr>
2962
2963
Aaron Ballman672dde22016-01-22 23:15:00 +00002964<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 +00002965<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
2966
2967Given
2968 class Y { public: void x(); };
2969 void z() { Y* y; y-&gt;x(); }
2970cxxMemberCallExpr(on(hasType(asString("class Y *"))))
2971 matches y-&gt;x()
2972</pre></td></tr>
2973
2974
Aaron Ballman672dde22016-01-22 23:15:00 +00002975<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 +00002976<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
2977
2978Matches a node if it equals the node previously bound to ID.
2979
2980Given
2981 class X { int a; int b; };
2982cxxRecordDecl(
2983 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2984 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2985 matches the class X, as a and b have the same type.
2986
2987Note that when multiple matches are involved via forEach* matchers,
2988equalsBoundNodes acts as a filter.
2989For example:
2990compoundStmt(
2991 forEachDescendant(varDecl().bind("d")),
2992 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2993will trigger a match for each combination of variable declaration
2994and reference to that variable declaration within a compound statement.
2995</pre></td></tr>
2996
2997
Aaron Ballman672dde22016-01-22 23:15:00 +00002998<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 +00002999<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3000the node, not hidden within a typedef.
3001
3002Given
3003 typedef const int const_int;
3004 const_int i;
3005 int *const j;
3006 int *volatile k;
3007 int m;
3008varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3009i is const-qualified but the qualifier is not local.
3010</pre></td></tr>
3011
3012
Aaron Ballman672dde22016-01-22 23:15:00 +00003013<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 +00003014<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3015
3016Given
3017 void a(char);
3018 void b(wchar_t);
3019 void c(double);
3020functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3021matches "a(char)", "b(wchar_t)", but not "c(double)".
3022</pre></td></tr>
3023
3024
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003025<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 +00003026<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3027the Objective-C object pointer type, which is different despite being
3028syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003029
3030Given
3031 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003032
3033 @interface Foo
3034 @end
3035 Foo *f;
3036
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003037 int j;
3038varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003039 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003040</pre></td></tr>
3041
3042
Aaron Ballman672dde22016-01-22 23:15:00 +00003043<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 +00003044<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3045include "top-level" const.
3046
3047Given
3048 void a(int);
3049 void b(int const);
3050 void c(const int);
3051 void d(const int*);
3052 void e(int const) {};
3053functionDecl(hasAnyParameter(hasType(isConstQualified())))
3054 matches "void b(int const)", "void c(const int)" and
3055 "void e(int const) {}". It does not match d as there
3056 is no top-level const on the parameter type "const int *".
3057</pre></td></tr>
3058
3059
Aaron Ballman672dde22016-01-22 23:15:00 +00003060<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 +00003061<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3062
3063Given
3064 void a(int);
3065 void b(long);
3066 void c(double);
3067functionDecl(hasAnyParameter(hasType(isInteger())))
3068matches "a(int)", "b(long)", but not "c(double)".
3069</pre></td></tr>
3070
3071
Clement Courbet42517592016-07-12 06:36:00 +00003072<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>
3073<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3074
3075Given
3076 void a(int);
3077 void b(unsigned long);
3078 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003079functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003080matches "a(int)", but not "b(unsigned long)" and "c(double)".
3081</pre></td></tr>
3082
3083
3084<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>
3085<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3086
3087Given
3088 void a(int);
3089 void b(unsigned long);
3090 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003091functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003092matches "b(unsigned long)", but not "a(int)" and "c(double)".
3093</pre></td></tr>
3094
3095
Aaron Ballman672dde22016-01-22 23:15:00 +00003096<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003097<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3098include "top-level" volatile.
3099
3100Given
3101 void a(int);
3102 void b(int volatile);
3103 void c(volatile int);
3104 void d(volatile int*);
3105 void e(int volatile) {};
3106functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3107 matches "void b(int volatile)", "void c(volatile int)" and
3108 "void e(int volatile) {}". It does not match d as there
3109 is no top-level volatile on the parameter type "volatile int *".
3110</pre></td></tr>
3111
3112
Aaron Ballman672dde22016-01-22 23:15:00 +00003113<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 +00003114<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3115
3116Example matches C, but not S or U.
3117 struct S {};
3118 class C {};
3119 union U {};
3120</pre></td></tr>
3121
3122
Aaron Ballman672dde22016-01-22 23:15:00 +00003123<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 +00003124<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3125
3126Example matches S, but not C or U.
3127 struct S {};
3128 class C {};
3129 union U {};
3130</pre></td></tr>
3131
3132
Aaron Ballman672dde22016-01-22 23:15:00 +00003133<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 +00003134<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3135
3136Example matches U, but not C or S.
3137 struct S {};
3138 class C {};
3139 union U {};
3140</pre></td></tr>
3141
3142
Aaron Ballman672dde22016-01-22 23:15:00 +00003143<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 +00003144<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3145
3146Matches a node if it equals the node previously bound to ID.
3147
3148Given
3149 class X { int a; int b; };
3150cxxRecordDecl(
3151 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3152 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3153 matches the class X, as a and b have the same type.
3154
3155Note that when multiple matches are involved via forEach* matchers,
3156equalsBoundNodes acts as a filter.
3157For example:
3158compoundStmt(
3159 forEachDescendant(varDecl().bind("d")),
3160 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3161will trigger a match for each combination of variable declaration
3162and reference to that variable declaration within a compound statement.
3163</pre></td></tr>
3164
3165
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003166<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>
3167<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3168
3169Stmt has pointer identity in the AST.
3170</pre></td></tr>
3171
3172
Aaron Ballman672dde22016-01-22 23:15:00 +00003173<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 +00003174<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3175partially matching a given regex.
3176
3177Example matches Y but not X
3178 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3179 #include "ASTMatcher.h"
3180 class X {};
3181ASTMatcher.h:
3182 class Y {};
3183
Aaron Ballman672dde22016-01-22 23:15:00 +00003184Usable 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 +00003185</pre></td></tr>
3186
3187
Aaron Ballman672dde22016-01-22 23:15:00 +00003188<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 +00003189<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3190
3191Example matches X but not Y
3192 (matcher = cxxRecordDecl(isExpansionInMainFile())
3193 #include &lt;Y.h&gt;
3194 class X {};
3195Y.h:
3196 class Y {};
3197
Aaron Ballman672dde22016-01-22 23:15:00 +00003198Usable 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 +00003199</pre></td></tr>
3200
3201
Aaron Ballman672dde22016-01-22 23:15:00 +00003202<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 +00003203<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3204
3205Example matches Y but not X
3206 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3207 #include &lt;SystemHeader.h&gt;
3208 class X {};
3209SystemHeader.h:
3210 class Y {};
3211
Aaron Ballman672dde22016-01-22 23:15:00 +00003212Usable 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 +00003213</pre></td></tr>
3214
3215
Etienne Bergeron3588be72016-05-12 04:20:04 +00003216<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>
3217<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3218
3219Given
3220 int a[42];
3221 int b[2 * 21];
3222 int c[41], d[43];
3223 char *s = "abcd";
3224 wchar_t *ws = L"abcd";
3225 char *w = "a";
3226constantArrayType(hasSize(42))
3227 matches "int a[42]" and "int b[2 * 21]"
3228stringLiteral(hasSize(4))
3229 matches "abcd", L"abcd"
3230</pre></td></tr>
3231
3232
Aaron Ballman672dde22016-01-22 23:15:00 +00003233<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 +00003234<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3235
3236Example matches A, va, fa
3237 class A {};
3238 class B; Doesn't match, as it has no body.
3239 int va;
3240 extern int vb; Doesn't match, as it doesn't define the variable.
3241 void fa() {}
3242 void fb(); Doesn't match, as it has no body.
3243
Aaron Ballman672dde22016-01-22 23:15:00 +00003244Usable 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 +00003245</pre></td></tr>
3246
3247
Aaron Ballman672dde22016-01-22 23:15:00 +00003248<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 +00003249<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3250
3251Note that 'Value' is a string as the template argument's value is
3252an arbitrary precision integer. 'Value' must be euqal to the canonical
3253representation of that integral value in base 10.
3254
3255Given
3256 template&lt;int T&gt; struct A {};
3257 C&lt;42&gt; c;
3258classTemplateSpecializationDecl(
3259 hasAnyTemplateArgument(equalsIntegralValue("42")))
3260 matches the implicit instantiation of C in C&lt;42&gt;.
3261</pre></td></tr>
3262
3263
Aaron Ballman672dde22016-01-22 23:15:00 +00003264<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 +00003265<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3266
3267Given
3268 template&lt;int T&gt; struct A {};
3269 C&lt;42&gt; c;
3270classTemplateSpecializationDecl(
3271 hasAnyTemplateArgument(isIntegral()))
3272 matches the implicit instantiation of C in C&lt;42&gt;
3273 with isIntegral() matching 42.
3274</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_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 +00003278<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3279
3280Given
3281 template&lt;typename T&gt; struct C {};
3282 C&lt;int&gt; c;
3283classTemplateSpecializationDecl(templateArgumentCountIs(1))
3284 matches C&lt;int&gt;.
3285</pre></td></tr>
3286
3287
Aaron Ballman672dde22016-01-22 23:15:00 +00003288<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 +00003289<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3290partially matching a given regex.
3291
3292Example matches Y but not X
3293 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3294 #include "ASTMatcher.h"
3295 class X {};
3296ASTMatcher.h:
3297 class Y {};
3298
Aaron Ballman672dde22016-01-22 23:15:00 +00003299Usable 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 +00003300</pre></td></tr>
3301
3302
Aaron Ballman672dde22016-01-22 23:15:00 +00003303<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 +00003304<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3305
3306Example matches X but not Y
3307 (matcher = cxxRecordDecl(isExpansionInMainFile())
3308 #include &lt;Y.h&gt;
3309 class X {};
3310Y.h:
3311 class Y {};
3312
Aaron Ballman672dde22016-01-22 23:15:00 +00003313Usable 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 +00003314</pre></td></tr>
3315
3316
Aaron Ballman672dde22016-01-22 23:15:00 +00003317<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 +00003318<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3319
3320Example matches Y but not X
3321 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3322 #include &lt;SystemHeader.h&gt;
3323 class X {};
3324SystemHeader.h:
3325 class Y {};
3326
Aaron Ballman672dde22016-01-22 23:15:00 +00003327Usable 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 +00003328</pre></td></tr>
3329
3330
Aaron Ballman672dde22016-01-22 23:15:00 +00003331<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 +00003332<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3333
3334Given
3335 struct S { bool func(); };
3336functionDecl(returns(booleanType()))
3337 matches "bool func();"
3338</pre></td></tr>
3339
3340
Aaron Ballman672dde22016-01-22 23:15:00 +00003341<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 +00003342<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3343
3344Matches a node if it equals the node previously bound to ID.
3345
3346Given
3347 class X { int a; int b; };
3348cxxRecordDecl(
3349 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3350 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3351 matches the class X, as a and b have the same type.
3352
3353Note that when multiple matches are involved via forEach* matchers,
3354equalsBoundNodes acts as a filter.
3355For example:
3356compoundStmt(
3357 forEachDescendant(varDecl().bind("d")),
3358 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3359will trigger a match for each combination of variable declaration
3360and reference to that variable declaration within a compound statement.
3361</pre></td></tr>
3362
3363
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003364<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>
3365<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3366
3367Type has pointer identity in the AST.
3368</pre></td></tr>
3369
3370
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003371<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>
3372<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3373
3374Given
3375 int i;
3376 float f;
3377realFloatingPointType()
3378 matches "float f" but not "int i"
3379</pre></td></tr>
3380
3381
Aaron Ballman672dde22016-01-22 23:15:00 +00003382<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003383<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3384
3385Given
3386 struct S { void func(); };
3387functionDecl(returns(voidType()))
3388 matches "void func();"
3389</pre></td></tr>
3390
3391
Aaron Ballman672dde22016-01-22 23:15:00 +00003392<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 +00003393<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3394
3395Given
3396 int x;
3397 int s = sizeof(x) + alignof(x)
3398unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3399 matches sizeof(x)
3400</pre></td></tr>
3401
3402
Aaron Ballman672dde22016-01-22 23:15:00 +00003403<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 +00003404<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3405unary).
3406
3407Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3408 !(a || b)
3409</pre></td></tr>
3410
3411
Aaron Ballman672dde22016-01-22 23:15:00 +00003412<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 +00003413<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3414
3415Example matches x, but not y, z, or a.
3416(matcher = varDecl(hasAutomaticStorageDuration())
3417void f() {
3418 int x;
3419 static int y;
3420 thread_local int z;
3421}
3422int a;
3423</pre></td></tr>
3424
3425
Aaron Ballman672dde22016-01-22 23:15:00 +00003426<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 +00003427<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3428
3429Example matches y and z (matcher = varDecl(hasGlobalStorage())
3430void f() {
3431 int x;
3432 static int y;
3433}
3434int z;
3435</pre></td></tr>
3436
3437
Aaron Ballman672dde22016-01-22 23:15:00 +00003438<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 +00003439<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3440non-static local variable.
3441
3442Example matches x (matcher = varDecl(hasLocalStorage())
3443void f() {
3444 int x;
3445 static int y;
3446}
3447int z;
3448</pre></td></tr>
3449
3450
Aaron Ballman672dde22016-01-22 23:15:00 +00003451<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 +00003452<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 +00003453It includes the variable declared at namespace scope and those declared
3454with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003455
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003456void f() {
3457 int x;
3458 static int y;
3459 thread_local int z;
3460}
3461int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003462static int b;
3463extern int c;
3464varDecl(hasStaticStorageDuration())
3465 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003466</pre></td></tr>
3467
3468
Aaron Ballman672dde22016-01-22 23:15:00 +00003469<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 +00003470<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3471
3472Example matches z, but not x, z, or a.
3473(matcher = varDecl(hasThreadStorageDuration())
3474void f() {
3475 int x;
3476 static int y;
3477 thread_local int z;
3478}
3479int a;
3480</pre></td></tr>
3481
3482
Aaron Ballman672dde22016-01-22 23:15:00 +00003483<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 +00003484<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3485
3486Given:
3487 constexpr int foo = 42;
3488 constexpr int bar();
3489varDecl(isConstexpr())
3490 matches the declaration of foo.
3491functionDecl(isConstexpr())
3492 matches the declaration of bar.
3493</pre></td></tr>
3494
3495
Aaron Ballman672dde22016-01-22 23:15:00 +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('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003497<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3498
3499Example matches A, va, fa
3500 class A {};
3501 class B; Doesn't match, as it has no body.
3502 int va;
3503 extern int vb; Doesn't match, as it doesn't define the variable.
3504 void fa() {}
3505 void fb(); Doesn't match, as it has no body.
3506
Aaron Ballman672dde22016-01-22 23:15:00 +00003507Usable 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 +00003508</pre></td></tr>
3509
3510
Aaron Ballman672dde22016-01-22 23:15:00 +00003511<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 +00003512<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3513a C++ catch block, or an Objective-C statement.
3514
3515Example matches x (matcher = varDecl(isExceptionVariable())
3516void f(int y) {
3517 try {
3518 } catch (int x) {
3519 }
3520}
3521</pre></td></tr>
3522
3523
Aaron Ballman672dde22016-01-22 23:15:00 +00003524<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 +00003525<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3526static member variable template instantiations.
3527
3528Given
3529 template&lt;typename T&gt; void A(T t) { }
3530 template&lt;&gt; void A(int N) { }
3531functionDecl(isExplicitTemplateSpecialization())
3532 matches the specialization A&lt;int&gt;().
3533
Aaron Ballman672dde22016-01-22 23:15:00 +00003534Usable 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 +00003535</pre></td></tr>
3536
3537
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003538<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>
3539<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations.
3540
3541Given:
3542 extern "C" void f() {}
3543 extern "C" { void g() {} }
3544 void h() {}
3545functionDecl(isExternC())
3546 matches the declaration of f and g, but not the declaration h
3547</pre></td></tr>
3548
3549
Haojian Wub3d25462016-09-26 16:01:52 +00003550<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 +00003551<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3552class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003553
3554Given:
3555 static void f() {}
3556 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003557 extern int j;
3558 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003559functionDecl(isStaticStorageClass())
3560 matches the function declaration f.
3561varDecl(isStaticStorageClass())
3562 matches the variable declaration i.
3563</pre></td></tr>
3564
3565
Aaron Ballman672dde22016-01-22 23:15:00 +00003566<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 +00003567<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3568member variable template instantiations.
3569
3570Given
3571 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3572or
3573 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3574cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3575 matches the template instantiation of X&lt;A&gt;.
3576
3577But given
3578 template &lt;typename T&gt; class X {}; class A {};
3579 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3580cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3581 does not match, as X&lt;A&gt; is an explicit template specialization.
3582
Aaron Ballman672dde22016-01-22 23:15:00 +00003583Usable 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 +00003584</pre></td></tr>
3585
3586
Aaron Ballman672dde22016-01-22 23:15:00 +00003587<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 +00003588<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3589template instantiations.
3590
3591Given
3592 template&lt;typename T&gt; void A(T t) { T i; }
3593 A(0);
3594 A(0U);
3595functionDecl(isInstantiated())
3596 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3597</pre></td></tr>
3598
3599
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003600<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>
3601<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3602GNU's __null, C++11's nullptr, or C's NULL macro.
3603
3604Given:
3605 void *v1 = NULL;
3606 void *v2 = nullptr;
3607 void *v3 = __null; GNU extension
3608 char *cp = (char *)0;
3609 int *ip = 0;
3610 int i = 0;
3611expr(nullPointerConstant())
3612 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3613 initializer for i.
3614</pre></td></tr>
3615
3616
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003617<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>
3618<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3619
3620This matcher is only provided as a performance optimization of hasName.
3621 hasAnyName(a, b, c)
3622 is equivalent to, but faster than
3623 anyOf(hasName(a), hasName(b), hasName(c))
3624</pre></td></tr>
3625
3626
Aaron Ballman672dde22016-01-22 23:15:00 +00003627<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 +00003628<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3629
3630Given
3631 int j;
3632 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3633 A(0);
3634 A(0U);
3635declStmt(isInTemplateInstantiation())
3636 matches 'int i;' and 'unsigned i'.
3637unless(stmt(isInTemplateInstantiation()))
3638 will NOT match j += 42; as it's shared between the template definition and
3639 instantiation.
3640</pre></td></tr>
3641
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003642<!--END_NARROWING_MATCHERS -->
3643</table>
3644
3645<!-- ======================================================================= -->
3646<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3647<!-- ======================================================================= -->
3648
3649<p>Traversal matchers specify the relationship to other nodes that are
3650reachable from the current node.</p>
3651
3652<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3653forEachDescendant) which work on all nodes and allow users to write more generic
3654match expressions.</p>
3655
3656<table>
3657<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003658<!-- START_TRAVERSAL_MATCHERS -->
3659
3660<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>
3661<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3662
3663Unlike anyOf, eachOf will generate a match result for each
3664matching submatcher.
3665
3666For example, in:
3667 class A { int a; int b; };
3668The matcher:
3669 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3670 has(fieldDecl(hasName("b")).bind("v"))))
3671will generate two results binding "v", the first of which binds
3672the field declaration of a, the second the field declaration of
3673b.
3674
3675Usable as: Any Matcher
3676</pre></td></tr>
3677
3678
3679<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3680<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3681provided matcher.
3682
3683Example matches X, A, B, C
3684 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3685 class X {}; Matches X, because X::X is a class of name X inside X.
3686 class A { class X {}; };
3687 class B { class C { class X {}; }; };
3688
3689DescendantT must be an AST base type.
3690
3691As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3692each result that matches instead of only on the first one.
3693
3694Note: Recursively combined ForEachDescendant can cause many matches:
3695 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3696 forEachDescendant(cxxRecordDecl())
3697 )))
3698will match 10 times (plus injected class name matches) on:
3699 class A { class B { class C { class D { class E {}; }; }; }; };
3700
3701Usable as: Any Matcher
3702</pre></td></tr>
3703
3704
3705<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3706<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3707provided matcher.
3708
3709Example matches X, Y
3710 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3711 class X {}; Matches X, because X::X is a class of name X inside X.
3712 class Y { class X {}; };
3713 class Z { class Y { class X {}; }; }; Does not match Z.
3714
3715ChildT must be an AST base type.
3716
3717As opposed to 'has', 'forEach' will cause a match for each result that
3718matches instead of only on the first one.
3719
3720Usable as: Any Matcher
3721</pre></td></tr>
3722
3723
3724<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3725<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3726matcher.
3727
3728Given
3729void f() { if (true) { int x = 42; } }
3730void g() { for (;;) { int x = 43; } }
3731expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3732
3733Usable as: Any Matcher
3734</pre></td></tr>
3735
3736
3737<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3738<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3739provided matcher.
3740
3741Example matches X, Y, Z
3742 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3743 class X {}; Matches X, because X::X is a class of name X inside X.
3744 class Y { class X {}; };
3745 class Z { class Y { class X {}; }; };
3746
3747DescendantT must be an AST base type.
3748
3749Usable as: Any Matcher
3750</pre></td></tr>
3751
3752
3753<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3754<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3755provided matcher.
3756
3757Example matches X, Y
3758 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3759 class X {}; Matches X, because X::X is a class of name X inside X.
3760 class Y { class X {}; };
3761 class Z { class Y { class X {}; }; }; Does not match Z.
3762
3763ChildT must be an AST base type.
3764
3765Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003766Note that has is direct matcher, so it also matches things like implicit
3767casts and paren casts. If you are matching with expr then you should
3768probably consider using ignoringParenImpCasts like:
3769has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003770</pre></td></tr>
3771
3772
3773<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3774<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3775matcher.
3776
3777Given
3778void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3779compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3780
3781Usable as: Any Matcher
3782</pre></td></tr>
3783
3784
Etienne Bergeron5500f952016-05-30 15:25:25 +00003785<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>
3786<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3787switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003788
3789Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3790 if (true) {}
3791</pre></td></tr>
3792
3793
3794<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>
3795<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3796(binary or ternary).
3797
3798Example matches b
3799 condition ? a : b
3800 condition ?: b
3801</pre></td></tr>
3802
3803
3804<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>
3805<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3806
3807Example 1 (conditional ternary operator): matches a
3808 condition ? a : b
3809
3810Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3811 condition ?: b
3812</pre></td></tr>
3813
3814
Manuel Klimeka37e1102016-12-01 15:45:06 +00003815<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>
3816<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 +00003817matches the given matcher.
3818
3819The associated declaration is:
3820- for type nodes, the declaration of the underlying type
3821- for CallExpr, the declaration of the callee
3822- for MemberExpr, the declaration of the referenced member
3823- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00003824- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003825
3826Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3827function. e.g. various subtypes of clang::Type and various expressions.
3828
Manuel Klimeka37e1102016-12-01 15:45:06 +00003829Usable 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;,
3830 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;,
3831 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;,
3832 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;,
3833 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;,
3834 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;,
3835 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +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_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 +00003840<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3841
3842Given
3843 int i[5];
3844 void f() { i[1] = 42; }
3845arraySubscriptExpression(hasBase(implicitCastExpr(
3846 hasSourceExpression(declRefExpr()))))
3847 matches i[1] with the declRefExpr() matching i
3848</pre></td></tr>
3849
3850
Aaron Ballman672dde22016-01-22 23:15:00 +00003851<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 +00003852<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3853
3854Given
3855 int i[5];
3856 void f() { i[1] = 42; }
3857arraySubscriptExpression(hasIndex(integerLiteral()))
3858 matches i[1] with the integerLiteral() matching 1
3859</pre></td></tr>
3860
3861
Aaron Ballman672dde22016-01-22 23:15:00 +00003862<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 +00003863<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
3864
3865Example matches a (matcher = binaryOperator(hasLHS()))
3866 a || b
3867</pre></td></tr>
3868
3869
Aaron Ballman672dde22016-01-22 23:15:00 +00003870<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 +00003871<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
3872
3873Example matches b (matcher = binaryOperator(hasRHS()))
3874 a || b
3875</pre></td></tr>
3876
3877
Aaron Ballman672dde22016-01-22 23:15:00 +00003878<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 +00003879<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
3880type.
3881
3882Given
3883 struct A {};
3884 A a[7];
3885 int b[7];
3886arrayType(hasElementType(builtinType()))
3887 matches "int b[7]"
3888
Aaron Ballman672dde22016-01-22 23:15:00 +00003889Usable 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 +00003890</pre></td></tr>
3891
3892
Aaron Ballman672dde22016-01-22 23:15:00 +00003893<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 +00003894<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
3895type.
3896
3897Given
3898 struct A {};
3899 A a[7];
3900 int b[7];
3901arrayType(hasElementType(builtinType()))
3902 matches "int b[7]"
3903
Aaron Ballman672dde22016-01-22 23:15:00 +00003904Usable 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 +00003905</pre></td></tr>
3906
3907
Aaron Ballman672dde22016-01-22 23:15:00 +00003908<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 +00003909<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
3910
3911Given
3912 _Atomic(int) i;
3913 _Atomic(float) f;
3914atomicType(hasValueType(isInteger()))
3915 matches "_Atomic(int) i"
3916
Aaron Ballman672dde22016-01-22 23:15:00 +00003917Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003918</pre></td></tr>
3919
3920
Aaron Ballman672dde22016-01-22 23:15:00 +00003921<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 +00003922<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
3923
3924Given
3925 _Atomic(int) i;
3926 _Atomic(float) f;
3927atomicType(hasValueType(isInteger()))
3928 matches "_Atomic(int) i"
3929
Aaron Ballman672dde22016-01-22 23:15:00 +00003930Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</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_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 +00003935<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
3936
3937Note: There is no TypeLoc for the deduced type and thus no
3938getDeducedLoc() matcher.
3939
3940Given
3941 auto a = 1;
3942 auto b = 2.0;
3943autoType(hasDeducedType(isInteger()))
3944 matches "auto a"
3945
Aaron Ballman672dde22016-01-22 23:15:00 +00003946Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</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_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 +00003951<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
3952binary operator matches.
3953</pre></td></tr>
3954
3955
Aaron Ballman672dde22016-01-22 23:15:00 +00003956<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 +00003957<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
3958
3959Example matches a (matcher = binaryOperator(hasLHS()))
3960 a || b
3961</pre></td></tr>
3962
3963
Aaron Ballman672dde22016-01-22 23:15:00 +00003964<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 +00003965<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
3966
3967Example matches b (matcher = binaryOperator(hasRHS()))
3968 a || b
3969</pre></td></tr>
3970
3971
Aaron Ballman672dde22016-01-22 23:15:00 +00003972<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 +00003973<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3974pointee matches a given matcher.
3975
3976Given
3977 int *a;
3978 int const *b;
3979 float const *f;
3980pointerType(pointee(isConstQualified(), isInteger()))
3981 matches "int const *b"
3982
Aaron Ballman672dde22016-01-22 23:15:00 +00003983Usable 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;,
3984 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 +00003985</pre></td></tr>
3986
3987
Aaron Ballman672dde22016-01-22 23:15:00 +00003988<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 +00003989<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3990pointee matches a given matcher.
3991
3992Given
3993 int *a;
3994 int const *b;
3995 float const *f;
3996pointerType(pointee(isConstQualified(), isInteger()))
3997 matches "int const *b"
3998
Aaron Ballman672dde22016-01-22 23:15:00 +00003999Usable 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;,
4000 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 +00004001</pre></td></tr>
4002
4003
Aaron Ballman672dde22016-01-22 23:15:00 +00004004<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 +00004005<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4006
4007Given
4008 void f(int i);
4009 int y;
4010 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004011callExpr(
4012 forEachArgumentWithParam(
4013 declRefExpr(to(varDecl(hasName("y")))),
4014 parmVarDecl(hasType(isInteger()))
4015))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004016 matches f(y);
4017with declRefExpr(...)
4018 matching int y
4019and parmVarDecl(...)
4020 matching int i
4021</pre></td></tr>
4022
4023
Aaron Ballman672dde22016-01-22 23:15:00 +00004024<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 +00004025<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4026expression.
4027
4028Given
4029 void x(int, int, int) { int y; x(1, y, 42); }
4030callExpr(hasAnyArgument(declRefExpr()))
4031 matches x(1, y, 42)
4032with hasAnyArgument(...)
4033 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004034</pre></td></tr>
4035
4036
Aaron Ballman672dde22016-01-22 23:15:00 +00004037<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 +00004038<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4039call expression.
4040
4041Example matches y in x(y)
4042 (matcher = callExpr(hasArgument(0, declRefExpr())))
4043 void x(int) { int y; x(y); }
4044</pre></td></tr>
4045
4046
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004047<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>
4048<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 +00004049matches the given matcher.
4050
4051The associated declaration is:
4052- for type nodes, the declaration of the underlying type
4053- for CallExpr, the declaration of the callee
4054- for MemberExpr, the declaration of the referenced member
4055- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004056- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004057
4058Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4059function. e.g. various subtypes of clang::Type and various expressions.
4060
Manuel Klimeka37e1102016-12-01 15:45:06 +00004061Usable 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;,
4062 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;,
4063 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;,
4064 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;,
4065 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;,
4066 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;,
4067 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004068</pre></td></tr>
4069
4070
Aaron Ballman672dde22016-01-22 23:15:00 +00004071<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 +00004072<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4073
4074Given
4075 class A { A() : i(42), j(42) {} int i; int j; };
4076cxxConstructorDecl(forEachConstructorInitializer(
4077 forField(decl().bind("x"))
4078))
4079 will trigger two matches, binding for 'i' and 'j' respectively.
4080</pre></td></tr>
4081
4082
Aaron Ballman672dde22016-01-22 23:15:00 +00004083<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 +00004084<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4085
4086Given
4087 struct Foo {
4088 Foo() : foo_(1) { }
4089 int foo_;
4090 };
4091cxxRecordDecl(has(cxxConstructorDecl(
4092 hasAnyConstructorInitializer(anything())
4093)))
4094 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4095</pre></td></tr>
4096
4097
Aaron Ballman672dde22016-01-22 23:15:00 +00004098<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 +00004099<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4100
4101Given
4102 struct Foo {
4103 Foo() : foo_(1) { }
4104 int foo_;
4105 };
4106cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4107 forField(hasName("foo_"))))))
4108 matches Foo
4109with forField matching foo_
4110</pre></td></tr>
4111
4112
Aaron Ballman672dde22016-01-22 23:15:00 +00004113<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 +00004114<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4115
4116Given
4117 struct Foo {
4118 Foo() : foo_(1) { }
4119 int foo_;
4120 };
4121cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4122 withInitializer(integerLiteral(equals(1)))))))
4123 matches Foo
4124with withInitializer matching (1)
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_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 +00004129<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4130definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004131
4132Given
4133 for (;;) {}
4134hasBody(compoundStmt())
4135 matches 'for (;;) {}'
4136with compoundStmt()
4137 matching '{}'
4138</pre></td></tr>
4139
4140
Aaron Ballman672dde22016-01-22 23:15:00 +00004141<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 +00004142<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4143
4144Example:
4145 forStmt(hasLoopVariable(anything()))
4146matches 'int x' in
4147 for (int x : a) { }
4148</pre></td></tr>
4149
4150
Aaron Ballman672dde22016-01-22 23:15:00 +00004151<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 +00004152<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4153
4154Example:
4155 forStmt(hasRangeInit(anything()))
4156matches 'a' in
4157 for (int x : a) { }
4158</pre></td></tr>
4159
4160
Aaron Ballman672dde22016-01-22 23:15:00 +00004161<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 +00004162<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4163
4164
Aaron Ballman672dde22016-01-22 23:15:00 +00004165<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 +00004166<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4167
4168Example matches y.x()
4169 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4170 class Y { public: void x(); };
4171 void z() { Y y; y.x(); }",
4172
4173FIXME: Overload to allow directly matching types?
4174</pre></td></tr>
4175
4176
Aaron Ballman672dde22016-01-22 23:15:00 +00004177<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 +00004178<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4179</pre></td></tr>
4180
4181
Aaron Ballman672dde22016-01-22 23:15:00 +00004182<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 +00004183<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4184matcher, or is a pointer to a type that matches the InnerMatcher.
4185</pre></td></tr>
4186
4187
Clement Courbet6ecaec82016-07-05 07:49:31 +00004188<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 +00004189<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 +00004190produce multiple matches.
4191
4192Given
4193 class A { virtual void f(); };
4194 class B : public A { void f(); };
4195 class C : public B { void f(); };
4196cxxMethodDecl(ofClass(hasName("C")),
4197 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4198 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4199 that B::f is not overridden by C::f).
4200
4201The check can produce multiple matches in case of multiple inheritance, e.g.
4202 class A1 { virtual void f(); };
4203 class A2 { virtual void f(); };
4204 class C : public A1, public A2 { void f(); };
4205cxxMethodDecl(ofClass(hasName("C")),
4206 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4207 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4208 once with "b" binding "A2::f" and "d" binding "C::f".
4209</pre></td></tr>
4210
4211
Aaron Ballman672dde22016-01-22 23:15:00 +00004212<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 +00004213<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4214belongs to.
4215
4216FIXME: Generalize this for other kinds of declarations.
4217FIXME: What other kind of declarations would we need to generalize
4218this to?
4219
4220Example matches A() in the last line
4221 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4222 ofClass(hasName("A"))))))
4223 class A {
4224 public:
4225 A();
4226 };
4227 A a = A();
4228</pre></td></tr>
4229
4230
Manuel Klimeka37e1102016-12-01 15:45:06 +00004231<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>
4232<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 +00004233matches the given matcher.
4234
4235The associated declaration is:
4236- for type nodes, the declaration of the underlying type
4237- for CallExpr, the declaration of the callee
4238- for MemberExpr, the declaration of the referenced member
4239- for CXXConstructExpr, the declaration of the constructor
4240- for CXXNewExpr, the declaration of the operator new
4241
4242Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4243function. e.g. various subtypes of clang::Type and various expressions.
4244
Manuel Klimeka37e1102016-12-01 15:45:06 +00004245Usable 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;,
4246 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;,
4247 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;,
4248 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;,
4249 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;,
4250 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;,
4251 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004252</pre></td></tr>
4253
4254
Aaron Ballman672dde22016-01-22 23:15:00 +00004255<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 +00004256<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4257
4258Given:
4259 class A { void func(); };
4260 class B { void member(); };
4261
4262cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4263A but not B.
4264</pre></td></tr>
4265
4266
Aaron Ballman672dde22016-01-22 23:15:00 +00004267<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 +00004268<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4269a class matching Base.
4270
4271Note that a class is not considered to be derived from itself.
4272
4273Example matches Y, Z, C (Base == hasName("X"))
4274 class X;
4275 class Y : public X {}; directly derived
4276 class Z : public Y {}; indirectly derived
4277 typedef X A;
4278 typedef A B;
4279 class C : public B {}; derived from a typedef of X
4280
4281In the following example, Bar matches isDerivedFrom(hasName("X")):
4282 class Foo;
4283 typedef Foo X;
4284 class Bar : public Foo {}; derived from a type that X is a typedef of
4285</pre></td></tr>
4286
4287
Aaron Ballman672dde22016-01-22 23:15:00 +00004288<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 +00004289<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4290match Base.
4291</pre></td></tr>
4292
4293
Aaron Ballman672dde22016-01-22 23:15:00 +00004294<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 +00004295<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4296given matcher.
4297
4298Example matches y.x() (matcher = callExpr(callee(
4299 cxxMethodDecl(hasName("x")))))
4300 class Y { public: void x(); };
4301 void z() { Y y; y.x(); }
4302</pre></td></tr>
4303
4304
Aaron Ballman672dde22016-01-22 23:15:00 +00004305<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 +00004306<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4307
4308Given
4309 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4310 void f() { f(); }
4311callExpr(callee(expr()))
4312 matches this-&gt;x(), x(), y.x(), f()
4313with callee(...)
4314 matching this-&gt;x, x, y.x, f respectively
4315
Aaron Ballman672dde22016-01-22 23:15:00 +00004316Note: 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 +00004317because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004318internal::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 +00004319implemented in terms of implicit casts.
4320</pre></td></tr>
4321
4322
Aaron Ballman672dde22016-01-22 23:15:00 +00004323<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 +00004324<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4325
4326Given
4327 void f(int i);
4328 int y;
4329 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004330callExpr(
4331 forEachArgumentWithParam(
4332 declRefExpr(to(varDecl(hasName("y")))),
4333 parmVarDecl(hasType(isInteger()))
4334))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004335 matches f(y);
4336with declRefExpr(...)
4337 matching int y
4338and parmVarDecl(...)
4339 matching int i
4340</pre></td></tr>
4341
4342
Aaron Ballman672dde22016-01-22 23:15:00 +00004343<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 +00004344<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4345expression.
4346
4347Given
4348 void x(int, int, int) { int y; x(1, y, 42); }
4349callExpr(hasAnyArgument(declRefExpr()))
4350 matches x(1, y, 42)
4351with hasAnyArgument(...)
4352 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004353</pre></td></tr>
4354
4355
Aaron Ballman672dde22016-01-22 23:15:00 +00004356<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 +00004357<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4358call expression.
4359
4360Example matches y in x(y)
4361 (matcher = callExpr(hasArgument(0, declRefExpr())))
4362 void x(int) { int y; x(y); }
4363</pre></td></tr>
4364
4365
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004366<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>
4367<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 +00004368matches the given matcher.
4369
4370The associated declaration is:
4371- for type nodes, the declaration of the underlying type
4372- for CallExpr, the declaration of the callee
4373- for MemberExpr, the declaration of the referenced member
4374- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004375- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004376
4377Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4378function. e.g. various subtypes of clang::Type and various expressions.
4379
Manuel Klimeka37e1102016-12-01 15:45:06 +00004380Usable 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;,
4381 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;,
4382 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;,
4383 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;,
4384 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;,
4385 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;,
4386 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004387</pre></td></tr>
4388
4389
Aaron Ballman672dde22016-01-22 23:15:00 +00004390<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 +00004391<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4392extension, matches the constant given in the statement.
4393
4394Given
4395 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4396caseStmt(hasCaseConstant(integerLiteral()))
4397 matches "case 1:"
4398</pre></td></tr>
4399
4400
Aaron Ballman672dde22016-01-22 23:15:00 +00004401<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 +00004402<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004403
4404
Aaron Ballman672dde22016-01-22 23:15:00 +00004405<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 +00004406<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4407functionDecl that have at least one TemplateArgument matching the given
4408InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004409
4410Given
4411 template&lt;typename T&gt; class A {};
4412 template&lt;&gt; class A&lt;double&gt; {};
4413 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004414
Haojian Wu99e39a72016-07-29 17:30:13 +00004415 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004416 void func() { f&lt;int&gt;(); };
4417
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004418classTemplateSpecializationDecl(hasAnyTemplateArgument(
4419 refersToType(asString("int"))))
4420 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004421
4422functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4423 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004424</pre></td></tr>
4425
4426
Aaron Ballman672dde22016-01-22 23:15:00 +00004427<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 +00004428<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4429functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004430
4431Given
4432 template&lt;typename T, typename U&gt; class A {};
4433 A&lt;bool, int&gt; b;
4434 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004435
Haojian Wu99e39a72016-07-29 17:30:13 +00004436 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004437 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004438classTemplateSpecializationDecl(hasTemplateArgument(
4439 1, refersToType(asString("int"))))
4440 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004441
4442functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4443 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004444</pre></td></tr>
4445
4446
Aaron Ballman672dde22016-01-22 23:15:00 +00004447<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 +00004448<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4449type.
4450
4451Given
4452 struct A {};
4453 A a[7];
4454 int b[7];
4455arrayType(hasElementType(builtinType()))
4456 matches "int b[7]"
4457
Aaron Ballman672dde22016-01-22 23:15:00 +00004458Usable 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 +00004459</pre></td></tr>
4460
4461
Aaron Ballman672dde22016-01-22 23:15:00 +00004462<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 +00004463<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4464type.
4465
4466Given
4467 struct A {};
4468 A a[7];
4469 int b[7];
4470arrayType(hasElementType(builtinType()))
4471 matches "int b[7]"
4472
Aaron Ballman672dde22016-01-22 23:15:00 +00004473Usable 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 +00004474</pre></td></tr>
4475
4476
Aaron Ballman672dde22016-01-22 23:15:00 +00004477<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 +00004478<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 +00004479a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004480
4481Given
4482 { {}; 1+2; }
4483hasAnySubstatement(compoundStmt())
4484 matches '{ {}; 1+2; }'
4485with compoundStmt()
4486 matching '{}'
4487</pre></td></tr>
4488
4489
Aaron Ballman672dde22016-01-22 23:15:00 +00004490<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 +00004491<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4492</pre></td></tr>
4493
4494
Manuel Klimeka37e1102016-12-01 15:45:06 +00004495<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>
4496<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 +00004497matches the given matcher.
4498
4499The associated declaration is:
4500- for type nodes, the declaration of the underlying type
4501- for CallExpr, the declaration of the callee
4502- for MemberExpr, the declaration of the referenced member
4503- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004504- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004505
4506Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4507function. e.g. various subtypes of clang::Type and various expressions.
4508
Manuel Klimeka37e1102016-12-01 15:45:06 +00004509Usable 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;,
4510 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;,
4511 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;,
4512 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;,
4513 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;,
4514 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;,
4515 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004516</pre></td></tr>
4517
4518
Aaron Ballman672dde22016-01-22 23:15:00 +00004519<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 +00004520<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4521specific using shadow declaration.
4522
4523Given
4524 namespace a { void f() {} }
4525 using a::f;
4526 void g() {
4527 f(); Matches this ..
4528 a::f(); .. but not this.
4529 }
4530declRefExpr(throughUsingDecl(anything()))
4531 matches f()
4532</pre></td></tr>
4533
4534
Aaron Ballman672dde22016-01-22 23:15:00 +00004535<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 +00004536<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4537specified matcher.
4538
4539Example matches x in if(x)
4540 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4541 bool x;
4542 if (x) {}
4543</pre></td></tr>
4544
4545
Aaron Ballman672dde22016-01-22 23:15:00 +00004546<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004547<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4548
4549Note that this does not work for global declarations because the AST
4550breaks up multiple-declaration DeclStmt's into multiple single-declaration
4551DeclStmt's.
4552Example: Given non-global declarations
4553 int a, b = 0;
4554 int c;
4555 int d = 2, e;
4556declStmt(containsDeclaration(
4557 0, varDecl(hasInitializer(anything()))))
4558 matches only 'int d = 2, e;', and
4559declStmt(containsDeclaration(1, varDecl()))
4560 matches 'int a, b = 0' as well as 'int d = 2, e;'
4561 but 'int c;' is not matched.
4562</pre></td></tr>
4563
4564
Aaron Ballman672dde22016-01-22 23:15:00 +00004565<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 +00004566<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4567
4568Given
4569 int a, b;
4570 int c;
4571declStmt(hasSingleDecl(anything()))
4572 matches 'int c;' but not 'int a, b;'.
4573</pre></td></tr>
4574
4575
Aaron Ballman672dde22016-01-22 23:15:00 +00004576<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 +00004577<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4578the inner matcher.
4579
4580Given
4581 int x;
4582declaratorDecl(hasTypeLoc(loc(asString("int"))))
4583 matches int x
4584</pre></td></tr>
4585
4586
Aaron Ballman672dde22016-01-22 23:15:00 +00004587<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 +00004588<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4589Decl, matches InnerMatcher.
4590
4591Given
4592 namespace N {
4593 namespace M {
4594 class D {};
4595 }
4596 }
4597
4598cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4599declaration of class D.
4600</pre></td></tr>
4601
4602
Aaron Ballman672dde22016-01-22 23:15:00 +00004603<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 +00004604<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4605definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004606
4607Given
4608 for (;;) {}
4609hasBody(compoundStmt())
4610 matches 'for (;;) {}'
4611with compoundStmt()
4612 matching '{}'
4613</pre></td></tr>
4614
4615
Aaron Ballman672dde22016-01-22 23:15:00 +00004616<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 +00004617<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 +00004618switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004619
4620Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4621 if (true) {}
4622</pre></td></tr>
4623
4624
Aaron Ballman672dde22016-01-22 23:15:00 +00004625<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004626<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4627matches InnerMatcher if the qualifier exists.
4628
4629Given
4630 namespace N {
4631 namespace M {
4632 class D {};
4633 }
4634 }
4635 N::M::D d;
4636
4637elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4638matches the type of the variable declaration of d.
4639</pre></td></tr>
4640
4641
Aaron Ballman672dde22016-01-22 23:15:00 +00004642<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 +00004643<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4644
4645Given
4646 namespace N {
4647 namespace M {
4648 class D {};
4649 }
4650 }
4651 N::M::D d;
4652
4653elaboratedType(namesType(recordType(
4654hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4655declaration of d.
4656</pre></td></tr>
4657
4658
Manuel Klimeka37e1102016-12-01 15:45:06 +00004659<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>
4660<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 +00004661matches the given matcher.
4662
4663The associated declaration is:
4664- for type nodes, the declaration of the underlying type
4665- for CallExpr, the declaration of the callee
4666- for MemberExpr, the declaration of the referenced member
4667- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004668- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004669
4670Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4671function. e.g. various subtypes of clang::Type and various expressions.
4672
Manuel Klimeka37e1102016-12-01 15:45:06 +00004673Usable 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;,
4674 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;,
4675 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;,
4676 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;,
4677 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;,
4678 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;,
4679 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004680</pre></td></tr>
4681
4682
Aaron Ballman672dde22016-01-22 23:15:00 +00004683<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 +00004684<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4685
4686(Note: Clang's AST refers to other conversions as "casts" too, and calls
4687actual casts "explicit" casts.)
4688</pre></td></tr>
4689
4690
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004691<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>
4692<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 +00004693declaration's type.
4694
4695In case of a value declaration (for example a variable declaration),
4696this resolves one layer of indirection. For example, in the value
4697declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4698X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4699declaration of x.
4700
4701Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4702 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4703 class X {};
4704 void y(X &amp;x) { x; X z; }
4705
Aaron Ballman672dde22016-01-22 23:15:00 +00004706Usable 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 +00004707</pre></td></tr>
4708
4709
Aaron Ballman672dde22016-01-22 23:15:00 +00004710<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 +00004711<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4712matcher.
4713
4714Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4715 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004716 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004717 class X {};
4718 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004719 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004720</pre></td></tr>
4721
4722
Aaron Ballman672dde22016-01-22 23:15:00 +00004723<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 +00004724<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4725are stripped off.
4726
4727Parentheses and explicit casts are not discarded.
4728Given
4729 int arr[5];
4730 int a = 0;
4731 char b = 0;
4732 const int c = a;
4733 int *d = arr;
4734 long e = (long) 0l;
4735The matchers
4736 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4737 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4738would match the declarations for a, b, c, and d, but not e.
4739While
4740 varDecl(hasInitializer(integerLiteral()))
4741 varDecl(hasInitializer(declRefExpr()))
4742only match the declarations for b, c, and d.
4743</pre></td></tr>
4744
4745
Cong Liu8a02efb2016-06-24 09:38:03 +00004746<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>
4747<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4748nodes are stripped off.
4749
4750Parentheses and explicit casts are not discarded.
4751Given
4752 class C {};
4753 C a = C();
4754 C b;
4755 C c = b;
4756The matchers
4757 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4758would match the declarations for a, b, and c.
4759While
4760 varDecl(hasInitializer(cxxConstructExpr()))
4761only match the declarations for b and c.
4762</pre></td></tr>
4763
4764
Aaron Ballman672dde22016-01-22 23:15:00 +00004765<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 +00004766<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4767casts are stripped off.
4768
4769Implicit and non-C Style casts are also discarded.
4770Given
4771 int a = 0;
4772 char b = (0);
4773 void* c = reinterpret_cast&lt;char*&gt;(0);
4774 char d = char(0);
4775The matcher
4776 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4777would match the declarations for a, b, c, and d.
4778while
4779 varDecl(hasInitializer(integerLiteral()))
4780only match the declaration for a.
4781</pre></td></tr>
4782
4783
Aaron Ballman672dde22016-01-22 23:15:00 +00004784<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 +00004785<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4786parentheses are stripped off.
4787
4788Explicit casts are not discarded.
4789Given
4790 int arr[5];
4791 int a = 0;
4792 char b = (0);
4793 const int c = a;
4794 int *d = (arr);
4795 long e = ((long) 0l);
4796The matchers
4797 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4798 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4799would match the declarations for a, b, c, and d, but not e.
4800while
4801 varDecl(hasInitializer(integerLiteral()))
4802 varDecl(hasInitializer(declRefExpr()))
4803would only match the declaration for a.
4804</pre></td></tr>
4805
4806
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00004807<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4808<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4809
4810Given
4811 class C {
4812 int a = 2;
4813 int b = 3;
4814 int c;
4815 };
4816fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4817 matches 'int a;' but not 'int b;'.
4818fieldDecl(hasInClassInitializer(anything()))
4819 matches 'int a;' and 'int b;' but not 'int c;'.
4820</pre></td></tr>
4821
4822
Aaron Ballman672dde22016-01-22 23:15:00 +00004823<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 +00004824<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4825definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004826
4827Given
4828 for (;;) {}
4829hasBody(compoundStmt())
4830 matches 'for (;;) {}'
4831with compoundStmt()
4832 matching '{}'
4833</pre></td></tr>
4834
4835
Aaron Ballman672dde22016-01-22 23:15:00 +00004836<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 +00004837<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 +00004838switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004839
4840Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4841 if (true) {}
4842</pre></td></tr>
4843
4844
Aaron Ballman672dde22016-01-22 23:15:00 +00004845<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 +00004846<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4847
4848Example:
4849 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4850matches '++x' in
4851 for (x; x &lt; N; ++x) { }
4852</pre></td></tr>
4853
4854
Aaron Ballman672dde22016-01-22 23:15:00 +00004855<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 +00004856<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
4857
4858Example:
4859 forStmt(hasLoopInit(declStmt()))
4860matches 'int x = 0' in
4861 for (int x = 0; x &lt; N; ++x) { }
4862</pre></td></tr>
4863
4864
Aaron Ballman672dde22016-01-22 23:15:00 +00004865<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 +00004866<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
4867
4868Does not match the 'this' parameter of a method.
4869
4870Given
4871 class X { void f(int x, int y, int z) {} };
4872cxxMethodDecl(hasAnyParameter(hasName("y")))
4873 matches f(int x, int y, int z) {}
4874with hasAnyParameter(...)
4875 matching int y
4876</pre></td></tr>
4877
4878
Haojian Wud898b092016-07-29 13:57:27 +00004879<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>
4880<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4881functionDecl that have at least one TemplateArgument matching the given
4882InnerMatcher.
4883
4884Given
4885 template&lt;typename T&gt; class A {};
4886 template&lt;&gt; class A&lt;double&gt; {};
4887 A&lt;int&gt; a;
4888
Haojian Wu99e39a72016-07-29 17:30:13 +00004889 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004890 void func() { f&lt;int&gt;(); };
4891
4892classTemplateSpecializationDecl(hasAnyTemplateArgument(
4893 refersToType(asString("int"))))
4894 matches the specialization A&lt;int&gt;
4895
4896functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4897 matches the specialization f&lt;int&gt;
4898</pre></td></tr>
4899
4900
Aaron Ballman672dde22016-01-22 23:15:00 +00004901<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 +00004902<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
4903definition that has a given body.
4904
4905Given
4906 for (;;) {}
4907hasBody(compoundStmt())
4908 matches 'for (;;) {}'
4909with compoundStmt()
4910 matching '{}'
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_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 +00004915<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
4916
4917Given
4918 class X { void f(int x) {} };
4919cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4920 matches f(int x) {}
4921with hasParameter(...)
4922 matching int x
4923</pre></td></tr>
4924
4925
Haojian Wud898b092016-07-29 13:57:27 +00004926<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>
4927<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4928functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
4929
4930Given
4931 template&lt;typename T, typename U&gt; class A {};
4932 A&lt;bool, int&gt; b;
4933 A&lt;int, bool&gt; c;
4934
Haojian Wu99e39a72016-07-29 17:30:13 +00004935 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004936 void func() { f&lt;int&gt;(); };
4937classTemplateSpecializationDecl(hasTemplateArgument(
4938 1, refersToType(asString("int"))))
4939 matches the specialization A&lt;bool, int&gt;
4940
4941functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4942 matches the specialization f&lt;int&gt;
4943</pre></td></tr>
4944
4945
Aaron Ballman672dde22016-01-22 23:15:00 +00004946<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 +00004947<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
4948
4949Given:
4950 class X { int f() { return 1; } };
4951cxxMethodDecl(returns(asString("int")))
4952 matches int f() { return 1; }
4953</pre></td></tr>
4954
4955
Aaron Ballman672dde22016-01-22 23:15:00 +00004956<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 +00004957<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 +00004958switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004959
4960Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4961 if (true) {}
4962</pre></td></tr>
4963
4964
Aaron Ballman672dde22016-01-22 23:15:00 +00004965<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 +00004966<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
4967
4968Given
4969 if (A* a = GetAPointer()) {}
4970hasConditionVariableStatement(...)
4971 matches 'A* a = GetAPointer()'.
4972</pre></td></tr>
4973
4974
Aaron Ballman672dde22016-01-22 23:15:00 +00004975<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 +00004976<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
4977
4978Examples matches the if statement
4979 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
4980 if (false) false; else true;
4981</pre></td></tr>
4982
4983
Aaron Ballman672dde22016-01-22 23:15:00 +00004984<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 +00004985<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
4986
4987Examples matches the if statement
4988 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
4989 if (false) true; else false;
4990</pre></td></tr>
4991
4992
Aaron Ballman672dde22016-01-22 23:15:00 +00004993<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 +00004994<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
4995matcher.
4996
4997FIXME: Unit test this matcher
4998</pre></td></tr>
4999
5000
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005001<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>
5002<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5003(if expression have it).
5004</pre></td></tr>
5005
5006
Manuel Klimeka37e1102016-12-01 15:45:06 +00005007<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 +00005008<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5009matches the given matcher.
5010
5011The associated declaration is:
5012- for type nodes, the declaration of the underlying type
5013- for CallExpr, the declaration of the callee
5014- for MemberExpr, the declaration of the referenced member
5015- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005016- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005017
5018Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5019function. e.g. various subtypes of clang::Type and various expressions.
5020
Manuel Klimeka37e1102016-12-01 15:45:06 +00005021Usable 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;,
5022 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;,
5023 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;,
5024 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;,
5025 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;,
5026 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;,
5027 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5028</pre></td></tr>
5029
5030
5031<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>
5032<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5033matches the given matcher.
5034
5035The associated declaration is:
5036- for type nodes, the declaration of the underlying type
5037- for CallExpr, the declaration of the callee
5038- for MemberExpr, the declaration of the referenced member
5039- for CXXConstructExpr, the declaration of the constructor
5040- for CXXNewExpr, the declaration of the operator new
5041
5042Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5043function. e.g. various subtypes of clang::Type and various expressions.
5044
5045Usable 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;,
5046 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;,
5047 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;,
5048 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;,
5049 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;,
5050 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;,
5051 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005052</pre></td></tr>
5053
5054
Aaron Ballman672dde22016-01-22 23:15:00 +00005055<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 +00005056<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5057matches the given matcher.
5058
5059The associated declaration is:
5060- for type nodes, the declaration of the underlying type
5061- for CallExpr, the declaration of the callee
5062- for MemberExpr, the declaration of the referenced member
5063- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005064- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005065
5066Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5067function. e.g. various subtypes of clang::Type and various expressions.
5068
Manuel Klimeka37e1102016-12-01 15:45:06 +00005069Usable 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;,
5070 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;,
5071 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;,
5072 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;,
5073 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;,
5074 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;,
5075 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005076</pre></td></tr>
5077
5078
Aaron Ballman672dde22016-01-22 23:15:00 +00005079<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 +00005080<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5081matched by a given matcher.
5082
5083Given
5084 struct X { int m; };
5085 void f(X x) { x.m; m; }
5086memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5087 matches "x.m" and "m"
5088with hasObjectExpression(...)
5089 matching "x" and the implicit object expression of "m" which has type X*.
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_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 +00005094<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5095given matcher.
5096
5097Given
5098 struct { int first, second; } first, second;
5099 int i(second.first);
5100 int j(first.second);
5101memberExpr(member(hasName("first")))
5102 matches second.first
5103 but not first.second (because the member name there is "second").
5104</pre></td></tr>
5105
5106
Aaron Ballman672dde22016-01-22 23:15:00 +00005107<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 +00005108<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5109pointee matches a given matcher.
5110
5111Given
5112 int *a;
5113 int const *b;
5114 float const *f;
5115pointerType(pointee(isConstQualified(), isInteger()))
5116 matches "int const *b"
5117
Aaron Ballman672dde22016-01-22 23:15:00 +00005118Usable 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;,
5119 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 +00005120</pre></td></tr>
5121
5122
Aaron Ballman672dde22016-01-22 23:15:00 +00005123<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 +00005124<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5125pointee matches a given matcher.
5126
5127Given
5128 int *a;
5129 int const *b;
5130 float const *f;
5131pointerType(pointee(isConstQualified(), isInteger()))
5132 matches "int const *b"
5133
Aaron Ballman672dde22016-01-22 23:15:00 +00005134Usable 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;,
5135 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 +00005136</pre></td></tr>
5137
5138
Martin Bohme8cef2c22016-08-09 15:07:52 +00005139<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>
5140<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5141matcher.
5142
5143Given
5144 namespace N { template&lt;class T&gt; void f(T t); }
5145 template &lt;class T&gt; void g() { using N::f; f(T()); }
5146unresolvedLookupExpr(hasAnyDeclaration(
5147 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5148 matches the use of f in g() .
5149</pre></td></tr>
5150
5151
Aaron Ballman672dde22016-01-22 23:15:00 +00005152<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005153<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5154
5155Given
5156 struct A { struct B { struct C {}; }; };
5157 A::B::C c;
5158nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5159 matches "A::"
5160</pre></td></tr>
5161
5162
Aaron Ballman672dde22016-01-22 23:15:00 +00005163<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 +00005164<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5165given TypeLoc.
5166
5167Given
5168 struct A { struct B { struct C {}; }; };
5169 A::B::C c;
5170nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5171 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5172 matches "A::"
5173</pre></td></tr>
5174
5175
Aaron Ballman672dde22016-01-22 23:15:00 +00005176<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 +00005177<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5178
5179Given
5180 struct A { struct B { struct C {}; }; };
5181 A::B::C c;
5182nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5183 matches "A::"
5184</pre></td></tr>
5185
5186
Aaron Ballman672dde22016-01-22 23:15:00 +00005187<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 +00005188<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5189given namespace matcher.
5190
5191Given
5192 namespace ns { struct A {}; }
5193 ns::A a;
5194nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5195 matches "ns::"
5196</pre></td></tr>
5197
5198
Aaron Ballman672dde22016-01-22 23:15:00 +00005199<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 +00005200<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5201given QualType matcher without qualifiers.
5202
5203Given
5204 struct A { struct B { struct C {}; }; };
5205 A::B::C c;
5206nestedNameSpecifier(specifiesType(
5207 hasDeclaration(cxxRecordDecl(hasName("A")))
5208))
5209 matches "A::"
5210</pre></td></tr>
5211
5212
Aaron Ballman672dde22016-01-22 23:15:00 +00005213<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 +00005214<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5215call expression.
5216
5217Example matches y in x(y)
5218 (matcher = callExpr(hasArgument(0, declRefExpr())))
5219 void x(int) { int y; x(y); }
5220</pre></td></tr>
5221
5222
Aaron Ballman672dde22016-01-22 23:15:00 +00005223<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 +00005224<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5225
5226Example
5227matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *")));
5228matches the [webView ...] message invocation.
5229 NSString *webViewJavaScript = ...
5230 UIWebView *webView = ...
5231 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5232</pre></td></tr>
5233
5234
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005235<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>
5236<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5237
5238
Martin Bohme8cef2c22016-08-09 15:07:52 +00005239<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>
5240<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5241overloads matches the given matcher.
5242
5243Given
5244 template &lt;typename T&gt; void foo(T);
5245 template &lt;typename T&gt; void bar(T);
5246 template &lt;typename T&gt; void baz(T t) {
5247 foo(t);
5248 bar(t);
5249 }
5250unresolvedLookupExpr(hasAnyDeclaration(
5251 functionTemplateDecl(hasName("foo"))))
5252 matches foo in foo(t); but not bar in bar(t);
5253</pre></td></tr>
5254
5255
Aaron Ballman672dde22016-01-22 23:15:00 +00005256<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005257<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5258
5259Given
5260 int (*ptr_to_array)[4];
5261 int (*ptr_to_func)(int);
5262
5263varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5264ptr_to_func but not ptr_to_array.
5265
Aaron Ballman672dde22016-01-22 23:15:00 +00005266Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005267</pre></td></tr>
5268
5269
Aaron Ballman672dde22016-01-22 23:15:00 +00005270<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005271<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5272pointee matches a given matcher.
5273
5274Given
5275 int *a;
5276 int const *b;
5277 float const *f;
5278pointerType(pointee(isConstQualified(), isInteger()))
5279 matches "int const *b"
5280
Aaron Ballman672dde22016-01-22 23:15:00 +00005281Usable 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;,
5282 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 +00005283</pre></td></tr>
5284
5285
Aaron Ballman672dde22016-01-22 23:15:00 +00005286<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 +00005287<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5288pointee matches a given matcher.
5289
5290Given
5291 int *a;
5292 int const *b;
5293 float const *f;
5294pointerType(pointee(isConstQualified(), isInteger()))
5295 matches "int const *b"
5296
Aaron Ballman672dde22016-01-22 23:15:00 +00005297Usable 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;,
5298 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 +00005299</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('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 +00005303<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5304
5305Given:
5306 typedef int &amp;int_ref;
5307 int a;
5308 int_ref b = a;
5309
5310varDecl(hasType(qualType(referenceType()))))) will not match the
5311declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5312</pre></td></tr>
5313
5314
Aaron Ballman672dde22016-01-22 23:15:00 +00005315<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 +00005316<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5317matches the given matcher.
5318
5319The associated declaration is:
5320- for type nodes, the declaration of the underlying type
5321- for CallExpr, the declaration of the callee
5322- for MemberExpr, the declaration of the referenced member
5323- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005324- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005325
5326Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5327function. e.g. various subtypes of clang::Type and various expressions.
5328
Manuel Klimeka37e1102016-12-01 15:45:06 +00005329Usable 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;,
5330 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;,
5331 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;,
5332 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;,
5333 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;,
5334 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;,
5335 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005336</pre></td></tr>
5337
5338
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005339<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>
5340<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5341
5342Given
5343 void (*fp)(void);
5344The matcher
5345 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5346would match the declaration for fp.
5347</pre></td></tr>
5348
5349
Aaron Ballman672dde22016-01-22 23:15:00 +00005350<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 +00005351<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5352</pre></td></tr>
5353
5354
Aaron Ballman672dde22016-01-22 23:15:00 +00005355<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 +00005356<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5357matches the specified matcher.
5358
5359Example matches y-&gt;x()
5360 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5361 cxxRecordDecl(hasName("Y")))))))
5362 class Y { public: void x(); };
5363 void z() { Y *y; y-&gt;x(); }
5364</pre></td></tr>
5365
5366
Aaron Ballman672dde22016-01-22 23:15:00 +00005367<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 +00005368<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5369</pre></td></tr>
5370
5371
Aaron Ballman672dde22016-01-22 23:15:00 +00005372<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 +00005373<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5374type matches the specified matcher.
5375
5376Example matches X &amp;x and const X &amp;y
5377 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5378 class X {
5379 void a(X b) {
5380 X &amp;x = b;
5381 const X &amp;y = b;
5382 }
5383 };
5384</pre></td></tr>
5385
5386
Aaron Ballman672dde22016-01-22 23:15:00 +00005387<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 +00005388<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5389matches the given matcher.
5390
5391The associated declaration is:
5392- for type nodes, the declaration of the underlying type
5393- for CallExpr, the declaration of the callee
5394- for MemberExpr, the declaration of the referenced member
5395- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005396- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005397
5398Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5399function. e.g. various subtypes of clang::Type and various expressions.
5400
Manuel Klimeka37e1102016-12-01 15:45:06 +00005401Usable 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;,
5402 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;,
5403 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;,
5404 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;,
5405 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;,
5406 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;,
5407 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005408</pre></td></tr>
5409
5410
Aaron Ballman672dde22016-01-22 23:15:00 +00005411<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 +00005412<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5413pointee matches a given matcher.
5414
5415Given
5416 int *a;
5417 int const *b;
5418 float const *f;
5419pointerType(pointee(isConstQualified(), isInteger()))
5420 matches "int const *b"
5421
Aaron Ballman672dde22016-01-22 23:15:00 +00005422Usable 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;,
5423 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 +00005424</pre></td></tr>
5425
5426
Aaron Ballman672dde22016-01-22 23:15:00 +00005427<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 +00005428<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5429pointee matches a given matcher.
5430
5431Given
5432 int *a;
5433 int const *b;
5434 float const *f;
5435pointerType(pointee(isConstQualified(), isInteger()))
5436 matches "int const *b"
5437
Aaron Ballman672dde22016-01-22 23:15:00 +00005438Usable 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;,
5439 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 +00005440</pre></td></tr>
5441
5442
Alexander Kornienko976921d2016-03-22 11:03:03 +00005443<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>
5444<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5445
5446Given
5447 return a + b;
5448hasReturnValue(binaryOperator())
5449 matches 'return a + b'
5450with binaryOperator()
5451 matching 'a + b'
5452</pre></td></tr>
5453
5454
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005455<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>
5456<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5457a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5458
5459Given
5460 { {}; 1+2; }
5461hasAnySubstatement(compoundStmt())
5462 matches '{ {}; 1+2; }'
5463with compoundStmt()
5464 matching '{}'
5465</pre></td></tr>
5466
5467
Aaron Ballman672dde22016-01-22 23:15:00 +00005468<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 +00005469<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5470alignof.
5471</pre></td></tr>
5472
5473
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005474<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>
Malcolm Parsonsdef8f902017-01-20 09:54:26 +00005475<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005476
5477Given:
5478F&amp; operator=(const F&amp; o) {
5479 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5480 return *this;
5481}
5482returnStmt(forFunction(hasName("operator=")))
5483 matches 'return *this'
5484 but does match 'return &gt; 0'
5485</pre></td></tr>
5486
5487
Aaron Ballman672dde22016-01-22 23:15:00 +00005488<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 +00005489<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5490sizeof.
5491</pre></td></tr>
5492
5493
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005494<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>
5495<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5496type that matches the provided matcher.
5497
5498Given
5499 template &lt;typename T&gt;
5500 double F(T t);
5501 int i;
5502 double j = F(i);
5503
5504substTemplateTypeParmType(hasReplacementType(type())) matches int
5505</pre></td></tr>
5506
5507
Aaron Ballman672dde22016-01-22 23:15:00 +00005508<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 +00005509<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5510statement. This matcher may produce multiple matches.
5511
5512Given
5513 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5514switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5515 matches four times, with "c" binding each of "case 1:", "case 2:",
5516"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5517"switch (1)", "switch (2)" and "switch (2)".
5518</pre></td></tr>
5519
5520
Etienne Bergeron5500f952016-05-30 15:25:25 +00005521<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>
5522<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5523switch statement or conditional operator.
5524
5525Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5526 if (true) {}
5527</pre></td></tr>
5528
5529
Aaron Ballman672dde22016-01-22 23:15:00 +00005530<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 +00005531<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5532matches the given matcher.
5533
5534The associated declaration is:
5535- for type nodes, the declaration of the underlying type
5536- for CallExpr, the declaration of the callee
5537- for MemberExpr, the declaration of the referenced member
5538- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005539- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005540
5541Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5542function. e.g. various subtypes of clang::Type and various expressions.
5543
Manuel Klimeka37e1102016-12-01 15:45:06 +00005544Usable 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;,
5545 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;,
5546 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;,
5547 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;,
5548 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;,
5549 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;,
5550 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005551</pre></td></tr>
5552
5553
Aaron Ballman672dde22016-01-22 23:15:00 +00005554<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 +00005555<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5556
5557Given
5558 template&lt;typename T&gt; struct A {};
5559 struct B { B* next; };
5560 A&lt;&amp;B::next&gt; a;
5561templateSpecializationType(hasAnyTemplateArgument(
5562 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5563 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5564 B::next
5565</pre></td></tr>
5566
5567
Aaron Ballman672dde22016-01-22 23:15:00 +00005568<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 +00005569<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5570declaration.
5571
5572Given
5573 template&lt;typename T&gt; struct A {};
5574 struct B { B* next; };
5575 A&lt;&amp;B::next&gt; a;
5576classTemplateSpecializationDecl(hasAnyTemplateArgument(
5577 refersToDeclaration(fieldDecl(hasName("next"))))
5578 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5579 B::next
5580</pre></td></tr>
5581
5582
Aaron Ballman672dde22016-01-22 23:15:00 +00005583<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 +00005584<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5585
5586Given
5587 template&lt;int T&gt; struct A {};
5588 C&lt;42&gt; c;
5589classTemplateSpecializationDecl(
5590 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5591 matches the implicit instantiation of C in C&lt;42&gt;.
5592</pre></td></tr>
5593
5594
Haojian Wub33b02e2016-07-29 15:45:11 +00005595<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>
5596<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5597
5598Given
5599 template&lt;template &lt;typename&gt; class S&gt; class X {};
5600 template&lt;typename T&gt; class Y {};"
5601 X&lt;Y&gt; xi;
5602classTemplateSpecializationDecl(hasAnyTemplateArgument(
5603 refersToTemplate(templateName())))
5604 matches the specialization X&lt;Y&gt;
5605</pre></td></tr>
5606
5607
Aaron Ballman672dde22016-01-22 23:15:00 +00005608<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 +00005609<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5610
5611Given
5612 struct X {};
5613 template&lt;typename T&gt; struct A {};
5614 A&lt;X&gt; a;
5615classTemplateSpecializationDecl(hasAnyTemplateArgument(
5616 refersToType(class(hasName("X")))))
5617 matches the specialization A&lt;X&gt;
5618</pre></td></tr>
5619
5620
Aaron Ballman672dde22016-01-22 23:15:00 +00005621<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 +00005622<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5623functionDecl that have at least one TemplateArgument matching the given
5624InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005625
5626Given
5627 template&lt;typename T&gt; class A {};
5628 template&lt;&gt; class A&lt;double&gt; {};
5629 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005630
Haojian Wu99e39a72016-07-29 17:30:13 +00005631 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005632 void func() { f&lt;int&gt;(); };
5633
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005634classTemplateSpecializationDecl(hasAnyTemplateArgument(
5635 refersToType(asString("int"))))
5636 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005637
5638functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5639 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005640</pre></td></tr>
5641
5642
Aaron Ballman672dde22016-01-22 23:15:00 +00005643<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 +00005644<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5645matches the given matcher.
5646
5647The associated declaration is:
5648- for type nodes, the declaration of the underlying type
5649- for CallExpr, the declaration of the callee
5650- for MemberExpr, the declaration of the referenced member
5651- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005652- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005653
5654Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5655function. e.g. various subtypes of clang::Type and various expressions.
5656
Manuel Klimeka37e1102016-12-01 15:45:06 +00005657Usable 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;,
5658 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;,
5659 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;,
5660 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;,
5661 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;,
5662 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;,
5663 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005664</pre></td></tr>
5665
5666
Aaron Ballman672dde22016-01-22 23:15:00 +00005667<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 +00005668<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5669functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005670
5671Given
5672 template&lt;typename T, typename U&gt; class A {};
5673 A&lt;bool, int&gt; b;
5674 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005675
Haojian Wu99e39a72016-07-29 17:30:13 +00005676 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005677 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005678classTemplateSpecializationDecl(hasTemplateArgument(
5679 1, refersToType(asString("int"))))
5680 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005681
5682functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5683 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005684</pre></td></tr>
5685
5686
Aaron Ballman672dde22016-01-22 23:15:00 +00005687<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 +00005688<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5689matches the given matcher.
5690
5691The associated declaration is:
5692- for type nodes, the declaration of the underlying type
5693- for CallExpr, the declaration of the callee
5694- for MemberExpr, the declaration of the referenced member
5695- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005696- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005697
5698Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5699function. e.g. various subtypes of clang::Type and various expressions.
5700
Manuel Klimeka37e1102016-12-01 15:45:06 +00005701Usable 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;,
5702 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;,
5703 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;,
5704 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;,
5705 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;,
5706 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;,
5707 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005708</pre></td></tr>
5709
5710
5711<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>
5712<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5713
5714Generates results for each match.
5715
5716For example, in:
5717 class A { class B {}; class C {}; };
5718The matcher:
5719 cxxRecordDecl(hasName("::A"),
5720 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5721will generate results for A, B and C.
5722
5723Usable as: Any Matcher
5724</pre></td></tr>
5725
5726
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005727<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 +00005728<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5729matcher.
5730
5731Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5732 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5733 and U (matcher = typedefDecl(hasType(asString("int")))
5734 class X {};
5735 void y(X &amp;x) { x; X z; }
5736 typedef int U;
5737</pre></td></tr>
5738
5739
Aaron Ballman672dde22016-01-22 23:15:00 +00005740<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 +00005741<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5742matches the given matcher.
5743
5744The associated declaration is:
5745- for type nodes, the declaration of the underlying type
5746- for CallExpr, the declaration of the callee
5747- for MemberExpr, the declaration of the referenced member
5748- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005749- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005750
5751Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5752function. e.g. various subtypes of clang::Type and various expressions.
5753
Manuel Klimeka37e1102016-12-01 15:45:06 +00005754Usable 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;,
5755 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;,
5756 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;,
5757 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;,
5758 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;,
5759 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;,
5760 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5761</pre></td></tr>
5762
5763
5764<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>
5765<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5766type of the matched node.
5767
5768For example, in:
5769 class A {};
5770 using B = A;
5771The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5772both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005773</pre></td></tr>
5774
5775
Aaron Ballman672dde22016-01-22 23:15:00 +00005776<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 +00005777<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5778
5779Given
5780 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5781unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5782 matches sizeof(a) and alignof(c)
5783</pre></td></tr>
5784
5785
Aaron Ballman672dde22016-01-22 23:15:00 +00005786<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 +00005787<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5788
5789Example matches true (matcher = hasUnaryOperand(
5790 cxxBoolLiteral(equals(true))))
5791 !true
5792</pre></td></tr>
5793
5794
Aaron Ballman672dde22016-01-22 23:15:00 +00005795<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 +00005796<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5797matches the given matcher.
5798
5799The associated declaration is:
5800- for type nodes, the declaration of the underlying type
5801- for CallExpr, the declaration of the callee
5802- for MemberExpr, the declaration of the referenced member
5803- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005804- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005805
5806Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5807function. e.g. various subtypes of clang::Type and various expressions.
5808
Manuel Klimeka37e1102016-12-01 15:45:06 +00005809Usable 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;,
5810 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;,
5811 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;,
5812 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;,
5813 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;,
5814 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;,
5815 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005816</pre></td></tr>
5817
5818
Aaron Ballman672dde22016-01-22 23:15:00 +00005819<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 +00005820<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5821
5822Given
5823 namespace X { void b(); }
5824 using X::b;
5825usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5826 matches using X::b </pre></td></tr>
5827
5828
Aaron Ballman672dde22016-01-22 23:15:00 +00005829<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 +00005830<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5831matched by the given matcher.
5832
5833Given
5834 namespace X { int a; void b(); }
5835 using X::a;
5836 using X::b;
5837usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5838 matches using X::b but not using X::a </pre></td></tr>
5839
5840
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005841<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>
5842<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 +00005843declaration's type.
5844
5845In case of a value declaration (for example a variable declaration),
5846this resolves one layer of indirection. For example, in the value
5847declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5848X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5849declaration of x.
5850
5851Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5852 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5853 class X {};
5854 void y(X &amp;x) { x; X z; }
5855
Aaron Ballman672dde22016-01-22 23:15:00 +00005856Usable 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 +00005857</pre></td></tr>
5858
5859
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005860<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>
5861<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 +00005862matcher.
5863
5864Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5865 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005866 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005867 class X {};
5868 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005869 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005870</pre></td></tr>
5871
5872
Aaron Ballman672dde22016-01-22 23:15:00 +00005873<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 +00005874<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
5875that matches the given matcher.
5876
5877Example matches x (matcher = varDecl(hasInitializer(callExpr())))
5878 bool y() { return true; }
5879 bool x = y();
5880</pre></td></tr>
5881
5882
Aaron Ballman672dde22016-01-22 23:15:00 +00005883<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 +00005884<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
5885expression.
5886
5887Given
5888 void f(int b) {
5889 int a[b];
5890 }
5891variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
5892 varDecl(hasName("b")))))))
5893 matches "int a[b]"
5894</pre></td></tr>
5895
5896
Aaron Ballman672dde22016-01-22 23:15:00 +00005897<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 +00005898<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
5899definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005900
5901Given
5902 for (;;) {}
5903hasBody(compoundStmt())
5904 matches 'for (;;) {}'
5905with compoundStmt()
5906 matching '{}'
5907</pre></td></tr>
5908
5909
Aaron Ballman672dde22016-01-22 23:15:00 +00005910<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 +00005911<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 +00005912switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005913
5914Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5915 if (true) {}
5916</pre></td></tr>
5917
5918
Aaron Ballman672dde22016-01-22 23:15:00 +00005919<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 +00005920<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
5921NestedNameSpecifier-matcher matches.
5922</pre></td></tr>
5923
5924
Aaron Ballman672dde22016-01-22 23:15:00 +00005925<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 +00005926<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
5927QualType-matcher matches.
5928</pre></td></tr>
5929
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00005930<!--END_TRAVERSAL_MATCHERS -->
5931</table>
5932
5933</div>
5934</body>
5935</html>
5936
5937