blob: bcd236adf5d551d0ac9dce1750a02696668aaea8 [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>
Dave Leebfb990b2017-11-11 23:53:27 +00001258<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C @throw statements.
Dave Lee0934fdc2017-11-11 22:46:15 +00001259
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
Adam Baloghda488a62017-11-23 12:43:20 +00002279<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2280<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2281
2282Given:
2283 MyClass *p1 = new MyClass[10];
2284cxxNewExpr(isArray())
2285 matches the expression 'new MyClass[10]'.
2286</pre></td></tr>
2287
2288
Aaron Ballman672dde22016-01-22 23:15:00 +00002289<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 +00002290<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2291
2292Matches overloaded operator names specified in strings without the
2293"operator" prefix: e.g. "&lt;&lt;".
2294
2295Given:
2296 class A { int operator*(); };
2297 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2298 A a;
2299 a &lt;&lt; a; &lt;-- This matches
2300
2301cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2302specified line and
2303cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2304matches the declaration of A.
2305
Aaron Ballman672dde22016-01-22 23:15:00 +00002306Usable 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 +00002307</pre></td></tr>
2308
2309
Aaron Ballman672dde22016-01-22 23:15:00 +00002310<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002311<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2312</pre></td></tr>
2313
2314
Aaron Ballman672dde22016-01-22 23:15:00 +00002315<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 +00002316<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2317static member variable template instantiations.
2318
2319Given
2320 template&lt;typename T&gt; void A(T t) { }
2321 template&lt;&gt; void A(int N) { }
2322functionDecl(isExplicitTemplateSpecialization())
2323 matches the specialization A&lt;int&gt;().
2324
Aaron Ballman672dde22016-01-22 23:15:00 +00002325Usable 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 +00002326</pre></td></tr>
2327
2328
Aaron Ballman672dde22016-01-22 23:15:00 +00002329<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 +00002330<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2331
2332Given:
2333 class A final {};
2334
2335 struct B {
2336 virtual void f();
2337 };
2338
2339 struct C : B {
2340 void f() final;
2341 };
2342matches A and C::f, but not B, C, or B::f
2343</pre></td></tr>
2344
2345
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002346<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>
2347<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2348
2349Given:
2350 auto x = []{};
2351
2352cxxRecordDecl(isLambda()) matches the implicit class declaration of
2353decltype(x)
2354</pre></td></tr>
2355
2356
Aaron Ballman672dde22016-01-22 23:15:00 +00002357<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002358<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2359isSameOrDerivedFrom(hasName(...)).
2360</pre></td></tr>
2361
2362
Aaron Ballman672dde22016-01-22 23:15:00 +00002363<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 +00002364<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2365member variable template instantiations.
2366
2367Given
2368 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2369or
2370 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2371cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2372 matches the template instantiation of X&lt;A&gt;.
2373
2374But given
2375 template &lt;typename T&gt; class X {}; class A {};
2376 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2377cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2378 does not match, as X&lt;A&gt; is an explicit template specialization.
2379
Aaron Ballman672dde22016-01-22 23:15:00 +00002380Usable 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 +00002381</pre></td></tr>
2382
2383
Aaron Ballman672dde22016-01-22 23:15:00 +00002384<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 +00002385<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2386a specific number of arguments (including absent default arguments).
2387
2388Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2389 void f(int x, int y);
2390 f(0, 0);
2391</pre></td></tr>
2392
2393
Etienne Bergeron75e52722016-05-13 19:36:55 +00002394<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>
2395<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2396
2397Example: matches the implicit cast around 0
2398(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2399 int *p = 0;
2400</pre></td></tr>
2401
2402
Aaron Ballman672dde22016-01-22 23:15:00 +00002403<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 +00002404<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 +00002405
Peter Wua9244b52017-06-08 22:00:58 +00002406Given
2407 f('false, 3.14, 42);
2408characterLiteral(equals(0))
2409 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2410 match false
2411floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2412 match 3.14
2413integerLiteral(equals(42))
2414 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002415
Clement Courbet43bdba42017-07-11 15:45:22 +00002416Note that you cannot directly match a negative numeric literal because the
2417minus sign is not part of the literal: It is a unary operator whose operand
2418is the positive numeric literal. Instead, you must use a unaryOperator()
2419matcher to match the minus sign:
2420
2421unaryOperator(hasOperatorName("-"),
2422 hasUnaryOperand(integerLiteral(equals(13))))
2423
Peter Wua9244b52017-06-08 22:00:58 +00002424Usable 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 +00002425 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 +00002426</pre></td></tr>
2427
2428
Peter Wua9244b52017-06-08 22:00:58 +00002429<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>
2430<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2431
2432
2433<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>
2434<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2435
2436
2437<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>
2438<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2439
2440
Aaron Ballman672dde22016-01-22 23:15:00 +00002441<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 +00002442<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2443
2444Given
2445 template&lt;typename T&gt; struct C {};
2446 C&lt;int&gt; c;
2447classTemplateSpecializationDecl(templateArgumentCountIs(1))
2448 matches C&lt;int&gt;.
2449</pre></td></tr>
2450
2451
Aaron Ballman672dde22016-01-22 23:15:00 +00002452<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 +00002453<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2454child statements.
2455
2456Example: Given
2457 { for (;;) {} }
2458compoundStmt(statementCountIs(0)))
2459 matches '{}'
2460 but does not match the outer compound statement.
2461</pre></td></tr>
2462
2463
Aaron Ballman672dde22016-01-22 23:15:00 +00002464<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 +00002465<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002466
2467Given
2468 int a[42];
2469 int b[2 * 21];
2470 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002471 char *s = "abcd";
2472 wchar_t *ws = L"abcd";
2473 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002474constantArrayType(hasSize(42))
2475 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002476stringLiteral(hasSize(4))
2477 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002478</pre></td></tr>
2479
2480
Aaron Ballman672dde22016-01-22 23:15:00 +00002481<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 +00002482<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2483declarations.
2484
2485Example: Given
2486 int a, b;
2487 int c;
2488 int d = 2, e;
2489declCountIs(2)
2490 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2491</pre></td></tr>
2492
2493
Aaron Ballman672dde22016-01-22 23:15:00 +00002494<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002495<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2496
2497Matches a node if it equals the node previously bound to ID.
2498
2499Given
2500 class X { int a; int b; };
2501cxxRecordDecl(
2502 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2503 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2504 matches the class X, as a and b have the same type.
2505
2506Note that when multiple matches are involved via forEach* matchers,
2507equalsBoundNodes acts as a filter.
2508For example:
2509compoundStmt(
2510 forEachDescendant(varDecl().bind("d")),
2511 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2512will trigger a match for each combination of variable declaration
2513and reference to that variable declaration within a compound statement.
2514</pre></td></tr>
2515
2516
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002517<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>
2518<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2519
2520Decl has pointer identity in the AST.
2521</pre></td></tr>
2522
2523
Aaron Ballman672dde22016-01-22 23:15:00 +00002524<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 +00002525<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2526
2527Given
2528 __attribute__((device)) void f() { ... }
2529decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2530f. If the matcher is use from clang-query, attr::Kind parameter should be
2531passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2532</pre></td></tr>
2533
2534
Aaron Ballman672dde22016-01-22 23:15:00 +00002535<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 +00002536<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2537partially matching a given regex.
2538
2539Example matches Y but not X
2540 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2541 #include "ASTMatcher.h"
2542 class X {};
2543ASTMatcher.h:
2544 class Y {};
2545
Aaron Ballman672dde22016-01-22 23:15:00 +00002546Usable 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 +00002547</pre></td></tr>
2548
2549
Aaron Ballman672dde22016-01-22 23:15:00 +00002550<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 +00002551<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2552
2553Example matches X but not Y
2554 (matcher = cxxRecordDecl(isExpansionInMainFile())
2555 #include &lt;Y.h&gt;
2556 class X {};
2557Y.h:
2558 class Y {};
2559
Aaron Ballman672dde22016-01-22 23:15:00 +00002560Usable 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 +00002561</pre></td></tr>
2562
2563
Aaron Ballman672dde22016-01-22 23:15:00 +00002564<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 +00002565<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2566
2567Example matches Y but not X
2568 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2569 #include &lt;SystemHeader.h&gt;
2570 class X {};
2571SystemHeader.h:
2572 class Y {};
2573
Aaron Ballman672dde22016-01-22 23:15:00 +00002574Usable 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 +00002575</pre></td></tr>
2576
2577
Aaron Ballman672dde22016-01-22 23:15:00 +00002578<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 +00002579<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2580by the compiler (eg. implicit defaultcopy constructors).
2581</pre></td></tr>
2582
2583
Aaron Ballman672dde22016-01-22 23:15:00 +00002584<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002585<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2586
2587Given
2588 class C {
2589 public: int a;
2590 protected: int b;
2591 private: int c;
2592 };
2593fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002594 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002595</pre></td></tr>
2596
2597
Aaron Ballman672dde22016-01-22 23:15:00 +00002598<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 +00002599<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2600
2601Given
2602 class C {
2603 public: int a;
2604 protected: int b;
2605 private: int c;
2606 };
2607fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002608 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002609</pre></td></tr>
2610
2611
Aaron Ballman672dde22016-01-22 23:15:00 +00002612<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002613<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2614
2615Given
2616 class C {
2617 public: int a;
2618 protected: int b;
2619 private: int c;
2620 };
2621fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002622 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002623</pre></td></tr>
2624
2625
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002626<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>
2627<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2628a specific number of designators.
2629
2630Example: Given
2631 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2632 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2633designatorCountIs(2)
2634 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2635 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2636</pre></td></tr>
2637
2638
Aaron Ballman5c574342016-07-06 18:25:16 +00002639<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 +00002640<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2641bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002642
2643Given
2644 class C {
2645 int a : 2;
2646 int b : 4;
2647 int c : 2;
2648 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002649fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002650 matches 'int a;' and 'int c;' but not 'int b;'.
2651</pre></td></tr>
2652
2653
2654<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>
2655<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2656
2657Given
2658 class C {
2659 int a : 2;
2660 int b;
2661 };
2662fieldDecl(isBitField())
2663 matches 'int a;' but not 'int b;'.
2664</pre></td></tr>
2665
2666
Aaron Ballman672dde22016-01-22 23:15:00 +00002667<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 +00002668<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 +00002669
Peter Wua9244b52017-06-08 22:00:58 +00002670Given
2671 f('false, 3.14, 42);
2672characterLiteral(equals(0))
2673 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2674 match false
2675floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2676 match 3.14
2677integerLiteral(equals(42))
2678 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002679
Clement Courbet43bdba42017-07-11 15:45:22 +00002680Note that you cannot directly match a negative numeric literal because the
2681minus sign is not part of the literal: It is a unary operator whose operand
2682is the positive numeric literal. Instead, you must use a unaryOperator()
2683matcher to match the minus sign:
2684
2685unaryOperator(hasOperatorName("-"),
2686 hasUnaryOperand(integerLiteral(equals(13))))
2687
Peter Wua9244b52017-06-08 22:00:58 +00002688Usable 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 +00002689 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 +00002690</pre></td></tr>
2691
2692
Peter Wua9244b52017-06-08 22:00:58 +00002693<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>
2694<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2695
2696
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002697<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>
2698<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2699
2700Given:
2701 void f();
2702 void g() noexcept;
2703 void h() noexcept(true);
2704 void i() noexcept(false);
2705 void j() throw();
2706 void k() throw(int);
2707 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002708functionDecl(hasDynamicExceptionSpec()) and
2709 functionProtoType(hasDynamicExceptionSpec())
2710 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002711</pre></td></tr>
2712
2713
Aaron Ballman672dde22016-01-22 23:15:00 +00002714<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 +00002715<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2716
2717Matches overloaded operator names specified in strings without the
2718"operator" prefix: e.g. "&lt;&lt;".
2719
2720Given:
2721 class A { int operator*(); };
2722 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2723 A a;
2724 a &lt;&lt; a; &lt;-- This matches
2725
2726cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2727specified line and
2728cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2729matches the declaration of A.
2730
Aaron Ballman672dde22016-01-22 23:15:00 +00002731Usable 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 +00002732</pre></td></tr>
2733
2734
Aaron Ballman672dde22016-01-22 23:15:00 +00002735<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 +00002736<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2737
2738Given:
2739 constexpr int foo = 42;
2740 constexpr int bar();
2741varDecl(isConstexpr())
2742 matches the declaration of foo.
2743functionDecl(isConstexpr())
2744 matches the declaration of bar.
2745</pre></td></tr>
2746
2747
Aaron Ballman672dde22016-01-22 23:15:00 +00002748<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 +00002749<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2750
2751Given:
2752 class A { ~A(); };
2753 class B { ~B() = default; };
2754functionDecl(isDefaulted())
2755 matches the declaration of ~B, but not ~A.
2756</pre></td></tr>
2757
2758
Dave Leebe398682017-11-14 14:17:26 +00002759<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
2760<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002761
2762Example matches A, va, fa
2763 class A {};
2764 class B; Doesn't match, as it has no body.
2765 int va;
2766 extern int vb; Doesn't match, as it doesn't define the variable.
2767 void fa() {}
2768 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00002769 @interface X
2770 - (void)ma; Doesn't match, interface is declaration.
2771 @end
2772 @implementation X
2773 - (void)ma {}
2774 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002775
Dave Leebe398682017-11-14 14:17:26 +00002776Usable 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;,
2777 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002778</pre></td></tr>
2779
2780
Aaron Ballman672dde22016-01-22 23:15:00 +00002781<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 +00002782<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2783
2784Given:
2785 void Func();
2786 void DeletedFunc() = delete;
2787functionDecl(isDeleted())
2788 matches the declaration of DeletedFunc, but not Func.
2789</pre></td></tr>
2790
2791
Aaron Ballman672dde22016-01-22 23:15:00 +00002792<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 +00002793<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2794static member variable template instantiations.
2795
2796Given
2797 template&lt;typename T&gt; void A(T t) { }
2798 template&lt;&gt; void A(int N) { }
2799functionDecl(isExplicitTemplateSpecialization())
2800 matches the specialization A&lt;int&gt;().
2801
Aaron Ballman672dde22016-01-22 23:15:00 +00002802Usable 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 +00002803</pre></td></tr>
2804
Aaron Ballman672dde22016-01-22 23:15:00 +00002805<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 +00002806<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002807
2808Given:
2809 extern "C" void f() {}
2810 extern "C" { void g() {} }
2811 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002812 extern "C" int x = 1;
2813 extern "C" int y = 2;
2814 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002815functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002816 matches the declaration of f and g, but not the declaration of h.
2817varDecl(isExternC())
2818 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002819</pre></td></tr>
2820
Aaron Ballman672dde22016-01-22 23:15:00 +00002821<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 +00002822<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2823the inline keyword.
2824
2825Given
2826 inline void f();
2827 void g();
2828 namespace n {
2829 inline namespace m {}
2830 }
2831functionDecl(isInline()) will match ::f().
2832namespaceDecl(isInline()) will match n::m.
2833</pre></td></tr>
2834
2835
Aaron Ballman672dde22016-01-22 23:15:00 +00002836<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002837<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2838
2839Given:
2840 void f();
2841 void g() noexcept;
2842 void h() throw();
2843 void i() throw(int);
2844 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002845functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2846 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002847</pre></td></tr>
2848
2849
Haojian Wub3d25462016-09-26 16:01:52 +00002850<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 +00002851<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2852class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002853
2854Given:
2855 static void f() {}
2856 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002857 extern int j;
2858 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002859functionDecl(isStaticStorageClass())
2860 matches the function declaration f.
2861varDecl(isStaticStorageClass())
2862 matches the variable declaration i.
2863</pre></td></tr>
2864
2865
Aaron Ballman672dde22016-01-22 23:15:00 +00002866<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 +00002867<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2868member variable template instantiations.
2869
2870Given
2871 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2872or
2873 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2874cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2875 matches the template instantiation of X&lt;A&gt;.
2876
2877But given
2878 template &lt;typename T&gt; class X {}; class A {};
2879 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2880cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2881 does not match, as X&lt;A&gt; is an explicit template specialization.
2882
Aaron Ballman672dde22016-01-22 23:15:00 +00002883Usable 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 +00002884</pre></td></tr>
2885
2886
Aaron Ballman672dde22016-01-22 23:15:00 +00002887<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 +00002888<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2889
2890Example matches f, but not g or h. The function i will not match, even when
2891compiled in C mode.
2892 void f(...);
2893 void g(int);
2894 template &lt;typename... Ts&gt; void h(Ts...);
2895 void i();
2896</pre></td></tr>
2897
2898
Aaron Ballman672dde22016-01-22 23:15:00 +00002899<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 +00002900<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2901specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002902
2903Given
2904 void f(int i) {}
2905 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002906 void h(int i, int j);
2907 void j(int i);
2908 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002909functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002910 matches void g(int i, int j) {}
2911functionProtoType(parameterCountIs(2))
2912 matches void h(int i, int j)
2913functionProtoType(parameterCountIs(3))
2914 matches void k(int x, int y, int z, ...);
2915</pre></td></tr>
2916
2917
Aaron Ballman230ad972016-06-07 17:34:45 +00002918<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>
2919<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2920
2921Given:
2922 void f();
2923 void g() noexcept;
2924 void h() noexcept(true);
2925 void i() noexcept(false);
2926 void j() throw();
2927 void k() throw(int);
2928 void l() throw(...);
2929functionDecl(hasDynamicExceptionSpec()) and
2930 functionProtoType(hasDynamicExceptionSpec())
2931 match the declarations of j, k, and l, but not f, g, h, or i.
2932</pre></td></tr>
2933
2934
2935<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>
2936<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2937
2938Given:
2939 void f();
2940 void g() noexcept;
2941 void h() throw();
2942 void i() throw(int);
2943 void j() noexcept(false);
2944functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2945 match the declarations of g, and h, but not f, i or j.
2946</pre></td></tr>
2947
2948
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002949<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>
2950<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2951specific parameter count.
2952
2953Given
2954 void f(int i) {}
2955 void g(int i, int j) {}
2956 void h(int i, int j);
2957 void j(int i);
2958 void k(int x, int y, int z, ...);
2959functionDecl(parameterCountIs(2))
2960 matches void g(int i, int j) {}
2961functionProtoType(parameterCountIs(2))
2962 matches void h(int i, int j)
2963functionProtoType(parameterCountIs(3))
2964 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002965</pre></td></tr>
2966
2967
Aaron Ballman672dde22016-01-22 23:15:00 +00002968<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 +00002969<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 +00002970
Peter Wua9244b52017-06-08 22:00:58 +00002971Given
2972 f('false, 3.14, 42);
2973characterLiteral(equals(0))
2974 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2975 match false
2976floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2977 match 3.14
2978integerLiteral(equals(42))
2979 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002980
Clement Courbet43bdba42017-07-11 15:45:22 +00002981Note that you cannot directly match a negative numeric literal because the
2982minus sign is not part of the literal: It is a unary operator whose operand
2983is the positive numeric literal. Instead, you must use a unaryOperator()
2984matcher to match the minus sign:
2985
2986unaryOperator(hasOperatorName("-"),
2987 hasUnaryOperand(integerLiteral(equals(13))))
2988
Peter Wua9244b52017-06-08 22:00:58 +00002989Usable 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 +00002990 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 +00002991</pre></td></tr>
2992
2993
Peter Wua9244b52017-06-08 22:00:58 +00002994<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>
2995<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2996
2997
2998<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>
2999<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3000
3001
3002<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>
3003<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3004
3005
Aaron Ballman672dde22016-01-22 23:15:00 +00003006<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003007<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3008to '.'.
3009
3010Member calls on the implicit this pointer match as called with '-&gt;'.
3011
3012Given
3013 class Y {
3014 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3015 int a;
3016 static int b;
3017 };
3018memberExpr(isArrow())
3019 matches this-&gt;x, x, y.x, a, this-&gt;b
3020</pre></td></tr>
3021
3022
Aaron Ballmana086b9f2016-08-17 13:10:42 +00003023<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>
3024<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3025
3026Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3027void f() {
3028 int x;
3029 static int y;
3030}
3031int z;
3032
3033Example matches f() because it has external formal linkage despite being
3034unique to the translation unit as though it has internal likage
3035(matcher = functionDecl(hasExternalFormalLinkage()))
3036
3037namespace {
3038void f() {}
3039}
3040</pre></td></tr>
3041
3042
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003043<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 +00003044<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3045
3046Supports specifying enclosing namespaces or classes by prefixing the name
3047with '&lt;enclosing&gt;::'.
3048Does not match typedefs of an underlying type with the given name.
3049
3050Example matches X (Name == "X")
3051 class X;
3052
3053Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3054 namespace a { namespace b { class X; } }
3055</pre></td></tr>
3056
3057
Aaron Ballman672dde22016-01-22 23:15:00 +00003058<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 +00003059<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3060a substring matched by the given RegExp.
3061
3062Supports specifying enclosing namespaces or classes by
3063prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3064of an underlying type with the given name.
3065
3066Example matches X (regexp == "::X")
3067 class X;
3068
3069Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3070 namespace foo { namespace bar { class X; } }
3071</pre></td></tr>
3072
3073
Aaron Ballman672dde22016-01-22 23:15:00 +00003074<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 +00003075<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3076
3077Given
3078 namespace n {
3079 namespace {} #1
3080 }
3081namespaceDecl(isAnonymous()) will match #1 but not ::n.
3082</pre></td></tr>
3083
3084
Aaron Ballman672dde22016-01-22 23:15:00 +00003085<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 +00003086<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3087the inline keyword.
3088
3089Given
3090 inline void f();
3091 void g();
3092 namespace n {
3093 inline namespace m {}
3094 }
3095functionDecl(isInline()) will match ::f().
3096namespaceDecl(isInline()) will match n::m.
3097</pre></td></tr>
3098
3099
Aaron Ballman672dde22016-01-22 23:15:00 +00003100<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 +00003101<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3102a specific number of arguments (including absent default arguments).
3103
3104Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3105 void f(int x, int y);
3106 f(0, 0);
3107</pre></td></tr>
3108
3109
Aaron Ballman672dde22016-01-22 23:15:00 +00003110<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 +00003111<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3112
3113objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3114message expression in
3115
3116 UIWebView *webView = ...;
3117 CGRect bodyFrame = webView.frame;
3118 bodyFrame.size.height = self.bodyContentHeight;
3119 webView.frame = bodyFrame;
3120 ^---- matches here
3121</pre></td></tr>
3122
3123
Aaron Ballman672dde22016-01-22 23:15:00 +00003124<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 +00003125<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3126
3127Matches only when the selector of the objCMessageExpr is NULL. This may
3128represent an error condition in the tree!
3129</pre></td></tr>
3130
3131
Aaron Ballman672dde22016-01-22 23:15:00 +00003132<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 +00003133<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3134
3135 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3136 matches the outer message expr in the code below, but NOT the message
3137 invocation for self.bodyView.
3138 [self.bodyView loadHTMLString:html baseURL:NULL];
3139</pre></td></tr>
3140
3141
Aaron Ballman672dde22016-01-22 23:15:00 +00003142<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 +00003143<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3144
3145 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3146 matches self.bodyView in the code below, but NOT the outer message
3147 invocation of "loadHTMLString:baseURL:".
3148 [self.bodyView loadHTMLString:html baseURL:NULL];
3149</pre></td></tr>
3150
3151
Aaron Ballman672dde22016-01-22 23:15:00 +00003152<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 +00003153<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3154a substring matched by the given RegExp.
3155 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3156 invocation for self.bodyView.
3157 [self.bodyView loadHTMLString:html baseURL:NULL];
3158</pre></td></tr>
3159
3160
Aaron Ballman672dde22016-01-22 23:15:00 +00003161<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 +00003162<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3163
3164 matcher = objCMessageExpr(numSelectorArgs(0));
3165 matches self.bodyView in the code below
3166
3167 matcher = objCMessageExpr(numSelectorArgs(2));
3168 matches the invocation of "loadHTMLString:baseURL:" but not that
3169 of self.bodyView
3170 [self.bodyView loadHTMLString:html baseURL:NULL];
3171</pre></td></tr>
3172
3173
Dave Leebe398682017-11-14 14:17:26 +00003174<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
3175<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3176
3177Example matches A, va, fa
3178 class A {};
3179 class B; Doesn't match, as it has no body.
3180 int va;
3181 extern int vb; Doesn't match, as it doesn't define the variable.
3182 void fa() {}
3183 void fb(); Doesn't match, as it has no body.
3184 @interface X
3185 - (void)ma; Doesn't match, interface is declaration.
3186 @end
3187 @implementation X
3188 - (void)ma {}
3189 @end
3190
3191Usable 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;,
3192 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3193</pre></td></tr>
3194
3195
Aaron Ballman5f8980a2017-11-21 19:22:34 +00003196<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
3197<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3198
3199Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3200void x(int val) {}
3201void y(int val = 0) {}
3202</pre></td></tr>
3203
3204
Aaron Ballman672dde22016-01-22 23:15:00 +00003205<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 +00003206<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3207
3208Given
3209 class Y { public: void x(); };
3210 void z() { Y* y; y-&gt;x(); }
3211cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3212 matches y-&gt;x()
3213</pre></td></tr>
3214
3215
Aaron Ballman672dde22016-01-22 23:15:00 +00003216<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 +00003217<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3218
3219Matches a node if it equals the node previously bound to ID.
3220
3221Given
3222 class X { int a; int b; };
3223cxxRecordDecl(
3224 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3225 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3226 matches the class X, as a and b have the same type.
3227
3228Note that when multiple matches are involved via forEach* matchers,
3229equalsBoundNodes acts as a filter.
3230For example:
3231compoundStmt(
3232 forEachDescendant(varDecl().bind("d")),
3233 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3234will trigger a match for each combination of variable declaration
3235and reference to that variable declaration within a compound statement.
3236</pre></td></tr>
3237
3238
Aaron Ballman672dde22016-01-22 23:15:00 +00003239<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 +00003240<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3241the node, not hidden within a typedef.
3242
3243Given
3244 typedef const int const_int;
3245 const_int i;
3246 int *const j;
3247 int *volatile k;
3248 int m;
3249varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3250i is const-qualified but the qualifier is not local.
3251</pre></td></tr>
3252
3253
Aaron Ballman672dde22016-01-22 23:15:00 +00003254<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 +00003255<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3256
3257Given
3258 void a(char);
3259 void b(wchar_t);
3260 void c(double);
3261functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3262matches "a(char)", "b(wchar_t)", but not "c(double)".
3263</pre></td></tr>
3264
3265
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003266<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 +00003267<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3268the Objective-C object pointer type, which is different despite being
3269syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003270
3271Given
3272 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003273
3274 @interface Foo
3275 @end
3276 Foo *f;
3277
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003278 int j;
3279varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003280 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003281</pre></td></tr>
3282
3283
Aaron Ballman672dde22016-01-22 23:15:00 +00003284<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 +00003285<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3286include "top-level" const.
3287
3288Given
3289 void a(int);
3290 void b(int const);
3291 void c(const int);
3292 void d(const int*);
3293 void e(int const) {};
3294functionDecl(hasAnyParameter(hasType(isConstQualified())))
3295 matches "void b(int const)", "void c(const int)" and
3296 "void e(int const) {}". It does not match d as there
3297 is no top-level const on the parameter type "const int *".
3298</pre></td></tr>
3299
3300
Aaron Ballman672dde22016-01-22 23:15:00 +00003301<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 +00003302<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3303
3304Given
3305 void a(int);
3306 void b(long);
3307 void c(double);
3308functionDecl(hasAnyParameter(hasType(isInteger())))
3309matches "a(int)", "b(long)", but not "c(double)".
3310</pre></td></tr>
3311
3312
Clement Courbet42517592016-07-12 06:36:00 +00003313<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>
3314<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3315
3316Given
3317 void a(int);
3318 void b(unsigned long);
3319 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003320functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003321matches "a(int)", but not "b(unsigned long)" and "c(double)".
3322</pre></td></tr>
3323
3324
3325<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>
3326<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3327
3328Given
3329 void a(int);
3330 void b(unsigned long);
3331 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003332functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003333matches "b(unsigned long)", but not "a(int)" and "c(double)".
3334</pre></td></tr>
3335
3336
Aaron Ballman672dde22016-01-22 23:15:00 +00003337<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 +00003338<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3339include "top-level" volatile.
3340
3341Given
3342 void a(int);
3343 void b(int volatile);
3344 void c(volatile int);
3345 void d(volatile int*);
3346 void e(int volatile) {};
3347functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3348 matches "void b(int volatile)", "void c(volatile int)" and
3349 "void e(int volatile) {}". It does not match d as there
3350 is no top-level volatile on the parameter type "volatile int *".
3351</pre></td></tr>
3352
3353
Aaron Ballman672dde22016-01-22 23:15:00 +00003354<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 +00003355<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3356
3357Example matches C, but not S or U.
3358 struct S {};
3359 class C {};
3360 union U {};
3361</pre></td></tr>
3362
3363
Aaron Ballman672dde22016-01-22 23:15:00 +00003364<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 +00003365<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3366
3367Example matches S, but not C or U.
3368 struct S {};
3369 class C {};
3370 union U {};
3371</pre></td></tr>
3372
3373
Aaron Ballman672dde22016-01-22 23:15:00 +00003374<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 +00003375<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3376
3377Example matches U, but not C or S.
3378 struct S {};
3379 class C {};
3380 union U {};
3381</pre></td></tr>
3382
3383
Aaron Ballman672dde22016-01-22 23:15:00 +00003384<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003385<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3386
3387Matches a node if it equals the node previously bound to ID.
3388
3389Given
3390 class X { int a; int b; };
3391cxxRecordDecl(
3392 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3393 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3394 matches the class X, as a and b have the same type.
3395
3396Note that when multiple matches are involved via forEach* matchers,
3397equalsBoundNodes acts as a filter.
3398For example:
3399compoundStmt(
3400 forEachDescendant(varDecl().bind("d")),
3401 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3402will trigger a match for each combination of variable declaration
3403and reference to that variable declaration within a compound statement.
3404</pre></td></tr>
3405
3406
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003407<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>
3408<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3409
3410Stmt has pointer identity in the AST.
3411</pre></td></tr>
3412
3413
Aaron Ballman672dde22016-01-22 23:15:00 +00003414<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 +00003415<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3416partially matching a given regex.
3417
3418Example matches Y but not X
3419 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3420 #include "ASTMatcher.h"
3421 class X {};
3422ASTMatcher.h:
3423 class Y {};
3424
Aaron Ballman672dde22016-01-22 23:15:00 +00003425Usable 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 +00003426</pre></td></tr>
3427
3428
Aaron Ballman672dde22016-01-22 23:15:00 +00003429<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003430<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3431
3432Example matches X but not Y
3433 (matcher = cxxRecordDecl(isExpansionInMainFile())
3434 #include &lt;Y.h&gt;
3435 class X {};
3436Y.h:
3437 class Y {};
3438
Aaron Ballman672dde22016-01-22 23:15:00 +00003439Usable 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 +00003440</pre></td></tr>
3441
3442
Aaron Ballman672dde22016-01-22 23:15:00 +00003443<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 +00003444<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3445
3446Example matches Y but not X
3447 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3448 #include &lt;SystemHeader.h&gt;
3449 class X {};
3450SystemHeader.h:
3451 class Y {};
3452
Aaron Ballman672dde22016-01-22 23:15:00 +00003453Usable 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 +00003454</pre></td></tr>
3455
3456
Etienne Bergeron3588be72016-05-12 04:20:04 +00003457<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>
3458<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3459
3460Given
3461 int a[42];
3462 int b[2 * 21];
3463 int c[41], d[43];
3464 char *s = "abcd";
3465 wchar_t *ws = L"abcd";
3466 char *w = "a";
3467constantArrayType(hasSize(42))
3468 matches "int a[42]" and "int b[2 * 21]"
3469stringLiteral(hasSize(4))
3470 matches "abcd", L"abcd"
3471</pre></td></tr>
3472
3473
Aaron Ballman672dde22016-01-22 23:15:00 +00003474<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 +00003475<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3476
3477Example matches A, va, fa
3478 class A {};
3479 class B; Doesn't match, as it has no body.
3480 int va;
3481 extern int vb; Doesn't match, as it doesn't define the variable.
3482 void fa() {}
3483 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003484 @interface X
3485 - (void)ma; Doesn't match, interface is declaration.
3486 @end
3487 @implementation X
3488 - (void)ma {}
3489 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003490
Dave Leebe398682017-11-14 14:17:26 +00003491Usable 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;,
3492 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</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_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 +00003497<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3498
3499Note that 'Value' is a string as the template argument's value is
3500an arbitrary precision integer. 'Value' must be euqal to the canonical
3501representation of that integral value in base 10.
3502
3503Given
3504 template&lt;int T&gt; struct A {};
3505 C&lt;42&gt; c;
3506classTemplateSpecializationDecl(
3507 hasAnyTemplateArgument(equalsIntegralValue("42")))
3508 matches the implicit instantiation of C in C&lt;42&gt;.
3509</pre></td></tr>
3510
3511
Aaron Ballman672dde22016-01-22 23:15:00 +00003512<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003513<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3514
3515Given
3516 template&lt;int T&gt; struct A {};
3517 C&lt;42&gt; c;
3518classTemplateSpecializationDecl(
3519 hasAnyTemplateArgument(isIntegral()))
3520 matches the implicit instantiation of C in C&lt;42&gt;
3521 with isIntegral() matching 42.
3522</pre></td></tr>
3523
3524
Aaron Ballman672dde22016-01-22 23:15:00 +00003525<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 +00003526<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3527
3528Given
3529 template&lt;typename T&gt; struct C {};
3530 C&lt;int&gt; c;
3531classTemplateSpecializationDecl(templateArgumentCountIs(1))
3532 matches C&lt;int&gt;.
3533</pre></td></tr>
3534
3535
Aaron Ballman672dde22016-01-22 23:15:00 +00003536<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 +00003537<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3538partially matching a given regex.
3539
3540Example matches Y but not X
3541 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3542 #include "ASTMatcher.h"
3543 class X {};
3544ASTMatcher.h:
3545 class Y {};
3546
Aaron Ballman672dde22016-01-22 23:15:00 +00003547Usable 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 +00003548</pre></td></tr>
3549
3550
Aaron Ballman672dde22016-01-22 23:15:00 +00003551<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 +00003552<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3553
3554Example matches X but not Y
3555 (matcher = cxxRecordDecl(isExpansionInMainFile())
3556 #include &lt;Y.h&gt;
3557 class X {};
3558Y.h:
3559 class Y {};
3560
Aaron Ballman672dde22016-01-22 23:15:00 +00003561Usable 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 +00003562</pre></td></tr>
3563
3564
Aaron Ballman672dde22016-01-22 23:15:00 +00003565<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 +00003566<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3567
3568Example matches Y but not X
3569 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3570 #include &lt;SystemHeader.h&gt;
3571 class X {};
3572SystemHeader.h:
3573 class Y {};
3574
Aaron Ballman672dde22016-01-22 23:15:00 +00003575Usable 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 +00003576</pre></td></tr>
3577
3578
Aaron Ballman672dde22016-01-22 23:15:00 +00003579<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 +00003580<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3581
3582Given
3583 struct S { bool func(); };
3584functionDecl(returns(booleanType()))
3585 matches "bool func();"
3586</pre></td></tr>
3587
3588
Aaron Ballman672dde22016-01-22 23:15:00 +00003589<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 +00003590<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3591
3592Matches a node if it equals the node previously bound to ID.
3593
3594Given
3595 class X { int a; int b; };
3596cxxRecordDecl(
3597 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3598 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3599 matches the class X, as a and b have the same type.
3600
3601Note that when multiple matches are involved via forEach* matchers,
3602equalsBoundNodes acts as a filter.
3603For example:
3604compoundStmt(
3605 forEachDescendant(varDecl().bind("d")),
3606 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3607will trigger a match for each combination of variable declaration
3608and reference to that variable declaration within a compound statement.
3609</pre></td></tr>
3610
3611
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003612<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>
3613<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3614
3615Type has pointer identity in the AST.
3616</pre></td></tr>
3617
3618
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003619<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>
3620<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3621
3622Given
3623 int i;
3624 float f;
3625realFloatingPointType()
3626 matches "float f" but not "int i"
3627</pre></td></tr>
3628
3629
Aaron Ballman672dde22016-01-22 23:15:00 +00003630<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 +00003631<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3632
3633Given
3634 struct S { void func(); };
3635functionDecl(returns(voidType()))
3636 matches "void func();"
3637</pre></td></tr>
3638
3639
Aaron Ballman672dde22016-01-22 23:15:00 +00003640<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 +00003641<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3642
3643Given
3644 int x;
3645 int s = sizeof(x) + alignof(x)
3646unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3647 matches sizeof(x)
3648</pre></td></tr>
3649
3650
Aaron Ballman672dde22016-01-22 23:15:00 +00003651<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 +00003652<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3653unary).
3654
3655Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3656 !(a || b)
3657</pre></td></tr>
3658
3659
Aaron Ballman672dde22016-01-22 23:15:00 +00003660<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 +00003661<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3662
3663Example matches x, but not y, z, or a.
3664(matcher = varDecl(hasAutomaticStorageDuration())
3665void f() {
3666 int x;
3667 static int y;
3668 thread_local int z;
3669}
3670int a;
3671</pre></td></tr>
3672
3673
Aaron Ballman672dde22016-01-22 23:15:00 +00003674<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 +00003675<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3676
3677Example matches y and z (matcher = varDecl(hasGlobalStorage())
3678void f() {
3679 int x;
3680 static int y;
3681}
3682int z;
3683</pre></td></tr>
3684
3685
Aaron Ballman672dde22016-01-22 23:15:00 +00003686<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 +00003687<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3688non-static local variable.
3689
3690Example matches x (matcher = varDecl(hasLocalStorage())
3691void f() {
3692 int x;
3693 static int y;
3694}
3695int z;
3696</pre></td></tr>
3697
3698
Aaron Ballman672dde22016-01-22 23:15:00 +00003699<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 +00003700<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 +00003701It includes the variable declared at namespace scope and those declared
3702with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003703
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003704void f() {
3705 int x;
3706 static int y;
3707 thread_local int z;
3708}
3709int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003710static int b;
3711extern int c;
3712varDecl(hasStaticStorageDuration())
3713 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003714</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('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003718<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3719
3720Example matches z, but not x, z, or a.
3721(matcher = varDecl(hasThreadStorageDuration())
3722void f() {
3723 int x;
3724 static int y;
3725 thread_local int z;
3726}
3727int a;
3728</pre></td></tr>
3729
3730
Aaron Ballman672dde22016-01-22 23:15:00 +00003731<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 +00003732<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3733
3734Given:
3735 constexpr int foo = 42;
3736 constexpr int bar();
3737varDecl(isConstexpr())
3738 matches the declaration of foo.
3739functionDecl(isConstexpr())
3740 matches the declaration of bar.
3741</pre></td></tr>
3742
3743
Aaron Ballman672dde22016-01-22 23:15:00 +00003744<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 +00003745<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3746
3747Example matches A, va, fa
3748 class A {};
3749 class B; Doesn't match, as it has no body.
3750 int va;
3751 extern int vb; Doesn't match, as it doesn't define the variable.
3752 void fa() {}
3753 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003754 @interface X
3755 - (void)ma; Doesn't match, interface is declaration.
3756 @end
3757 @implementation X
3758 - (void)ma {}
3759 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003760
Dave Leebe398682017-11-14 14:17:26 +00003761Usable 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;,
3762 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003763</pre></td></tr>
3764
3765
Aaron Ballman672dde22016-01-22 23:15:00 +00003766<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 +00003767<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3768a C++ catch block, or an Objective-C statement.
3769
3770Example matches x (matcher = varDecl(isExceptionVariable())
3771void f(int y) {
3772 try {
3773 } catch (int x) {
3774 }
3775}
3776</pre></td></tr>
3777
3778
Aaron Ballman672dde22016-01-22 23:15:00 +00003779<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 +00003780<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3781static member variable template instantiations.
3782
3783Given
3784 template&lt;typename T&gt; void A(T t) { }
3785 template&lt;&gt; void A(int N) { }
3786functionDecl(isExplicitTemplateSpecialization())
3787 matches the specialization A&lt;int&gt;().
3788
Aaron Ballman672dde22016-01-22 23:15:00 +00003789Usable 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 +00003790</pre></td></tr>
3791
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003792<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 +00003793<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003794
3795Given:
3796 extern "C" void f() {}
3797 extern "C" { void g() {} }
3798 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003799 extern "C" int x = 1;
3800 extern "C" int y = 2;
3801 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003802functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003803 matches the declaration of f and g, but not the declaration of h.
3804varDecl(isExternC())
3805 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003806</pre></td></tr>
3807
Haojian Wub3d25462016-09-26 16:01:52 +00003808<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 +00003809<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3810class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003811
3812Given:
3813 static void f() {}
3814 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003815 extern int j;
3816 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003817functionDecl(isStaticStorageClass())
3818 matches the function declaration f.
3819varDecl(isStaticStorageClass())
3820 matches the variable declaration i.
3821</pre></td></tr>
3822
3823
Aaron Ballman672dde22016-01-22 23:15:00 +00003824<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003825<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3826member variable template instantiations.
3827
3828Given
3829 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3830or
3831 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3832cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3833 matches the template instantiation of X&lt;A&gt;.
3834
3835But given
3836 template &lt;typename T&gt; class X {}; class A {};
3837 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3838cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3839 does not match, as X&lt;A&gt; is an explicit template specialization.
3840
Aaron Ballman672dde22016-01-22 23:15:00 +00003841Usable 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 +00003842</pre></td></tr>
3843
3844
Aaron Ballman672dde22016-01-22 23:15:00 +00003845<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 +00003846<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3847template instantiations.
3848
3849Given
3850 template&lt;typename T&gt; void A(T t) { T i; }
3851 A(0);
3852 A(0U);
3853functionDecl(isInstantiated())
3854 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3855</pre></td></tr>
3856
3857
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003858<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>
3859<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3860GNU's __null, C++11's nullptr, or C's NULL macro.
3861
3862Given:
3863 void *v1 = NULL;
3864 void *v2 = nullptr;
3865 void *v3 = __null; GNU extension
3866 char *cp = (char *)0;
3867 int *ip = 0;
3868 int i = 0;
3869expr(nullPointerConstant())
3870 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3871 initializer for i.
3872</pre></td></tr>
3873
3874
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003875<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>
3876<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3877
3878This matcher is only provided as a performance optimization of hasName.
3879 hasAnyName(a, b, c)
3880 is equivalent to, but faster than
3881 anyOf(hasName(a), hasName(b), hasName(c))
3882</pre></td></tr>
3883
3884
Aaron Ballman672dde22016-01-22 23:15:00 +00003885<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 +00003886<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3887
3888Given
3889 int j;
3890 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3891 A(0);
3892 A(0U);
3893declStmt(isInTemplateInstantiation())
3894 matches 'int i;' and 'unsigned i'.
3895unless(stmt(isInTemplateInstantiation()))
3896 will NOT match j += 42; as it's shared between the template definition and
3897 instantiation.
3898</pre></td></tr>
3899
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003900<!--END_NARROWING_MATCHERS -->
3901</table>
3902
3903<!-- ======================================================================= -->
3904<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3905<!-- ======================================================================= -->
3906
3907<p>Traversal matchers specify the relationship to other nodes that are
3908reachable from the current node.</p>
3909
3910<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3911forEachDescendant) which work on all nodes and allow users to write more generic
3912match expressions.</p>
3913
3914<table>
3915<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003916<!-- START_TRAVERSAL_MATCHERS -->
3917
3918<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>
3919<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3920
3921Unlike anyOf, eachOf will generate a match result for each
3922matching submatcher.
3923
3924For example, in:
3925 class A { int a; int b; };
3926The matcher:
3927 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3928 has(fieldDecl(hasName("b")).bind("v"))))
3929will generate two results binding "v", the first of which binds
3930the field declaration of a, the second the field declaration of
3931b.
3932
3933Usable as: Any Matcher
3934</pre></td></tr>
3935
3936
3937<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3938<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3939provided matcher.
3940
3941Example matches X, A, B, C
3942 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3943 class X {}; Matches X, because X::X is a class of name X inside X.
3944 class A { class X {}; };
3945 class B { class C { class X {}; }; };
3946
3947DescendantT must be an AST base type.
3948
3949As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3950each result that matches instead of only on the first one.
3951
3952Note: Recursively combined ForEachDescendant can cause many matches:
3953 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3954 forEachDescendant(cxxRecordDecl())
3955 )))
3956will match 10 times (plus injected class name matches) on:
3957 class A { class B { class C { class D { class E {}; }; }; }; };
3958
3959Usable as: Any Matcher
3960</pre></td></tr>
3961
3962
3963<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3964<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3965provided matcher.
3966
3967Example matches X, Y
3968 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3969 class X {}; Matches X, because X::X is a class of name X inside X.
3970 class Y { class X {}; };
3971 class Z { class Y { class X {}; }; }; Does not match Z.
3972
3973ChildT must be an AST base type.
3974
3975As opposed to 'has', 'forEach' will cause a match for each result that
3976matches instead of only on the first one.
3977
3978Usable as: Any Matcher
3979</pre></td></tr>
3980
3981
3982<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3983<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3984matcher.
3985
3986Given
3987void f() { if (true) { int x = 42; } }
3988void g() { for (;;) { int x = 43; } }
3989expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3990
3991Usable as: Any Matcher
3992</pre></td></tr>
3993
3994
3995<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3996<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3997provided matcher.
3998
3999Example matches X, Y, Z
4000 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4001 class X {}; Matches X, because X::X is a class of name X inside X.
4002 class Y { class X {}; };
4003 class Z { class Y { class X {}; }; };
4004
4005DescendantT must be an AST base type.
4006
4007Usable as: Any Matcher
4008</pre></td></tr>
4009
4010
4011<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4012<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4013provided matcher.
4014
4015Example matches X, Y
4016 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4017 class X {}; Matches X, because X::X is a class of name X inside X.
4018 class Y { class X {}; };
4019 class Z { class Y { class X {}; }; }; Does not match Z.
4020
4021ChildT must be an AST base type.
4022
4023Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00004024Note that has is direct matcher, so it also matches things like implicit
4025casts and paren casts. If you are matching with expr then you should
4026probably consider using ignoringParenImpCasts like:
4027has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004028</pre></td></tr>
4029
4030
4031<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4032<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4033matcher.
4034
4035Given
4036void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4037compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4038
4039Usable as: Any Matcher
4040</pre></td></tr>
4041
4042
Etienne Bergeron5500f952016-05-30 15:25:25 +00004043<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>
4044<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4045switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004046
4047Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4048 if (true) {}
4049</pre></td></tr>
4050
4051
4052<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>
4053<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4054(binary or ternary).
4055
4056Example matches b
4057 condition ? a : b
4058 condition ?: b
4059</pre></td></tr>
4060
4061
4062<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>
4063<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4064
4065Example 1 (conditional ternary operator): matches a
4066 condition ? a : b
4067
4068Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4069 condition ?: b
4070</pre></td></tr>
4071
4072
Manuel Klimeka37e1102016-12-01 15:45:06 +00004073<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>
4074<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 +00004075matches the given matcher.
4076
4077The associated declaration is:
4078- for type nodes, the declaration of the underlying type
4079- for CallExpr, the declaration of the callee
4080- for MemberExpr, the declaration of the referenced member
4081- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004082- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004083
4084Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4085function. e.g. various subtypes of clang::Type and various expressions.
4086
Manuel Klimeka37e1102016-12-01 15:45:06 +00004087Usable 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;,
4088 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;,
4089 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;,
4090 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;,
4091 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;,
4092 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;,
4093 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004094</pre></td></tr>
4095
4096
Aaron Ballman672dde22016-01-22 23:15:00 +00004097<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004098<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4099
4100Given
4101 int i[5];
4102 void f() { i[1] = 42; }
4103arraySubscriptExpression(hasBase(implicitCastExpr(
4104 hasSourceExpression(declRefExpr()))))
4105 matches i[1] with the declRefExpr() matching i
4106</pre></td></tr>
4107
4108
Aaron Ballman672dde22016-01-22 23:15:00 +00004109<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 +00004110<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4111
4112Given
4113 int i[5];
4114 void f() { i[1] = 42; }
4115arraySubscriptExpression(hasIndex(integerLiteral()))
4116 matches i[1] with the integerLiteral() matching 1
4117</pre></td></tr>
4118
4119
Aaron Ballman672dde22016-01-22 23:15:00 +00004120<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 +00004121<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4122
4123Example matches a (matcher = binaryOperator(hasLHS()))
4124 a || b
4125</pre></td></tr>
4126
4127
Aaron Ballman672dde22016-01-22 23:15:00 +00004128<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004129<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4130
4131Example matches b (matcher = binaryOperator(hasRHS()))
4132 a || b
4133</pre></td></tr>
4134
4135
Aaron Ballman672dde22016-01-22 23:15:00 +00004136<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 +00004137<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4138type.
4139
4140Given
4141 struct A {};
4142 A a[7];
4143 int b[7];
4144arrayType(hasElementType(builtinType()))
4145 matches "int b[7]"
4146
Aaron Ballman672dde22016-01-22 23:15:00 +00004147Usable 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 +00004148</pre></td></tr>
4149
4150
Aaron Ballman672dde22016-01-22 23:15:00 +00004151<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004152<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4153type.
4154
4155Given
4156 struct A {};
4157 A a[7];
4158 int b[7];
4159arrayType(hasElementType(builtinType()))
4160 matches "int b[7]"
4161
Aaron Ballman672dde22016-01-22 23:15:00 +00004162Usable 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 +00004163</pre></td></tr>
4164
4165
Aaron Ballman672dde22016-01-22 23:15:00 +00004166<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 +00004167<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4168
4169Given
4170 _Atomic(int) i;
4171 _Atomic(float) f;
4172atomicType(hasValueType(isInteger()))
4173 matches "_Atomic(int) i"
4174
Aaron Ballman672dde22016-01-22 23:15:00 +00004175Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004176</pre></td></tr>
4177
4178
Aaron Ballman672dde22016-01-22 23:15:00 +00004179<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 +00004180<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4181
4182Given
4183 _Atomic(int) i;
4184 _Atomic(float) f;
4185atomicType(hasValueType(isInteger()))
4186 matches "_Atomic(int) i"
4187
Aaron Ballman672dde22016-01-22 23:15:00 +00004188Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004189</pre></td></tr>
4190
4191
Aaron Ballman672dde22016-01-22 23:15:00 +00004192<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 +00004193<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4194
4195Note: There is no TypeLoc for the deduced type and thus no
4196getDeducedLoc() matcher.
4197
4198Given
4199 auto a = 1;
4200 auto b = 2.0;
4201autoType(hasDeducedType(isInteger()))
4202 matches "auto a"
4203
Aaron Ballman672dde22016-01-22 23:15:00 +00004204Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004205</pre></td></tr>
4206
4207
Aaron Ballman672dde22016-01-22 23:15:00 +00004208<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 +00004209<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4210binary operator matches.
4211</pre></td></tr>
4212
4213
Aaron Ballman672dde22016-01-22 23:15:00 +00004214<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 +00004215<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4216
4217Example matches a (matcher = binaryOperator(hasLHS()))
4218 a || b
4219</pre></td></tr>
4220
4221
Aaron Ballman672dde22016-01-22 23:15:00 +00004222<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 +00004223<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4224
4225Example matches b (matcher = binaryOperator(hasRHS()))
4226 a || b
4227</pre></td></tr>
4228
4229
Aaron Ballman672dde22016-01-22 23:15:00 +00004230<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 +00004231<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4232pointee matches a given matcher.
4233
4234Given
4235 int *a;
4236 int const *b;
4237 float const *f;
4238pointerType(pointee(isConstQualified(), isInteger()))
4239 matches "int const *b"
4240
Aaron Ballman672dde22016-01-22 23:15:00 +00004241Usable 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;,
4242 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 +00004243</pre></td></tr>
4244
4245
Aaron Ballman672dde22016-01-22 23:15:00 +00004246<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 +00004247<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4248pointee matches a given matcher.
4249
4250Given
4251 int *a;
4252 int const *b;
4253 float const *f;
4254pointerType(pointee(isConstQualified(), isInteger()))
4255 matches "int const *b"
4256
Aaron Ballman672dde22016-01-22 23:15:00 +00004257Usable 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;,
4258 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 +00004259</pre></td></tr>
4260
4261
Aaron Ballman672dde22016-01-22 23:15:00 +00004262<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 +00004263<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4264
4265Given
4266 void f(int i);
4267 int y;
4268 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004269callExpr(
4270 forEachArgumentWithParam(
4271 declRefExpr(to(varDecl(hasName("y")))),
4272 parmVarDecl(hasType(isInteger()))
4273))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004274 matches f(y);
4275with declRefExpr(...)
4276 matching int y
4277and parmVarDecl(...)
4278 matching int i
4279</pre></td></tr>
4280
4281
Aaron Ballman672dde22016-01-22 23:15:00 +00004282<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 +00004283<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4284expression.
4285
4286Given
4287 void x(int, int, int) { int y; x(1, y, 42); }
4288callExpr(hasAnyArgument(declRefExpr()))
4289 matches x(1, y, 42)
4290with hasAnyArgument(...)
4291 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004292</pre></td></tr>
4293
4294
Aaron Ballman672dde22016-01-22 23:15:00 +00004295<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 +00004296<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4297call expression.
4298
4299Example matches y in x(y)
4300 (matcher = callExpr(hasArgument(0, declRefExpr())))
4301 void x(int) { int y; x(y); }
4302</pre></td></tr>
4303
4304
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004305<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>
4306<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 +00004307matches the given matcher.
4308
4309The associated declaration is:
4310- for type nodes, the declaration of the underlying type
4311- for CallExpr, the declaration of the callee
4312- for MemberExpr, the declaration of the referenced member
4313- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004314- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004315
4316Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4317function. e.g. various subtypes of clang::Type and various expressions.
4318
Manuel Klimeka37e1102016-12-01 15:45:06 +00004319Usable 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;,
4320 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;,
4321 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;,
4322 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;,
4323 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;,
4324 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;,
4325 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004326</pre></td></tr>
4327
4328
Aaron Ballman672dde22016-01-22 23:15:00 +00004329<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004330<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4331
4332Given
4333 class A { A() : i(42), j(42) {} int i; int j; };
4334cxxConstructorDecl(forEachConstructorInitializer(
4335 forField(decl().bind("x"))
4336))
4337 will trigger two matches, binding for 'i' and 'j' respectively.
4338</pre></td></tr>
4339
4340
Aaron Ballman672dde22016-01-22 23:15:00 +00004341<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 +00004342<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4343
4344Given
4345 struct Foo {
4346 Foo() : foo_(1) { }
4347 int foo_;
4348 };
4349cxxRecordDecl(has(cxxConstructorDecl(
4350 hasAnyConstructorInitializer(anything())
4351)))
4352 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4353</pre></td></tr>
4354
4355
Aaron Ballman672dde22016-01-22 23:15:00 +00004356<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004357<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4358
4359Given
4360 struct Foo {
4361 Foo() : foo_(1) { }
4362 int foo_;
4363 };
4364cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4365 forField(hasName("foo_"))))))
4366 matches Foo
4367with forField matching foo_
4368</pre></td></tr>
4369
4370
Aaron Ballman672dde22016-01-22 23:15:00 +00004371<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 +00004372<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4373
4374Given
4375 struct Foo {
4376 Foo() : foo_(1) { }
4377 int foo_;
4378 };
4379cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4380 withInitializer(integerLiteral(equals(1)))))))
4381 matches Foo
4382with withInitializer matching (1)
4383</pre></td></tr>
4384
4385
Aaron Ballman672dde22016-01-22 23:15:00 +00004386<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 +00004387<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4388definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004389
4390Given
4391 for (;;) {}
4392hasBody(compoundStmt())
4393 matches 'for (;;) {}'
4394with compoundStmt()
4395 matching '{}'
4396</pre></td></tr>
4397
4398
Aaron Ballman672dde22016-01-22 23:15:00 +00004399<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 +00004400<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4401
4402Example:
4403 forStmt(hasLoopVariable(anything()))
4404matches 'int x' in
4405 for (int x : a) { }
4406</pre></td></tr>
4407
4408
Aaron Ballman672dde22016-01-22 23:15:00 +00004409<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 +00004410<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4411
4412Example:
4413 forStmt(hasRangeInit(anything()))
4414matches 'a' in
4415 for (int x : a) { }
4416</pre></td></tr>
4417
4418
Aaron Ballman672dde22016-01-22 23:15:00 +00004419<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 +00004420<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4421
4422
Aaron Ballman672dde22016-01-22 23:15:00 +00004423<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004424<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4425
4426Example matches y.x()
4427 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4428 class Y { public: void x(); };
4429 void z() { Y y; y.x(); }",
4430
4431FIXME: Overload to allow directly matching types?
4432</pre></td></tr>
4433
4434
Aaron Ballman672dde22016-01-22 23:15:00 +00004435<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 +00004436<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4437</pre></td></tr>
4438
4439
Aaron Ballman672dde22016-01-22 23:15:00 +00004440<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 +00004441<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4442matcher, or is a pointer to a type that matches the InnerMatcher.
4443</pre></td></tr>
4444
4445
Clement Courbet6ecaec82016-07-05 07:49:31 +00004446<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 +00004447<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 +00004448produce multiple matches.
4449
4450Given
4451 class A { virtual void f(); };
4452 class B : public A { void f(); };
4453 class C : public B { void f(); };
4454cxxMethodDecl(ofClass(hasName("C")),
4455 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4456 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4457 that B::f is not overridden by C::f).
4458
4459The check can produce multiple matches in case of multiple inheritance, e.g.
4460 class A1 { virtual void f(); };
4461 class A2 { virtual void f(); };
4462 class C : public A1, public A2 { void f(); };
4463cxxMethodDecl(ofClass(hasName("C")),
4464 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4465 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4466 once with "b" binding "A2::f" and "d" binding "C::f".
4467</pre></td></tr>
4468
4469
Aaron Ballman672dde22016-01-22 23:15:00 +00004470<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 +00004471<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4472belongs to.
4473
4474FIXME: Generalize this for other kinds of declarations.
4475FIXME: What other kind of declarations would we need to generalize
4476this to?
4477
4478Example matches A() in the last line
4479 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4480 ofClass(hasName("A"))))))
4481 class A {
4482 public:
4483 A();
4484 };
4485 A a = A();
4486</pre></td></tr>
4487
4488
Adam Baloghda488a62017-11-23 12:43:20 +00004489<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4490<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
4491
4492Given:
4493 MyClass *p1 = new MyClass[10];
4494cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
4495 matches the expression 'new MyClass[10]'.
4496</pre></td></tr>
4497
4498
Manuel Klimeka37e1102016-12-01 15:45:06 +00004499<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>
4500<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 +00004501matches the given matcher.
4502
4503The associated declaration is:
4504- for type nodes, the declaration of the underlying type
4505- for CallExpr, the declaration of the callee
4506- for MemberExpr, the declaration of the referenced member
4507- for CXXConstructExpr, the declaration of the constructor
4508- for CXXNewExpr, the declaration of the operator new
4509
4510Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4511function. e.g. various subtypes of clang::Type and various expressions.
4512
Manuel Klimeka37e1102016-12-01 15:45:06 +00004513Usable 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;,
4514 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;,
4515 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;,
4516 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;,
4517 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;,
4518 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;,
4519 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004520</pre></td></tr>
4521
4522
Aaron Ballman672dde22016-01-22 23:15:00 +00004523<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 +00004524<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4525
4526Given:
4527 class A { void func(); };
4528 class B { void member(); };
4529
4530cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4531A but not B.
4532</pre></td></tr>
4533
4534
Aaron Ballman672dde22016-01-22 23:15:00 +00004535<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004536<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4537a class matching Base.
4538
4539Note that a class is not considered to be derived from itself.
4540
4541Example matches Y, Z, C (Base == hasName("X"))
4542 class X;
4543 class Y : public X {}; directly derived
4544 class Z : public Y {}; indirectly derived
4545 typedef X A;
4546 typedef A B;
4547 class C : public B {}; derived from a typedef of X
4548
4549In the following example, Bar matches isDerivedFrom(hasName("X")):
4550 class Foo;
4551 typedef Foo X;
4552 class Bar : public Foo {}; derived from a type that X is a typedef of
4553</pre></td></tr>
4554
4555
Aaron Ballman672dde22016-01-22 23:15:00 +00004556<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 +00004557<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4558match Base.
4559</pre></td></tr>
4560
4561
Aaron Ballman672dde22016-01-22 23:15:00 +00004562<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004563<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4564given matcher.
4565
4566Example matches y.x() (matcher = callExpr(callee(
4567 cxxMethodDecl(hasName("x")))))
4568 class Y { public: void x(); };
4569 void z() { Y y; y.x(); }
4570</pre></td></tr>
4571
4572
Aaron Ballman672dde22016-01-22 23:15:00 +00004573<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 +00004574<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4575
4576Given
4577 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4578 void f() { f(); }
4579callExpr(callee(expr()))
4580 matches this-&gt;x(), x(), y.x(), f()
4581with callee(...)
4582 matching this-&gt;x, x, y.x, f respectively
4583
Aaron Ballman672dde22016-01-22 23:15:00 +00004584Note: 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 +00004585because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004586internal::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 +00004587implemented in terms of implicit casts.
4588</pre></td></tr>
4589
4590
Aaron Ballman672dde22016-01-22 23:15:00 +00004591<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004592<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4593
4594Given
4595 void f(int i);
4596 int y;
4597 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004598callExpr(
4599 forEachArgumentWithParam(
4600 declRefExpr(to(varDecl(hasName("y")))),
4601 parmVarDecl(hasType(isInteger()))
4602))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004603 matches f(y);
4604with declRefExpr(...)
4605 matching int y
4606and parmVarDecl(...)
4607 matching int i
4608</pre></td></tr>
4609
4610
Aaron Ballman672dde22016-01-22 23:15:00 +00004611<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004612<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4613expression.
4614
4615Given
4616 void x(int, int, int) { int y; x(1, y, 42); }
4617callExpr(hasAnyArgument(declRefExpr()))
4618 matches x(1, y, 42)
4619with hasAnyArgument(...)
4620 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004621</pre></td></tr>
4622
4623
Aaron Ballman672dde22016-01-22 23:15:00 +00004624<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 +00004625<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4626call expression.
4627
4628Example matches y in x(y)
4629 (matcher = callExpr(hasArgument(0, declRefExpr())))
4630 void x(int) { int y; x(y); }
4631</pre></td></tr>
4632
4633
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004634<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>
4635<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 +00004636matches the given matcher.
4637
4638The associated declaration is:
4639- for type nodes, the declaration of the underlying type
4640- for CallExpr, the declaration of the callee
4641- for MemberExpr, the declaration of the referenced member
4642- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004643- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004644
4645Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4646function. e.g. various subtypes of clang::Type and various expressions.
4647
Manuel Klimeka37e1102016-12-01 15:45:06 +00004648Usable 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;,
4649 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;,
4650 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;,
4651 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;,
4652 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;,
4653 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;,
4654 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004655</pre></td></tr>
4656
4657
Aaron Ballman672dde22016-01-22 23:15:00 +00004658<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 +00004659<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4660extension, matches the constant given in the statement.
4661
4662Given
4663 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4664caseStmt(hasCaseConstant(integerLiteral()))
4665 matches "case 1:"
4666</pre></td></tr>
4667
4668
Aaron Ballman672dde22016-01-22 23:15:00 +00004669<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004670<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004671
4672
Aaron Ballman672dde22016-01-22 23:15:00 +00004673<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 +00004674<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4675functionDecl that have at least one TemplateArgument matching the given
4676InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004677
4678Given
4679 template&lt;typename T&gt; class A {};
4680 template&lt;&gt; class A&lt;double&gt; {};
4681 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004682
Haojian Wu99e39a72016-07-29 17:30:13 +00004683 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004684 void func() { f&lt;int&gt;(); };
4685
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004686classTemplateSpecializationDecl(hasAnyTemplateArgument(
4687 refersToType(asString("int"))))
4688 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004689
4690functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4691 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004692</pre></td></tr>
4693
4694
Manuel Klimek696e5052017-08-02 13:04:44 +00004695<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>
4696<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4697
4698Given
4699 tempalate&lt;typename T&gt; class A {};
4700 typedef A&lt;int&gt; B;
4701classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4702 matches 'B' with classTemplateDecl() matching the class template
4703 declaration of 'A'.
4704</pre></td></tr>
4705
4706
Aaron Ballman672dde22016-01-22 23:15:00 +00004707<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 +00004708<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4709functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004710
4711Given
4712 template&lt;typename T, typename U&gt; class A {};
4713 A&lt;bool, int&gt; b;
4714 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004715
Haojian Wu99e39a72016-07-29 17:30:13 +00004716 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004717 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004718classTemplateSpecializationDecl(hasTemplateArgument(
4719 1, refersToType(asString("int"))))
4720 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004721
4722functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4723 matches the specialization f&lt;int&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_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 +00004728<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4729type.
4730
4731Given
4732 struct A {};
4733 A a[7];
4734 int b[7];
4735arrayType(hasElementType(builtinType()))
4736 matches "int b[7]"
4737
Aaron Ballman672dde22016-01-22 23:15:00 +00004738Usable 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 +00004739</pre></td></tr>
4740
4741
Aaron Ballman672dde22016-01-22 23:15:00 +00004742<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 +00004743<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4744type.
4745
4746Given
4747 struct A {};
4748 A a[7];
4749 int b[7];
4750arrayType(hasElementType(builtinType()))
4751 matches "int b[7]"
4752
Aaron Ballman672dde22016-01-22 23:15:00 +00004753Usable 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 +00004754</pre></td></tr>
4755
4756
Aaron Ballman672dde22016-01-22 23:15:00 +00004757<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 +00004758<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 +00004759a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004760
4761Given
4762 { {}; 1+2; }
4763hasAnySubstatement(compoundStmt())
4764 matches '{ {}; 1+2; }'
4765with compoundStmt()
4766 matching '{}'
4767</pre></td></tr>
4768
4769
Aaron Ballman672dde22016-01-22 23:15:00 +00004770<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 +00004771<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4772</pre></td></tr>
4773
4774
Manuel Klimeka37e1102016-12-01 15:45:06 +00004775<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>
4776<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 +00004777matches the given matcher.
4778
4779The associated declaration is:
4780- for type nodes, the declaration of the underlying type
4781- for CallExpr, the declaration of the callee
4782- for MemberExpr, the declaration of the referenced member
4783- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004784- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004785
4786Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4787function. e.g. various subtypes of clang::Type and various expressions.
4788
Manuel Klimeka37e1102016-12-01 15:45:06 +00004789Usable 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;,
4790 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;,
4791 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;,
4792 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;,
4793 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;,
4794 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;,
4795 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004796</pre></td></tr>
4797
4798
Aaron Ballman672dde22016-01-22 23:15:00 +00004799<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 +00004800<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4801specific using shadow declaration.
4802
4803Given
4804 namespace a { void f() {} }
4805 using a::f;
4806 void g() {
4807 f(); Matches this ..
4808 a::f(); .. but not this.
4809 }
4810declRefExpr(throughUsingDecl(anything()))
4811 matches f()
4812</pre></td></tr>
4813
4814
Aaron Ballman672dde22016-01-22 23:15:00 +00004815<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 +00004816<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4817specified matcher.
4818
4819Example matches x in if(x)
4820 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4821 bool x;
4822 if (x) {}
4823</pre></td></tr>
4824
4825
Aaron Ballman672dde22016-01-22 23:15:00 +00004826<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 +00004827<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4828
4829Note that this does not work for global declarations because the AST
4830breaks up multiple-declaration DeclStmt's into multiple single-declaration
4831DeclStmt's.
4832Example: Given non-global declarations
4833 int a, b = 0;
4834 int c;
4835 int d = 2, e;
4836declStmt(containsDeclaration(
4837 0, varDecl(hasInitializer(anything()))))
4838 matches only 'int d = 2, e;', and
4839declStmt(containsDeclaration(1, varDecl()))
4840 matches 'int a, b = 0' as well as 'int d = 2, e;'
4841 but 'int c;' is not matched.
4842</pre></td></tr>
4843
4844
Aaron Ballman672dde22016-01-22 23:15:00 +00004845<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004846<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4847
4848Given
4849 int a, b;
4850 int c;
4851declStmt(hasSingleDecl(anything()))
4852 matches 'int c;' but not 'int a, b;'.
4853</pre></td></tr>
4854
4855
Aaron Ballman672dde22016-01-22 23:15:00 +00004856<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 +00004857<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4858the inner matcher.
4859
4860Given
4861 int x;
4862declaratorDecl(hasTypeLoc(loc(asString("int"))))
4863 matches int x
4864</pre></td></tr>
4865
4866
Aaron Ballman672dde22016-01-22 23:15:00 +00004867<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 +00004868<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4869Decl, matches InnerMatcher.
4870
4871Given
4872 namespace N {
4873 namespace M {
4874 class D {};
4875 }
4876 }
4877
4878cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4879declaration of class D.
4880</pre></td></tr>
4881
4882
Aaron Ballman672dde22016-01-22 23:15:00 +00004883<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 +00004884<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4885definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004886
4887Given
4888 for (;;) {}
4889hasBody(compoundStmt())
4890 matches 'for (;;) {}'
4891with compoundStmt()
4892 matching '{}'
4893</pre></td></tr>
4894
4895
Aaron Ballman672dde22016-01-22 23:15:00 +00004896<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 +00004897<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 +00004898switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004899
4900Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4901 if (true) {}
4902</pre></td></tr>
4903
4904
Aaron Ballman672dde22016-01-22 23:15:00 +00004905<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004906<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4907matches InnerMatcher if the qualifier exists.
4908
4909Given
4910 namespace N {
4911 namespace M {
4912 class D {};
4913 }
4914 }
4915 N::M::D d;
4916
4917elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4918matches the type of the variable declaration of d.
4919</pre></td></tr>
4920
4921
Aaron Ballman672dde22016-01-22 23:15:00 +00004922<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 +00004923<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4924
4925Given
4926 namespace N {
4927 namespace M {
4928 class D {};
4929 }
4930 }
4931 N::M::D d;
4932
4933elaboratedType(namesType(recordType(
4934hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4935declaration of d.
4936</pre></td></tr>
4937
4938
Manuel Klimeka37e1102016-12-01 15:45:06 +00004939<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>
4940<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 +00004941matches the given matcher.
4942
4943The associated declaration is:
4944- for type nodes, the declaration of the underlying type
4945- for CallExpr, the declaration of the callee
4946- for MemberExpr, the declaration of the referenced member
4947- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004948- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004949
4950Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4951function. e.g. various subtypes of clang::Type and various expressions.
4952
Manuel Klimeka37e1102016-12-01 15:45:06 +00004953Usable 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;,
4954 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;,
4955 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;,
4956 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;,
4957 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;,
4958 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;,
4959 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004960</pre></td></tr>
4961
4962
Aaron Ballman672dde22016-01-22 23:15:00 +00004963<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 +00004964<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4965
4966(Note: Clang's AST refers to other conversions as "casts" too, and calls
4967actual casts "explicit" casts.)
4968</pre></td></tr>
4969
4970
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004971<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>
4972<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 +00004973declaration's type.
4974
4975In case of a value declaration (for example a variable declaration),
4976this resolves one layer of indirection. For example, in the value
4977declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4978X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4979declaration of x.
4980
4981Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4982 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4983 class X {};
4984 void y(X &amp;x) { x; X z; }
4985
Aaron Ballman672dde22016-01-22 23:15:00 +00004986Usable 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 +00004987</pre></td></tr>
4988
4989
Aaron Ballman672dde22016-01-22 23:15:00 +00004990<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 +00004991<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4992matcher.
4993
4994Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4995 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004996 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004997 class X {};
4998 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004999 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005000</pre></td></tr>
5001
5002
Aaron Ballman672dde22016-01-22 23:15:00 +00005003<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 +00005004<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5005are stripped off.
5006
5007Parentheses and explicit casts are not discarded.
5008Given
5009 int arr[5];
5010 int a = 0;
5011 char b = 0;
5012 const int c = a;
5013 int *d = arr;
5014 long e = (long) 0l;
5015The matchers
5016 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5017 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5018would match the declarations for a, b, c, and d, but not e.
5019While
5020 varDecl(hasInitializer(integerLiteral()))
5021 varDecl(hasInitializer(declRefExpr()))
5022only match the declarations for b, c, and d.
5023</pre></td></tr>
5024
5025
Cong Liu8a02efb2016-06-24 09:38:03 +00005026<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>
5027<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5028nodes are stripped off.
5029
5030Parentheses and explicit casts are not discarded.
5031Given
5032 class C {};
5033 C a = C();
5034 C b;
5035 C c = b;
5036The matchers
5037 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5038would match the declarations for a, b, and c.
5039While
5040 varDecl(hasInitializer(cxxConstructExpr()))
5041only match the declarations for b and c.
5042</pre></td></tr>
5043
5044
Aaron Ballman672dde22016-01-22 23:15:00 +00005045<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 +00005046<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5047casts are stripped off.
5048
5049Implicit and non-C Style casts are also discarded.
5050Given
5051 int a = 0;
5052 char b = (0);
5053 void* c = reinterpret_cast&lt;char*&gt;(0);
5054 char d = char(0);
5055The matcher
5056 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5057would match the declarations for a, b, c, and d.
5058while
5059 varDecl(hasInitializer(integerLiteral()))
5060only match the declaration for a.
5061</pre></td></tr>
5062
5063
Aaron Ballman672dde22016-01-22 23:15:00 +00005064<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 +00005065<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5066parentheses are stripped off.
5067
5068Explicit casts are not discarded.
5069Given
5070 int arr[5];
5071 int a = 0;
5072 char b = (0);
5073 const int c = a;
5074 int *d = (arr);
5075 long e = ((long) 0l);
5076The matchers
5077 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5078 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5079would match the declarations for a, b, c, and d, but not e.
5080while
5081 varDecl(hasInitializer(integerLiteral()))
5082 varDecl(hasInitializer(declRefExpr()))
5083would only match the declaration for a.
5084</pre></td></tr>
5085
5086
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00005087<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>
5088<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5089
5090Given
5091 class C {
5092 int a = 2;
5093 int b = 3;
5094 int c;
5095 };
5096fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5097 matches 'int a;' but not 'int b;'.
5098fieldDecl(hasInClassInitializer(anything()))
5099 matches 'int a;' and 'int b;' but not 'int c;'.
5100</pre></td></tr>
5101
5102
Aaron Ballman672dde22016-01-22 23:15:00 +00005103<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 +00005104<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5105definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005106
5107Given
5108 for (;;) {}
5109hasBody(compoundStmt())
5110 matches 'for (;;) {}'
5111with compoundStmt()
5112 matching '{}'
5113</pre></td></tr>
5114
5115
Aaron Ballman672dde22016-01-22 23:15:00 +00005116<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 +00005117<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 +00005118switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005119
5120Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5121 if (true) {}
5122</pre></td></tr>
5123
5124
Aaron Ballman672dde22016-01-22 23:15:00 +00005125<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 +00005126<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5127
5128Example:
5129 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5130matches '++x' in
5131 for (x; x &lt; N; ++x) { }
5132</pre></td></tr>
5133
5134
Aaron Ballman672dde22016-01-22 23:15:00 +00005135<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 +00005136<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5137
5138Example:
5139 forStmt(hasLoopInit(declStmt()))
5140matches 'int x = 0' in
5141 for (int x = 0; x &lt; N; ++x) { }
5142</pre></td></tr>
5143
5144
Aaron Ballman672dde22016-01-22 23:15:00 +00005145<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 +00005146<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5147
5148Does not match the 'this' parameter of a method.
5149
5150Given
5151 class X { void f(int x, int y, int z) {} };
5152cxxMethodDecl(hasAnyParameter(hasName("y")))
5153 matches f(int x, int y, int z) {}
5154with hasAnyParameter(...)
5155 matching int y
5156</pre></td></tr>
5157
5158
Haojian Wud898b092016-07-29 13:57:27 +00005159<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>
5160<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5161functionDecl that have at least one TemplateArgument matching the given
5162InnerMatcher.
5163
5164Given
5165 template&lt;typename T&gt; class A {};
5166 template&lt;&gt; class A&lt;double&gt; {};
5167 A&lt;int&gt; a;
5168
Haojian Wu99e39a72016-07-29 17:30:13 +00005169 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005170 void func() { f&lt;int&gt;(); };
5171
5172classTemplateSpecializationDecl(hasAnyTemplateArgument(
5173 refersToType(asString("int"))))
5174 matches the specialization A&lt;int&gt;
5175
5176functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5177 matches the specialization f&lt;int&gt;
5178</pre></td></tr>
5179
5180
Aaron Ballman672dde22016-01-22 23:15:00 +00005181<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 +00005182<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5183definition that has a given body.
5184
5185Given
5186 for (;;) {}
5187hasBody(compoundStmt())
5188 matches 'for (;;) {}'
5189with compoundStmt()
5190 matching '{}'
5191</pre></td></tr>
5192
5193
Aaron Ballman672dde22016-01-22 23:15:00 +00005194<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 +00005195<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5196
5197Given
5198 class X { void f(int x) {} };
5199cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5200 matches f(int x) {}
5201with hasParameter(...)
5202 matching int x
5203</pre></td></tr>
5204
5205
Haojian Wud898b092016-07-29 13:57:27 +00005206<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>
5207<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5208functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5209
5210Given
5211 template&lt;typename T, typename U&gt; class A {};
5212 A&lt;bool, int&gt; b;
5213 A&lt;int, bool&gt; c;
5214
Haojian Wu99e39a72016-07-29 17:30:13 +00005215 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005216 void func() { f&lt;int&gt;(); };
5217classTemplateSpecializationDecl(hasTemplateArgument(
5218 1, refersToType(asString("int"))))
5219 matches the specialization A&lt;bool, int&gt;
5220
5221functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5222 matches the specialization f&lt;int&gt;
5223</pre></td></tr>
5224
5225
Aaron Ballman672dde22016-01-22 23:15:00 +00005226<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 +00005227<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5228
5229Given:
5230 class X { int f() { return 1; } };
5231cxxMethodDecl(returns(asString("int")))
5232 matches int f() { return 1; }
5233</pre></td></tr>
5234
5235
Aaron Ballman672dde22016-01-22 23:15:00 +00005236<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 +00005237<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 +00005238switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005239
5240Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5241 if (true) {}
5242</pre></td></tr>
5243
5244
Aaron Ballman672dde22016-01-22 23:15:00 +00005245<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005246<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5247
5248Given
5249 if (A* a = GetAPointer()) {}
5250hasConditionVariableStatement(...)
5251 matches 'A* a = GetAPointer()'.
5252</pre></td></tr>
5253
5254
Aaron Ballman672dde22016-01-22 23:15:00 +00005255<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 +00005256<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5257
5258Examples matches the if statement
5259 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5260 if (false) false; else true;
5261</pre></td></tr>
5262
5263
Aaron Ballman672dde22016-01-22 23:15:00 +00005264<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 +00005265<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5266
5267Examples matches the if statement
5268 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5269 if (false) true; else false;
5270</pre></td></tr>
5271
5272
Aaron Ballman672dde22016-01-22 23:15:00 +00005273<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 +00005274<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5275matcher.
5276
5277FIXME: Unit test this matcher
5278</pre></td></tr>
5279
5280
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005281<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>
5282<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5283(if expression have it).
5284</pre></td></tr>
5285
5286
Manuel Klimeka37e1102016-12-01 15:45:06 +00005287<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 +00005288<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5289matches the given matcher.
5290
5291The associated declaration is:
5292- for type nodes, the declaration of the underlying type
5293- for CallExpr, the declaration of the callee
5294- for MemberExpr, the declaration of the referenced member
5295- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005296- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005297
5298Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5299function. e.g. various subtypes of clang::Type and various expressions.
5300
Manuel Klimeka37e1102016-12-01 15:45:06 +00005301Usable 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;,
5302 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;,
5303 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;,
5304 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;,
5305 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;,
5306 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;,
5307 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5308</pre></td></tr>
5309
5310
5311<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>
5312<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5313matches the given matcher.
5314
5315The associated declaration is:
5316- for type nodes, the declaration of the underlying type
5317- for CallExpr, the declaration of the callee
5318- for MemberExpr, the declaration of the referenced member
5319- for CXXConstructExpr, the declaration of the constructor
5320- for CXXNewExpr, the declaration of the operator new
5321
5322Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5323function. e.g. various subtypes of clang::Type and various expressions.
5324
5325Usable 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;,
5326 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;,
5327 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;,
5328 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;,
5329 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;,
5330 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;,
5331 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005332</pre></td></tr>
5333
5334
Aaron Ballman672dde22016-01-22 23:15:00 +00005335<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 +00005336<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5337matches the given matcher.
5338
5339The associated declaration is:
5340- for type nodes, the declaration of the underlying type
5341- for CallExpr, the declaration of the callee
5342- for MemberExpr, the declaration of the referenced member
5343- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005344- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005345
5346Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5347function. e.g. various subtypes of clang::Type and various expressions.
5348
Manuel Klimeka37e1102016-12-01 15:45:06 +00005349Usable 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;,
5350 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;,
5351 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;,
5352 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;,
5353 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;,
5354 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;,
5355 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005356</pre></td></tr>
5357
5358
Aaron Ballman672dde22016-01-22 23:15:00 +00005359<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 +00005360<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5361matched by a given matcher.
5362
5363Given
5364 struct X { int m; };
5365 void f(X x) { x.m; m; }
5366memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5367 matches "x.m" and "m"
5368with hasObjectExpression(...)
5369 matching "x" and the implicit object expression of "m" which has type X*.
5370</pre></td></tr>
5371
5372
Aaron Ballman672dde22016-01-22 23:15:00 +00005373<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 +00005374<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5375given matcher.
5376
5377Given
5378 struct { int first, second; } first, second;
5379 int i(second.first);
5380 int j(first.second);
5381memberExpr(member(hasName("first")))
5382 matches second.first
5383 but not first.second (because the member name there is "second").
5384</pre></td></tr>
5385
5386
Aaron Ballman672dde22016-01-22 23:15:00 +00005387<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005388<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5389pointee matches a given matcher.
5390
5391Given
5392 int *a;
5393 int const *b;
5394 float const *f;
5395pointerType(pointee(isConstQualified(), isInteger()))
5396 matches "int const *b"
5397
Aaron Ballman672dde22016-01-22 23:15:00 +00005398Usable 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;,
5399 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 +00005400</pre></td></tr>
5401
5402
Aaron Ballman672dde22016-01-22 23:15:00 +00005403<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 +00005404<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5405pointee matches a given matcher.
5406
5407Given
5408 int *a;
5409 int const *b;
5410 float const *f;
5411pointerType(pointee(isConstQualified(), isInteger()))
5412 matches "int const *b"
5413
Aaron Ballman672dde22016-01-22 23:15:00 +00005414Usable 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;,
5415 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 +00005416</pre></td></tr>
5417
5418
Martin Bohme8cef2c22016-08-09 15:07:52 +00005419<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>
5420<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5421matcher.
5422
5423Given
5424 namespace N { template&lt;class T&gt; void f(T t); }
5425 template &lt;class T&gt; void g() { using N::f; f(T()); }
5426unresolvedLookupExpr(hasAnyDeclaration(
5427 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5428 matches the use of f in g() .
5429</pre></td></tr>
5430
5431
Aaron Ballman672dde22016-01-22 23:15:00 +00005432<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 +00005433<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5434
5435Given
5436 struct A { struct B { struct C {}; }; };
5437 A::B::C c;
5438nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5439 matches "A::"
5440</pre></td></tr>
5441
5442
Aaron Ballman672dde22016-01-22 23:15:00 +00005443<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 +00005444<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5445given TypeLoc.
5446
5447Given
5448 struct A { struct B { struct C {}; }; };
5449 A::B::C c;
5450nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5451 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5452 matches "A::"
5453</pre></td></tr>
5454
5455
Aaron Ballman672dde22016-01-22 23:15:00 +00005456<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 +00005457<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5458
5459Given
5460 struct A { struct B { struct C {}; }; };
5461 A::B::C c;
5462nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5463 matches "A::"
5464</pre></td></tr>
5465
5466
Aaron Ballman672dde22016-01-22 23:15:00 +00005467<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 +00005468<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5469given namespace matcher.
5470
5471Given
5472 namespace ns { struct A {}; }
5473 ns::A a;
5474nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5475 matches "ns::"
5476</pre></td></tr>
5477
5478
Aaron Ballman672dde22016-01-22 23:15:00 +00005479<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 +00005480<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5481given QualType matcher without qualifiers.
5482
5483Given
5484 struct A { struct B { struct C {}; }; };
5485 A::B::C c;
5486nestedNameSpecifier(specifiesType(
5487 hasDeclaration(cxxRecordDecl(hasName("A")))
5488))
5489 matches "A::"
5490</pre></td></tr>
5491
5492
Aaron Ballman672dde22016-01-22 23:15:00 +00005493<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 +00005494<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5495call expression.
5496
5497Example matches y in x(y)
5498 (matcher = callExpr(hasArgument(0, declRefExpr())))
5499 void x(int) { int y; x(y); }
5500</pre></td></tr>
5501
5502
Aaron Ballman672dde22016-01-22 23:15:00 +00005503<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 +00005504<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5505
5506Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005507matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005508matches the [webView ...] message invocation.
5509 NSString *webViewJavaScript = ...
5510 UIWebView *webView = ...
5511 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5512</pre></td></tr>
5513
5514
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005515<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>
5516<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5517
5518
Martin Bohme8cef2c22016-08-09 15:07:52 +00005519<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>
5520<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5521overloads matches the given matcher.
5522
5523Given
5524 template &lt;typename T&gt; void foo(T);
5525 template &lt;typename T&gt; void bar(T);
5526 template &lt;typename T&gt; void baz(T t) {
5527 foo(t);
5528 bar(t);
5529 }
5530unresolvedLookupExpr(hasAnyDeclaration(
5531 functionTemplateDecl(hasName("foo"))))
5532 matches foo in foo(t); but not bar in bar(t);
5533</pre></td></tr>
5534
5535
Aaron Ballman672dde22016-01-22 23:15:00 +00005536<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 +00005537<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5538
5539Given
5540 int (*ptr_to_array)[4];
5541 int (*ptr_to_func)(int);
5542
5543varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5544ptr_to_func but not ptr_to_array.
5545
Aaron Ballman672dde22016-01-22 23:15:00 +00005546Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005547</pre></td></tr>
5548
5549
Aaron Ballman672dde22016-01-22 23:15:00 +00005550<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 +00005551<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5552pointee matches a given matcher.
5553
5554Given
5555 int *a;
5556 int const *b;
5557 float const *f;
5558pointerType(pointee(isConstQualified(), isInteger()))
5559 matches "int const *b"
5560
Aaron Ballman672dde22016-01-22 23:15:00 +00005561Usable 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;,
5562 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 +00005563</pre></td></tr>
5564
5565
Aaron Ballman672dde22016-01-22 23:15:00 +00005566<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 +00005567<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5568pointee matches a given matcher.
5569
5570Given
5571 int *a;
5572 int const *b;
5573 float const *f;
5574pointerType(pointee(isConstQualified(), isInteger()))
5575 matches "int const *b"
5576
Aaron Ballman672dde22016-01-22 23:15:00 +00005577Usable 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;,
5578 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 +00005579</pre></td></tr>
5580
5581
Aaron Ballman672dde22016-01-22 23:15:00 +00005582<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 +00005583<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5584
5585Given:
5586 typedef int &amp;int_ref;
5587 int a;
5588 int_ref b = a;
5589
5590varDecl(hasType(qualType(referenceType()))))) will not match the
5591declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
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_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 +00005596<tr><td colspan="4" class="doc" id="hasDeclaration6"><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 Ballmanba8dbbe2016-06-06 18:52:17 +00005619<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>
5620<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5621
5622Given
5623 void (*fp)(void);
5624The matcher
5625 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5626would match the declaration for fp.
5627</pre></td></tr>
5628
5629
Aaron Ballman672dde22016-01-22 23:15:00 +00005630<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 +00005631<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5632</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_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 +00005636<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5637matches the specified matcher.
5638
5639Example matches y-&gt;x()
5640 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5641 cxxRecordDecl(hasName("Y")))))))
5642 class Y { public: void x(); };
5643 void z() { Y *y; y-&gt;x(); }
5644</pre></td></tr>
5645
5646
Aaron Ballman672dde22016-01-22 23:15:00 +00005647<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 +00005648<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5649</pre></td></tr>
5650
5651
Aaron Ballman672dde22016-01-22 23:15:00 +00005652<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 +00005653<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5654type matches the specified matcher.
5655
5656Example matches X &amp;x and const X &amp;y
5657 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5658 class X {
5659 void a(X b) {
5660 X &amp;x = b;
5661 const X &amp;y = b;
5662 }
5663 };
5664</pre></td></tr>
5665
5666
Aaron Ballman672dde22016-01-22 23:15:00 +00005667<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005668<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5669matches the given matcher.
5670
5671The associated declaration is:
5672- for type nodes, the declaration of the underlying type
5673- for CallExpr, the declaration of the callee
5674- for MemberExpr, the declaration of the referenced member
5675- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005676- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005677
5678Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5679function. e.g. various subtypes of clang::Type and various expressions.
5680
Manuel Klimeka37e1102016-12-01 15:45:06 +00005681Usable 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;,
5682 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;,
5683 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;,
5684 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;,
5685 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;,
5686 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;,
5687 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005688</pre></td></tr>
5689
5690
Aaron Ballman672dde22016-01-22 23:15:00 +00005691<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 +00005692<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5693pointee matches a given matcher.
5694
5695Given
5696 int *a;
5697 int const *b;
5698 float const *f;
5699pointerType(pointee(isConstQualified(), isInteger()))
5700 matches "int const *b"
5701
Aaron Ballman672dde22016-01-22 23:15:00 +00005702Usable 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;,
5703 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 +00005704</pre></td></tr>
5705
5706
Aaron Ballman672dde22016-01-22 23:15:00 +00005707<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 +00005708<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5709pointee matches a given matcher.
5710
5711Given
5712 int *a;
5713 int const *b;
5714 float const *f;
5715pointerType(pointee(isConstQualified(), isInteger()))
5716 matches "int const *b"
5717
Aaron Ballman672dde22016-01-22 23:15:00 +00005718Usable 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;,
5719 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 +00005720</pre></td></tr>
5721
5722
Alexander Kornienko976921d2016-03-22 11:03:03 +00005723<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>
5724<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5725
5726Given
5727 return a + b;
5728hasReturnValue(binaryOperator())
5729 matches 'return a + b'
5730with binaryOperator()
5731 matching 'a + b'
5732</pre></td></tr>
5733
5734
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005735<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>
5736<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5737a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5738
5739Given
5740 { {}; 1+2; }
5741hasAnySubstatement(compoundStmt())
5742 matches '{ {}; 1+2; }'
5743with compoundStmt()
5744 matching '{}'
5745</pre></td></tr>
5746
5747
Aaron Ballman672dde22016-01-22 23:15:00 +00005748<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 +00005749<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5750alignof.
5751</pre></td></tr>
5752
5753
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005754<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 +00005755<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 +00005756
5757Given:
5758F&amp; operator=(const F&amp; o) {
5759 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5760 return *this;
5761}
5762returnStmt(forFunction(hasName("operator=")))
5763 matches 'return *this'
5764 but does match 'return &gt; 0'
5765</pre></td></tr>
5766
5767
Aaron Ballman672dde22016-01-22 23:15:00 +00005768<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 +00005769<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5770sizeof.
5771</pre></td></tr>
5772
5773
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005774<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>
5775<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5776type that matches the provided matcher.
5777
5778Given
5779 template &lt;typename T&gt;
5780 double F(T t);
5781 int i;
5782 double j = F(i);
5783
5784substTemplateTypeParmType(hasReplacementType(type())) matches int
5785</pre></td></tr>
5786
5787
Aaron Ballman672dde22016-01-22 23:15:00 +00005788<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 +00005789<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5790statement. This matcher may produce multiple matches.
5791
5792Given
5793 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5794switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5795 matches four times, with "c" binding each of "case 1:", "case 2:",
5796"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5797"switch (1)", "switch (2)" and "switch (2)".
5798</pre></td></tr>
5799
5800
Etienne Bergeron5500f952016-05-30 15:25:25 +00005801<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>
5802<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5803switch statement or conditional operator.
5804
5805Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5806 if (true) {}
5807</pre></td></tr>
5808
5809
Aaron Ballman672dde22016-01-22 23:15:00 +00005810<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 +00005811<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5812matches the given matcher.
5813
5814The associated declaration is:
5815- for type nodes, the declaration of the underlying type
5816- for CallExpr, the declaration of the callee
5817- for MemberExpr, the declaration of the referenced member
5818- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005819- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005820
5821Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5822function. e.g. various subtypes of clang::Type and various expressions.
5823
Manuel Klimeka37e1102016-12-01 15:45:06 +00005824Usable 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;,
5825 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;,
5826 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;,
5827 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;,
5828 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;,
5829 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;,
5830 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005831</pre></td></tr>
5832
5833
Aaron Ballman672dde22016-01-22 23:15:00 +00005834<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 +00005835<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5836
5837Given
5838 template&lt;typename T&gt; struct A {};
5839 struct B { B* next; };
5840 A&lt;&amp;B::next&gt; a;
5841templateSpecializationType(hasAnyTemplateArgument(
5842 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5843 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5844 B::next
5845</pre></td></tr>
5846
5847
Aaron Ballman672dde22016-01-22 23:15:00 +00005848<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 +00005849<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5850declaration.
5851
5852Given
5853 template&lt;typename T&gt; struct A {};
5854 struct B { B* next; };
5855 A&lt;&amp;B::next&gt; a;
5856classTemplateSpecializationDecl(hasAnyTemplateArgument(
5857 refersToDeclaration(fieldDecl(hasName("next"))))
5858 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5859 B::next
5860</pre></td></tr>
5861
5862
Aaron Ballman672dde22016-01-22 23:15:00 +00005863<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 +00005864<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5865
5866Given
5867 template&lt;int T&gt; struct A {};
5868 C&lt;42&gt; c;
5869classTemplateSpecializationDecl(
5870 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5871 matches the implicit instantiation of C in C&lt;42&gt;.
5872</pre></td></tr>
5873
5874
Haojian Wub33b02e2016-07-29 15:45:11 +00005875<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>
5876<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5877
5878Given
5879 template&lt;template &lt;typename&gt; class S&gt; class X {};
5880 template&lt;typename T&gt; class Y {};"
5881 X&lt;Y&gt; xi;
5882classTemplateSpecializationDecl(hasAnyTemplateArgument(
5883 refersToTemplate(templateName())))
5884 matches the specialization X&lt;Y&gt;
5885</pre></td></tr>
5886
5887
Aaron Ballman672dde22016-01-22 23:15:00 +00005888<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 +00005889<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5890
5891Given
5892 struct X {};
5893 template&lt;typename T&gt; struct A {};
5894 A&lt;X&gt; a;
5895classTemplateSpecializationDecl(hasAnyTemplateArgument(
5896 refersToType(class(hasName("X")))))
5897 matches the specialization A&lt;X&gt;
5898</pre></td></tr>
5899
5900
Aaron Ballman672dde22016-01-22 23:15:00 +00005901<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 +00005902<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5903functionDecl that have at least one TemplateArgument matching the given
5904InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005905
5906Given
5907 template&lt;typename T&gt; class A {};
5908 template&lt;&gt; class A&lt;double&gt; {};
5909 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005910
Haojian Wu99e39a72016-07-29 17:30:13 +00005911 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005912 void func() { f&lt;int&gt;(); };
5913
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005914classTemplateSpecializationDecl(hasAnyTemplateArgument(
5915 refersToType(asString("int"))))
5916 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005917
5918functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5919 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005920</pre></td></tr>
5921
5922
Aaron Ballman672dde22016-01-22 23:15:00 +00005923<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 +00005924<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5925matches the given matcher.
5926
5927The associated declaration is:
5928- for type nodes, the declaration of the underlying type
5929- for CallExpr, the declaration of the callee
5930- for MemberExpr, the declaration of the referenced member
5931- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005932- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005933
5934Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5935function. e.g. various subtypes of clang::Type and various expressions.
5936
Manuel Klimeka37e1102016-12-01 15:45:06 +00005937Usable 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;,
5938 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;,
5939 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;,
5940 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;,
5941 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;,
5942 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;,
5943 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005944</pre></td></tr>
5945
5946
Aaron Ballman672dde22016-01-22 23:15:00 +00005947<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 +00005948<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5949functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005950
5951Given
5952 template&lt;typename T, typename U&gt; class A {};
5953 A&lt;bool, int&gt; b;
5954 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005955
Haojian Wu99e39a72016-07-29 17:30:13 +00005956 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005957 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005958classTemplateSpecializationDecl(hasTemplateArgument(
5959 1, refersToType(asString("int"))))
5960 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005961
5962functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5963 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005964</pre></td></tr>
5965
5966
Aaron Ballman672dde22016-01-22 23:15:00 +00005967<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 +00005968<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5969matches the given matcher.
5970
5971The associated declaration is:
5972- for type nodes, the declaration of the underlying type
5973- for CallExpr, the declaration of the callee
5974- for MemberExpr, the declaration of the referenced member
5975- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005976- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005977
5978Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5979function. e.g. various subtypes of clang::Type and various expressions.
5980
Manuel Klimeka37e1102016-12-01 15:45:06 +00005981Usable 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;,
5982 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;,
5983 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;,
5984 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;,
5985 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;,
5986 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;,
5987 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005988</pre></td></tr>
5989
5990
5991<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>
5992<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5993
5994Generates results for each match.
5995
5996For example, in:
5997 class A { class B {}; class C {}; };
5998The matcher:
5999 cxxRecordDecl(hasName("::A"),
6000 findAll(cxxRecordDecl(isDefinition()).bind("m")))
6001will generate results for A, B and C.
6002
6003Usable as: Any Matcher
6004</pre></td></tr>
6005
6006
Aaron Ballman66eb58a2016-04-14 16:05:45 +00006007<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 +00006008<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6009matcher.
6010
6011Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6012 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6013 and U (matcher = typedefDecl(hasType(asString("int")))
6014 class X {};
6015 void y(X &amp;x) { x; X z; }
6016 typedef int U;
6017</pre></td></tr>
6018
6019
Aaron Ballman672dde22016-01-22 23:15:00 +00006020<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 +00006021<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6022matches the given matcher.
6023
6024The associated declaration is:
6025- for type nodes, the declaration of the underlying type
6026- for CallExpr, the declaration of the callee
6027- for MemberExpr, the declaration of the referenced member
6028- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006029- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006030
6031Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
6032function. e.g. various subtypes of clang::Type and various expressions.
6033
Manuel Klimeka37e1102016-12-01 15:45:06 +00006034Usable 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;,
6035 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;,
6036 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;,
6037 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;,
6038 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;,
6039 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;,
6040 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6041</pre></td></tr>
6042
6043
6044<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>
6045<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
6046type of the matched node.
6047
6048For example, in:
6049 class A {};
6050 using B = A;
6051The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
6052both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006053</pre></td></tr>
6054
6055
Aaron Ballman672dde22016-01-22 23:15:00 +00006056<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 +00006057<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
6058
6059Given
6060 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
6061unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
6062 matches sizeof(a) and alignof(c)
6063</pre></td></tr>
6064
6065
Aaron Ballman672dde22016-01-22 23:15:00 +00006066<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 +00006067<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
6068
6069Example matches true (matcher = hasUnaryOperand(
6070 cxxBoolLiteral(equals(true))))
6071 !true
6072</pre></td></tr>
6073
6074
Aaron Ballman672dde22016-01-22 23:15:00 +00006075<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 +00006076<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
6077matches the given matcher.
6078
6079The associated declaration is:
6080- for type nodes, the declaration of the underlying type
6081- for CallExpr, the declaration of the callee
6082- for MemberExpr, the declaration of the referenced member
6083- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006084- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006085
6086Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
6087function. e.g. various subtypes of clang::Type and various expressions.
6088
Manuel Klimeka37e1102016-12-01 15:45:06 +00006089Usable 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;,
6090 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;,
6091 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;,
6092 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;,
6093 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;,
6094 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;,
6095 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006096</pre></td></tr>
6097
6098
Aaron Ballman672dde22016-01-22 23:15:00 +00006099<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 +00006100<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6101
6102Given
6103 namespace X { void b(); }
6104 using X::b;
6105usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6106 matches using X::b </pre></td></tr>
6107
6108
Aaron Ballman672dde22016-01-22 23:15:00 +00006109<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 +00006110<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
6111matched by the given matcher.
6112
6113Given
6114 namespace X { int a; void b(); }
6115 using X::a;
6116 using X::b;
6117usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6118 matches using X::b but not using X::a </pre></td></tr>
6119
6120
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006121<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>
6122<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 +00006123declaration's type.
6124
6125In case of a value declaration (for example a variable declaration),
6126this resolves one layer of indirection. For example, in the value
6127declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6128X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6129declaration of x.
6130
6131Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6132 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6133 class X {};
6134 void y(X &amp;x) { x; X z; }
6135
Aaron Ballman672dde22016-01-22 23:15:00 +00006136Usable 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 +00006137</pre></td></tr>
6138
6139
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006140<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>
6141<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 +00006142matcher.
6143
6144Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6145 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006146 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006147 class X {};
6148 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006149 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006150</pre></td></tr>
6151
6152
Aaron Ballman672dde22016-01-22 23:15:00 +00006153<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 +00006154<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6155that matches the given matcher.
6156
6157Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6158 bool y() { return true; }
6159 bool x = y();
6160</pre></td></tr>
6161
6162
Aaron Ballman672dde22016-01-22 23:15:00 +00006163<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 +00006164<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6165expression.
6166
6167Given
6168 void f(int b) {
6169 int a[b];
6170 }
6171variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6172 varDecl(hasName("b")))))))
6173 matches "int a[b]"
6174</pre></td></tr>
6175
6176
Aaron Ballman672dde22016-01-22 23:15:00 +00006177<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 +00006178<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6179definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006180
6181Given
6182 for (;;) {}
6183hasBody(compoundStmt())
6184 matches 'for (;;) {}'
6185with compoundStmt()
6186 matching '{}'
6187</pre></td></tr>
6188
6189
Aaron Ballman672dde22016-01-22 23:15:00 +00006190<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 +00006191<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 +00006192switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006193
6194Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6195 if (true) {}
6196</pre></td></tr>
6197
6198
Aaron Ballman672dde22016-01-22 23:15:00 +00006199<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 +00006200<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6201NestedNameSpecifier-matcher matches.
6202</pre></td></tr>
6203
6204
Aaron Ballman672dde22016-01-22 23:15:00 +00006205<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 +00006206<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6207QualType-matcher matches.
6208</pre></td></tr>
6209
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006210<!--END_TRAVERSAL_MATCHERS -->
6211</table>
6212
6213</div>
6214</body>
6215</html>
6216
6217