blob: 4cddea86991e748b4c5f94a77e155e3eb477aa65 [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
Dave Lee55540a02017-10-26 15:53:37 +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('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
350<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
351
352Example matches Foo (Additions)
353 @implementation Foo (Additions)
354 @end
355</pre></td></tr>
356
357
Dave Leee6d362c2017-09-10 21:00:15 +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('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
359<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
360
361Example matches Foo
362 @implementation Foo
363 @end
364</pre></td></tr>
365
366
Aaron Ballman672dde22016-01-22 23:15:00 +0000367<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 +0000368<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
369
370Example matches Foo
371 @interface Foo
372 @end
373</pre></td></tr>
374
375
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000376<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>
377<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
378
379Example matches _enabled
380 @implementation Foo {
381 BOOL _enabled;
382 }
383 @end
384</pre></td></tr>
385
386
387<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>
388<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
389
390Example matches both declaration and definition of -[Foo method]
391 @interface Foo
392 - (void)method;
393 @end
394
395 @implementation Foo
396 - (void)method {}
397 @end
398</pre></td></tr>
399
400
401<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>
402<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
403
404Example matches enabled
405 @interface Foo
406 @property BOOL enabled;
407 @end
408</pre></td></tr>
409
410
411<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>
412<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
413
414Example matches FooDelegate
415 @protocol FooDelegate
416 @end
417</pre></td></tr>
418
419
Aaron Ballman672dde22016-01-22 23:15:00 +0000420<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 +0000421<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
422
423Given
424 void f(int x);
425parmVarDecl()
426 matches int x.
427</pre></td></tr>
428
429
Aaron Ballman672dde22016-01-22 23:15:00 +0000430<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 +0000431<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
432
433Example matches X, Z, U, and S
434 class X;
435 template&lt;class T&gt; class Z {};
436 struct S {};
437 union U {};
438</pre></td></tr>
439
440
Aaron Ballman672dde22016-01-22 23:15:00 +0000441<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000442<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
443
444Example:
445 staticAssertExpr()
446matches
447 static_assert(sizeof(S) == sizeof(int))
448in
449 struct S {
450 int x;
451 };
452 static_assert(sizeof(S) == sizeof(int));
453</pre></td></tr>
454
455
Aaron Ballman672dde22016-01-22 23:15:00 +0000456<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 +0000457<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
458
459Given
460 template &lt;typename T, int N&gt; struct C {};
461templateTypeParmDecl()
462 matches 'T', but not 'N'.
463</pre></td></tr>
464
465
Aaron Ballman672dde22016-01-22 23:15:00 +0000466<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 +0000467<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
468
469Given
470 int X;
471 namespace NS {
472 int Y;
473 } namespace NS
474decl(hasDeclContext(translationUnitDecl()))
475 matches "int X", but not "int Y".
476</pre></td></tr>
477
478
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000479<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
480<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
481
482Given
483 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000484 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000485typeAliasDecl()
486 matches "using Y = int", but not "typedef int X"
487</pre></td></tr>
488
489
Eric Liu285f8042017-03-28 12:56:47 +0000490<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
491<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
492
493typeAliasTemplateDecl() matches
494 template &lt;typename T&gt;
495 using Y = X&lt;T&gt;;
496</pre></td></tr>
497
498
Aaron Ballman672dde22016-01-22 23:15:00 +0000499<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 +0000500<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
501
502Given
503 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000504 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000505typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000506 matches "typedef int X", but not "using Y = int"
507</pre></td></tr>
508
509
510<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>
511<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
512
513Given
514 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000515 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000516typedefNameDecl()
517 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000518</pre></td></tr>
519
520
Aaron Ballman672dde22016-01-22 23:15:00 +0000521<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 +0000522<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
523typename.
524
525Given
526 template &lt;typename T&gt;
527 struct Base { typedef T Foo; };
528
529 template&lt;typename T&gt;
530 struct S : private Base&lt;T&gt; {
531 using typename Base&lt;T&gt;::Foo;
532 };
533unresolvedUsingTypenameDecl()
534 matches using Base&lt;T&gt;::Foo </pre></td></tr>
535
536
Aaron Ballman672dde22016-01-22 23:15:00 +0000537<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 +0000538<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
539
540Given
541 template&lt;typename X&gt;
542 class C : private X {
543 using X::x;
544 };
545unresolvedUsingValueDecl()
546 matches using X::x </pre></td></tr>
547
548
Aaron Ballman672dde22016-01-22 23:15:00 +0000549<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 +0000550<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
551
552Given
553 namespace X { int x; }
554 using X::x;
555usingDecl()
556 matches using X::x </pre></td></tr>
557
558
Aaron Ballman672dde22016-01-22 23:15:00 +0000559<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 +0000560<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
561
562Given
563 namespace X { int x; }
564 using namespace X;
565usingDirectiveDecl()
566 matches using namespace X </pre></td></tr>
567
568
Aaron Ballman672dde22016-01-22 23:15:00 +0000569<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 +0000570<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
571
572Example matches A, B, C and F
573 enum X { A, B, C };
574 void F();
575</pre></td></tr>
576
577
Aaron Ballman672dde22016-01-22 23:15:00 +0000578<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 +0000579<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
580
581Note: this does not match declarations of member variables, which are
582"field" declarations in Clang parlance.
583
584Example matches a
585 int a;
586</pre></td></tr>
587
588
Aaron Ballman672dde22016-01-22 23:15:00 +0000589<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +0000590<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
591</pre></td></tr>
592
593
Aaron Ballman672dde22016-01-22 23:15:00 +0000594<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 +0000595<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
596
597Given
598 namespace ns {
599 struct A { static void f(); };
600 void A::f() {}
601 void g() { A::f(); }
602 }
603 ns::A a;
604nestedNameSpecifier()
605 matches "ns::" and both "A::"
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_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 +0000610<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
611</pre></td></tr>
612
613
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000614<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>
615<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
616
617Given
618 FOO: bar();
619 void *ptr = &amp;&amp;FOO;
620 goto *bar;
621addrLabelExpr()
622 matches '&amp;&amp;FOO'
623</pre></td></tr>
624
625
Aaron Ballman672dde22016-01-22 23:15:00 +0000626<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 +0000627<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
628
629Given
630 int i = a[1];
631arraySubscriptExpr()
632 matches "a[1]"
633</pre></td></tr>
634
635
Aaron Ballman672dde22016-01-22 23:15:00 +0000636<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 +0000637<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
638
639 int i = 100;
640 __asm("mov al, 2");
641asmStmt()
642 matches '__asm("mov al, 2")'
643</pre></td></tr>
644
645
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000646<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>
647<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
648Example matches __atomic_load_n(ptr, 1)
649 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
650</pre></td></tr>
651
652
653<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>
654<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
655
656Example matches a ?: b
657 (a ?: b) + 42;
658</pre></td></tr>
659
660
Aaron Ballman672dde22016-01-22 23:15:00 +0000661<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000662<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
663
664Example matches a || b
665 !(a || b)
666</pre></td></tr>
667
668
Aaron Ballman672dde22016-01-22 23:15:00 +0000669<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000670<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
671
672Given
673 while (true) { break; }
674breakStmt()
675 matches 'break'
676</pre></td></tr>
677
678
Aaron Ballman672dde22016-01-22 23:15:00 +0000679<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 +0000680<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
681
Artem Dergachevded92a92016-11-11 22:34:53 +0000682Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000683 int i = (int) 2.2f;
684</pre></td></tr>
685
686
Aaron Ballman672dde22016-01-22 23:15:00 +0000687<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000688<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
689
690Example matches x.y() and y()
691 X x;
692 x.y();
693 y();
694</pre></td></tr>
695
696
Aaron Ballman672dde22016-01-22 23:15:00 +0000697<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 +0000698<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
699
700Given
701 switch(a) { case 42: break; default: break; }
702caseStmt()
703 matches 'case 42: break;'.
704</pre></td></tr>
705
706
Aaron Ballman672dde22016-01-22 23:15:00 +0000707<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 +0000708<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
709
710Example: castExpr() matches each of the following:
711 (int) 3;
712 const_cast&lt;Expr *&gt;(SubExpr);
713 char c = 0;
714but does not match
715 int i = (0);
716 int k = 0;
717</pre></td></tr>
718
719
Aaron Ballman672dde22016-01-22 23:15:00 +0000720<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 +0000721<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
722
723Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
724though.
725
726Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000727 char ch = 'a';
728 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000729</pre></td></tr>
730
731
Aaron Ballman672dde22016-01-22 23:15:00 +0000732<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000733<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
734
735Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000736 int array[4] = {1};
737 vector int myvec = (vector int)(1, 2);
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000738</pre></td></tr>
739
740
Aaron Ballman672dde22016-01-22 23:15:00 +0000741<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 +0000742<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
743
744Example matches '{}' and '{{}}'in 'for (;;) {{}}'
745 for (;;) {{}}
746</pre></td></tr>
747
748
Aaron Ballman672dde22016-01-22 23:15:00 +0000749<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 +0000750<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
751
752Example matches a ? b : c
753 (a ? b : c) + 42
754</pre></td></tr>
755
756
Aaron Ballman672dde22016-01-22 23:15:00 +0000757<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 +0000758<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
759
760Given
761 while (true) { continue; }
762continueStmt()
763 matches 'continue'
764</pre></td></tr>
765
766
Aaron Ballman672dde22016-01-22 23:15:00 +0000767<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 +0000768<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
769
770Example matches,
771 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
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('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 +0000776<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
777
778Example matches FunctionTakesString(GetStringByValue())
779 (matcher = cxxBindTemporaryExpr())
780 FunctionTakesString(GetStringByValue());
781 FunctionTakesStringByPointer(GetStringPointer());
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('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 +0000786<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
787
788Example matches true
789 true
790</pre></td></tr>
791
792
Aaron Ballman672dde22016-01-22 23:15:00 +0000793<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 +0000794<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
795
796 try {} catch(int i) {}
797cxxCatchStmt()
798 matches 'catch(int i)'
799</pre></td></tr>
800
801
Aaron Ballman672dde22016-01-22 23:15:00 +0000802<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 +0000803<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
804
805Example: Matches const_cast&lt;int*&gt;(&amp;r) in
806 int n = 42;
807 const int &amp;r(n);
808 int* p = const_cast&lt;int*&gt;(&amp;r);
809</pre></td></tr>
810
811
Aaron Ballman672dde22016-01-22 23:15:00 +0000812<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 +0000813<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
814
815Example matches string(ptr, n) and ptr within arguments of f
816 (matcher = cxxConstructExpr())
817 void f(const string &amp;a, const string &amp;b);
818 char *ptr;
819 int n;
820 f(string(ptr, n), ptr);
821</pre></td></tr>
822
823
Aaron Ballman672dde22016-01-22 23:15:00 +0000824<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 +0000825<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
826
827Example matches the CXXDefaultArgExpr placeholder inserted for the
828 default value of the second parameter in the call expression f(42)
829 (matcher = cxxDefaultArgExpr())
830 void f(int x, int y = 0);
831 f(42);
832</pre></td></tr>
833
834
Aaron Ballman672dde22016-01-22 23:15:00 +0000835<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 +0000836<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
837
838Given
839 delete X;
840cxxDeleteExpr()
841 matches 'delete X'.
842</pre></td></tr>
843
844
Aaron Ballman672dde22016-01-22 23:15:00 +0000845<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 +0000846<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
847
848Example:
849 cxxDynamicCastExpr()
850matches
851 dynamic_cast&lt;D*&gt;(&amp;b);
852in
853 struct B { virtual ~B() {} }; struct D : B {};
854 B b;
855 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
856</pre></td></tr>
857
858
Aaron Ballman672dde22016-01-22 23:15:00 +0000859<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 +0000860<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
861
862cxxForRangeStmt() matches 'for (auto a : i)'
863 int i[] = {1, 2, 3}; for (auto a : i);
864 for(int j = 0; j &lt; 5; ++j);
865</pre></td></tr>
866
867
Aaron Ballman672dde22016-01-22 23:15:00 +0000868<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 +0000869<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
870
871Example: Matches Foo(bar);
872 Foo f = bar;
873 Foo g = (Foo) bar;
874 Foo h = Foo(bar);
875</pre></td></tr>
876
877
Aaron Ballman672dde22016-01-22 23:15:00 +0000878<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 +0000879<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
880
881Example matches x.y()
882 X x;
883 x.y();
884</pre></td></tr>
885
886
Aaron Ballman672dde22016-01-22 23:15:00 +0000887<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 +0000888<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
889
890Given
891 new X;
892cxxNewExpr()
893 matches 'new X'.
894</pre></td></tr>
895
896
Aaron Ballman672dde22016-01-22 23:15:00 +0000897<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 +0000898<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
899</pre></td></tr>
900
901
Aaron Ballman672dde22016-01-22 23:15:00 +0000902<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 +0000903<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
904
905Note that if an operator isn't overloaded, it won't match. Instead, use
906binaryOperator matcher.
907Currently it does not match operators such as new delete.
908FIXME: figure out why these do not match?
909
910Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
911 (matcher = cxxOperatorCallExpr())
912 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
913 ostream &amp;o; int b = 1, c = 1;
914 o &lt;&lt; b &lt;&lt; c;
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('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 +0000919<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
920
921Either the source expression or the destination type can be matched
922using has(), but hasDestinationType() is more specific and can be
923more readable.
924
925Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
926 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
927</pre></td></tr>
928
929
Aaron Ballman672dde22016-01-22 23:15:00 +0000930<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 +0000931<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
932
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000933See also: hasDestinationType
934See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000935
936Example:
937 cxxStaticCastExpr()
938matches
939 static_cast&lt;long&gt;(8)
940in
941 long eight(static_cast&lt;long&gt;(8));
942</pre></td></tr>
943
944
Jakub Kuderski64b6c782017-05-05 21:01:12 +0000945<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
946<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
947
948Given
949 std::vector&lt;int&gt; a({ 1, 2, 3 });
950 std::vector&lt;int&gt; b = { 4, 5 };
951 int c[] = { 6, 7 };
952 std::pair&lt;int, int&gt; d = { 8, 9 };
953cxxStdInitializerListExpr()
954 matches "{ 1, 2, 3 }" and "{ 4, 5 }"
955</pre></td></tr>
956
957
Aaron Ballman672dde22016-01-22 23:15:00 +0000958<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 +0000959<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
960
961Example: Matches Foo(bar, bar)
962 Foo h = Foo(bar, bar);
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('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 +0000967<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
968
969Example matches the implicit this expression in "return i".
970 (matcher = cxxThisExpr())
971struct foo {
972 int i;
973 int f() { return i; }
974};
975</pre></td></tr>
976
977
Aaron Ballman672dde22016-01-22 23:15:00 +0000978<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 +0000979<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
980
981 try { throw 5; } catch(int i) {}
982cxxThrowExpr()
983 matches 'throw 5'
984</pre></td></tr>
985
986
Aaron Ballman672dde22016-01-22 23:15:00 +0000987<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 +0000988<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
989
990 try {} catch(int i) {}
991cxxTryStmt()
992 matches 'try {}'
993</pre></td></tr>
994
995
Aaron Ballman672dde22016-01-22 23:15:00 +0000996<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 +0000997<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
998
999Example matches T(t) in return statement of f
1000 (matcher = cxxUnresolvedConstructExpr())
1001 template &lt;typename T&gt;
1002 void f(const T&amp; t) { return T(t); }
1003</pre></td></tr>
1004
1005
Aaron Ballman672dde22016-01-22 23:15:00 +00001006<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 +00001007<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1008
1009Example matches x in if (x)
1010 bool x;
1011 if (x) {}
1012</pre></td></tr>
1013
1014
Aaron Ballman672dde22016-01-22 23:15:00 +00001015<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 +00001016<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1017
1018Given
1019 int a;
1020declStmt()
1021 matches 'int a'.
1022</pre></td></tr>
1023
1024
Aaron Ballman672dde22016-01-22 23:15:00 +00001025<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 +00001026<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1027
1028Given
1029 switch(a) { case 42: break; default: break; }
1030defaultStmt()
1031 matches 'default: break;'.
1032</pre></td></tr>
1033
1034
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001035<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>
1036<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1037
1038Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1039 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1040</pre></td></tr>
1041
1042
Aaron Ballman672dde22016-01-22 23:15:00 +00001043<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 +00001044<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1045
1046Given
1047 do {} while (true);
1048doStmt()
1049 matches 'do {} while(true)'
1050</pre></td></tr>
1051
1052
Aaron Ballman672dde22016-01-22 23:15:00 +00001053<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 +00001054<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1055
1056Matches any cast expression written in user code, whether it be a
1057C-style cast, a functional-style cast, or a keyword cast.
1058
1059Does not match implicit conversions.
1060
1061Note: the name "explicitCast" is chosen to match Clang's terminology, as
1062Clang uses the term "cast" to apply to implicit conversions as well as to
1063actual cast expressions.
1064
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001065See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001066
1067Example: matches all five of the casts in
1068 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1069but does not match the implicit conversion in
1070 long ell = 42;
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('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 +00001075<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1076
1077Example matches x()
1078 void f() { x(); }
1079</pre></td></tr>
1080
1081
Aaron Ballman672dde22016-01-22 23:15:00 +00001082<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 +00001083<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1084of the sub-expression's evaluation.
1085
1086Example matches std::string()
1087 const std::string str = std::string();
1088</pre></td></tr>
1089
1090
Aaron Ballman672dde22016-01-22 23:15:00 +00001091<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 +00001092<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10931.0, 1.0f, 1.0L and 1e10.
1094
1095Does not match implicit conversions such as
1096 float a = 10;
1097</pre></td></tr>
1098
1099
Aaron Ballman672dde22016-01-22 23:15:00 +00001100<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 +00001101<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1102
1103Example matches 'for (;;) {}'
1104 for (;;) {}
1105 int i[] = {1, 2, 3}; for (auto a : i);
1106</pre></td></tr>
1107
1108
Aaron Ballman672dde22016-01-22 23:15:00 +00001109<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 +00001110<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1111</pre></td></tr>
1112
1113
Aaron Ballman672dde22016-01-22 23:15:00 +00001114<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 +00001115<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1116
1117Given
1118 goto FOO;
1119 FOO: bar();
1120gotoStmt()
1121 matches 'goto FOO'
1122</pre></td></tr>
1123
1124
Aaron Ballman672dde22016-01-22 23:15:00 +00001125<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 +00001126<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1127
1128Example matches 'if (x) {}'
1129 if (x) {}
1130</pre></td></tr>
1131
1132
Aaron Ballman672dde22016-01-22 23:15:00 +00001133<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 +00001134<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1135
1136This matches many different places, including function call return value
1137eliding, as well as any type conversions.
1138</pre></td></tr>
1139
1140
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001141<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>
1142<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1143
1144Given
1145 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1146implicitValueInitExpr()
1147 matches "[0].y" (implicitly)
1148</pre></td></tr>
1149
1150
Aaron Ballman672dde22016-01-22 23:15:00 +00001151<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 +00001152<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1153
1154Given
1155 int a[] = { 1, 2 };
1156 struct B { int x, y; };
1157 B b = { 5, 6 };
1158initListExpr()
1159 matches "{ 1, 2 }" and "{ 5, 6 }"
1160</pre></td></tr>
1161
1162
Aaron Ballman672dde22016-01-22 23:15:00 +00001163<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 +00001164<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11651, 1L, 0x1 and 1U.
1166
1167Does not match character-encoded integers such as L'a'.
1168</pre></td></tr>
1169
1170
Aaron Ballman672dde22016-01-22 23:15:00 +00001171<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 +00001172<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1173
1174Given
1175 goto FOO;
1176 FOO: bar();
1177labelStmt()
1178 matches 'FOO:'
1179</pre></td></tr>
1180
1181
Aaron Ballman672dde22016-01-22 23:15:00 +00001182<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 +00001183<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1184
1185Example matches [&amp;](){return 5;}
1186 [&amp;](){return 5;}
1187</pre></td></tr>
1188
1189
Aaron Ballman672dde22016-01-22 23:15:00 +00001190<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001191<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1192
1193Example: Given
Jakub Kuderski64b6c782017-05-05 21:01:12 +00001194 struct T {void func();};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001195 T f();
1196 void g(T);
1197materializeTemporaryExpr() matches 'f()' in these statements
1198 T u(f());
1199 g(f());
1200but does not match
1201 f();
1202 f().func();
1203</pre></td></tr>
1204
1205
Aaron Ballman672dde22016-01-22 23:15:00 +00001206<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 +00001207<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1208
1209Given
1210 class Y {
1211 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1212 int a; static int b;
1213 };
1214memberExpr()
1215 matches this-&gt;x, x, y.x, a, this-&gt;b
1216</pre></td></tr>
1217
1218
Aaron Ballman672dde22016-01-22 23:15:00 +00001219<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 +00001220<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1221
1222 foo();;
1223nullStmt()
1224 matches the second ';'
1225</pre></td></tr>
1226
1227
Dave Lee0934fdc2017-11-11 22:46:15 +00001228<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1229<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1230
1231Example matches @catch
1232 @try {}
1233 @catch (...) {}
1234</pre></td></tr>
1235
1236
1237<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1238<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1239
1240Example matches @finally
1241 @try {}
1242 @finally {}
1243</pre></td></tr>
1244
1245
Aaron Ballman672dde22016-01-22 23:15:00 +00001246<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 +00001247<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1248
1249The innermost message send invokes the "alloc" class method on the
1250NSString class, while the outermost message send invokes the
1251"initWithString" instance method on the object returned from
1252NSString's "alloc". This matcher should match both message sends.
1253 [[NSString alloc] initWithString:@"Hello"]
1254</pre></td></tr>
1255
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001256
Dave Lee0934fdc2017-11-11 22:46:15 +00001257<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
1258<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C @try statements.
1259
1260Example matches @throw
1261 @throw obj;
1262</pre></td></tr>
1263
1264
1265<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
1266<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1267
1268Example matches @try
1269 @try {}
1270 @catch (...) {}
1271</pre></td></tr>
1272
1273
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001274<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>
1275<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1276to reference another expressions and can be met
1277in BinaryConditionalOperators, for example.
1278
1279Example matches 'a'
1280 (a ?: c) + 42;
1281</pre></td></tr>
1282
1283
Aaron Ballman672dde22016-01-22 23:15:00 +00001284<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 +00001285<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1286
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001287Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001288 int foo() { return 1; }
1289 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001290</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001291
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001292
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001293<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1294<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1295ParenListExprs don't have a predefined type and are used for late parsing.
1296In the final AST, they can be met in template declarations.
1297
1298Given
1299 template&lt;typename T&gt; class X {
1300 void f() {
1301 X x(*this);
1302 int a = 0, b = 1; int i = (a, b);
1303 }
1304 };
1305parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1306has a predefined type and is a ParenExpr, not a ParenListExpr.
1307</pre></td></tr>
1308
1309
1310<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>
1311<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1312
1313Example: Matches __func__
1314 printf("%s", __func__);
1315</pre></td></tr>
1316
1317
Aaron Ballman672dde22016-01-22 23:15:00 +00001318<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 +00001319<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1320
1321Given
1322 return 1;
1323returnStmt()
1324 matches 'return 1'
1325</pre></td></tr>
1326
1327
Aaron Ballman672dde22016-01-22 23:15:00 +00001328<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 +00001329<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1330
1331Given
1332 { ++a; }
1333stmt()
1334 matches both the compound statement '{ ++a; }' and '++a'.
1335</pre></td></tr>
1336
1337
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001338<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>
1339<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1340
1341Example match: ({ int X = 4; X; })
1342 int C = ({ int X = 4; X; });
1343</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('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 +00001347<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1348
1349Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001350 char *s = "abcd";
1351 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001352</pre></td></tr>
1353
1354
Aaron Ballman672dde22016-01-22 23:15:00 +00001355<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 +00001356<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1357
1358Given
1359 template &lt;int N&gt;
1360 struct A { static const int n = N; };
1361 struct B : public A&lt;42&gt; {};
1362substNonTypeTemplateParmExpr()
1363 matches "N" in the right-hand side of "static const int n = N;"
1364</pre></td></tr>
1365
1366
Aaron Ballman672dde22016-01-22 23:15:00 +00001367<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 +00001368<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1369
1370Given
1371 switch(a) { case 42: break; default: break; }
1372switchCase()
1373 matches 'case 42: break;' and 'default: break;'.
1374</pre></td></tr>
1375
1376
Aaron Ballman672dde22016-01-22 23:15:00 +00001377<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 +00001378<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1379
1380Given
1381 switch(a) { case 42: break; default: break; }
1382switchStmt()
1383 matches 'switch(a)'.
1384</pre></td></tr>
1385
1386
Aaron Ballman672dde22016-01-22 23:15:00 +00001387<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 +00001388<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1389
1390Given
1391 Foo x = bar;
1392 int y = sizeof(x) + alignof(x);
1393unaryExprOrTypeTraitExpr()
1394 matches sizeof(x) and alignof(x)
1395</pre></td></tr>
1396
1397
Aaron Ballman672dde22016-01-22 23:15:00 +00001398<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 +00001399<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1400
1401Example matches !a
1402 !a || b
1403</pre></td></tr>
1404
1405
Haojian Wu7751c922016-05-18 12:53:59 +00001406<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>
1407<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1408but could not be resolved to a specific declaration.
1409
1410Given
1411 template&lt;typename T&gt;
1412 T foo() { T a; return a; }
1413 template&lt;typename T&gt;
1414 void bar() {
1415 foo&lt;T&gt;();
1416 }
1417unresolvedLookupExpr()
1418 matches foo&lt;T&gt;() </pre></td></tr>
1419
1420
Aaron Ballman672dde22016-01-22 23:15:00 +00001421<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 +00001422<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1423
1424Example match: "foo"_suffix
1425</pre></td></tr>
1426
1427
Aaron Ballman672dde22016-01-22 23:15:00 +00001428<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 +00001429<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1430
1431Given
1432 while (true) {}
1433whileStmt()
1434 matches 'while (true) {}'.
1435</pre></td></tr>
1436
1437
Aaron Ballman672dde22016-01-22 23:15:00 +00001438<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 +00001439<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1440
1441Given
1442 template &lt;typename T&gt; struct C {};
1443 C&lt;int&gt; c;
1444templateArgument()
1445 matches 'int' in C&lt;int&gt;.
1446</pre></td></tr>
1447
1448
Haojian Wub33b02e2016-07-29 15:45:11 +00001449<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>
1450<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1451
1452Given
1453 template &lt;typename T&gt; class X { };
1454 X&lt;int&gt; xi;
1455templateName()
1456 matches 'X' in X&lt;int&gt;.
1457</pre></td></tr>
1458
1459
Aaron Ballman672dde22016-01-22 23:15:00 +00001460<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 +00001461<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1462</pre></td></tr>
1463
1464
Aaron Ballman672dde22016-01-22 23:15:00 +00001465<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 +00001466<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1467
1468Given
1469 int a[] = { 2, 3 };
1470 int b[4];
1471 void f() { int c[a[0]]; }
1472arrayType()
1473 matches "int a[]", "int b[4]" and "int c[a[0]]";
1474</pre></td></tr>
1475
1476
Aaron Ballman672dde22016-01-22 23:15:00 +00001477<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001478<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1479
1480Given
1481 _Atomic(int) i;
1482atomicType()
1483 matches "_Atomic(int) i"
1484</pre></td></tr>
1485
1486
Aaron Ballman672dde22016-01-22 23:15:00 +00001487<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 +00001488<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1489
1490Given:
1491 auto n = 4;
1492 int v[] = { 2, 3 }
1493 for (auto i : v) { }
1494autoType()
1495 matches "auto n" and "auto i"
1496</pre></td></tr>
1497
1498
Aaron Ballman672dde22016-01-22 23:15:00 +00001499<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 +00001500<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1501"void (^)(int)".
1502
1503The pointee is always required to be a FunctionType.
1504</pre></td></tr>
1505
1506
Aaron Ballman672dde22016-01-22 23:15:00 +00001507<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 +00001508<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1509
1510Given
1511 struct A {};
1512 A a;
1513 int b;
1514 float c;
1515 bool d;
1516builtinType()
1517 matches "int b", "float c" and "bool d"
1518</pre></td></tr>
1519
1520
Aaron Ballman672dde22016-01-22 23:15:00 +00001521<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 +00001522<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1523
1524Given
1525 _Complex float f;
1526complexType()
1527 matches "_Complex float f"
1528</pre></td></tr>
1529
1530
Aaron Ballman672dde22016-01-22 23:15:00 +00001531<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 +00001532<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1533
1534Given
1535 void() {
1536 int a[2];
1537 int b[] = { 2, 3 };
1538 int c[b[0]];
1539 }
1540constantArrayType()
1541 matches "int a[2]"
1542</pre></td></tr>
1543
1544
Aaron Ballman672dde22016-01-22 23:15:00 +00001545<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 +00001546<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1547Example matches i[] in declaration of f.
1548 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1549Example matches i[1].
1550 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1551 void f(int i[]) {
1552 i[1] = 0;
1553 }
1554</pre></td></tr>
1555
1556
Aaron Ballman672dde22016-01-22 23:15:00 +00001557<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 +00001558<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1559
1560Given
1561 template&lt;typename T, int Size&gt;
1562 class array {
1563 T data[Size];
1564 };
1565dependentSizedArrayType
1566 matches "T data[Size]"
1567</pre></td></tr>
1568
1569
Aaron Ballman672dde22016-01-22 23:15:00 +00001570<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 +00001571<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1572qualified name.
1573
1574Given
1575 namespace N {
1576 namespace M {
1577 class D {};
1578 }
1579 }
1580 class C {};
1581
1582 class C c;
1583 N::M::D d;
1584
1585elaboratedType() matches the type of the variable declarations of both
1586c and d.
1587</pre></td></tr>
1588
1589
Haojian Wue775de82016-06-30 07:50:01 +00001590<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>
1591<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1592
1593Given
1594 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001595 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001596
1597 C c;
1598 S s;
1599
1600enumType() matches the type of the variable declarations of both c and
1601s.
1602</pre></td></tr>
1603
1604
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001605<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>
1606<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1607
1608Given
1609 int (*f)(int);
1610 void g();
1611functionProtoType()
1612 matches "int (*f)(int)" and the type of "g" in C++ mode.
1613 In C mode, "g" is not matched because it does not contain a prototype.
1614</pre></td></tr>
1615
1616
Aaron Ballman672dde22016-01-22 23:15:00 +00001617<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 +00001618<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1619
1620Given
1621 int (*f)(int);
1622 void g();
1623functionType()
1624 matches "int (*f)(int)" and the type of "g".
1625</pre></td></tr>
1626
1627
Aaron Ballman672dde22016-01-22 23:15:00 +00001628<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 +00001629<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1630
1631Given
1632 int a[] = { 2, 3 };
1633 int b[42];
1634 void f(int c[]) { int d[a[0]]; };
1635incompleteArrayType()
1636 matches "int a[]" and "int c[]"
1637</pre></td></tr>
1638
1639
Aaron Ballman672dde22016-01-22 23:15:00 +00001640<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 +00001641<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1642
1643Example matches S s, but not S&lt;T&gt; s.
1644 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1645 template &lt;typename T&gt; struct S {
1646 void f(S s);
1647 void g(S&lt;T&gt; s);
1648 };
1649</pre></td></tr>
1650
1651
Aaron Ballman672dde22016-01-22 23:15:00 +00001652<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 +00001653<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1654
1655Given:
1656 int *a;
1657 int &amp;b = *a;
1658 int &amp;&amp;c = 1;
1659 auto &amp;d = b;
1660 auto &amp;&amp;e = c;
1661 auto &amp;&amp;f = 2;
1662 int g = 5;
1663
1664lValueReferenceType() matches the types of b, d, and e. e is
1665matched since the type is deduced as int&amp; by reference collapsing rules.
1666</pre></td></tr>
1667
1668
Aaron Ballman672dde22016-01-22 23:15:00 +00001669<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 +00001670<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1671Given
1672 struct A { int i; }
1673 A::* ptr = A::i;
1674memberPointerType()
1675 matches "A::* ptr"
1676</pre></td></tr>
1677
1678
Aaron Ballman672dde22016-01-22 23:15:00 +00001679<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 +00001680<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1681a pointer type, despite being syntactically similar.
1682
1683Given
1684 int *a;
1685
1686 @interface Foo
1687 @end
1688 Foo *f;
1689pointerType()
1690 matches "Foo *f", but does not match "int *a".
1691</pre></td></tr>
1692
1693
Aaron Ballman672dde22016-01-22 23:15:00 +00001694<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 +00001695<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1696
1697Given
1698 int (*ptr_to_array)[4];
1699 int *array_of_ptrs[4];
1700
1701varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1702array_of_ptrs.
1703</pre></td></tr>
1704
1705
Aaron Ballman672dde22016-01-22 23:15:00 +00001706<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001707<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1708types.
1709
1710Given
1711 int *a;
1712 int &amp;b = *a;
1713 int c = 5;
1714
1715 @interface Foo
1716 @end
1717 Foo *f;
1718pointerType()
1719 matches "int *a", but does not match "Foo *f".
1720</pre></td></tr>
1721
1722
Aaron Ballman672dde22016-01-22 23:15:00 +00001723<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 +00001724<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1725
1726Given:
1727 int *a;
1728 int &amp;b = *a;
1729 int &amp;&amp;c = 1;
1730 auto &amp;d = b;
1731 auto &amp;&amp;e = c;
1732 auto &amp;&amp;f = 2;
1733 int g = 5;
1734
1735rValueReferenceType() matches the types of c and f. e is not
1736matched as it is deduced to int&amp; by reference collapsing rules.
1737</pre></td></tr>
1738
1739
Aaron Ballman672dde22016-01-22 23:15:00 +00001740<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 +00001741<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1742
1743Given
1744 class C {};
1745 struct S {};
1746
1747 C c;
1748 S s;
1749
1750recordType() matches the type of the variable declarations of both c
1751and s.
1752</pre></td></tr>
1753
1754
Aaron Ballman672dde22016-01-22 23:15:00 +00001755<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 +00001756<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1757
1758Given
1759 int *a;
1760 int &amp;b = *a;
1761 int &amp;&amp;c = 1;
1762 auto &amp;d = b;
1763 auto &amp;&amp;e = c;
1764 auto &amp;&amp;f = 2;
1765 int g = 5;
1766
1767referenceType() matches the types of b, c, d, e, and f.
1768</pre></td></tr>
1769
1770
Aaron Ballman672dde22016-01-22 23:15:00 +00001771<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 +00001772<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1773template type parameter.
1774
1775Given
1776 template &lt;typename T&gt;
1777 void F(T t) {
1778 int i = 1 + t;
1779 }
1780
1781substTemplateTypeParmType() matches the type of 't' but not '1'
1782</pre></td></tr>
1783
1784
Manuel Klimek696e5052017-08-02 13:04:44 +00001785<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
1786<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1787
1788Given
1789 enum E {};
1790 class C {};
1791
1792 E e;
1793 C c;
1794
1795tagType() matches the type of the variable declarations of both e
1796and c.
1797</pre></td></tr>
1798
1799
Aaron Ballman672dde22016-01-22 23:15:00 +00001800<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 +00001801<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1802
1803Given
1804 template &lt;typename T&gt;
1805 class C { };
1806
1807 template class C&lt;int&gt;; A
1808 C&lt;char&gt; var; B
1809
1810templateSpecializationType() matches the type of the explicit
1811instantiation in A and the type of the variable declaration in B.
1812</pre></td></tr>
1813
1814
Aaron Ballman672dde22016-01-22 23:15:00 +00001815<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 +00001816<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1817
1818Example matches T, but not int.
1819 (matcher = templateTypeParmType())
1820 template &lt;typename T&gt; void f(int i);
1821</pre></td></tr>
1822
1823
Aaron Ballman672dde22016-01-22 23:15:00 +00001824<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001825<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1826</pre></td></tr>
1827
1828
Aaron Ballman672dde22016-01-22 23:15:00 +00001829<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 +00001830<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1831
1832Given
1833 typedef int X;
1834typedefType()
1835 matches "typedef int X"
1836</pre></td></tr>
1837
1838
Aaron Ballman672dde22016-01-22 23:15:00 +00001839<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 +00001840<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1841
1842Given:
1843 typedef __underlying_type(T) type;
1844unaryTransformType()
1845 matches "__underlying_type(T)"
1846</pre></td></tr>
1847
1848
Aaron Ballman672dde22016-01-22 23:15:00 +00001849<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 +00001850<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1851integer-constant-expression.
1852
1853Given
1854 void f() {
1855 int a[] = { 2, 3 }
1856 int b[42];
1857 int c[a[0]];
1858 }
1859variableArrayType()
1860 matches "int c[a[0]]"
1861</pre></td></tr>
1862
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001863<!--END_DECL_MATCHERS -->
1864</table>
1865
1866<!-- ======================================================================= -->
1867<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1868<!-- ======================================================================= -->
1869
1870<p>Narrowing matchers match certain attributes on the current node, thus
1871narrowing down the set of nodes of the current type to match on.</p>
1872
1873<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1874which allow users to create more powerful match expressions.</p>
1875
1876<table>
1877<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001878<!-- START_NARROWING_MATCHERS -->
1879
1880<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>
1881<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1882
1883Usable as: Any Matcher
1884</pre></td></tr>
1885
1886
1887<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>
1888<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1889
1890Usable as: Any Matcher
1891</pre></td></tr>
1892
1893
1894<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1895<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1896
1897Useful when another matcher requires a child matcher, but there's no
1898additional constraint. This will often be used with an explicit conversion
1899to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1900
1901Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1902"int* p" and "void f()" in
1903 int* p;
1904 void f();
1905
1906Usable as: Any Matcher
1907</pre></td></tr>
1908
1909
1910<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1911<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1912
1913Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1914 class X {};
1915 class Y {};
1916
1917Usable as: Any Matcher
1918</pre></td></tr>
1919
1920
Aaron Ballman672dde22016-01-22 23:15:00 +00001921<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 +00001922<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1923unary).
1924
1925Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1926 !(a || b)
1927</pre></td></tr>
1928
1929
Peter Wua9244b52017-06-08 22:00:58 +00001930<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
1931<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001932
Peter Wua9244b52017-06-08 22:00:58 +00001933Given
1934 f('false, 3.14, 42);
1935characterLiteral(equals(0))
1936 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1937 match false
1938floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1939 match 3.14
1940integerLiteral(equals(42))
1941 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001942
Clement Courbet43bdba42017-07-11 15:45:22 +00001943Note that you cannot directly match a negative numeric literal because the
1944minus sign is not part of the literal: It is a unary operator whose operand
1945is the positive numeric literal. Instead, you must use a unaryOperator()
1946matcher to match the minus sign:
1947
1948unaryOperator(hasOperatorName("-"),
1949 hasUnaryOperand(integerLiteral(equals(13))))
1950
Peter Wua9244b52017-06-08 22:00:58 +00001951Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00001952 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 +00001953</pre></td></tr>
1954
1955
Peter Wua9244b52017-06-08 22:00:58 +00001956<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
1957<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1958
1959
1960<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
1961<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1962
1963
1964<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
1965<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1966
1967
Aaron Ballman672dde22016-01-22 23:15:00 +00001968<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 +00001969<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1970
1971Given
1972 try {
1973 ...
1974 } catch (int) {
1975 ...
1976 } catch (...) {
1977 ...
1978 }
1979endcode
1980cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1981</pre></td></tr>
1982
1983
Aaron Ballman672dde22016-01-22 23:15:00 +00001984<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 +00001985<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1986a specific number of arguments (including absent default arguments).
1987
1988Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1989 void f(int x, int y);
1990 f(0, 0);
1991</pre></td></tr>
1992
1993
Aaron Ballman672dde22016-01-22 23:15:00 +00001994<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 +00001995<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1996</pre></td></tr>
1997
1998
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001999<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>
2000<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2001zero initialization.
2002
2003Given
2004void foo() {
2005 struct point { double x; double y; };
2006 point pt[2] = { { 1.0, 2.0 } };
2007}
2008initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2009will match the implicit array filler for pt[1].
2010</pre></td></tr>
2011
2012
Aaron Ballman672dde22016-01-22 23:15:00 +00002013<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 +00002014<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2015
2016Given
2017 struct S {
2018 S(); #1
2019 S(const S &amp;); #2
2020 S(S &amp;&amp;); #3
2021 };
2022cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2023</pre></td></tr>
2024
2025
Aaron Ballman672dde22016-01-22 23:15:00 +00002026<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 +00002027<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2028
2029Given
2030 struct S {
2031 S(); #1
2032 S(const S &amp;); #2
2033 S(S &amp;&amp;); #3
2034 };
2035cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2036</pre></td></tr>
2037
2038
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002039<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>
2040<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2041
2042Given
2043 struct S {
2044 S(); #1
2045 S(int) {} #2
2046 S(S &amp;&amp;) : S() {} #3
2047 };
2048 S::S() : S(0) {} #4
2049cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2050#1 or #2.
2051</pre></td></tr>
2052
2053
Aaron Ballman672dde22016-01-22 23:15:00 +00002054<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 +00002055<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2056the explicit keyword.
2057
2058Given
2059 struct S {
2060 S(int); #1
2061 explicit S(double); #2
2062 operator int(); #3
2063 explicit operator bool(); #4
2064 };
2065cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2066cxxConversionDecl(isExplicit()) will match #4, but not #3.
2067</pre></td></tr>
2068
2069
Aaron Ballman672dde22016-01-22 23:15:00 +00002070<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002071<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2072
2073Given
2074 struct S {
2075 S(); #1
2076 S(const S &amp;); #2
2077 S(S &amp;&amp;); #3
2078 };
2079cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2080</pre></td></tr>
2081
2082
Aaron Ballman672dde22016-01-22 23:15:00 +00002083<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 +00002084<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2085the explicit keyword.
2086
2087Given
2088 struct S {
2089 S(int); #1
2090 explicit S(double); #2
2091 operator int(); #3
2092 explicit operator bool(); #4
2093 };
2094cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2095cxxConversionDecl(isExplicit()) will match #4, but not #3.
2096</pre></td></tr>
2097
2098
Aaron Ballman672dde22016-01-22 23:15:00 +00002099<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 +00002100<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2101opposed to a member.
2102
2103Given
2104 struct B {};
2105 struct D : B {
2106 int I;
2107 D(int i) : I(i) {}
2108 };
2109 struct E : B {
2110 E() : B() {}
2111 };
2112cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2113 will match E(), but not match D(int).
2114</pre></td></tr>
2115
2116
Aaron Ballman672dde22016-01-22 23:15:00 +00002117<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 +00002118<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2119opposed to a base.
2120
2121Given
2122 struct B {};
2123 struct D : B {
2124 int I;
2125 D(int i) : I(i) {}
2126 };
2127 struct E : B {
2128 E() : B() {}
2129 };
2130cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2131 will match D(int), but not match E().
2132</pre></td></tr>
2133
2134
Aaron Ballman672dde22016-01-22 23:15:00 +00002135<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002136<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2137code (as opposed to implicitly added by the compiler).
2138
2139Given
2140 struct Foo {
2141 Foo() { }
2142 Foo(int) : foo_("A") { }
2143 string foo_;
2144 };
2145cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2146 will match Foo(int), but not Foo()
2147</pre></td></tr>
2148
2149
Aaron Ballman672dde22016-01-22 23:15:00 +00002150<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 +00002151<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2152
2153Given
2154struct A {
2155 void foo() const;
2156 void bar();
2157};
2158
2159cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2160</pre></td></tr>
2161
2162
Aaron Ballman672dde22016-01-22 23:15:00 +00002163<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 +00002164<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2165operator.
2166
2167Given
2168struct A {
2169 A &amp;operator=(const A &amp;);
2170 A &amp;operator=(A &amp;&amp;);
2171};
2172
2173cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2174the second one.
2175</pre></td></tr>
2176
2177
Aaron Ballman672dde22016-01-22 23:15:00 +00002178<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 +00002179<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2180
2181Given:
2182 class A final {};
2183
2184 struct B {
2185 virtual void f();
2186 };
2187
2188 struct C : B {
2189 void f() final;
2190 };
2191matches A and C::f, but not B, C, or B::f
2192</pre></td></tr>
2193
2194
Aaron Ballman672dde22016-01-22 23:15:00 +00002195<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 +00002196<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2197operator.
2198
2199Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002200struct A {
2201 A &amp;operator=(const A &amp;);
2202 A &amp;operator=(A &amp;&amp;);
2203};
2204
2205cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2206the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002207</pre></td></tr>
2208
2209
Aaron Ballman672dde22016-01-22 23:15:00 +00002210<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 +00002211<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2212
2213Given
2214 class A {
2215 public:
2216 virtual void x();
2217 };
2218 class B : public A {
2219 public:
2220 virtual void x();
2221 };
2222 matches B::x
2223</pre></td></tr>
2224
2225
Aaron Ballman672dde22016-01-22 23:15:00 +00002226<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 +00002227<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2228
2229Given
2230 class A {
2231 public:
2232 virtual void x() = 0;
2233 };
2234 matches A::x
2235</pre></td></tr>
2236
2237
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002238<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>
2239<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2240
2241Given
2242 struct S {
2243 S(); #1
2244 S(const S &amp;) = default; #2
2245 S(S &amp;&amp;) = delete; #3
2246 };
2247cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2248</pre></td></tr>
2249
2250
Aaron Ballman672dde22016-01-22 23:15:00 +00002251<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 +00002252<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2253
2254Given
2255 class A {
2256 public:
2257 virtual void x();
2258 };
2259 matches A::x
2260</pre></td></tr>
2261
Aaron Ballman672dde22016-01-22 23:15:00 +00002262
2263<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 +00002264<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2265
2266Given
2267 class A {
2268 public:
2269 virtual void x();
2270 };
2271 class B : public A {
2272 public:
2273 void x();
2274 };
2275 matches A::x but not B::x
2276</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002277
Aaron Ballman672dde22016-01-22 23:15:00 +00002278
2279<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 +00002280<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2281
2282Matches overloaded operator names specified in strings without the
2283"operator" prefix: e.g. "&lt;&lt;".
2284
2285Given:
2286 class A { int operator*(); };
2287 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2288 A a;
2289 a &lt;&lt; a; &lt;-- This matches
2290
2291cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2292specified line and
2293cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2294matches the declaration of A.
2295
Aaron Ballman672dde22016-01-22 23:15:00 +00002296Usable 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 +00002297</pre></td></tr>
2298
2299
Aaron Ballman672dde22016-01-22 23:15:00 +00002300<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 +00002301<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2302</pre></td></tr>
2303
2304
Aaron Ballman672dde22016-01-22 23:15:00 +00002305<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 +00002306<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2307static member variable template instantiations.
2308
2309Given
2310 template&lt;typename T&gt; void A(T t) { }
2311 template&lt;&gt; void A(int N) { }
2312functionDecl(isExplicitTemplateSpecialization())
2313 matches the specialization A&lt;int&gt;().
2314
Aaron Ballman672dde22016-01-22 23:15:00 +00002315Usable 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 +00002316</pre></td></tr>
2317
2318
Aaron Ballman672dde22016-01-22 23:15:00 +00002319<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 +00002320<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2321
2322Given:
2323 class A final {};
2324
2325 struct B {
2326 virtual void f();
2327 };
2328
2329 struct C : B {
2330 void f() final;
2331 };
2332matches A and C::f, but not B, C, or B::f
2333</pre></td></tr>
2334
2335
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002336<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>
2337<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2338
2339Given:
2340 auto x = []{};
2341
2342cxxRecordDecl(isLambda()) matches the implicit class declaration of
2343decltype(x)
2344</pre></td></tr>
2345
2346
Aaron Ballman672dde22016-01-22 23:15:00 +00002347<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 +00002348<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2349isSameOrDerivedFrom(hasName(...)).
2350</pre></td></tr>
2351
2352
Aaron Ballman672dde22016-01-22 23:15:00 +00002353<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 +00002354<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2355member variable template instantiations.
2356
2357Given
2358 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2359or
2360 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2361cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2362 matches the template instantiation of X&lt;A&gt;.
2363
2364But given
2365 template &lt;typename T&gt; class X {}; class A {};
2366 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2367cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2368 does not match, as X&lt;A&gt; is an explicit template specialization.
2369
Aaron Ballman672dde22016-01-22 23:15:00 +00002370Usable 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 +00002371</pre></td></tr>
2372
2373
Aaron Ballman672dde22016-01-22 23:15:00 +00002374<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 +00002375<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2376a specific number of arguments (including absent default arguments).
2377
2378Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2379 void f(int x, int y);
2380 f(0, 0);
2381</pre></td></tr>
2382
2383
Etienne Bergeron75e52722016-05-13 19:36:55 +00002384<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>
2385<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2386
2387Example: matches the implicit cast around 0
2388(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2389 int *p = 0;
2390</pre></td></tr>
2391
2392
Aaron Ballman672dde22016-01-22 23:15:00 +00002393<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>
Peter Wua9244b52017-06-08 22:00:58 +00002394<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002395
Peter Wua9244b52017-06-08 22:00:58 +00002396Given
2397 f('false, 3.14, 42);
2398characterLiteral(equals(0))
2399 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2400 match false
2401floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2402 match 3.14
2403integerLiteral(equals(42))
2404 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002405
Clement Courbet43bdba42017-07-11 15:45:22 +00002406Note that you cannot directly match a negative numeric literal because the
2407minus sign is not part of the literal: It is a unary operator whose operand
2408is the positive numeric literal. Instead, you must use a unaryOperator()
2409matcher to match the minus sign:
2410
2411unaryOperator(hasOperatorName("-"),
2412 hasUnaryOperand(integerLiteral(equals(13))))
2413
Peter Wua9244b52017-06-08 22:00:58 +00002414Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00002415 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 +00002416</pre></td></tr>
2417
2418
Peter Wua9244b52017-06-08 22:00:58 +00002419<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
2420<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2421
2422
2423<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
2424<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2425
2426
2427<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
2428<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2429
2430
Aaron Ballman672dde22016-01-22 23:15:00 +00002431<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 +00002432<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2433
2434Given
2435 template&lt;typename T&gt; struct C {};
2436 C&lt;int&gt; c;
2437classTemplateSpecializationDecl(templateArgumentCountIs(1))
2438 matches C&lt;int&gt;.
2439</pre></td></tr>
2440
2441
Aaron Ballman672dde22016-01-22 23:15:00 +00002442<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 +00002443<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2444child statements.
2445
2446Example: Given
2447 { for (;;) {} }
2448compoundStmt(statementCountIs(0)))
2449 matches '{}'
2450 but does not match the outer compound statement.
2451</pre></td></tr>
2452
2453
Aaron Ballman672dde22016-01-22 23:15:00 +00002454<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 +00002455<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002456
2457Given
2458 int a[42];
2459 int b[2 * 21];
2460 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002461 char *s = "abcd";
2462 wchar_t *ws = L"abcd";
2463 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002464constantArrayType(hasSize(42))
2465 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002466stringLiteral(hasSize(4))
2467 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002468</pre></td></tr>
2469
2470
Aaron Ballman672dde22016-01-22 23:15:00 +00002471<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 +00002472<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2473declarations.
2474
2475Example: Given
2476 int a, b;
2477 int c;
2478 int d = 2, e;
2479declCountIs(2)
2480 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2481</pre></td></tr>
2482
2483
Aaron Ballman672dde22016-01-22 23:15:00 +00002484<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 +00002485<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2486
2487Matches a node if it equals the node previously bound to ID.
2488
2489Given
2490 class X { int a; int b; };
2491cxxRecordDecl(
2492 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2493 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2494 matches the class X, as a and b have the same type.
2495
2496Note that when multiple matches are involved via forEach* matchers,
2497equalsBoundNodes acts as a filter.
2498For example:
2499compoundStmt(
2500 forEachDescendant(varDecl().bind("d")),
2501 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2502will trigger a match for each combination of variable declaration
2503and reference to that variable declaration within a compound statement.
2504</pre></td></tr>
2505
2506
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002507<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>
2508<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2509
2510Decl has pointer identity in the AST.
2511</pre></td></tr>
2512
2513
Aaron Ballman672dde22016-01-22 23:15:00 +00002514<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 +00002515<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2516
2517Given
2518 __attribute__((device)) void f() { ... }
2519decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2520f. If the matcher is use from clang-query, attr::Kind parameter should be
2521passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2522</pre></td></tr>
2523
2524
Aaron Ballman672dde22016-01-22 23:15:00 +00002525<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 +00002526<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2527partially matching a given regex.
2528
2529Example matches Y but not X
2530 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2531 #include "ASTMatcher.h"
2532 class X {};
2533ASTMatcher.h:
2534 class Y {};
2535
Aaron Ballman672dde22016-01-22 23:15:00 +00002536Usable 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 +00002537</pre></td></tr>
2538
2539
Aaron Ballman672dde22016-01-22 23:15:00 +00002540<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 +00002541<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2542
2543Example matches X but not Y
2544 (matcher = cxxRecordDecl(isExpansionInMainFile())
2545 #include &lt;Y.h&gt;
2546 class X {};
2547Y.h:
2548 class Y {};
2549
Aaron Ballman672dde22016-01-22 23:15:00 +00002550Usable 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 +00002551</pre></td></tr>
2552
2553
Aaron Ballman672dde22016-01-22 23:15:00 +00002554<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 +00002555<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2556
2557Example matches Y but not X
2558 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2559 #include &lt;SystemHeader.h&gt;
2560 class X {};
2561SystemHeader.h:
2562 class Y {};
2563
Aaron Ballman672dde22016-01-22 23:15:00 +00002564Usable 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 +00002565</pre></td></tr>
2566
2567
Aaron Ballman672dde22016-01-22 23:15:00 +00002568<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 +00002569<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2570by the compiler (eg. implicit defaultcopy constructors).
2571</pre></td></tr>
2572
2573
Aaron Ballman672dde22016-01-22 23:15:00 +00002574<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 +00002575<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2576
2577Given
2578 class C {
2579 public: int a;
2580 protected: int b;
2581 private: int c;
2582 };
2583fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002584 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002585</pre></td></tr>
2586
2587
Aaron Ballman672dde22016-01-22 23:15:00 +00002588<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 +00002589<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2590
2591Given
2592 class C {
2593 public: int a;
2594 protected: int b;
2595 private: int c;
2596 };
2597fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002598 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002599</pre></td></tr>
2600
2601
Aaron Ballman672dde22016-01-22 23:15:00 +00002602<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 +00002603<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2604
2605Given
2606 class C {
2607 public: int a;
2608 protected: int b;
2609 private: int c;
2610 };
2611fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002612 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002613</pre></td></tr>
2614
2615
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002616<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>
2617<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2618a specific number of designators.
2619
2620Example: Given
2621 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2622 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2623designatorCountIs(2)
2624 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2625 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2626</pre></td></tr>
2627
2628
Aaron Ballman5c574342016-07-06 18:25:16 +00002629<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 +00002630<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2631bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002632
2633Given
2634 class C {
2635 int a : 2;
2636 int b : 4;
2637 int c : 2;
2638 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002639fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002640 matches 'int a;' and 'int c;' but not 'int b;'.
2641</pre></td></tr>
2642
2643
2644<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>
2645<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2646
2647Given
2648 class C {
2649 int a : 2;
2650 int b;
2651 };
2652fieldDecl(isBitField())
2653 matches 'int a;' but not 'int b;'.
2654</pre></td></tr>
2655
2656
Aaron Ballman672dde22016-01-22 23:15:00 +00002657<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>
Peter Wua9244b52017-06-08 22:00:58 +00002658<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002659
Peter Wua9244b52017-06-08 22:00:58 +00002660Given
2661 f('false, 3.14, 42);
2662characterLiteral(equals(0))
2663 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2664 match false
2665floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2666 match 3.14
2667integerLiteral(equals(42))
2668 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002669
Clement Courbet43bdba42017-07-11 15:45:22 +00002670Note that you cannot directly match a negative numeric literal because the
2671minus sign is not part of the literal: It is a unary operator whose operand
2672is the positive numeric literal. Instead, you must use a unaryOperator()
2673matcher to match the minus sign:
2674
2675unaryOperator(hasOperatorName("-"),
2676 hasUnaryOperand(integerLiteral(equals(13))))
2677
Peter Wua9244b52017-06-08 22:00:58 +00002678Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00002679 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 +00002680</pre></td></tr>
2681
2682
Peter Wua9244b52017-06-08 22:00:58 +00002683<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
2684<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2685
2686
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002687<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>
2688<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2689
2690Given:
2691 void f();
2692 void g() noexcept;
2693 void h() noexcept(true);
2694 void i() noexcept(false);
2695 void j() throw();
2696 void k() throw(int);
2697 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002698functionDecl(hasDynamicExceptionSpec()) and
2699 functionProtoType(hasDynamicExceptionSpec())
2700 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +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('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002705<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2706
2707Matches overloaded operator names specified in strings without the
2708"operator" prefix: e.g. "&lt;&lt;".
2709
2710Given:
2711 class A { int operator*(); };
2712 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2713 A a;
2714 a &lt;&lt; a; &lt;-- This matches
2715
2716cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2717specified line and
2718cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2719matches the declaration of A.
2720
Aaron Ballman672dde22016-01-22 23:15:00 +00002721Usable 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 +00002722</pre></td></tr>
2723
2724
Aaron Ballman672dde22016-01-22 23:15:00 +00002725<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 +00002726<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2727
2728Given:
2729 constexpr int foo = 42;
2730 constexpr int bar();
2731varDecl(isConstexpr())
2732 matches the declaration of foo.
2733functionDecl(isConstexpr())
2734 matches the declaration of bar.
2735</pre></td></tr>
2736
2737
Aaron Ballman672dde22016-01-22 23:15:00 +00002738<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 +00002739<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2740
2741Given:
2742 class A { ~A(); };
2743 class B { ~B() = default; };
2744functionDecl(isDefaulted())
2745 matches the declaration of ~B, but not ~A.
2746</pre></td></tr>
2747
2748
Aaron Ballman672dde22016-01-22 23:15:00 +00002749<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 +00002750<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2751
2752Example matches A, va, fa
2753 class A {};
2754 class B; Doesn't match, as it has no body.
2755 int va;
2756 extern int vb; Doesn't match, as it doesn't define the variable.
2757 void fa() {}
2758 void fb(); Doesn't match, as it has no body.
2759
Aaron Ballman672dde22016-01-22 23:15:00 +00002760Usable 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 +00002761</pre></td></tr>
2762
2763
Aaron Ballman672dde22016-01-22 23:15:00 +00002764<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 +00002765<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2766
2767Given:
2768 void Func();
2769 void DeletedFunc() = delete;
2770functionDecl(isDeleted())
2771 matches the declaration of DeletedFunc, but not Func.
2772</pre></td></tr>
2773
2774
Aaron Ballman672dde22016-01-22 23:15:00 +00002775<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 +00002776<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2777static member variable template instantiations.
2778
2779Given
2780 template&lt;typename T&gt; void A(T t) { }
2781 template&lt;&gt; void A(int N) { }
2782functionDecl(isExplicitTemplateSpecialization())
2783 matches the specialization A&lt;int&gt;().
2784
Aaron Ballman672dde22016-01-22 23:15:00 +00002785Usable 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 +00002786</pre></td></tr>
2787
Aaron Ballman672dde22016-01-22 23:15:00 +00002788<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>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002789<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002790
2791Given:
2792 extern "C" void f() {}
2793 extern "C" { void g() {} }
2794 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002795 extern "C" int x = 1;
2796 extern "C" int y = 2;
2797 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002798functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002799 matches the declaration of f and g, but not the declaration of h.
2800varDecl(isExternC())
2801 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002802</pre></td></tr>
2803
Aaron Ballman672dde22016-01-22 23:15:00 +00002804<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 +00002805<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2806the inline keyword.
2807
2808Given
2809 inline void f();
2810 void g();
2811 namespace n {
2812 inline namespace m {}
2813 }
2814functionDecl(isInline()) will match ::f().
2815namespaceDecl(isInline()) will match n::m.
2816</pre></td></tr>
2817
2818
Aaron Ballman672dde22016-01-22 23:15:00 +00002819<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 +00002820<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2821
2822Given:
2823 void f();
2824 void g() noexcept;
2825 void h() throw();
2826 void i() throw(int);
2827 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002828functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2829 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002830</pre></td></tr>
2831
2832
Haojian Wub3d25462016-09-26 16:01:52 +00002833<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 +00002834<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2835class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002836
2837Given:
2838 static void f() {}
2839 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002840 extern int j;
2841 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002842functionDecl(isStaticStorageClass())
2843 matches the function declaration f.
2844varDecl(isStaticStorageClass())
2845 matches the variable declaration i.
2846</pre></td></tr>
2847
2848
Aaron Ballman672dde22016-01-22 23:15:00 +00002849<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 +00002850<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2851member variable template instantiations.
2852
2853Given
2854 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2855or
2856 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2857cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2858 matches the template instantiation of X&lt;A&gt;.
2859
2860But given
2861 template &lt;typename T&gt; class X {}; class A {};
2862 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2863cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2864 does not match, as X&lt;A&gt; is an explicit template specialization.
2865
Aaron Ballman672dde22016-01-22 23:15:00 +00002866Usable 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 +00002867</pre></td></tr>
2868
2869
Aaron Ballman672dde22016-01-22 23:15:00 +00002870<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002871<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2872
2873Example matches f, but not g or h. The function i will not match, even when
2874compiled in C mode.
2875 void f(...);
2876 void g(int);
2877 template &lt;typename... Ts&gt; void h(Ts...);
2878 void i();
2879</pre></td></tr>
2880
2881
Aaron Ballman672dde22016-01-22 23:15:00 +00002882<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 +00002883<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2884specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002885
2886Given
2887 void f(int i) {}
2888 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002889 void h(int i, int j);
2890 void j(int i);
2891 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002892functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002893 matches void g(int i, int j) {}
2894functionProtoType(parameterCountIs(2))
2895 matches void h(int i, int j)
2896functionProtoType(parameterCountIs(3))
2897 matches void k(int x, int y, int z, ...);
2898</pre></td></tr>
2899
2900
Aaron Ballman230ad972016-06-07 17:34:45 +00002901<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>
2902<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2903
2904Given:
2905 void f();
2906 void g() noexcept;
2907 void h() noexcept(true);
2908 void i() noexcept(false);
2909 void j() throw();
2910 void k() throw(int);
2911 void l() throw(...);
2912functionDecl(hasDynamicExceptionSpec()) and
2913 functionProtoType(hasDynamicExceptionSpec())
2914 match the declarations of j, k, and l, but not f, g, h, or i.
2915</pre></td></tr>
2916
2917
2918<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>
2919<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2920
2921Given:
2922 void f();
2923 void g() noexcept;
2924 void h() throw();
2925 void i() throw(int);
2926 void j() noexcept(false);
2927functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2928 match the declarations of g, and h, but not f, i or j.
2929</pre></td></tr>
2930
2931
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002932<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>
2933<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2934specific parameter count.
2935
2936Given
2937 void f(int i) {}
2938 void g(int i, int j) {}
2939 void h(int i, int j);
2940 void j(int i);
2941 void k(int x, int y, int z, ...);
2942functionDecl(parameterCountIs(2))
2943 matches void g(int i, int j) {}
2944functionProtoType(parameterCountIs(2))
2945 matches void h(int i, int j)
2946functionProtoType(parameterCountIs(3))
2947 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002948</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_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002952<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002953
Peter Wua9244b52017-06-08 22:00:58 +00002954Given
2955 f('false, 3.14, 42);
2956characterLiteral(equals(0))
2957 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2958 match false
2959floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2960 match 3.14
2961integerLiteral(equals(42))
2962 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002963
Clement Courbet43bdba42017-07-11 15:45:22 +00002964Note that you cannot directly match a negative numeric literal because the
2965minus sign is not part of the literal: It is a unary operator whose operand
2966is the positive numeric literal. Instead, you must use a unaryOperator()
2967matcher to match the minus sign:
2968
2969unaryOperator(hasOperatorName("-"),
2970 hasUnaryOperand(integerLiteral(equals(13))))
2971
Peter Wua9244b52017-06-08 22:00:58 +00002972Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
Aaron Ballman672dde22016-01-22 23:15:00 +00002973 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 +00002974</pre></td></tr>
2975
2976
Peter Wua9244b52017-06-08 22:00:58 +00002977<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
2978<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2979
2980
2981<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
2982<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2983
2984
2985<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
2986<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2987
2988
Aaron Ballman672dde22016-01-22 23:15:00 +00002989<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002990<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2991to '.'.
2992
2993Member calls on the implicit this pointer match as called with '-&gt;'.
2994
2995Given
2996 class Y {
2997 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2998 int a;
2999 static int b;
3000 };
3001memberExpr(isArrow())
3002 matches this-&gt;x, x, y.x, a, this-&gt;b
3003</pre></td></tr>
3004
3005
Aaron Ballmana086b9f2016-08-17 13:10:42 +00003006<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>
3007<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3008
3009Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3010void f() {
3011 int x;
3012 static int y;
3013}
3014int z;
3015
3016Example matches f() because it has external formal linkage despite being
3017unique to the translation unit as though it has internal likage
3018(matcher = functionDecl(hasExternalFormalLinkage()))
3019
3020namespace {
3021void f() {}
3022}
3023</pre></td></tr>
3024
3025
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003026<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 +00003027<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3028
3029Supports specifying enclosing namespaces or classes by prefixing the name
3030with '&lt;enclosing&gt;::'.
3031Does not match typedefs of an underlying type with the given name.
3032
3033Example matches X (Name == "X")
3034 class X;
3035
3036Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3037 namespace a { namespace b { class X; } }
3038</pre></td></tr>
3039
3040
Aaron Ballman672dde22016-01-22 23:15:00 +00003041<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 +00003042<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3043a substring matched by the given RegExp.
3044
3045Supports specifying enclosing namespaces or classes by
3046prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3047of an underlying type with the given name.
3048
3049Example matches X (regexp == "::X")
3050 class X;
3051
3052Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3053 namespace foo { namespace bar { class X; } }
3054</pre></td></tr>
3055
3056
Aaron Ballman672dde22016-01-22 23:15:00 +00003057<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 +00003058<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3059
3060Given
3061 namespace n {
3062 namespace {} #1
3063 }
3064namespaceDecl(isAnonymous()) will match #1 but not ::n.
3065</pre></td></tr>
3066
3067
Aaron Ballman672dde22016-01-22 23:15:00 +00003068<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 +00003069<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3070the inline keyword.
3071
3072Given
3073 inline void f();
3074 void g();
3075 namespace n {
3076 inline namespace m {}
3077 }
3078functionDecl(isInline()) will match ::f().
3079namespaceDecl(isInline()) will match n::m.
3080</pre></td></tr>
3081
3082
Aaron Ballman672dde22016-01-22 23:15:00 +00003083<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 +00003084<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3085a specific number of arguments (including absent default arguments).
3086
3087Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3088 void f(int x, int y);
3089 f(0, 0);
3090</pre></td></tr>
3091
3092
Aaron Ballman672dde22016-01-22 23:15:00 +00003093<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 +00003094<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3095
3096objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3097message expression in
3098
3099 UIWebView *webView = ...;
3100 CGRect bodyFrame = webView.frame;
3101 bodyFrame.size.height = self.bodyContentHeight;
3102 webView.frame = bodyFrame;
3103 ^---- matches here
3104</pre></td></tr>
3105
3106
Aaron Ballman672dde22016-01-22 23:15:00 +00003107<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 +00003108<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3109
3110Matches only when the selector of the objCMessageExpr is NULL. This may
3111represent an error condition in the tree!
3112</pre></td></tr>
3113
3114
Aaron Ballman672dde22016-01-22 23:15:00 +00003115<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 +00003116<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3117
3118 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3119 matches the outer message expr in the code below, but NOT the message
3120 invocation for self.bodyView.
3121 [self.bodyView loadHTMLString:html baseURL:NULL];
3122</pre></td></tr>
3123
3124
Aaron Ballman672dde22016-01-22 23:15:00 +00003125<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003126<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3127
3128 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3129 matches self.bodyView in the code below, but NOT the outer message
3130 invocation of "loadHTMLString:baseURL:".
3131 [self.bodyView loadHTMLString:html baseURL:NULL];
3132</pre></td></tr>
3133
3134
Aaron Ballman672dde22016-01-22 23:15:00 +00003135<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 +00003136<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3137a substring matched by the given RegExp.
3138 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3139 invocation for self.bodyView.
3140 [self.bodyView loadHTMLString:html baseURL:NULL];
3141</pre></td></tr>
3142
3143
Aaron Ballman672dde22016-01-22 23:15:00 +00003144<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 +00003145<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3146
3147 matcher = objCMessageExpr(numSelectorArgs(0));
3148 matches self.bodyView in the code below
3149
3150 matcher = objCMessageExpr(numSelectorArgs(2));
3151 matches the invocation of "loadHTMLString:baseURL:" but not that
3152 of self.bodyView
3153 [self.bodyView loadHTMLString:html baseURL:NULL];
3154</pre></td></tr>
3155
3156
Aaron Ballman672dde22016-01-22 23:15:00 +00003157<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 +00003158<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3159
3160Given
3161 class Y { public: void x(); };
3162 void z() { Y* y; y-&gt;x(); }
3163cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3164 matches y-&gt;x()
3165</pre></td></tr>
3166
3167
Aaron Ballman672dde22016-01-22 23:15:00 +00003168<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 +00003169<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3170
3171Matches a node if it equals the node previously bound to ID.
3172
3173Given
3174 class X { int a; int b; };
3175cxxRecordDecl(
3176 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3177 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3178 matches the class X, as a and b have the same type.
3179
3180Note that when multiple matches are involved via forEach* matchers,
3181equalsBoundNodes acts as a filter.
3182For example:
3183compoundStmt(
3184 forEachDescendant(varDecl().bind("d")),
3185 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3186will trigger a match for each combination of variable declaration
3187and reference to that variable declaration within a compound statement.
3188</pre></td></tr>
3189
3190
Aaron Ballman672dde22016-01-22 23:15:00 +00003191<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 +00003192<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3193the node, not hidden within a typedef.
3194
3195Given
3196 typedef const int const_int;
3197 const_int i;
3198 int *const j;
3199 int *volatile k;
3200 int m;
3201varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3202i is const-qualified but the qualifier is not local.
3203</pre></td></tr>
3204
3205
Aaron Ballman672dde22016-01-22 23:15:00 +00003206<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 +00003207<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3208
3209Given
3210 void a(char);
3211 void b(wchar_t);
3212 void c(double);
3213functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3214matches "a(char)", "b(wchar_t)", but not "c(double)".
3215</pre></td></tr>
3216
3217
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003218<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 +00003219<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3220the Objective-C object pointer type, which is different despite being
3221syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003222
3223Given
3224 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003225
3226 @interface Foo
3227 @end
3228 Foo *f;
3229
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003230 int j;
3231varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003232 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003233</pre></td></tr>
3234
3235
Aaron Ballman672dde22016-01-22 23:15:00 +00003236<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 +00003237<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3238include "top-level" const.
3239
3240Given
3241 void a(int);
3242 void b(int const);
3243 void c(const int);
3244 void d(const int*);
3245 void e(int const) {};
3246functionDecl(hasAnyParameter(hasType(isConstQualified())))
3247 matches "void b(int const)", "void c(const int)" and
3248 "void e(int const) {}". It does not match d as there
3249 is no top-level const on the parameter type "const int *".
3250</pre></td></tr>
3251
3252
Aaron Ballman672dde22016-01-22 23:15:00 +00003253<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 +00003254<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3255
3256Given
3257 void a(int);
3258 void b(long);
3259 void c(double);
3260functionDecl(hasAnyParameter(hasType(isInteger())))
3261matches "a(int)", "b(long)", but not "c(double)".
3262</pre></td></tr>
3263
3264
Clement Courbet42517592016-07-12 06:36:00 +00003265<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>
3266<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3267
3268Given
3269 void a(int);
3270 void b(unsigned long);
3271 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003272functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003273matches "a(int)", but not "b(unsigned long)" and "c(double)".
3274</pre></td></tr>
3275
3276
3277<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>
3278<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3279
3280Given
3281 void a(int);
3282 void b(unsigned long);
3283 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003284functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003285matches "b(unsigned long)", but not "a(int)" and "c(double)".
3286</pre></td></tr>
3287
3288
Aaron Ballman672dde22016-01-22 23:15:00 +00003289<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 +00003290<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3291include "top-level" volatile.
3292
3293Given
3294 void a(int);
3295 void b(int volatile);
3296 void c(volatile int);
3297 void d(volatile int*);
3298 void e(int volatile) {};
3299functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3300 matches "void b(int volatile)", "void c(volatile int)" and
3301 "void e(int volatile) {}". It does not match d as there
3302 is no top-level volatile on the parameter type "volatile int *".
3303</pre></td></tr>
3304
3305
Aaron Ballman672dde22016-01-22 23:15:00 +00003306<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 +00003307<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3308
3309Example matches C, but not S or U.
3310 struct S {};
3311 class C {};
3312 union U {};
3313</pre></td></tr>
3314
3315
Aaron Ballman672dde22016-01-22 23:15:00 +00003316<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 +00003317<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3318
3319Example matches S, but not C or U.
3320 struct S {};
3321 class C {};
3322 union U {};
3323</pre></td></tr>
3324
3325
Aaron Ballman672dde22016-01-22 23:15:00 +00003326<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 +00003327<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3328
3329Example matches U, but not C or S.
3330 struct S {};
3331 class C {};
3332 union U {};
3333</pre></td></tr>
3334
3335
Aaron Ballman672dde22016-01-22 23:15:00 +00003336<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 +00003337<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3338
3339Matches a node if it equals the node previously bound to ID.
3340
3341Given
3342 class X { int a; int b; };
3343cxxRecordDecl(
3344 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3345 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3346 matches the class X, as a and b have the same type.
3347
3348Note that when multiple matches are involved via forEach* matchers,
3349equalsBoundNodes acts as a filter.
3350For example:
3351compoundStmt(
3352 forEachDescendant(varDecl().bind("d")),
3353 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3354will trigger a match for each combination of variable declaration
3355and reference to that variable declaration within a compound statement.
3356</pre></td></tr>
3357
3358
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003359<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>
3360<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3361
3362Stmt has pointer identity in the AST.
3363</pre></td></tr>
3364
3365
Aaron Ballman672dde22016-01-22 23:15:00 +00003366<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 +00003367<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3368partially matching a given regex.
3369
3370Example matches Y but not X
3371 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3372 #include "ASTMatcher.h"
3373 class X {};
3374ASTMatcher.h:
3375 class Y {};
3376
Aaron Ballman672dde22016-01-22 23:15:00 +00003377Usable 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 +00003378</pre></td></tr>
3379
3380
Aaron Ballman672dde22016-01-22 23:15:00 +00003381<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 +00003382<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3383
3384Example matches X but not Y
3385 (matcher = cxxRecordDecl(isExpansionInMainFile())
3386 #include &lt;Y.h&gt;
3387 class X {};
3388Y.h:
3389 class Y {};
3390
Aaron Ballman672dde22016-01-22 23:15:00 +00003391Usable 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 +00003392</pre></td></tr>
3393
3394
Aaron Ballman672dde22016-01-22 23:15:00 +00003395<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 +00003396<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3397
3398Example matches Y but not X
3399 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3400 #include &lt;SystemHeader.h&gt;
3401 class X {};
3402SystemHeader.h:
3403 class Y {};
3404
Aaron Ballman672dde22016-01-22 23:15:00 +00003405Usable 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 +00003406</pre></td></tr>
3407
3408
Etienne Bergeron3588be72016-05-12 04:20:04 +00003409<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>
3410<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3411
3412Given
3413 int a[42];
3414 int b[2 * 21];
3415 int c[41], d[43];
3416 char *s = "abcd";
3417 wchar_t *ws = L"abcd";
3418 char *w = "a";
3419constantArrayType(hasSize(42))
3420 matches "int a[42]" and "int b[2 * 21]"
3421stringLiteral(hasSize(4))
3422 matches "abcd", L"abcd"
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_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 +00003427<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3428
3429Example matches A, va, fa
3430 class A {};
3431 class B; Doesn't match, as it has no body.
3432 int va;
3433 extern int vb; Doesn't match, as it doesn't define the variable.
3434 void fa() {}
3435 void fb(); Doesn't match, as it has no body.
3436
Aaron Ballman672dde22016-01-22 23:15:00 +00003437Usable 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 +00003438</pre></td></tr>
3439
3440
Aaron Ballman672dde22016-01-22 23:15:00 +00003441<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 +00003442<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3443
3444Note that 'Value' is a string as the template argument's value is
3445an arbitrary precision integer. 'Value' must be euqal to the canonical
3446representation of that integral value in base 10.
3447
3448Given
3449 template&lt;int T&gt; struct A {};
3450 C&lt;42&gt; c;
3451classTemplateSpecializationDecl(
3452 hasAnyTemplateArgument(equalsIntegralValue("42")))
3453 matches the implicit instantiation of C in C&lt;42&gt;.
3454</pre></td></tr>
3455
3456
Aaron Ballman672dde22016-01-22 23:15:00 +00003457<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003458<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3459
3460Given
3461 template&lt;int T&gt; struct A {};
3462 C&lt;42&gt; c;
3463classTemplateSpecializationDecl(
3464 hasAnyTemplateArgument(isIntegral()))
3465 matches the implicit instantiation of C in C&lt;42&gt;
3466 with isIntegral() matching 42.
3467</pre></td></tr>
3468
3469
Aaron Ballman672dde22016-01-22 23:15:00 +00003470<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003471<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3472
3473Given
3474 template&lt;typename T&gt; struct C {};
3475 C&lt;int&gt; c;
3476classTemplateSpecializationDecl(templateArgumentCountIs(1))
3477 matches C&lt;int&gt;.
3478</pre></td></tr>
3479
3480
Aaron Ballman672dde22016-01-22 23:15:00 +00003481<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 +00003482<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3483partially matching a given regex.
3484
3485Example matches Y but not X
3486 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3487 #include "ASTMatcher.h"
3488 class X {};
3489ASTMatcher.h:
3490 class Y {};
3491
Aaron Ballman672dde22016-01-22 23:15:00 +00003492Usable 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 +00003493</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_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 +00003497<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3498
3499Example matches X but not Y
3500 (matcher = cxxRecordDecl(isExpansionInMainFile())
3501 #include &lt;Y.h&gt;
3502 class X {};
3503Y.h:
3504 class Y {};
3505
Aaron Ballman672dde22016-01-22 23:15:00 +00003506Usable 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 +00003507</pre></td></tr>
3508
3509
Aaron Ballman672dde22016-01-22 23:15:00 +00003510<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 +00003511<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3512
3513Example matches Y but not X
3514 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3515 #include &lt;SystemHeader.h&gt;
3516 class X {};
3517SystemHeader.h:
3518 class Y {};
3519
Aaron Ballman672dde22016-01-22 23:15:00 +00003520Usable 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 +00003521</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_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 +00003525<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3526
3527Given
3528 struct S { bool func(); };
3529functionDecl(returns(booleanType()))
3530 matches "bool func();"
3531</pre></td></tr>
3532
3533
Aaron Ballman672dde22016-01-22 23:15:00 +00003534<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 +00003535<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3536
3537Matches a node if it equals the node previously bound to ID.
3538
3539Given
3540 class X { int a; int b; };
3541cxxRecordDecl(
3542 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3543 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3544 matches the class X, as a and b have the same type.
3545
3546Note that when multiple matches are involved via forEach* matchers,
3547equalsBoundNodes acts as a filter.
3548For example:
3549compoundStmt(
3550 forEachDescendant(varDecl().bind("d")),
3551 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3552will trigger a match for each combination of variable declaration
3553and reference to that variable declaration within a compound statement.
3554</pre></td></tr>
3555
3556
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003557<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>
3558<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3559
3560Type has pointer identity in the AST.
3561</pre></td></tr>
3562
3563
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003564<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>
3565<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3566
3567Given
3568 int i;
3569 float f;
3570realFloatingPointType()
3571 matches "float f" but not "int i"
3572</pre></td></tr>
3573
3574
Aaron Ballman672dde22016-01-22 23:15:00 +00003575<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 +00003576<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3577
3578Given
3579 struct S { void func(); };
3580functionDecl(returns(voidType()))
3581 matches "void func();"
3582</pre></td></tr>
3583
3584
Aaron Ballman672dde22016-01-22 23:15:00 +00003585<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 +00003586<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3587
3588Given
3589 int x;
3590 int s = sizeof(x) + alignof(x)
3591unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3592 matches sizeof(x)
3593</pre></td></tr>
3594
3595
Aaron Ballman672dde22016-01-22 23:15:00 +00003596<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 +00003597<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3598unary).
3599
3600Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3601 !(a || b)
3602</pre></td></tr>
3603
3604
Aaron Ballman672dde22016-01-22 23:15:00 +00003605<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 +00003606<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3607
3608Example matches x, but not y, z, or a.
3609(matcher = varDecl(hasAutomaticStorageDuration())
3610void f() {
3611 int x;
3612 static int y;
3613 thread_local int z;
3614}
3615int a;
3616</pre></td></tr>
3617
3618
Aaron Ballman672dde22016-01-22 23:15:00 +00003619<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 +00003620<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3621
3622Example matches y and z (matcher = varDecl(hasGlobalStorage())
3623void f() {
3624 int x;
3625 static int y;
3626}
3627int z;
3628</pre></td></tr>
3629
3630
Aaron Ballman672dde22016-01-22 23:15:00 +00003631<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 +00003632<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3633non-static local variable.
3634
3635Example matches x (matcher = varDecl(hasLocalStorage())
3636void f() {
3637 int x;
3638 static int y;
3639}
3640int z;
3641</pre></td></tr>
3642
3643
Aaron Ballman672dde22016-01-22 23:15:00 +00003644<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 +00003645<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 +00003646It includes the variable declared at namespace scope and those declared
3647with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003648
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003649void f() {
3650 int x;
3651 static int y;
3652 thread_local int z;
3653}
3654int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003655static int b;
3656extern int c;
3657varDecl(hasStaticStorageDuration())
3658 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003659</pre></td></tr>
3660
3661
Aaron Ballman672dde22016-01-22 23:15:00 +00003662<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 +00003663<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3664
3665Example matches z, but not x, z, or a.
3666(matcher = varDecl(hasThreadStorageDuration())
3667void f() {
3668 int x;
3669 static int y;
3670 thread_local int z;
3671}
3672int a;
3673</pre></td></tr>
3674
3675
Aaron Ballman672dde22016-01-22 23:15:00 +00003676<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003677<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3678
3679Given:
3680 constexpr int foo = 42;
3681 constexpr int bar();
3682varDecl(isConstexpr())
3683 matches the declaration of foo.
3684functionDecl(isConstexpr())
3685 matches the declaration of bar.
3686</pre></td></tr>
3687
3688
Aaron Ballman672dde22016-01-22 23:15:00 +00003689<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 +00003690<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3691
3692Example matches A, va, fa
3693 class A {};
3694 class B; Doesn't match, as it has no body.
3695 int va;
3696 extern int vb; Doesn't match, as it doesn't define the variable.
3697 void fa() {}
3698 void fb(); Doesn't match, as it has no body.
3699
Aaron Ballman672dde22016-01-22 23:15:00 +00003700Usable 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 +00003701</pre></td></tr>
3702
3703
Aaron Ballman672dde22016-01-22 23:15:00 +00003704<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 +00003705<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3706a C++ catch block, or an Objective-C statement.
3707
3708Example matches x (matcher = varDecl(isExceptionVariable())
3709void f(int y) {
3710 try {
3711 } catch (int x) {
3712 }
3713}
3714</pre></td></tr>
3715
3716
Aaron Ballman672dde22016-01-22 23:15:00 +00003717<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 +00003718<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3719static member variable template instantiations.
3720
3721Given
3722 template&lt;typename T&gt; void A(T t) { }
3723 template&lt;&gt; void A(int N) { }
3724functionDecl(isExplicitTemplateSpecialization())
3725 matches the specialization A&lt;int&gt;().
3726
Aaron Ballman672dde22016-01-22 23:15:00 +00003727Usable 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 +00003728</pre></td></tr>
3729
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003730<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>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003731<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003732
3733Given:
3734 extern "C" void f() {}
3735 extern "C" { void g() {} }
3736 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003737 extern "C" int x = 1;
3738 extern "C" int y = 2;
3739 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003740functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003741 matches the declaration of f and g, but not the declaration of h.
3742varDecl(isExternC())
3743 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003744</pre></td></tr>
3745
Haojian Wub3d25462016-09-26 16:01:52 +00003746<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 +00003747<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3748class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003749
3750Given:
3751 static void f() {}
3752 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003753 extern int j;
3754 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003755functionDecl(isStaticStorageClass())
3756 matches the function declaration f.
3757varDecl(isStaticStorageClass())
3758 matches the variable declaration i.
3759</pre></td></tr>
3760
3761
Aaron Ballman672dde22016-01-22 23:15:00 +00003762<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 +00003763<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3764member variable template instantiations.
3765
3766Given
3767 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3768or
3769 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3770cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3771 matches the template instantiation of X&lt;A&gt;.
3772
3773But given
3774 template &lt;typename T&gt; class X {}; class A {};
3775 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3776cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3777 does not match, as X&lt;A&gt; is an explicit template specialization.
3778
Aaron Ballman672dde22016-01-22 23:15:00 +00003779Usable 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 +00003780</pre></td></tr>
3781
3782
Aaron Ballman672dde22016-01-22 23:15:00 +00003783<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 +00003784<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3785template instantiations.
3786
3787Given
3788 template&lt;typename T&gt; void A(T t) { T i; }
3789 A(0);
3790 A(0U);
3791functionDecl(isInstantiated())
3792 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3793</pre></td></tr>
3794
3795
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003796<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>
3797<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3798GNU's __null, C++11's nullptr, or C's NULL macro.
3799
3800Given:
3801 void *v1 = NULL;
3802 void *v2 = nullptr;
3803 void *v3 = __null; GNU extension
3804 char *cp = (char *)0;
3805 int *ip = 0;
3806 int i = 0;
3807expr(nullPointerConstant())
3808 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3809 initializer for i.
3810</pre></td></tr>
3811
3812
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003813<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>
3814<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3815
3816This matcher is only provided as a performance optimization of hasName.
3817 hasAnyName(a, b, c)
3818 is equivalent to, but faster than
3819 anyOf(hasName(a), hasName(b), hasName(c))
3820</pre></td></tr>
3821
3822
Aaron Ballman672dde22016-01-22 23:15:00 +00003823<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 +00003824<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3825
3826Given
3827 int j;
3828 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3829 A(0);
3830 A(0U);
3831declStmt(isInTemplateInstantiation())
3832 matches 'int i;' and 'unsigned i'.
3833unless(stmt(isInTemplateInstantiation()))
3834 will NOT match j += 42; as it's shared between the template definition and
3835 instantiation.
3836</pre></td></tr>
3837
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003838<!--END_NARROWING_MATCHERS -->
3839</table>
3840
3841<!-- ======================================================================= -->
3842<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3843<!-- ======================================================================= -->
3844
3845<p>Traversal matchers specify the relationship to other nodes that are
3846reachable from the current node.</p>
3847
3848<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3849forEachDescendant) which work on all nodes and allow users to write more generic
3850match expressions.</p>
3851
3852<table>
3853<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003854<!-- START_TRAVERSAL_MATCHERS -->
3855
3856<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>
3857<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3858
3859Unlike anyOf, eachOf will generate a match result for each
3860matching submatcher.
3861
3862For example, in:
3863 class A { int a; int b; };
3864The matcher:
3865 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3866 has(fieldDecl(hasName("b")).bind("v"))))
3867will generate two results binding "v", the first of which binds
3868the field declaration of a, the second the field declaration of
3869b.
3870
3871Usable as: Any Matcher
3872</pre></td></tr>
3873
3874
3875<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3876<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3877provided matcher.
3878
3879Example matches X, A, B, C
3880 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3881 class X {}; Matches X, because X::X is a class of name X inside X.
3882 class A { class X {}; };
3883 class B { class C { class X {}; }; };
3884
3885DescendantT must be an AST base type.
3886
3887As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3888each result that matches instead of only on the first one.
3889
3890Note: Recursively combined ForEachDescendant can cause many matches:
3891 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3892 forEachDescendant(cxxRecordDecl())
3893 )))
3894will match 10 times (plus injected class name matches) on:
3895 class A { class B { class C { class D { class E {}; }; }; }; };
3896
3897Usable as: Any Matcher
3898</pre></td></tr>
3899
3900
3901<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3902<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3903provided matcher.
3904
3905Example matches X, Y
3906 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3907 class X {}; Matches X, because X::X is a class of name X inside X.
3908 class Y { class X {}; };
3909 class Z { class Y { class X {}; }; }; Does not match Z.
3910
3911ChildT must be an AST base type.
3912
3913As opposed to 'has', 'forEach' will cause a match for each result that
3914matches instead of only on the first one.
3915
3916Usable as: Any Matcher
3917</pre></td></tr>
3918
3919
3920<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3921<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3922matcher.
3923
3924Given
3925void f() { if (true) { int x = 42; } }
3926void g() { for (;;) { int x = 43; } }
3927expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3928
3929Usable as: Any Matcher
3930</pre></td></tr>
3931
3932
3933<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3934<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3935provided matcher.
3936
3937Example matches X, Y, Z
3938 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3939 class X {}; Matches X, because X::X is a class of name X inside X.
3940 class Y { class X {}; };
3941 class Z { class Y { class X {}; }; };
3942
3943DescendantT must be an AST base type.
3944
3945Usable as: Any Matcher
3946</pre></td></tr>
3947
3948
3949<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3950<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3951provided matcher.
3952
3953Example matches X, Y
3954 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3955 class X {}; Matches X, because X::X is a class of name X inside X.
3956 class Y { class X {}; };
3957 class Z { class Y { class X {}; }; }; Does not match Z.
3958
3959ChildT must be an AST base type.
3960
3961Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003962Note that has is direct matcher, so it also matches things like implicit
3963casts and paren casts. If you are matching with expr then you should
3964probably consider using ignoringParenImpCasts like:
3965has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003966</pre></td></tr>
3967
3968
3969<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3970<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3971matcher.
3972
3973Given
3974void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3975compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3976
3977Usable as: Any Matcher
3978</pre></td></tr>
3979
3980
Etienne Bergeron5500f952016-05-30 15:25:25 +00003981<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>
3982<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3983switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003984
3985Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3986 if (true) {}
3987</pre></td></tr>
3988
3989
3990<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>
3991<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3992(binary or ternary).
3993
3994Example matches b
3995 condition ? a : b
3996 condition ?: b
3997</pre></td></tr>
3998
3999
4000<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>
4001<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4002
4003Example 1 (conditional ternary operator): matches a
4004 condition ? a : b
4005
4006Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4007 condition ?: b
4008</pre></td></tr>
4009
4010
Manuel Klimeka37e1102016-12-01 15:45:06 +00004011<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>
4012<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 +00004013matches the given matcher.
4014
4015The associated declaration is:
4016- for type nodes, the declaration of the underlying type
4017- for CallExpr, the declaration of the callee
4018- for MemberExpr, the declaration of the referenced member
4019- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004020- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004021
4022Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4023function. e.g. various subtypes of clang::Type and various expressions.
4024
Manuel Klimeka37e1102016-12-01 15:45:06 +00004025Usable 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;,
4026 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;,
4027 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;,
4028 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;,
4029 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;,
4030 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;,
4031 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004032</pre></td></tr>
4033
4034
Aaron Ballman672dde22016-01-22 23:15:00 +00004035<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 +00004036<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4037
4038Given
4039 int i[5];
4040 void f() { i[1] = 42; }
4041arraySubscriptExpression(hasBase(implicitCastExpr(
4042 hasSourceExpression(declRefExpr()))))
4043 matches i[1] with the declRefExpr() matching i
4044</pre></td></tr>
4045
4046
Aaron Ballman672dde22016-01-22 23:15:00 +00004047<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 +00004048<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4049
4050Given
4051 int i[5];
4052 void f() { i[1] = 42; }
4053arraySubscriptExpression(hasIndex(integerLiteral()))
4054 matches i[1] with the integerLiteral() matching 1
4055</pre></td></tr>
4056
4057
Aaron Ballman672dde22016-01-22 23:15:00 +00004058<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 +00004059<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4060
4061Example matches a (matcher = binaryOperator(hasLHS()))
4062 a || b
4063</pre></td></tr>
4064
4065
Aaron Ballman672dde22016-01-22 23:15:00 +00004066<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 +00004067<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4068
4069Example matches b (matcher = binaryOperator(hasRHS()))
4070 a || b
4071</pre></td></tr>
4072
4073
Aaron Ballman672dde22016-01-22 23:15:00 +00004074<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004075<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4076type.
4077
4078Given
4079 struct A {};
4080 A a[7];
4081 int b[7];
4082arrayType(hasElementType(builtinType()))
4083 matches "int b[7]"
4084
Aaron Ballman672dde22016-01-22 23:15:00 +00004085Usable 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 +00004086</pre></td></tr>
4087
4088
Aaron Ballman672dde22016-01-22 23:15:00 +00004089<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 +00004090<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4091type.
4092
4093Given
4094 struct A {};
4095 A a[7];
4096 int b[7];
4097arrayType(hasElementType(builtinType()))
4098 matches "int b[7]"
4099
Aaron Ballman672dde22016-01-22 23:15:00 +00004100Usable 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 +00004101</pre></td></tr>
4102
4103
Aaron Ballman672dde22016-01-22 23:15:00 +00004104<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 +00004105<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4106
4107Given
4108 _Atomic(int) i;
4109 _Atomic(float) f;
4110atomicType(hasValueType(isInteger()))
4111 matches "_Atomic(int) i"
4112
Aaron Ballman672dde22016-01-22 23:15:00 +00004113Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004114</pre></td></tr>
4115
4116
Aaron Ballman672dde22016-01-22 23:15:00 +00004117<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 +00004118<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4119
4120Given
4121 _Atomic(int) i;
4122 _Atomic(float) f;
4123atomicType(hasValueType(isInteger()))
4124 matches "_Atomic(int) i"
4125
Aaron Ballman672dde22016-01-22 23:15:00 +00004126Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004127</pre></td></tr>
4128
4129
Aaron Ballman672dde22016-01-22 23:15:00 +00004130<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 +00004131<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4132
4133Note: There is no TypeLoc for the deduced type and thus no
4134getDeducedLoc() matcher.
4135
4136Given
4137 auto a = 1;
4138 auto b = 2.0;
4139autoType(hasDeducedType(isInteger()))
4140 matches "auto a"
4141
Aaron Ballman672dde22016-01-22 23:15:00 +00004142Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004143</pre></td></tr>
4144
4145
Aaron Ballman672dde22016-01-22 23:15:00 +00004146<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 +00004147<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4148binary operator matches.
4149</pre></td></tr>
4150
4151
Aaron Ballman672dde22016-01-22 23:15:00 +00004152<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 +00004153<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4154
4155Example matches a (matcher = binaryOperator(hasLHS()))
4156 a || b
4157</pre></td></tr>
4158
4159
Aaron Ballman672dde22016-01-22 23:15:00 +00004160<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 +00004161<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4162
4163Example matches b (matcher = binaryOperator(hasRHS()))
4164 a || b
4165</pre></td></tr>
4166
4167
Aaron Ballman672dde22016-01-22 23:15:00 +00004168<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 +00004169<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4170pointee matches a given matcher.
4171
4172Given
4173 int *a;
4174 int const *b;
4175 float const *f;
4176pointerType(pointee(isConstQualified(), isInteger()))
4177 matches "int const *b"
4178
Aaron Ballman672dde22016-01-22 23:15:00 +00004179Usable 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;,
4180 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 +00004181</pre></td></tr>
4182
4183
Aaron Ballman672dde22016-01-22 23:15:00 +00004184<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 +00004185<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4186pointee matches a given matcher.
4187
4188Given
4189 int *a;
4190 int const *b;
4191 float const *f;
4192pointerType(pointee(isConstQualified(), isInteger()))
4193 matches "int const *b"
4194
Aaron Ballman672dde22016-01-22 23:15:00 +00004195Usable 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;,
4196 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 +00004197</pre></td></tr>
4198
4199
Aaron Ballman672dde22016-01-22 23:15:00 +00004200<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 +00004201<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4202
4203Given
4204 void f(int i);
4205 int y;
4206 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004207callExpr(
4208 forEachArgumentWithParam(
4209 declRefExpr(to(varDecl(hasName("y")))),
4210 parmVarDecl(hasType(isInteger()))
4211))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004212 matches f(y);
4213with declRefExpr(...)
4214 matching int y
4215and parmVarDecl(...)
4216 matching int i
4217</pre></td></tr>
4218
4219
Aaron Ballman672dde22016-01-22 23:15:00 +00004220<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 +00004221<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4222expression.
4223
4224Given
4225 void x(int, int, int) { int y; x(1, y, 42); }
4226callExpr(hasAnyArgument(declRefExpr()))
4227 matches x(1, y, 42)
4228with hasAnyArgument(...)
4229 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004230</pre></td></tr>
4231
4232
Aaron Ballman672dde22016-01-22 23:15:00 +00004233<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 +00004234<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4235call expression.
4236
4237Example matches y in x(y)
4238 (matcher = callExpr(hasArgument(0, declRefExpr())))
4239 void x(int) { int y; x(y); }
4240</pre></td></tr>
4241
4242
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004243<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>
4244<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 +00004245matches the given matcher.
4246
4247The associated declaration is:
4248- for type nodes, the declaration of the underlying type
4249- for CallExpr, the declaration of the callee
4250- for MemberExpr, the declaration of the referenced member
4251- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004252- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004253
4254Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4255function. e.g. various subtypes of clang::Type and various expressions.
4256
Manuel Klimeka37e1102016-12-01 15:45:06 +00004257Usable 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;,
4258 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;,
4259 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;,
4260 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;,
4261 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;,
4262 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;,
4263 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004264</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_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 +00004268<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4269
4270Given
4271 class A { A() : i(42), j(42) {} int i; int j; };
4272cxxConstructorDecl(forEachConstructorInitializer(
4273 forField(decl().bind("x"))
4274))
4275 will trigger two matches, binding for 'i' and 'j' respectively.
4276</pre></td></tr>
4277
4278
Aaron Ballman672dde22016-01-22 23:15:00 +00004279<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 +00004280<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4281
4282Given
4283 struct Foo {
4284 Foo() : foo_(1) { }
4285 int foo_;
4286 };
4287cxxRecordDecl(has(cxxConstructorDecl(
4288 hasAnyConstructorInitializer(anything())
4289)))
4290 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
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_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 +00004295<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4296
4297Given
4298 struct Foo {
4299 Foo() : foo_(1) { }
4300 int foo_;
4301 };
4302cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4303 forField(hasName("foo_"))))))
4304 matches Foo
4305with forField matching foo_
4306</pre></td></tr>
4307
4308
Aaron Ballman672dde22016-01-22 23:15:00 +00004309<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 +00004310<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4311
4312Given
4313 struct Foo {
4314 Foo() : foo_(1) { }
4315 int foo_;
4316 };
4317cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4318 withInitializer(integerLiteral(equals(1)))))))
4319 matches Foo
4320with withInitializer matching (1)
4321</pre></td></tr>
4322
4323
Aaron Ballman672dde22016-01-22 23:15:00 +00004324<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 +00004325<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4326definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004327
4328Given
4329 for (;;) {}
4330hasBody(compoundStmt())
4331 matches 'for (;;) {}'
4332with compoundStmt()
4333 matching '{}'
4334</pre></td></tr>
4335
4336
Aaron Ballman672dde22016-01-22 23:15:00 +00004337<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 +00004338<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4339
4340Example:
4341 forStmt(hasLoopVariable(anything()))
4342matches 'int x' in
4343 for (int x : a) { }
4344</pre></td></tr>
4345
4346
Aaron Ballman672dde22016-01-22 23:15:00 +00004347<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004348<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4349
4350Example:
4351 forStmt(hasRangeInit(anything()))
4352matches 'a' in
4353 for (int x : a) { }
4354</pre></td></tr>
4355
4356
Aaron Ballman672dde22016-01-22 23:15:00 +00004357<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 +00004358<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4359
4360
Aaron Ballman672dde22016-01-22 23:15:00 +00004361<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 +00004362<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4363
4364Example matches y.x()
4365 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4366 class Y { public: void x(); };
4367 void z() { Y y; y.x(); }",
4368
4369FIXME: Overload to allow directly matching types?
4370</pre></td></tr>
4371
4372
Aaron Ballman672dde22016-01-22 23:15:00 +00004373<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004374<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4375</pre></td></tr>
4376
4377
Aaron Ballman672dde22016-01-22 23:15:00 +00004378<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 +00004379<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4380matcher, or is a pointer to a type that matches the InnerMatcher.
4381</pre></td></tr>
4382
4383
Clement Courbet6ecaec82016-07-05 07:49:31 +00004384<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 +00004385<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 +00004386produce multiple matches.
4387
4388Given
4389 class A { virtual void f(); };
4390 class B : public A { void f(); };
4391 class C : public B { void f(); };
4392cxxMethodDecl(ofClass(hasName("C")),
4393 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4394 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4395 that B::f is not overridden by C::f).
4396
4397The check can produce multiple matches in case of multiple inheritance, e.g.
4398 class A1 { virtual void f(); };
4399 class A2 { virtual void f(); };
4400 class C : public A1, public A2 { void f(); };
4401cxxMethodDecl(ofClass(hasName("C")),
4402 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4403 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4404 once with "b" binding "A2::f" and "d" binding "C::f".
4405</pre></td></tr>
4406
4407
Aaron Ballman672dde22016-01-22 23:15:00 +00004408<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004409<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4410belongs to.
4411
4412FIXME: Generalize this for other kinds of declarations.
4413FIXME: What other kind of declarations would we need to generalize
4414this to?
4415
4416Example matches A() in the last line
4417 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4418 ofClass(hasName("A"))))))
4419 class A {
4420 public:
4421 A();
4422 };
4423 A a = A();
4424</pre></td></tr>
4425
4426
Manuel Klimeka37e1102016-12-01 15:45:06 +00004427<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>
4428<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 +00004429matches the given matcher.
4430
4431The associated declaration is:
4432- for type nodes, the declaration of the underlying type
4433- for CallExpr, the declaration of the callee
4434- for MemberExpr, the declaration of the referenced member
4435- for CXXConstructExpr, the declaration of the constructor
4436- for CXXNewExpr, the declaration of the operator new
4437
4438Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4439function. e.g. various subtypes of clang::Type and various expressions.
4440
Manuel Klimeka37e1102016-12-01 15:45:06 +00004441Usable 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;,
4442 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;,
4443 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;,
4444 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;,
4445 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;,
4446 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;,
4447 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004448</pre></td></tr>
4449
4450
Aaron Ballman672dde22016-01-22 23:15:00 +00004451<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 +00004452<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4453
4454Given:
4455 class A { void func(); };
4456 class B { void member(); };
4457
4458cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4459A but not B.
4460</pre></td></tr>
4461
4462
Aaron Ballman672dde22016-01-22 23:15:00 +00004463<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 +00004464<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4465a class matching Base.
4466
4467Note that a class is not considered to be derived from itself.
4468
4469Example matches Y, Z, C (Base == hasName("X"))
4470 class X;
4471 class Y : public X {}; directly derived
4472 class Z : public Y {}; indirectly derived
4473 typedef X A;
4474 typedef A B;
4475 class C : public B {}; derived from a typedef of X
4476
4477In the following example, Bar matches isDerivedFrom(hasName("X")):
4478 class Foo;
4479 typedef Foo X;
4480 class Bar : public Foo {}; derived from a type that X is a typedef of
4481</pre></td></tr>
4482
4483
Aaron Ballman672dde22016-01-22 23:15:00 +00004484<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 +00004485<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4486match Base.
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_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 +00004491<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4492given matcher.
4493
4494Example matches y.x() (matcher = callExpr(callee(
4495 cxxMethodDecl(hasName("x")))))
4496 class Y { public: void x(); };
4497 void z() { Y y; y.x(); }
4498</pre></td></tr>
4499
4500
Aaron Ballman672dde22016-01-22 23:15:00 +00004501<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 +00004502<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4503
4504Given
4505 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4506 void f() { f(); }
4507callExpr(callee(expr()))
4508 matches this-&gt;x(), x(), y.x(), f()
4509with callee(...)
4510 matching this-&gt;x, x, y.x, f respectively
4511
Aaron Ballman672dde22016-01-22 23:15:00 +00004512Note: 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 +00004513because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004514internal::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 +00004515implemented in terms of implicit casts.
4516</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_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 +00004520<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4521
4522Given
4523 void f(int i);
4524 int y;
4525 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004526callExpr(
4527 forEachArgumentWithParam(
4528 declRefExpr(to(varDecl(hasName("y")))),
4529 parmVarDecl(hasType(isInteger()))
4530))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004531 matches f(y);
4532with declRefExpr(...)
4533 matching int y
4534and parmVarDecl(...)
4535 matching int i
4536</pre></td></tr>
4537
4538
Aaron Ballman672dde22016-01-22 23:15:00 +00004539<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 +00004540<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4541expression.
4542
4543Given
4544 void x(int, int, int) { int y; x(1, y, 42); }
4545callExpr(hasAnyArgument(declRefExpr()))
4546 matches x(1, y, 42)
4547with hasAnyArgument(...)
4548 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004549</pre></td></tr>
4550
4551
Aaron Ballman672dde22016-01-22 23:15:00 +00004552<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 +00004553<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4554call expression.
4555
4556Example matches y in x(y)
4557 (matcher = callExpr(hasArgument(0, declRefExpr())))
4558 void x(int) { int y; x(y); }
4559</pre></td></tr>
4560
4561
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004562<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>
4563<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 +00004564matches the given matcher.
4565
4566The associated declaration is:
4567- for type nodes, the declaration of the underlying type
4568- for CallExpr, the declaration of the callee
4569- for MemberExpr, the declaration of the referenced member
4570- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004571- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004572
4573Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4574function. e.g. various subtypes of clang::Type and various expressions.
4575
Manuel Klimeka37e1102016-12-01 15:45:06 +00004576Usable 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;,
4577 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;,
4578 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;,
4579 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;,
4580 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;,
4581 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;,
4582 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004583</pre></td></tr>
4584
4585
Aaron Ballman672dde22016-01-22 23:15:00 +00004586<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 +00004587<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4588extension, matches the constant given in the statement.
4589
4590Given
4591 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4592caseStmt(hasCaseConstant(integerLiteral()))
4593 matches "case 1:"
4594</pre></td></tr>
4595
4596
Aaron Ballman672dde22016-01-22 23:15:00 +00004597<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 +00004598<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004599
4600
Aaron Ballman672dde22016-01-22 23:15:00 +00004601<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 +00004602<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4603functionDecl that have at least one TemplateArgument matching the given
4604InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004605
4606Given
4607 template&lt;typename T&gt; class A {};
4608 template&lt;&gt; class A&lt;double&gt; {};
4609 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004610
Haojian Wu99e39a72016-07-29 17:30:13 +00004611 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004612 void func() { f&lt;int&gt;(); };
4613
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004614classTemplateSpecializationDecl(hasAnyTemplateArgument(
4615 refersToType(asString("int"))))
4616 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004617
4618functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4619 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004620</pre></td></tr>
4621
4622
Manuel Klimek696e5052017-08-02 13:04:44 +00004623<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
4624<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4625
4626Given
4627 tempalate&lt;typename T&gt; class A {};
4628 typedef A&lt;int&gt; B;
4629classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4630 matches 'B' with classTemplateDecl() matching the class template
4631 declaration of 'A'.
4632</pre></td></tr>
4633
4634
Aaron Ballman672dde22016-01-22 23:15:00 +00004635<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 +00004636<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4637functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004638
4639Given
4640 template&lt;typename T, typename U&gt; class A {};
4641 A&lt;bool, int&gt; b;
4642 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004643
Haojian Wu99e39a72016-07-29 17:30:13 +00004644 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004645 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004646classTemplateSpecializationDecl(hasTemplateArgument(
4647 1, refersToType(asString("int"))))
4648 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004649
4650functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4651 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004652</pre></td></tr>
4653
4654
Aaron Ballman672dde22016-01-22 23:15:00 +00004655<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 +00004656<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4657type.
4658
4659Given
4660 struct A {};
4661 A a[7];
4662 int b[7];
4663arrayType(hasElementType(builtinType()))
4664 matches "int b[7]"
4665
Aaron Ballman672dde22016-01-22 23:15:00 +00004666Usable 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 +00004667</pre></td></tr>
4668
4669
Aaron Ballman672dde22016-01-22 23:15:00 +00004670<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 +00004671<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4672type.
4673
4674Given
4675 struct A {};
4676 A a[7];
4677 int b[7];
4678arrayType(hasElementType(builtinType()))
4679 matches "int b[7]"
4680
Aaron Ballman672dde22016-01-22 23:15:00 +00004681Usable 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 +00004682</pre></td></tr>
4683
4684
Aaron Ballman672dde22016-01-22 23:15:00 +00004685<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 +00004686<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 +00004687a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004688
4689Given
4690 { {}; 1+2; }
4691hasAnySubstatement(compoundStmt())
4692 matches '{ {}; 1+2; }'
4693with compoundStmt()
4694 matching '{}'
4695</pre></td></tr>
4696
4697
Aaron Ballman672dde22016-01-22 23:15:00 +00004698<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 +00004699<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4700</pre></td></tr>
4701
4702
Manuel Klimeka37e1102016-12-01 15:45:06 +00004703<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>
4704<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 +00004705matches the given matcher.
4706
4707The associated declaration is:
4708- for type nodes, the declaration of the underlying type
4709- for CallExpr, the declaration of the callee
4710- for MemberExpr, the declaration of the referenced member
4711- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004712- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004713
4714Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4715function. e.g. various subtypes of clang::Type and various expressions.
4716
Manuel Klimeka37e1102016-12-01 15:45:06 +00004717Usable 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;,
4718 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;,
4719 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;,
4720 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;,
4721 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;,
4722 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;,
4723 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004724</pre></td></tr>
4725
4726
Aaron Ballman672dde22016-01-22 23:15:00 +00004727<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 +00004728<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4729specific using shadow declaration.
4730
4731Given
4732 namespace a { void f() {} }
4733 using a::f;
4734 void g() {
4735 f(); Matches this ..
4736 a::f(); .. but not this.
4737 }
4738declRefExpr(throughUsingDecl(anything()))
4739 matches f()
4740</pre></td></tr>
4741
4742
Aaron Ballman672dde22016-01-22 23:15:00 +00004743<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 +00004744<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4745specified matcher.
4746
4747Example matches x in if(x)
4748 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4749 bool x;
4750 if (x) {}
4751</pre></td></tr>
4752
4753
Aaron Ballman672dde22016-01-22 23:15:00 +00004754<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 +00004755<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4756
4757Note that this does not work for global declarations because the AST
4758breaks up multiple-declaration DeclStmt's into multiple single-declaration
4759DeclStmt's.
4760Example: Given non-global declarations
4761 int a, b = 0;
4762 int c;
4763 int d = 2, e;
4764declStmt(containsDeclaration(
4765 0, varDecl(hasInitializer(anything()))))
4766 matches only 'int d = 2, e;', and
4767declStmt(containsDeclaration(1, varDecl()))
4768 matches 'int a, b = 0' as well as 'int d = 2, e;'
4769 but 'int c;' is not matched.
4770</pre></td></tr>
4771
4772
Aaron Ballman672dde22016-01-22 23:15:00 +00004773<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 +00004774<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4775
4776Given
4777 int a, b;
4778 int c;
4779declStmt(hasSingleDecl(anything()))
4780 matches 'int c;' but not 'int a, b;'.
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_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 +00004785<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4786the inner matcher.
4787
4788Given
4789 int x;
4790declaratorDecl(hasTypeLoc(loc(asString("int"))))
4791 matches int x
4792</pre></td></tr>
4793
4794
Aaron Ballman672dde22016-01-22 23:15:00 +00004795<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004796<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4797Decl, matches InnerMatcher.
4798
4799Given
4800 namespace N {
4801 namespace M {
4802 class D {};
4803 }
4804 }
4805
4806cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4807declaration of class D.
4808</pre></td></tr>
4809
4810
Aaron Ballman672dde22016-01-22 23:15:00 +00004811<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 +00004812<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4813definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004814
4815Given
4816 for (;;) {}
4817hasBody(compoundStmt())
4818 matches 'for (;;) {}'
4819with compoundStmt()
4820 matching '{}'
4821</pre></td></tr>
4822
4823
Aaron Ballman672dde22016-01-22 23:15:00 +00004824<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 +00004825<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 +00004826switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004827
4828Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4829 if (true) {}
4830</pre></td></tr>
4831
4832
Aaron Ballman672dde22016-01-22 23:15:00 +00004833<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 +00004834<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4835matches InnerMatcher if the qualifier exists.
4836
4837Given
4838 namespace N {
4839 namespace M {
4840 class D {};
4841 }
4842 }
4843 N::M::D d;
4844
4845elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4846matches the type of the variable declaration of d.
4847</pre></td></tr>
4848
4849
Aaron Ballman672dde22016-01-22 23:15:00 +00004850<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 +00004851<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4852
4853Given
4854 namespace N {
4855 namespace M {
4856 class D {};
4857 }
4858 }
4859 N::M::D d;
4860
4861elaboratedType(namesType(recordType(
4862hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4863declaration of d.
4864</pre></td></tr>
4865
4866
Manuel Klimeka37e1102016-12-01 15:45:06 +00004867<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>
4868<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 +00004869matches the given matcher.
4870
4871The associated declaration is:
4872- for type nodes, the declaration of the underlying type
4873- for CallExpr, the declaration of the callee
4874- for MemberExpr, the declaration of the referenced member
4875- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004876- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004877
4878Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4879function. e.g. various subtypes of clang::Type and various expressions.
4880
Manuel Klimeka37e1102016-12-01 15:45:06 +00004881Usable 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;,
4882 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;,
4883 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;,
4884 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;,
4885 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;,
4886 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;,
4887 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004888</pre></td></tr>
4889
4890
Aaron Ballman672dde22016-01-22 23:15:00 +00004891<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 +00004892<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4893
4894(Note: Clang's AST refers to other conversions as "casts" too, and calls
4895actual casts "explicit" casts.)
4896</pre></td></tr>
4897
4898
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004899<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>
4900<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 +00004901declaration's type.
4902
4903In case of a value declaration (for example a variable declaration),
4904this resolves one layer of indirection. For example, in the value
4905declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4906X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4907declaration of x.
4908
4909Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4910 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4911 class X {};
4912 void y(X &amp;x) { x; X z; }
4913
Aaron Ballman672dde22016-01-22 23:15:00 +00004914Usable 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 +00004915</pre></td></tr>
4916
4917
Aaron Ballman672dde22016-01-22 23:15:00 +00004918<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 +00004919<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4920matcher.
4921
4922Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4923 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004924 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004925 class X {};
4926 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004927 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004928</pre></td></tr>
4929
4930
Aaron Ballman672dde22016-01-22 23:15:00 +00004931<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 +00004932<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4933are stripped off.
4934
4935Parentheses and explicit casts are not discarded.
4936Given
4937 int arr[5];
4938 int a = 0;
4939 char b = 0;
4940 const int c = a;
4941 int *d = arr;
4942 long e = (long) 0l;
4943The matchers
4944 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4945 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4946would match the declarations for a, b, c, and d, but not e.
4947While
4948 varDecl(hasInitializer(integerLiteral()))
4949 varDecl(hasInitializer(declRefExpr()))
4950only match the declarations for b, c, and d.
4951</pre></td></tr>
4952
4953
Cong Liu8a02efb2016-06-24 09:38:03 +00004954<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>
4955<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4956nodes are stripped off.
4957
4958Parentheses and explicit casts are not discarded.
4959Given
4960 class C {};
4961 C a = C();
4962 C b;
4963 C c = b;
4964The matchers
4965 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4966would match the declarations for a, b, and c.
4967While
4968 varDecl(hasInitializer(cxxConstructExpr()))
4969only match the declarations for b and c.
4970</pre></td></tr>
4971
4972
Aaron Ballman672dde22016-01-22 23:15:00 +00004973<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 +00004974<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4975casts are stripped off.
4976
4977Implicit and non-C Style casts are also discarded.
4978Given
4979 int a = 0;
4980 char b = (0);
4981 void* c = reinterpret_cast&lt;char*&gt;(0);
4982 char d = char(0);
4983The matcher
4984 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4985would match the declarations for a, b, c, and d.
4986while
4987 varDecl(hasInitializer(integerLiteral()))
4988only match the declaration for a.
4989</pre></td></tr>
4990
4991
Aaron Ballman672dde22016-01-22 23:15:00 +00004992<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 +00004993<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4994parentheses are stripped off.
4995
4996Explicit casts are not discarded.
4997Given
4998 int arr[5];
4999 int a = 0;
5000 char b = (0);
5001 const int c = a;
5002 int *d = (arr);
5003 long e = ((long) 0l);
5004The matchers
5005 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5006 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5007would match the declarations for a, b, c, and d, but not e.
5008while
5009 varDecl(hasInitializer(integerLiteral()))
5010 varDecl(hasInitializer(declRefExpr()))
5011would only match the declaration for a.
5012</pre></td></tr>
5013
5014
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00005015<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>
5016<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5017
5018Given
5019 class C {
5020 int a = 2;
5021 int b = 3;
5022 int c;
5023 };
5024fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5025 matches 'int a;' but not 'int b;'.
5026fieldDecl(hasInClassInitializer(anything()))
5027 matches 'int a;' and 'int b;' but not 'int c;'.
5028</pre></td></tr>
5029
5030
Aaron Ballman672dde22016-01-22 23:15:00 +00005031<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 +00005032<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5033definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005034
5035Given
5036 for (;;) {}
5037hasBody(compoundStmt())
5038 matches 'for (;;) {}'
5039with compoundStmt()
5040 matching '{}'
5041</pre></td></tr>
5042
5043
Aaron Ballman672dde22016-01-22 23:15:00 +00005044<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 +00005045<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 +00005046switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005047
5048Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5049 if (true) {}
5050</pre></td></tr>
5051
5052
Aaron Ballman672dde22016-01-22 23:15:00 +00005053<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005054<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5055
5056Example:
5057 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5058matches '++x' in
5059 for (x; x &lt; N; ++x) { }
5060</pre></td></tr>
5061
5062
Aaron Ballman672dde22016-01-22 23:15:00 +00005063<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 +00005064<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5065
5066Example:
5067 forStmt(hasLoopInit(declStmt()))
5068matches 'int x = 0' in
5069 for (int x = 0; x &lt; N; ++x) { }
5070</pre></td></tr>
5071
5072
Aaron Ballman672dde22016-01-22 23:15:00 +00005073<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 +00005074<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5075
5076Does not match the 'this' parameter of a method.
5077
5078Given
5079 class X { void f(int x, int y, int z) {} };
5080cxxMethodDecl(hasAnyParameter(hasName("y")))
5081 matches f(int x, int y, int z) {}
5082with hasAnyParameter(...)
5083 matching int y
5084</pre></td></tr>
5085
5086
Haojian Wud898b092016-07-29 13:57:27 +00005087<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>
5088<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5089functionDecl that have at least one TemplateArgument matching the given
5090InnerMatcher.
5091
5092Given
5093 template&lt;typename T&gt; class A {};
5094 template&lt;&gt; class A&lt;double&gt; {};
5095 A&lt;int&gt; a;
5096
Haojian Wu99e39a72016-07-29 17:30:13 +00005097 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005098 void func() { f&lt;int&gt;(); };
5099
5100classTemplateSpecializationDecl(hasAnyTemplateArgument(
5101 refersToType(asString("int"))))
5102 matches the specialization A&lt;int&gt;
5103
5104functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5105 matches the specialization f&lt;int&gt;
5106</pre></td></tr>
5107
5108
Aaron Ballman672dde22016-01-22 23:15:00 +00005109<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 +00005110<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5111definition that has a given body.
5112
5113Given
5114 for (;;) {}
5115hasBody(compoundStmt())
5116 matches 'for (;;) {}'
5117with compoundStmt()
5118 matching '{}'
5119</pre></td></tr>
5120
5121
Aaron Ballman672dde22016-01-22 23:15:00 +00005122<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 +00005123<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5124
5125Given
5126 class X { void f(int x) {} };
5127cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5128 matches f(int x) {}
5129with hasParameter(...)
5130 matching int x
5131</pre></td></tr>
5132
5133
Haojian Wud898b092016-07-29 13:57:27 +00005134<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>
5135<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5136functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5137
5138Given
5139 template&lt;typename T, typename U&gt; class A {};
5140 A&lt;bool, int&gt; b;
5141 A&lt;int, bool&gt; c;
5142
Haojian Wu99e39a72016-07-29 17:30:13 +00005143 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005144 void func() { f&lt;int&gt;(); };
5145classTemplateSpecializationDecl(hasTemplateArgument(
5146 1, refersToType(asString("int"))))
5147 matches the specialization A&lt;bool, int&gt;
5148
5149functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5150 matches the specialization f&lt;int&gt;
5151</pre></td></tr>
5152
5153
Aaron Ballman672dde22016-01-22 23:15:00 +00005154<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 +00005155<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5156
5157Given:
5158 class X { int f() { return 1; } };
5159cxxMethodDecl(returns(asString("int")))
5160 matches int f() { return 1; }
5161</pre></td></tr>
5162
5163
Aaron Ballman672dde22016-01-22 23:15:00 +00005164<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 +00005165<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 +00005166switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005167
5168Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5169 if (true) {}
5170</pre></td></tr>
5171
5172
Aaron Ballman672dde22016-01-22 23:15:00 +00005173<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 +00005174<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5175
5176Given
5177 if (A* a = GetAPointer()) {}
5178hasConditionVariableStatement(...)
5179 matches 'A* a = GetAPointer()'.
5180</pre></td></tr>
5181
5182
Aaron Ballman672dde22016-01-22 23:15:00 +00005183<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 +00005184<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5185
5186Examples matches the if statement
5187 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5188 if (false) false; else true;
5189</pre></td></tr>
5190
5191
Aaron Ballman672dde22016-01-22 23:15:00 +00005192<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 +00005193<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5194
5195Examples matches the if statement
5196 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5197 if (false) true; else false;
5198</pre></td></tr>
5199
5200
Aaron Ballman672dde22016-01-22 23:15:00 +00005201<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 +00005202<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5203matcher.
5204
5205FIXME: Unit test this matcher
5206</pre></td></tr>
5207
5208
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005209<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>
5210<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5211(if expression have it).
5212</pre></td></tr>
5213
5214
Manuel Klimeka37e1102016-12-01 15:45:06 +00005215<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 +00005216<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5217matches the given matcher.
5218
5219The associated declaration is:
5220- for type nodes, the declaration of the underlying type
5221- for CallExpr, the declaration of the callee
5222- for MemberExpr, the declaration of the referenced member
5223- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005224- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005225
5226Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5227function. e.g. various subtypes of clang::Type and various expressions.
5228
Manuel Klimeka37e1102016-12-01 15:45:06 +00005229Usable 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;,
5230 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;,
5231 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;,
5232 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;,
5233 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;,
5234 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;,
5235 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5236</pre></td></tr>
5237
5238
5239<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>
5240<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5241matches the given matcher.
5242
5243The associated declaration is:
5244- for type nodes, the declaration of the underlying type
5245- for CallExpr, the declaration of the callee
5246- for MemberExpr, the declaration of the referenced member
5247- for CXXConstructExpr, the declaration of the constructor
5248- for CXXNewExpr, the declaration of the operator new
5249
5250Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5251function. e.g. various subtypes of clang::Type and various expressions.
5252
5253Usable 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;,
5254 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;,
5255 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;,
5256 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;,
5257 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;,
5258 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;,
5259 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005260</pre></td></tr>
5261
5262
Aaron Ballman672dde22016-01-22 23:15:00 +00005263<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 +00005264<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5265matches the given matcher.
5266
5267The associated declaration is:
5268- for type nodes, the declaration of the underlying type
5269- for CallExpr, the declaration of the callee
5270- for MemberExpr, the declaration of the referenced member
5271- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005272- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005273
5274Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5275function. e.g. various subtypes of clang::Type and various expressions.
5276
Manuel Klimeka37e1102016-12-01 15:45:06 +00005277Usable 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;,
5278 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;,
5279 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;,
5280 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;,
5281 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;,
5282 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;,
5283 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005284</pre></td></tr>
5285
5286
Aaron Ballman672dde22016-01-22 23:15:00 +00005287<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 +00005288<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5289matched by a given matcher.
5290
5291Given
5292 struct X { int m; };
5293 void f(X x) { x.m; m; }
5294memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5295 matches "x.m" and "m"
5296with hasObjectExpression(...)
5297 matching "x" and the implicit object expression of "m" which has type X*.
5298</pre></td></tr>
5299
5300
Aaron Ballman672dde22016-01-22 23:15:00 +00005301<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 +00005302<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5303given matcher.
5304
5305Given
5306 struct { int first, second; } first, second;
5307 int i(second.first);
5308 int j(first.second);
5309memberExpr(member(hasName("first")))
5310 matches second.first
5311 but not first.second (because the member name there is "second").
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_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 +00005316<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5317pointee matches a given matcher.
5318
5319Given
5320 int *a;
5321 int const *b;
5322 float const *f;
5323pointerType(pointee(isConstQualified(), isInteger()))
5324 matches "int const *b"
5325
Aaron Ballman672dde22016-01-22 23:15:00 +00005326Usable 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;,
5327 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 +00005328</pre></td></tr>
5329
5330
Aaron Ballman672dde22016-01-22 23:15:00 +00005331<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 +00005332<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5333pointee matches a given matcher.
5334
5335Given
5336 int *a;
5337 int const *b;
5338 float const *f;
5339pointerType(pointee(isConstQualified(), isInteger()))
5340 matches "int const *b"
5341
Aaron Ballman672dde22016-01-22 23:15:00 +00005342Usable 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;,
5343 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 +00005344</pre></td></tr>
5345
5346
Martin Bohme8cef2c22016-08-09 15:07:52 +00005347<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>
5348<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5349matcher.
5350
5351Given
5352 namespace N { template&lt;class T&gt; void f(T t); }
5353 template &lt;class T&gt; void g() { using N::f; f(T()); }
5354unresolvedLookupExpr(hasAnyDeclaration(
5355 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5356 matches the use of f in g() .
5357</pre></td></tr>
5358
5359
Aaron Ballman672dde22016-01-22 23:15:00 +00005360<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 +00005361<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5362
5363Given
5364 struct A { struct B { struct C {}; }; };
5365 A::B::C c;
5366nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5367 matches "A::"
5368</pre></td></tr>
5369
5370
Aaron Ballman672dde22016-01-22 23:15:00 +00005371<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 +00005372<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5373given TypeLoc.
5374
5375Given
5376 struct A { struct B { struct C {}; }; };
5377 A::B::C c;
5378nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5379 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5380 matches "A::"
5381</pre></td></tr>
5382
5383
Aaron Ballman672dde22016-01-22 23:15:00 +00005384<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 +00005385<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5386
5387Given
5388 struct A { struct B { struct C {}; }; };
5389 A::B::C c;
5390nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5391 matches "A::"
5392</pre></td></tr>
5393
5394
Aaron Ballman672dde22016-01-22 23:15:00 +00005395<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 +00005396<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5397given namespace matcher.
5398
5399Given
5400 namespace ns { struct A {}; }
5401 ns::A a;
5402nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5403 matches "ns::"
5404</pre></td></tr>
5405
5406
Aaron Ballman672dde22016-01-22 23:15:00 +00005407<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 +00005408<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5409given QualType matcher without qualifiers.
5410
5411Given
5412 struct A { struct B { struct C {}; }; };
5413 A::B::C c;
5414nestedNameSpecifier(specifiesType(
5415 hasDeclaration(cxxRecordDecl(hasName("A")))
5416))
5417 matches "A::"
5418</pre></td></tr>
5419
5420
Aaron Ballman672dde22016-01-22 23:15:00 +00005421<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 +00005422<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5423call expression.
5424
5425Example matches y in x(y)
5426 (matcher = callExpr(hasArgument(0, declRefExpr())))
5427 void x(int) { int y; x(y); }
5428</pre></td></tr>
5429
5430
Aaron Ballman672dde22016-01-22 23:15:00 +00005431<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 +00005432<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5433
5434Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005435matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005436matches the [webView ...] message invocation.
5437 NSString *webViewJavaScript = ...
5438 UIWebView *webView = ...
5439 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5440</pre></td></tr>
5441
5442
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005443<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>
5444<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5445
5446
Martin Bohme8cef2c22016-08-09 15:07:52 +00005447<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>
5448<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5449overloads matches the given matcher.
5450
5451Given
5452 template &lt;typename T&gt; void foo(T);
5453 template &lt;typename T&gt; void bar(T);
5454 template &lt;typename T&gt; void baz(T t) {
5455 foo(t);
5456 bar(t);
5457 }
5458unresolvedLookupExpr(hasAnyDeclaration(
5459 functionTemplateDecl(hasName("foo"))))
5460 matches foo in foo(t); but not bar in bar(t);
5461</pre></td></tr>
5462
5463
Aaron Ballman672dde22016-01-22 23:15:00 +00005464<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 +00005465<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5466
5467Given
5468 int (*ptr_to_array)[4];
5469 int (*ptr_to_func)(int);
5470
5471varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5472ptr_to_func but not ptr_to_array.
5473
Aaron Ballman672dde22016-01-22 23:15:00 +00005474Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005475</pre></td></tr>
5476
5477
Aaron Ballman672dde22016-01-22 23:15:00 +00005478<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 +00005479<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5480pointee matches a given matcher.
5481
5482Given
5483 int *a;
5484 int const *b;
5485 float const *f;
5486pointerType(pointee(isConstQualified(), isInteger()))
5487 matches "int const *b"
5488
Aaron Ballman672dde22016-01-22 23:15:00 +00005489Usable 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;,
5490 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 +00005491</pre></td></tr>
5492
5493
Aaron Ballman672dde22016-01-22 23:15:00 +00005494<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 +00005495<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5496pointee matches a given matcher.
5497
5498Given
5499 int *a;
5500 int const *b;
5501 float const *f;
5502pointerType(pointee(isConstQualified(), isInteger()))
5503 matches "int const *b"
5504
Aaron Ballman672dde22016-01-22 23:15:00 +00005505Usable 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;,
5506 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 +00005507</pre></td></tr>
5508
5509
Aaron Ballman672dde22016-01-22 23:15:00 +00005510<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 +00005511<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5512
5513Given:
5514 typedef int &amp;int_ref;
5515 int a;
5516 int_ref b = a;
5517
5518varDecl(hasType(qualType(referenceType()))))) will not match the
5519declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5520</pre></td></tr>
5521
5522
Aaron Ballman672dde22016-01-22 23:15:00 +00005523<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 +00005524<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5525matches the given matcher.
5526
5527The associated declaration is:
5528- for type nodes, the declaration of the underlying type
5529- for CallExpr, the declaration of the callee
5530- for MemberExpr, the declaration of the referenced member
5531- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005532- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005533
5534Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5535function. e.g. various subtypes of clang::Type and various expressions.
5536
Manuel Klimeka37e1102016-12-01 15:45:06 +00005537Usable 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;,
5538 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;,
5539 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;,
5540 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;,
5541 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;,
5542 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;,
5543 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005544</pre></td></tr>
5545
5546
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005547<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>
5548<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5549
5550Given
5551 void (*fp)(void);
5552The matcher
5553 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5554would match the declaration for fp.
5555</pre></td></tr>
5556
5557
Aaron Ballman672dde22016-01-22 23:15:00 +00005558<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 +00005559<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5560</pre></td></tr>
5561
5562
Aaron Ballman672dde22016-01-22 23:15:00 +00005563<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 +00005564<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5565matches the specified matcher.
5566
5567Example matches y-&gt;x()
5568 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5569 cxxRecordDecl(hasName("Y")))))))
5570 class Y { public: void x(); };
5571 void z() { Y *y; y-&gt;x(); }
5572</pre></td></tr>
5573
5574
Aaron Ballman672dde22016-01-22 23:15:00 +00005575<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 +00005576<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5577</pre></td></tr>
5578
5579
Aaron Ballman672dde22016-01-22 23:15:00 +00005580<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 +00005581<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5582type matches the specified matcher.
5583
5584Example matches X &amp;x and const X &amp;y
5585 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5586 class X {
5587 void a(X b) {
5588 X &amp;x = b;
5589 const X &amp;y = b;
5590 }
5591 };
5592</pre></td></tr>
5593
5594
Aaron Ballman672dde22016-01-22 23:15:00 +00005595<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 +00005596<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5597matches the given matcher.
5598
5599The associated declaration is:
5600- for type nodes, the declaration of the underlying type
5601- for CallExpr, the declaration of the callee
5602- for MemberExpr, the declaration of the referenced member
5603- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005604- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005605
5606Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5607function. e.g. various subtypes of clang::Type and various expressions.
5608
Manuel Klimeka37e1102016-12-01 15:45:06 +00005609Usable 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;,
5610 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;,
5611 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;,
5612 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;,
5613 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;,
5614 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;,
5615 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005616</pre></td></tr>
5617
5618
Aaron Ballman672dde22016-01-22 23:15:00 +00005619<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 +00005620<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5621pointee matches a given matcher.
5622
5623Given
5624 int *a;
5625 int const *b;
5626 float const *f;
5627pointerType(pointee(isConstQualified(), isInteger()))
5628 matches "int const *b"
5629
Aaron Ballman672dde22016-01-22 23:15:00 +00005630Usable 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;,
5631 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 +00005632</pre></td></tr>
5633
5634
Aaron Ballman672dde22016-01-22 23:15:00 +00005635<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 +00005636<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5637pointee matches a given matcher.
5638
5639Given
5640 int *a;
5641 int const *b;
5642 float const *f;
5643pointerType(pointee(isConstQualified(), isInteger()))
5644 matches "int const *b"
5645
Aaron Ballman672dde22016-01-22 23:15:00 +00005646Usable 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;,
5647 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 +00005648</pre></td></tr>
5649
5650
Alexander Kornienko976921d2016-03-22 11:03:03 +00005651<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>
5652<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5653
5654Given
5655 return a + b;
5656hasReturnValue(binaryOperator())
5657 matches 'return a + b'
5658with binaryOperator()
5659 matching 'a + b'
5660</pre></td></tr>
5661
5662
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005663<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>
5664<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5665a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5666
5667Given
5668 { {}; 1+2; }
5669hasAnySubstatement(compoundStmt())
5670 matches '{ {}; 1+2; }'
5671with compoundStmt()
5672 matching '{}'
5673</pre></td></tr>
5674
5675
Aaron Ballman672dde22016-01-22 23:15:00 +00005676<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 +00005677<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5678alignof.
5679</pre></td></tr>
5680
5681
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005682<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 +00005683<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 +00005684
5685Given:
5686F&amp; operator=(const F&amp; o) {
5687 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5688 return *this;
5689}
5690returnStmt(forFunction(hasName("operator=")))
5691 matches 'return *this'
5692 but does match 'return &gt; 0'
5693</pre></td></tr>
5694
5695
Aaron Ballman672dde22016-01-22 23:15:00 +00005696<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 +00005697<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5698sizeof.
5699</pre></td></tr>
5700
5701
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005702<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>
5703<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5704type that matches the provided matcher.
5705
5706Given
5707 template &lt;typename T&gt;
5708 double F(T t);
5709 int i;
5710 double j = F(i);
5711
5712substTemplateTypeParmType(hasReplacementType(type())) matches int
5713</pre></td></tr>
5714
5715
Aaron Ballman672dde22016-01-22 23:15:00 +00005716<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005717<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5718statement. This matcher may produce multiple matches.
5719
5720Given
5721 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5722switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5723 matches four times, with "c" binding each of "case 1:", "case 2:",
5724"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5725"switch (1)", "switch (2)" and "switch (2)".
5726</pre></td></tr>
5727
5728
Etienne Bergeron5500f952016-05-30 15:25:25 +00005729<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>
5730<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5731switch statement or conditional operator.
5732
5733Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5734 if (true) {}
5735</pre></td></tr>
5736
5737
Aaron Ballman672dde22016-01-22 23:15:00 +00005738<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 +00005739<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5740matches the given matcher.
5741
5742The associated declaration is:
5743- for type nodes, the declaration of the underlying type
5744- for CallExpr, the declaration of the callee
5745- for MemberExpr, the declaration of the referenced member
5746- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005747- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005748
5749Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5750function. e.g. various subtypes of clang::Type and various expressions.
5751
Manuel Klimeka37e1102016-12-01 15:45:06 +00005752Usable 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;,
5753 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;,
5754 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;,
5755 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;,
5756 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;,
5757 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;,
5758 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005759</pre></td></tr>
5760
5761
Aaron Ballman672dde22016-01-22 23:15:00 +00005762<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 +00005763<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5764
5765Given
5766 template&lt;typename T&gt; struct A {};
5767 struct B { B* next; };
5768 A&lt;&amp;B::next&gt; a;
5769templateSpecializationType(hasAnyTemplateArgument(
5770 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5771 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5772 B::next
5773</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_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 +00005777<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5778declaration.
5779
5780Given
5781 template&lt;typename T&gt; struct A {};
5782 struct B { B* next; };
5783 A&lt;&amp;B::next&gt; a;
5784classTemplateSpecializationDecl(hasAnyTemplateArgument(
5785 refersToDeclaration(fieldDecl(hasName("next"))))
5786 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5787 B::next
5788</pre></td></tr>
5789
5790
Aaron Ballman672dde22016-01-22 23:15:00 +00005791<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 +00005792<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5793
5794Given
5795 template&lt;int T&gt; struct A {};
5796 C&lt;42&gt; c;
5797classTemplateSpecializationDecl(
5798 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5799 matches the implicit instantiation of C in C&lt;42&gt;.
5800</pre></td></tr>
5801
5802
Haojian Wub33b02e2016-07-29 15:45:11 +00005803<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>
5804<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5805
5806Given
5807 template&lt;template &lt;typename&gt; class S&gt; class X {};
5808 template&lt;typename T&gt; class Y {};"
5809 X&lt;Y&gt; xi;
5810classTemplateSpecializationDecl(hasAnyTemplateArgument(
5811 refersToTemplate(templateName())))
5812 matches the specialization X&lt;Y&gt;
5813</pre></td></tr>
5814
5815
Aaron Ballman672dde22016-01-22 23:15:00 +00005816<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 +00005817<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5818
5819Given
5820 struct X {};
5821 template&lt;typename T&gt; struct A {};
5822 A&lt;X&gt; a;
5823classTemplateSpecializationDecl(hasAnyTemplateArgument(
5824 refersToType(class(hasName("X")))))
5825 matches the specialization A&lt;X&gt;
5826</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_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 +00005830<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5831functionDecl that have at least one TemplateArgument matching the given
5832InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005833
5834Given
5835 template&lt;typename T&gt; class A {};
5836 template&lt;&gt; class A&lt;double&gt; {};
5837 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005838
Haojian Wu99e39a72016-07-29 17:30:13 +00005839 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005840 void func() { f&lt;int&gt;(); };
5841
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005842classTemplateSpecializationDecl(hasAnyTemplateArgument(
5843 refersToType(asString("int"))))
5844 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005845
5846functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5847 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005848</pre></td></tr>
5849
5850
Aaron Ballman672dde22016-01-22 23:15:00 +00005851<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 +00005852<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5853matches the given matcher.
5854
5855The associated declaration is:
5856- for type nodes, the declaration of the underlying type
5857- for CallExpr, the declaration of the callee
5858- for MemberExpr, the declaration of the referenced member
5859- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005860- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005861
5862Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5863function. e.g. various subtypes of clang::Type and various expressions.
5864
Manuel Klimeka37e1102016-12-01 15:45:06 +00005865Usable 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;,
5866 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;,
5867 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;,
5868 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;,
5869 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;,
5870 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;,
5871 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005872</pre></td></tr>
5873
5874
Aaron Ballman672dde22016-01-22 23:15:00 +00005875<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 +00005876<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5877functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005878
5879Given
5880 template&lt;typename T, typename U&gt; class A {};
5881 A&lt;bool, int&gt; b;
5882 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005883
Haojian Wu99e39a72016-07-29 17:30:13 +00005884 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005885 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005886classTemplateSpecializationDecl(hasTemplateArgument(
5887 1, refersToType(asString("int"))))
5888 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005889
5890functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5891 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005892</pre></td></tr>
5893
5894
Aaron Ballman672dde22016-01-22 23:15:00 +00005895<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 +00005896<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5897matches the given matcher.
5898
5899The associated declaration is:
5900- for type nodes, the declaration of the underlying type
5901- for CallExpr, the declaration of the callee
5902- for MemberExpr, the declaration of the referenced member
5903- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005904- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005905
5906Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5907function. e.g. various subtypes of clang::Type and various expressions.
5908
Manuel Klimeka37e1102016-12-01 15:45:06 +00005909Usable 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;,
5910 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;,
5911 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;,
5912 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;,
5913 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;,
5914 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;,
5915 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005916</pre></td></tr>
5917
5918
5919<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>
5920<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5921
5922Generates results for each match.
5923
5924For example, in:
5925 class A { class B {}; class C {}; };
5926The matcher:
5927 cxxRecordDecl(hasName("::A"),
5928 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5929will generate results for A, B and C.
5930
5931Usable as: Any Matcher
5932</pre></td></tr>
5933
5934
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005935<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 +00005936<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5937matcher.
5938
5939Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5940 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5941 and U (matcher = typedefDecl(hasType(asString("int")))
5942 class X {};
5943 void y(X &amp;x) { x; X z; }
5944 typedef int U;
5945</pre></td></tr>
5946
5947
Aaron Ballman672dde22016-01-22 23:15:00 +00005948<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 +00005949<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5950matches the given matcher.
5951
5952The associated declaration is:
5953- for type nodes, the declaration of the underlying type
5954- for CallExpr, the declaration of the callee
5955- for MemberExpr, the declaration of the referenced member
5956- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005957- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005958
5959Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5960function. e.g. various subtypes of clang::Type and various expressions.
5961
Manuel Klimeka37e1102016-12-01 15:45:06 +00005962Usable 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;,
5963 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;,
5964 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;,
5965 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;,
5966 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;,
5967 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;,
5968 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5969</pre></td></tr>
5970
5971
5972<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>
5973<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5974type of the matched node.
5975
5976For example, in:
5977 class A {};
5978 using B = A;
5979The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5980both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005981</pre></td></tr>
5982
5983
Aaron Ballman672dde22016-01-22 23:15:00 +00005984<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 +00005985<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5986
5987Given
5988 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5989unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5990 matches sizeof(a) and alignof(c)
5991</pre></td></tr>
5992
5993
Aaron Ballman672dde22016-01-22 23:15:00 +00005994<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 +00005995<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5996
5997Example matches true (matcher = hasUnaryOperand(
5998 cxxBoolLiteral(equals(true))))
5999 !true
6000</pre></td></tr>
6001
6002
Aaron Ballman672dde22016-01-22 23:15:00 +00006003<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 +00006004<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
6005matches the given matcher.
6006
6007The associated declaration is:
6008- for type nodes, the declaration of the underlying type
6009- for CallExpr, the declaration of the callee
6010- for MemberExpr, the declaration of the referenced member
6011- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006012- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006013
6014Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
6015function. e.g. various subtypes of clang::Type and various expressions.
6016
Manuel Klimeka37e1102016-12-01 15:45:06 +00006017Usable 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;,
6018 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;,
6019 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;,
6020 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;,
6021 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;,
6022 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;,
6023 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006024</pre></td></tr>
6025
6026
Aaron Ballman672dde22016-01-22 23:15:00 +00006027<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 +00006028<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6029
6030Given
6031 namespace X { void b(); }
6032 using X::b;
6033usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6034 matches using X::b </pre></td></tr>
6035
6036
Aaron Ballman672dde22016-01-22 23:15:00 +00006037<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 +00006038<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
6039matched by the given matcher.
6040
6041Given
6042 namespace X { int a; void b(); }
6043 using X::a;
6044 using X::b;
6045usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6046 matches using X::b but not using X::a </pre></td></tr>
6047
6048
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006049<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>
6050<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 +00006051declaration's type.
6052
6053In case of a value declaration (for example a variable declaration),
6054this resolves one layer of indirection. For example, in the value
6055declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6056X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6057declaration of x.
6058
6059Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6060 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6061 class X {};
6062 void y(X &amp;x) { x; X z; }
6063
Aaron Ballman672dde22016-01-22 23:15:00 +00006064Usable 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 +00006065</pre></td></tr>
6066
6067
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006068<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>
6069<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 +00006070matcher.
6071
6072Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6073 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006074 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006075 class X {};
6076 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006077 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006078</pre></td></tr>
6079
6080
Aaron Ballman672dde22016-01-22 23:15:00 +00006081<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 +00006082<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6083that matches the given matcher.
6084
6085Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6086 bool y() { return true; }
6087 bool x = y();
6088</pre></td></tr>
6089
6090
Aaron Ballman672dde22016-01-22 23:15:00 +00006091<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 +00006092<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6093expression.
6094
6095Given
6096 void f(int b) {
6097 int a[b];
6098 }
6099variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6100 varDecl(hasName("b")))))))
6101 matches "int a[b]"
6102</pre></td></tr>
6103
6104
Aaron Ballman672dde22016-01-22 23:15:00 +00006105<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 +00006106<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6107definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006108
6109Given
6110 for (;;) {}
6111hasBody(compoundStmt())
6112 matches 'for (;;) {}'
6113with compoundStmt()
6114 matching '{}'
6115</pre></td></tr>
6116
6117
Aaron Ballman672dde22016-01-22 23:15:00 +00006118<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 +00006119<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 +00006120switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006121
6122Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6123 if (true) {}
6124</pre></td></tr>
6125
6126
Aaron Ballman672dde22016-01-22 23:15:00 +00006127<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 +00006128<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6129NestedNameSpecifier-matcher matches.
6130</pre></td></tr>
6131
6132
Aaron Ballman672dde22016-01-22 23:15:00 +00006133<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 +00006134<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6135QualType-matcher matches.
6136</pre></td></tr>
6137
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006138<!--END_TRAVERSAL_MATCHERS -->
6139</table>
6140
6141</div>
6142</body>
6143</html>
6144
6145