blob: ac90c1e629e664edc6e21c41bcb28a8633fae994 [file] [log] [blame]
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10 padding: .33em;
11}
12td.doc {
13 display: none;
14 border-bottom: 1px solid black;
15}
16td.name:hover {
17 color: blue;
18 cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23 if (!id) return;
24 row = document.getElementById(id);
25 if (row.style.display != 'table-cell')
26 row.style.display = 'table-cell';
27 else
28 row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66 ifStmt(hasTrueExpression(
67 expr(hasDescendant(
68 ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000101<!-- START_DECL_MATCHERS -->
102
Aaron Ballman672dde22016-01-22 23:15:00 +0000103<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107 class C {
108 C() : i(42) {}
109 int i;
110 };
111</pre></td></tr>
112
113
Aaron Ballman672dde22016-01-22 23:15:00 +0000114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118 class C {
119 public:
120 int a;
121 };
122accessSpecDecl()
123 matches 'public:'
124</pre></td></tr>
125
126
Aaron Ballman672dde22016-01-22 23:15:00 +0000127<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000128<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
129
130Example matches Z
131 template&lt;class T&gt; class Z {};
132</pre></td></tr>
133
134
Aaron Ballman672dde22016-01-22 23:15:00 +0000135<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000136<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
137
138Given
139 template&lt;typename T&gt; class A {};
140 template&lt;&gt; class A&lt;double&gt; {};
141 A&lt;int&gt; a;
142classTemplateSpecializationDecl()
143 matches the specializations A&lt;int&gt; and A&lt;double&gt;
144</pre></td></tr>
145
146
Aaron Ballman672dde22016-01-22 23:15:00 +0000147<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000148<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
149
150Example matches Foo::Foo() and Foo::Foo(int)
151 class Foo {
152 public:
153 Foo();
154 Foo(int);
155 int DoSomething();
156 };
157</pre></td></tr>
158
159
Aaron Ballman672dde22016-01-22 23:15:00 +0000160<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000161<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
162
163Example matches the operator.
164 class X { operator int() const; };
165</pre></td></tr>
166
167
Aaron Ballman672dde22016-01-22 23:15:00 +0000168<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000169<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
170
171Example matches Foo::~Foo()
172 class Foo {
173 public:
174 virtual ~Foo();
175 };
176</pre></td></tr>
177
178
Aaron Ballman672dde22016-01-22 23:15:00 +0000179<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000180<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
181
182Example matches y
183 class X { void y(); };
184</pre></td></tr>
185
186
Aaron Ballman672dde22016-01-22 23:15:00 +0000187<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000188<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
189
190Example matches X, Z
191 class X;
192 template&lt;class T&gt; class Z {};
193</pre></td></tr>
194
195
Aaron Ballman672dde22016-01-22 23:15:00 +0000196<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000197<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
198
199Examples matches X, C, and the friend declaration inside C;
200 void X();
201 class C {
202 friend X;
203 };
204</pre></td></tr>
205
206
Aaron Ballman672dde22016-01-22 23:15:00 +0000207<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000208<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
209and non-type template parameter declarations).
210
211Given
212 class X { int y; };
213declaratorDecl()
214 matches int y.
215</pre></td></tr>
216
217
Aaron Ballman672dde22016-01-22 23:15:00 +0000218<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000219<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
220
221Example matches A, B, C
222 enum X {
223 A, B, C
224 };
225</pre></td></tr>
226
227
Aaron Ballman672dde22016-01-22 23:15:00 +0000228<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000229<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
230
231Example matches X
232 enum X {
233 A, B, C
234 };
235</pre></td></tr>
236
237
Aaron Ballman672dde22016-01-22 23:15:00 +0000238<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000239<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
240
241Given
242 class X { int m; };
243fieldDecl()
244 matches 'm'.
245</pre></td></tr>
246
247
Aaron Ballman672dde22016-01-22 23:15:00 +0000248<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000249<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
250
251Given
252 class X { friend void foo(); };
253friendDecl()
254 matches 'friend void foo()'.
255</pre></td></tr>
256
257
Aaron Ballman672dde22016-01-22 23:15:00 +0000258<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000259<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
260
261Example matches f
262 void f();
263</pre></td></tr>
264
265
Aaron Ballman672dde22016-01-22 23:15:00 +0000266<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000267<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
268
269Example matches f
270 template&lt;class T&gt; void f(T t) {}
271</pre></td></tr>
272
273
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000274<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
275<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
276
277Given
278 goto FOO;
279 FOO: bar();
280labelDecl()
281 matches 'FOO:'
282</pre></td></tr>
283
284
Aaron Ballman672dde22016-01-22 23:15:00 +0000285<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000286<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
287
288Given
289 extern "C" {}
290linkageSpecDecl()
291 matches "extern "C" {}"
292</pre></td></tr>
293
294
Aaron Ballman672dde22016-01-22 23:15:00 +0000295<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000296<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
297
298Example matches X, S, the anonymous union type, i, and U;
299 typedef int X;
300 struct S {
301 union {
302 int i;
303 } U;
304 };
305</pre></td></tr>
306
307
Aaron Ballman672dde22016-01-22 23:15:00 +0000308<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000309<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
310
311Given
312 namespace test {}
313 namespace alias = ::test;
314namespaceAliasDecl()
315 matches "namespace alias" but not "namespace test"
316</pre></td></tr>
317
318
Aaron Ballman672dde22016-01-22 23:15:00 +0000319<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000320<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
321
322Given
323 namespace {}
324 namespace test {}
325namespaceDecl()
326 matches "namespace {}" and "namespace test {}"
327</pre></td></tr>
328
329
Aaron Ballman672dde22016-01-22 23:15:00 +0000330<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000331<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
332
333Given
334 template &lt;typename T, int N&gt; struct C {};
335nonTypeTemplateParmDecl()
336 matches 'N', but not 'T'.
337</pre></td></tr>
338
339
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000340<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
341<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
342
343Example matches Foo (Additions)
344 @interface Foo (Additions)
345 @end
346</pre></td></tr>
347
348
Aaron Ballman672dde22016-01-22 23:15:00 +0000349<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000350<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
351
352Example matches Foo
353 @interface Foo
354 @end
355</pre></td></tr>
356
357
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000358<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
359<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
360
361Example matches _enabled
362 @implementation Foo {
363 BOOL _enabled;
364 }
365 @end
366</pre></td></tr>
367
368
369<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
370<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
371
372Example matches both declaration and definition of -[Foo method]
373 @interface Foo
374 - (void)method;
375 @end
376
377 @implementation Foo
378 - (void)method {}
379 @end
380</pre></td></tr>
381
382
383<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
384<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
385
386Example matches enabled
387 @interface Foo
388 @property BOOL enabled;
389 @end
390</pre></td></tr>
391
392
393<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
394<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
395
396Example matches FooDelegate
397 @protocol FooDelegate
398 @end
399</pre></td></tr>
400
401
Aaron Ballman672dde22016-01-22 23:15:00 +0000402<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000403<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
404
405Given
406 void f(int x);
407parmVarDecl()
408 matches int x.
409</pre></td></tr>
410
411
Aaron Ballman672dde22016-01-22 23:15:00 +0000412<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000413<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
414
415Example matches X, Z, U, and S
416 class X;
417 template&lt;class T&gt; class Z {};
418 struct S {};
419 union U {};
420</pre></td></tr>
421
422
Aaron Ballman672dde22016-01-22 23:15:00 +0000423<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000424<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
425
426Example:
427 staticAssertExpr()
428matches
429 static_assert(sizeof(S) == sizeof(int))
430in
431 struct S {
432 int x;
433 };
434 static_assert(sizeof(S) == sizeof(int));
435</pre></td></tr>
436
437
Aaron Ballman672dde22016-01-22 23:15:00 +0000438<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000439<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
440
441Given
442 template &lt;typename T, int N&gt; struct C {};
443templateTypeParmDecl()
444 matches 'T', but not 'N'.
445</pre></td></tr>
446
447
Aaron Ballman672dde22016-01-22 23:15:00 +0000448<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000449<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
450
451Given
452 int X;
453 namespace NS {
454 int Y;
455 } namespace NS
456decl(hasDeclContext(translationUnitDecl()))
457 matches "int X", but not "int Y".
458</pre></td></tr>
459
460
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000461<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
462<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
463
464Given
465 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000466 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000467typeAliasDecl()
468 matches "using Y = int", but not "typedef int X"
469</pre></td></tr>
470
471
Eric Liu285f8042017-03-28 12:56:47 +0000472<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
473<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
474
475typeAliasTemplateDecl() matches
476 template &lt;typename T&gt;
477 using Y = X&lt;T&gt;;
478</pre></td></tr>
479
480
Aaron Ballman672dde22016-01-22 23:15:00 +0000481<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 +0000482<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
483
484Given
485 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000486 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000487typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000488 matches "typedef int X", but not "using Y = int"
489</pre></td></tr>
490
491
492<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>
493<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
494
495Given
496 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000497 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000498typedefNameDecl()
499 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000500</pre></td></tr>
501
502
Aaron Ballman672dde22016-01-22 23:15:00 +0000503<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 +0000504<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
505typename.
506
507Given
508 template &lt;typename T&gt;
509 struct Base { typedef T Foo; };
510
511 template&lt;typename T&gt;
512 struct S : private Base&lt;T&gt; {
513 using typename Base&lt;T&gt;::Foo;
514 };
515unresolvedUsingTypenameDecl()
516 matches using Base&lt;T&gt;::Foo </pre></td></tr>
517
518
Aaron Ballman672dde22016-01-22 23:15:00 +0000519<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 +0000520<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
521
522Given
523 template&lt;typename X&gt;
524 class C : private X {
525 using X::x;
526 };
527unresolvedUsingValueDecl()
528 matches using X::x </pre></td></tr>
529
530
Aaron Ballman672dde22016-01-22 23:15:00 +0000531<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 +0000532<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
533
534Given
535 namespace X { int x; }
536 using X::x;
537usingDecl()
538 matches using X::x </pre></td></tr>
539
540
Aaron Ballman672dde22016-01-22 23:15:00 +0000541<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 +0000542<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
543
544Given
545 namespace X { int x; }
546 using namespace X;
547usingDirectiveDecl()
548 matches using namespace X </pre></td></tr>
549
550
Aaron Ballman672dde22016-01-22 23:15:00 +0000551<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000552<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
553
554Example matches A, B, C and F
555 enum X { A, B, C };
556 void F();
557</pre></td></tr>
558
559
Aaron Ballman672dde22016-01-22 23:15:00 +0000560<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 +0000561<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
562
563Note: this does not match declarations of member variables, which are
564"field" declarations in Clang parlance.
565
566Example matches a
567 int a;
568</pre></td></tr>
569
570
Aaron Ballman672dde22016-01-22 23:15:00 +0000571<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 +0000572<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
573</pre></td></tr>
574
575
Aaron Ballman672dde22016-01-22 23:15:00 +0000576<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 +0000577<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
578
579Given
580 namespace ns {
581 struct A { static void f(); };
582 void A::f() {}
583 void g() { A::f(); }
584 }
585 ns::A a;
586nestedNameSpecifier()
587 matches "ns::" and both "A::"
588</pre></td></tr>
589
590
Aaron Ballman672dde22016-01-22 23:15:00 +0000591<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 +0000592<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
593</pre></td></tr>
594
595
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000596<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>
597<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
598
599Given
600 FOO: bar();
601 void *ptr = &amp;&amp;FOO;
602 goto *bar;
603addrLabelExpr()
604 matches '&amp;&amp;FOO'
605</pre></td></tr>
606
607
Aaron Ballman672dde22016-01-22 23:15:00 +0000608<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 +0000609<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
610
611Given
612 int i = a[1];
613arraySubscriptExpr()
614 matches "a[1]"
615</pre></td></tr>
616
617
Aaron Ballman672dde22016-01-22 23:15:00 +0000618<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 +0000619<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
620
621 int i = 100;
622 __asm("mov al, 2");
623asmStmt()
624 matches '__asm("mov al, 2")'
625</pre></td></tr>
626
627
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000628<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>
629<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
630Example matches __atomic_load_n(ptr, 1)
631 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
632</pre></td></tr>
633
634
635<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>
636<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
637
638Example matches a ?: b
639 (a ?: b) + 42;
640</pre></td></tr>
641
642
Aaron Ballman672dde22016-01-22 23:15:00 +0000643<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 +0000644<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
645
646Example matches a || b
647 !(a || b)
648</pre></td></tr>
649
650
Aaron Ballman672dde22016-01-22 23:15:00 +0000651<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 +0000652<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
653
654Given
655 while (true) { break; }
656breakStmt()
657 matches 'break'
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('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 +0000662<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
663
Artem Dergachevded92a92016-11-11 22:34:53 +0000664Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000665 int i = (int) 2.2f;
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('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 +0000670<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
671
672Example matches x.y() and y()
673 X x;
674 x.y();
675 y();
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('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 +0000680<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
681
682Given
683 switch(a) { case 42: break; default: break; }
684caseStmt()
685 matches 'case 42: break;'.
686</pre></td></tr>
687
688
Aaron Ballman672dde22016-01-22 23:15:00 +0000689<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 +0000690<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
691
692Example: castExpr() matches each of the following:
693 (int) 3;
694 const_cast&lt;Expr *&gt;(SubExpr);
695 char c = 0;
696but does not match
697 int i = (0);
698 int k = 0;
699</pre></td></tr>
700
701
Aaron Ballman672dde22016-01-22 23:15:00 +0000702<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 +0000703<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
704
705Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
706though.
707
708Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000709 char ch = 'a';
710 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000711</pre></td></tr>
712
713
Aaron Ballman672dde22016-01-22 23:15:00 +0000714<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000715<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
716
717Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000718 int array[4] = {1};
719 vector int myvec = (vector int)(1, 2);
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000720</pre></td></tr>
721
722
Aaron Ballman672dde22016-01-22 23:15:00 +0000723<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 +0000724<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
725
726Example matches '{}' and '{{}}'in 'for (;;) {{}}'
727 for (;;) {{}}
728</pre></td></tr>
729
730
Aaron Ballman672dde22016-01-22 23:15:00 +0000731<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 +0000732<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
733
734Example matches a ? b : c
735 (a ? b : c) + 42
736</pre></td></tr>
737
738
Aaron Ballman672dde22016-01-22 23:15:00 +0000739<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 +0000740<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
741
742Given
743 while (true) { continue; }
744continueStmt()
745 matches 'continue'
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('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 +0000750<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
751
752Example matches,
753 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
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('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 +0000758<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
759
760Example matches FunctionTakesString(GetStringByValue())
761 (matcher = cxxBindTemporaryExpr())
762 FunctionTakesString(GetStringByValue());
763 FunctionTakesStringByPointer(GetStringPointer());
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('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 +0000768<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
769
770Example matches true
771 true
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('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 +0000776<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
777
778 try {} catch(int i) {}
779cxxCatchStmt()
780 matches 'catch(int i)'
781</pre></td></tr>
782
783
Aaron Ballman672dde22016-01-22 23:15:00 +0000784<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 +0000785<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
786
787Example: Matches const_cast&lt;int*&gt;(&amp;r) in
788 int n = 42;
789 const int &amp;r(n);
790 int* p = const_cast&lt;int*&gt;(&amp;r);
791</pre></td></tr>
792
793
Aaron Ballman672dde22016-01-22 23:15:00 +0000794<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 +0000795<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
796
797Example matches string(ptr, n) and ptr within arguments of f
798 (matcher = cxxConstructExpr())
799 void f(const string &amp;a, const string &amp;b);
800 char *ptr;
801 int n;
802 f(string(ptr, n), ptr);
803</pre></td></tr>
804
805
Aaron Ballman672dde22016-01-22 23:15:00 +0000806<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 +0000807<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
808
809Example matches the CXXDefaultArgExpr placeholder inserted for the
810 default value of the second parameter in the call expression f(42)
811 (matcher = cxxDefaultArgExpr())
812 void f(int x, int y = 0);
813 f(42);
814</pre></td></tr>
815
816
Aaron Ballman672dde22016-01-22 23:15:00 +0000817<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000818<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
819
820Given
821 delete X;
822cxxDeleteExpr()
823 matches 'delete X'.
824</pre></td></tr>
825
826
Aaron Ballman672dde22016-01-22 23:15:00 +0000827<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 +0000828<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
829
830Example:
831 cxxDynamicCastExpr()
832matches
833 dynamic_cast&lt;D*&gt;(&amp;b);
834in
835 struct B { virtual ~B() {} }; struct D : B {};
836 B b;
837 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
838</pre></td></tr>
839
840
Aaron Ballman672dde22016-01-22 23:15:00 +0000841<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000842<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
843
844cxxForRangeStmt() matches 'for (auto a : i)'
845 int i[] = {1, 2, 3}; for (auto a : i);
846 for(int j = 0; j &lt; 5; ++j);
847</pre></td></tr>
848
849
Aaron Ballman672dde22016-01-22 23:15:00 +0000850<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000851<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
852
853Example: Matches Foo(bar);
854 Foo f = bar;
855 Foo g = (Foo) bar;
856 Foo h = Foo(bar);
857</pre></td></tr>
858
859
Aaron Ballman672dde22016-01-22 23:15:00 +0000860<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000861<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
862
863Example matches x.y()
864 X x;
865 x.y();
866</pre></td></tr>
867
868
Aaron Ballman672dde22016-01-22 23:15:00 +0000869<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 +0000870<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
871
872Given
873 new X;
874cxxNewExpr()
875 matches 'new X'.
876</pre></td></tr>
877
878
Aaron Ballman672dde22016-01-22 23:15:00 +0000879<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 +0000880<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
881</pre></td></tr>
882
883
Aaron Ballman672dde22016-01-22 23:15:00 +0000884<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 +0000885<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
886
887Note that if an operator isn't overloaded, it won't match. Instead, use
888binaryOperator matcher.
889Currently it does not match operators such as new delete.
890FIXME: figure out why these do not match?
891
892Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
893 (matcher = cxxOperatorCallExpr())
894 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
895 ostream &amp;o; int b = 1, c = 1;
896 o &lt;&lt; b &lt;&lt; c;
897</pre></td></tr>
898
899
Aaron Ballman672dde22016-01-22 23:15:00 +0000900<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 +0000901<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
902
903Either the source expression or the destination type can be matched
904using has(), but hasDestinationType() is more specific and can be
905more readable.
906
907Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
908 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
909</pre></td></tr>
910
911
Aaron Ballman672dde22016-01-22 23:15:00 +0000912<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 +0000913<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
914
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000915See also: hasDestinationType
916See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000917
918Example:
919 cxxStaticCastExpr()
920matches
921 static_cast&lt;long&gt;(8)
922in
923 long eight(static_cast&lt;long&gt;(8));
924</pre></td></tr>
925
926
Jakub Kuderski64b6c782017-05-05 21:01:12 +0000927<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>
928<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
929
930Given
931 std::vector&lt;int&gt; a({ 1, 2, 3 });
932 std::vector&lt;int&gt; b = { 4, 5 };
933 int c[] = { 6, 7 };
934 std::pair&lt;int, int&gt; d = { 8, 9 };
935cxxStdInitializerListExpr()
936 matches "{ 1, 2, 3 }" and "{ 4, 5 }"
937</pre></td></tr>
938
939
Aaron Ballman672dde22016-01-22 23:15:00 +0000940<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 +0000941<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
942
943Example: Matches Foo(bar, bar)
944 Foo h = Foo(bar, bar);
945</pre></td></tr>
946
947
Aaron Ballman672dde22016-01-22 23:15:00 +0000948<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 +0000949<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
950
951Example matches the implicit this expression in "return i".
952 (matcher = cxxThisExpr())
953struct foo {
954 int i;
955 int f() { return i; }
956};
957</pre></td></tr>
958
959
Aaron Ballman672dde22016-01-22 23:15:00 +0000960<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000961<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
962
963 try { throw 5; } catch(int i) {}
964cxxThrowExpr()
965 matches 'throw 5'
966</pre></td></tr>
967
968
Aaron Ballman672dde22016-01-22 23:15:00 +0000969<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 +0000970<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
971
972 try {} catch(int i) {}
973cxxTryStmt()
974 matches 'try {}'
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('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 +0000979<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
980
981Example matches T(t) in return statement of f
982 (matcher = cxxUnresolvedConstructExpr())
983 template &lt;typename T&gt;
984 void f(const T&amp; t) { return T(t); }
985</pre></td></tr>
986
987
Aaron Ballman672dde22016-01-22 23:15:00 +0000988<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 +0000989<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
990
991Example matches x in if (x)
992 bool x;
993 if (x) {}
994</pre></td></tr>
995
996
Aaron Ballman672dde22016-01-22 23:15:00 +0000997<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 +0000998<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
999
1000Given
1001 int a;
1002declStmt()
1003 matches 'int a'.
1004</pre></td></tr>
1005
1006
Aaron Ballman672dde22016-01-22 23:15:00 +00001007<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001008<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1009
1010Given
1011 switch(a) { case 42: break; default: break; }
1012defaultStmt()
1013 matches 'default: break;'.
1014</pre></td></tr>
1015
1016
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001017<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>
1018<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1019
1020Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1021 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
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('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 +00001026<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1027
1028Given
1029 do {} while (true);
1030doStmt()
1031 matches 'do {} while(true)'
1032</pre></td></tr>
1033
1034
Aaron Ballman672dde22016-01-22 23:15:00 +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('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 +00001036<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1037
1038Matches any cast expression written in user code, whether it be a
1039C-style cast, a functional-style cast, or a keyword cast.
1040
1041Does not match implicit conversions.
1042
1043Note: the name "explicitCast" is chosen to match Clang's terminology, as
1044Clang uses the term "cast" to apply to implicit conversions as well as to
1045actual cast expressions.
1046
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001047See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001048
1049Example: matches all five of the casts in
1050 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1051but does not match the implicit conversion in
1052 long ell = 42;
1053</pre></td></tr>
1054
1055
Aaron Ballman672dde22016-01-22 23:15:00 +00001056<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 +00001057<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1058
1059Example matches x()
1060 void f() { x(); }
1061</pre></td></tr>
1062
1063
Aaron Ballman672dde22016-01-22 23:15:00 +00001064<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 +00001065<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1066of the sub-expression's evaluation.
1067
1068Example matches std::string()
1069 const std::string str = std::string();
1070</pre></td></tr>
1071
1072
Aaron Ballman672dde22016-01-22 23:15:00 +00001073<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 +00001074<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10751.0, 1.0f, 1.0L and 1e10.
1076
1077Does not match implicit conversions such as
1078 float a = 10;
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('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 +00001083<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1084
1085Example matches 'for (;;) {}'
1086 for (;;) {}
1087 int i[] = {1, 2, 3}; for (auto a : i);
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('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 +00001092<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1093</pre></td></tr>
1094
1095
Aaron Ballman672dde22016-01-22 23:15:00 +00001096<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 +00001097<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1098
1099Given
1100 goto FOO;
1101 FOO: bar();
1102gotoStmt()
1103 matches 'goto FOO'
1104</pre></td></tr>
1105
1106
Aaron Ballman672dde22016-01-22 23:15:00 +00001107<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 +00001108<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1109
1110Example matches 'if (x) {}'
1111 if (x) {}
1112</pre></td></tr>
1113
1114
Aaron Ballman672dde22016-01-22 23:15:00 +00001115<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 +00001116<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1117
1118This matches many different places, including function call return value
1119eliding, as well as any type conversions.
1120</pre></td></tr>
1121
1122
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001123<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1124<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1125
1126Given
1127 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1128implicitValueInitExpr()
1129 matches "[0].y" (implicitly)
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('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 +00001134<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1135
1136Given
1137 int a[] = { 1, 2 };
1138 struct B { int x, y; };
1139 B b = { 5, 6 };
1140initListExpr()
1141 matches "{ 1, 2 }" and "{ 5, 6 }"
1142</pre></td></tr>
1143
1144
Aaron Ballman672dde22016-01-22 23:15:00 +00001145<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 +00001146<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11471, 1L, 0x1 and 1U.
1148
1149Does not match character-encoded integers such as L'a'.
1150</pre></td></tr>
1151
1152
Aaron Ballman672dde22016-01-22 23:15:00 +00001153<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 +00001154<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1155
1156Given
1157 goto FOO;
1158 FOO: bar();
1159labelStmt()
1160 matches 'FOO:'
1161</pre></td></tr>
1162
1163
Aaron Ballman672dde22016-01-22 23:15:00 +00001164<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 +00001165<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1166
1167Example matches [&amp;](){return 5;}
1168 [&amp;](){return 5;}
1169</pre></td></tr>
1170
1171
Aaron Ballman672dde22016-01-22 23:15:00 +00001172<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 +00001173<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1174
1175Example: Given
Jakub Kuderski64b6c782017-05-05 21:01:12 +00001176 struct T {void func();};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001177 T f();
1178 void g(T);
1179materializeTemporaryExpr() matches 'f()' in these statements
1180 T u(f());
1181 g(f());
1182but does not match
1183 f();
1184 f().func();
1185</pre></td></tr>
1186
1187
Aaron Ballman672dde22016-01-22 23:15:00 +00001188<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001189<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1190
1191Given
1192 class Y {
1193 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1194 int a; static int b;
1195 };
1196memberExpr()
1197 matches this-&gt;x, x, y.x, a, this-&gt;b
1198</pre></td></tr>
1199
1200
Aaron Ballman672dde22016-01-22 23:15:00 +00001201<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 +00001202<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1203
1204 foo();;
1205nullStmt()
1206 matches the second ';'
1207</pre></td></tr>
1208
1209
Aaron Ballman672dde22016-01-22 23:15:00 +00001210<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001211<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1212
1213The innermost message send invokes the "alloc" class method on the
1214NSString class, while the outermost message send invokes the
1215"initWithString" instance method on the object returned from
1216NSString's "alloc". This matcher should match both message sends.
1217 [[NSString alloc] initWithString:@"Hello"]
1218</pre></td></tr>
1219
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001220
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001221<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>
1222<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1223to reference another expressions and can be met
1224in BinaryConditionalOperators, for example.
1225
1226Example matches 'a'
1227 (a ?: c) + 42;
1228</pre></td></tr>
1229
1230
Aaron Ballman672dde22016-01-22 23:15:00 +00001231<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 +00001232<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1233
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001234Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001235 int foo() { return 1; }
1236 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001237</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001238
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001239
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001240<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>
1241<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1242ParenListExprs don't have a predefined type and are used for late parsing.
1243In the final AST, they can be met in template declarations.
1244
1245Given
1246 template&lt;typename T&gt; class X {
1247 void f() {
1248 X x(*this);
1249 int a = 0, b = 1; int i = (a, b);
1250 }
1251 };
1252parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1253has a predefined type and is a ParenExpr, not a ParenListExpr.
1254</pre></td></tr>
1255
1256
1257<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>
1258<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1259
1260Example: Matches __func__
1261 printf("%s", __func__);
1262</pre></td></tr>
1263
1264
Aaron Ballman672dde22016-01-22 23:15:00 +00001265<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 +00001266<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1267
1268Given
1269 return 1;
1270returnStmt()
1271 matches 'return 1'
1272</pre></td></tr>
1273
1274
Aaron Ballman672dde22016-01-22 23:15:00 +00001275<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 +00001276<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1277
1278Given
1279 { ++a; }
1280stmt()
1281 matches both the compound statement '{ ++a; }' and '++a'.
1282</pre></td></tr>
1283
1284
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001285<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>
1286<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1287
1288Example match: ({ int X = 4; X; })
1289 int C = ({ int X = 4; X; });
1290</pre></td></tr>
1291
1292
Aaron Ballman672dde22016-01-22 23:15:00 +00001293<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001294<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1295
1296Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001297 char *s = "abcd";
1298 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001299</pre></td></tr>
1300
1301
Aaron Ballman672dde22016-01-22 23:15:00 +00001302<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001303<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1304
1305Given
1306 template &lt;int N&gt;
1307 struct A { static const int n = N; };
1308 struct B : public A&lt;42&gt; {};
1309substNonTypeTemplateParmExpr()
1310 matches "N" in the right-hand side of "static const int n = N;"
1311</pre></td></tr>
1312
1313
Aaron Ballman672dde22016-01-22 23:15:00 +00001314<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 +00001315<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1316
1317Given
1318 switch(a) { case 42: break; default: break; }
1319switchCase()
1320 matches 'case 42: break;' and 'default: break;'.
1321</pre></td></tr>
1322
1323
Aaron Ballman672dde22016-01-22 23:15:00 +00001324<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 +00001325<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1326
1327Given
1328 switch(a) { case 42: break; default: break; }
1329switchStmt()
1330 matches 'switch(a)'.
1331</pre></td></tr>
1332
1333
Aaron Ballman672dde22016-01-22 23:15:00 +00001334<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 +00001335<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1336
1337Given
1338 Foo x = bar;
1339 int y = sizeof(x) + alignof(x);
1340unaryExprOrTypeTraitExpr()
1341 matches sizeof(x) and alignof(x)
1342</pre></td></tr>
1343
1344
Aaron Ballman672dde22016-01-22 23:15:00 +00001345<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 +00001346<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1347
1348Example matches !a
1349 !a || b
1350</pre></td></tr>
1351
1352
Haojian Wu7751c922016-05-18 12:53:59 +00001353<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1354<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1355but could not be resolved to a specific declaration.
1356
1357Given
1358 template&lt;typename T&gt;
1359 T foo() { T a; return a; }
1360 template&lt;typename T&gt;
1361 void bar() {
1362 foo&lt;T&gt;();
1363 }
1364unresolvedLookupExpr()
1365 matches foo&lt;T&gt;() </pre></td></tr>
1366
1367
Aaron Ballman672dde22016-01-22 23:15:00 +00001368<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001369<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1370
1371Example match: "foo"_suffix
1372</pre></td></tr>
1373
1374
Aaron Ballman672dde22016-01-22 23:15:00 +00001375<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 +00001376<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1377
1378Given
1379 while (true) {}
1380whileStmt()
1381 matches 'while (true) {}'.
1382</pre></td></tr>
1383
1384
Aaron Ballman672dde22016-01-22 23:15:00 +00001385<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001386<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1387
1388Given
1389 template &lt;typename T&gt; struct C {};
1390 C&lt;int&gt; c;
1391templateArgument()
1392 matches 'int' in C&lt;int&gt;.
1393</pre></td></tr>
1394
1395
Haojian Wub33b02e2016-07-29 15:45:11 +00001396<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>
1397<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1398
1399Given
1400 template &lt;typename T&gt; class X { };
1401 X&lt;int&gt; xi;
1402templateName()
1403 matches 'X' in X&lt;int&gt;.
1404</pre></td></tr>
1405
1406
Aaron Ballman672dde22016-01-22 23:15:00 +00001407<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 +00001408<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1409</pre></td></tr>
1410
1411
Aaron Ballman672dde22016-01-22 23:15:00 +00001412<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001413<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1414
1415Given
1416 int a[] = { 2, 3 };
1417 int b[4];
1418 void f() { int c[a[0]]; }
1419arrayType()
1420 matches "int a[]", "int b[4]" and "int c[a[0]]";
1421</pre></td></tr>
1422
1423
Aaron Ballman672dde22016-01-22 23:15:00 +00001424<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001425<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1426
1427Given
1428 _Atomic(int) i;
1429atomicType()
1430 matches "_Atomic(int) i"
1431</pre></td></tr>
1432
1433
Aaron Ballman672dde22016-01-22 23:15:00 +00001434<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 +00001435<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1436
1437Given:
1438 auto n = 4;
1439 int v[] = { 2, 3 }
1440 for (auto i : v) { }
1441autoType()
1442 matches "auto n" and "auto i"
1443</pre></td></tr>
1444
1445
Aaron Ballman672dde22016-01-22 23:15:00 +00001446<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001447<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1448"void (^)(int)".
1449
1450The pointee is always required to be a FunctionType.
1451</pre></td></tr>
1452
1453
Aaron Ballman672dde22016-01-22 23:15:00 +00001454<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 +00001455<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1456
1457Given
1458 struct A {};
1459 A a;
1460 int b;
1461 float c;
1462 bool d;
1463builtinType()
1464 matches "int b", "float c" and "bool d"
1465</pre></td></tr>
1466
1467
Aaron Ballman672dde22016-01-22 23:15:00 +00001468<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 +00001469<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1470
1471Given
1472 _Complex float f;
1473complexType()
1474 matches "_Complex float f"
1475</pre></td></tr>
1476
1477
Aaron Ballman672dde22016-01-22 23:15:00 +00001478<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001479<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1480
1481Given
1482 void() {
1483 int a[2];
1484 int b[] = { 2, 3 };
1485 int c[b[0]];
1486 }
1487constantArrayType()
1488 matches "int a[2]"
1489</pre></td></tr>
1490
1491
Aaron Ballman672dde22016-01-22 23:15:00 +00001492<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 +00001493<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1494Example matches i[] in declaration of f.
1495 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1496Example matches i[1].
1497 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1498 void f(int i[]) {
1499 i[1] = 0;
1500 }
1501</pre></td></tr>
1502
1503
Aaron Ballman672dde22016-01-22 23:15:00 +00001504<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 +00001505<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1506
1507Given
1508 template&lt;typename T, int Size&gt;
1509 class array {
1510 T data[Size];
1511 };
1512dependentSizedArrayType
1513 matches "T data[Size]"
1514</pre></td></tr>
1515
1516
Aaron Ballman672dde22016-01-22 23:15:00 +00001517<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 +00001518<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1519qualified name.
1520
1521Given
1522 namespace N {
1523 namespace M {
1524 class D {};
1525 }
1526 }
1527 class C {};
1528
1529 class C c;
1530 N::M::D d;
1531
1532elaboratedType() matches the type of the variable declarations of both
1533c and d.
1534</pre></td></tr>
1535
1536
Haojian Wue775de82016-06-30 07:50:01 +00001537<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>
1538<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1539
1540Given
1541 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001542 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001543
1544 C c;
1545 S s;
1546
1547enumType() matches the type of the variable declarations of both c and
1548s.
1549</pre></td></tr>
1550
1551
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001552<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>
1553<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1554
1555Given
1556 int (*f)(int);
1557 void g();
1558functionProtoType()
1559 matches "int (*f)(int)" and the type of "g" in C++ mode.
1560 In C mode, "g" is not matched because it does not contain a prototype.
1561</pre></td></tr>
1562
1563
Aaron Ballman672dde22016-01-22 23:15:00 +00001564<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 +00001565<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1566
1567Given
1568 int (*f)(int);
1569 void g();
1570functionType()
1571 matches "int (*f)(int)" and the type of "g".
1572</pre></td></tr>
1573
1574
Aaron Ballman672dde22016-01-22 23:15:00 +00001575<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 +00001576<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1577
1578Given
1579 int a[] = { 2, 3 };
1580 int b[42];
1581 void f(int c[]) { int d[a[0]]; };
1582incompleteArrayType()
1583 matches "int a[]" and "int c[]"
1584</pre></td></tr>
1585
1586
Aaron Ballman672dde22016-01-22 23:15:00 +00001587<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 +00001588<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1589
1590Example matches S s, but not S&lt;T&gt; s.
1591 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1592 template &lt;typename T&gt; struct S {
1593 void f(S s);
1594 void g(S&lt;T&gt; s);
1595 };
1596</pre></td></tr>
1597
1598
Aaron Ballman672dde22016-01-22 23:15:00 +00001599<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 +00001600<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1601
1602Given:
1603 int *a;
1604 int &amp;b = *a;
1605 int &amp;&amp;c = 1;
1606 auto &amp;d = b;
1607 auto &amp;&amp;e = c;
1608 auto &amp;&amp;f = 2;
1609 int g = 5;
1610
1611lValueReferenceType() matches the types of b, d, and e. e is
1612matched since the type is deduced as int&amp; by reference collapsing rules.
1613</pre></td></tr>
1614
1615
Aaron Ballman672dde22016-01-22 23:15:00 +00001616<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001617<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1618Given
1619 struct A { int i; }
1620 A::* ptr = A::i;
1621memberPointerType()
1622 matches "A::* ptr"
1623</pre></td></tr>
1624
1625
Aaron Ballman672dde22016-01-22 23:15:00 +00001626<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 +00001627<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1628a pointer type, despite being syntactically similar.
1629
1630Given
1631 int *a;
1632
1633 @interface Foo
1634 @end
1635 Foo *f;
1636pointerType()
1637 matches "Foo *f", but does not match "int *a".
1638</pre></td></tr>
1639
1640
Aaron Ballman672dde22016-01-22 23:15:00 +00001641<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 +00001642<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1643
1644Given
1645 int (*ptr_to_array)[4];
1646 int *array_of_ptrs[4];
1647
1648varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1649array_of_ptrs.
1650</pre></td></tr>
1651
1652
Aaron Ballman672dde22016-01-22 23:15:00 +00001653<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 +00001654<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1655types.
1656
1657Given
1658 int *a;
1659 int &amp;b = *a;
1660 int c = 5;
1661
1662 @interface Foo
1663 @end
1664 Foo *f;
1665pointerType()
1666 matches "int *a", but does not match "Foo *f".
1667</pre></td></tr>
1668
1669
Aaron Ballman672dde22016-01-22 23:15:00 +00001670<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001671<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1672
1673Given:
1674 int *a;
1675 int &amp;b = *a;
1676 int &amp;&amp;c = 1;
1677 auto &amp;d = b;
1678 auto &amp;&amp;e = c;
1679 auto &amp;&amp;f = 2;
1680 int g = 5;
1681
1682rValueReferenceType() matches the types of c and f. e is not
1683matched as it is deduced to int&amp; by reference collapsing rules.
1684</pre></td></tr>
1685
1686
Aaron Ballman672dde22016-01-22 23:15:00 +00001687<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 +00001688<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1689
1690Given
1691 class C {};
1692 struct S {};
1693
1694 C c;
1695 S s;
1696
1697recordType() matches the type of the variable declarations of both c
1698and s.
1699</pre></td></tr>
1700
1701
Aaron Ballman672dde22016-01-22 23:15:00 +00001702<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 +00001703<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1704
1705Given
1706 int *a;
1707 int &amp;b = *a;
1708 int &amp;&amp;c = 1;
1709 auto &amp;d = b;
1710 auto &amp;&amp;e = c;
1711 auto &amp;&amp;f = 2;
1712 int g = 5;
1713
1714referenceType() matches the types of b, c, d, e, and f.
1715</pre></td></tr>
1716
1717
Aaron Ballman672dde22016-01-22 23:15:00 +00001718<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 +00001719<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1720template type parameter.
1721
1722Given
1723 template &lt;typename T&gt;
1724 void F(T t) {
1725 int i = 1 + t;
1726 }
1727
1728substTemplateTypeParmType() matches the type of 't' but not '1'
1729</pre></td></tr>
1730
1731
Manuel Klimek696e5052017-08-02 13:04:44 +00001732<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>
1733<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1734
1735Given
1736 enum E {};
1737 class C {};
1738
1739 E e;
1740 C c;
1741
1742tagType() matches the type of the variable declarations of both e
1743and c.
1744</pre></td></tr>
1745
1746
Aaron Ballman672dde22016-01-22 23:15:00 +00001747<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 +00001748<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1749
1750Given
1751 template &lt;typename T&gt;
1752 class C { };
1753
1754 template class C&lt;int&gt;; A
1755 C&lt;char&gt; var; B
1756
1757templateSpecializationType() matches the type of the explicit
1758instantiation in A and the type of the variable declaration in B.
1759</pre></td></tr>
1760
1761
Aaron Ballman672dde22016-01-22 23:15:00 +00001762<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 +00001763<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1764
1765Example matches T, but not int.
1766 (matcher = templateTypeParmType())
1767 template &lt;typename T&gt; void f(int i);
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('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 +00001772<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1773</pre></td></tr>
1774
1775
Aaron Ballman672dde22016-01-22 23:15:00 +00001776<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 +00001777<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1778
1779Given
1780 typedef int X;
1781typedefType()
1782 matches "typedef int X"
1783</pre></td></tr>
1784
1785
Aaron Ballman672dde22016-01-22 23:15:00 +00001786<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 +00001787<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1788
1789Given:
1790 typedef __underlying_type(T) type;
1791unaryTransformType()
1792 matches "__underlying_type(T)"
1793</pre></td></tr>
1794
1795
Aaron Ballman672dde22016-01-22 23:15:00 +00001796<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 +00001797<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1798integer-constant-expression.
1799
1800Given
1801 void f() {
1802 int a[] = { 2, 3 }
1803 int b[42];
1804 int c[a[0]];
1805 }
1806variableArrayType()
1807 matches "int c[a[0]]"
1808</pre></td></tr>
1809
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001810<!--END_DECL_MATCHERS -->
1811</table>
1812
1813<!-- ======================================================================= -->
1814<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1815<!-- ======================================================================= -->
1816
1817<p>Narrowing matchers match certain attributes on the current node, thus
1818narrowing down the set of nodes of the current type to match on.</p>
1819
1820<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1821which allow users to create more powerful match expressions.</p>
1822
1823<table>
1824<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001825<!-- START_NARROWING_MATCHERS -->
1826
1827<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>
1828<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1829
1830Usable as: Any Matcher
1831</pre></td></tr>
1832
1833
1834<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>
1835<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1836
1837Usable as: Any Matcher
1838</pre></td></tr>
1839
1840
1841<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1842<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1843
1844Useful when another matcher requires a child matcher, but there's no
1845additional constraint. This will often be used with an explicit conversion
1846to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1847
1848Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1849"int* p" and "void f()" in
1850 int* p;
1851 void f();
1852
1853Usable as: Any Matcher
1854</pre></td></tr>
1855
1856
1857<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1858<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1859
1860Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1861 class X {};
1862 class Y {};
1863
1864Usable as: Any Matcher
1865</pre></td></tr>
1866
1867
Aaron Ballman672dde22016-01-22 23:15:00 +00001868<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 +00001869<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1870unary).
1871
1872Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1873 !(a || b)
1874</pre></td></tr>
1875
1876
Peter Wua9244b52017-06-08 22:00:58 +00001877<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>
1878<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 +00001879
Peter Wua9244b52017-06-08 22:00:58 +00001880Given
1881 f('false, 3.14, 42);
1882characterLiteral(equals(0))
1883 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1884 match false
1885floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1886 match 3.14
1887integerLiteral(equals(42))
1888 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001889
Clement Courbet43bdba42017-07-11 15:45:22 +00001890Note that you cannot directly match a negative numeric literal because the
1891minus sign is not part of the literal: It is a unary operator whose operand
1892is the positive numeric literal. Instead, you must use a unaryOperator()
1893matcher to match the minus sign:
1894
1895unaryOperator(hasOperatorName("-"),
1896 hasUnaryOperand(integerLiteral(equals(13))))
1897
Peter Wua9244b52017-06-08 22:00:58 +00001898Usable 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 +00001899 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 +00001900</pre></td></tr>
1901
1902
Peter Wua9244b52017-06-08 22:00:58 +00001903<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>
1904<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1905
1906
1907<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>
1908<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1909
1910
1911<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>
1912<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1913
1914
Aaron Ballman672dde22016-01-22 23:15:00 +00001915<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 +00001916<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1917
1918Given
1919 try {
1920 ...
1921 } catch (int) {
1922 ...
1923 } catch (...) {
1924 ...
1925 }
1926endcode
1927cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1928</pre></td></tr>
1929
1930
Aaron Ballman672dde22016-01-22 23:15:00 +00001931<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 +00001932<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1933a specific number of arguments (including absent default arguments).
1934
1935Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1936 void f(int x, int y);
1937 f(0, 0);
1938</pre></td></tr>
1939
1940
Aaron Ballman672dde22016-01-22 23:15:00 +00001941<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 +00001942<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1943</pre></td></tr>
1944
1945
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001946<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>
1947<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1948zero initialization.
1949
1950Given
1951void foo() {
1952 struct point { double x; double y; };
1953 point pt[2] = { { 1.0, 2.0 } };
1954}
1955initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1956will match the implicit array filler for pt[1].
1957</pre></td></tr>
1958
1959
Aaron Ballman672dde22016-01-22 23:15:00 +00001960<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 +00001961<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1962
1963Given
1964 struct S {
1965 S(); #1
1966 S(const S &amp;); #2
1967 S(S &amp;&amp;); #3
1968 };
1969cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1970</pre></td></tr>
1971
1972
Aaron Ballman672dde22016-01-22 23:15:00 +00001973<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 +00001974<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1975
1976Given
1977 struct S {
1978 S(); #1
1979 S(const S &amp;); #2
1980 S(S &amp;&amp;); #3
1981 };
1982cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1983</pre></td></tr>
1984
1985
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00001986<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>
1987<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1988
1989Given
1990 struct S {
1991 S(); #1
1992 S(int) {} #2
1993 S(S &amp;&amp;) : S() {} #3
1994 };
1995 S::S() : S(0) {} #4
1996cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1997#1 or #2.
1998</pre></td></tr>
1999
2000
Aaron Ballman672dde22016-01-22 23:15:00 +00002001<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 +00002002<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2003the explicit keyword.
2004
2005Given
2006 struct S {
2007 S(int); #1
2008 explicit S(double); #2
2009 operator int(); #3
2010 explicit operator bool(); #4
2011 };
2012cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2013cxxConversionDecl(isExplicit()) will match #4, but not #3.
2014</pre></td></tr>
2015
2016
Aaron Ballman672dde22016-01-22 23:15:00 +00002017<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 +00002018<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2019
2020Given
2021 struct S {
2022 S(); #1
2023 S(const S &amp;); #2
2024 S(S &amp;&amp;); #3
2025 };
2026cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2027</pre></td></tr>
2028
2029
Aaron Ballman672dde22016-01-22 23:15:00 +00002030<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 +00002031<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2032the explicit keyword.
2033
2034Given
2035 struct S {
2036 S(int); #1
2037 explicit S(double); #2
2038 operator int(); #3
2039 explicit operator bool(); #4
2040 };
2041cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2042cxxConversionDecl(isExplicit()) will match #4, but not #3.
2043</pre></td></tr>
2044
2045
Aaron Ballman672dde22016-01-22 23:15:00 +00002046<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002047<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2048opposed to a member.
2049
2050Given
2051 struct B {};
2052 struct D : B {
2053 int I;
2054 D(int i) : I(i) {}
2055 };
2056 struct E : B {
2057 E() : B() {}
2058 };
2059cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2060 will match E(), but not match D(int).
2061</pre></td></tr>
2062
2063
Aaron Ballman672dde22016-01-22 23:15:00 +00002064<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 +00002065<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2066opposed to a base.
2067
2068Given
2069 struct B {};
2070 struct D : B {
2071 int I;
2072 D(int i) : I(i) {}
2073 };
2074 struct E : B {
2075 E() : B() {}
2076 };
2077cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2078 will match D(int), but not match E().
2079</pre></td></tr>
2080
2081
Aaron Ballman672dde22016-01-22 23:15:00 +00002082<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 +00002083<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2084code (as opposed to implicitly added by the compiler).
2085
2086Given
2087 struct Foo {
2088 Foo() { }
2089 Foo(int) : foo_("A") { }
2090 string foo_;
2091 };
2092cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2093 will match Foo(int), but not Foo()
2094</pre></td></tr>
2095
2096
Aaron Ballman672dde22016-01-22 23:15:00 +00002097<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 +00002098<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2099
2100Given
2101struct A {
2102 void foo() const;
2103 void bar();
2104};
2105
2106cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2107</pre></td></tr>
2108
2109
Aaron Ballman672dde22016-01-22 23:15:00 +00002110<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 +00002111<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2112operator.
2113
2114Given
2115struct A {
2116 A &amp;operator=(const A &amp;);
2117 A &amp;operator=(A &amp;&amp;);
2118};
2119
2120cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2121the second one.
2122</pre></td></tr>
2123
2124
Aaron Ballman672dde22016-01-22 23:15:00 +00002125<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 +00002126<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2127
2128Given:
2129 class A final {};
2130
2131 struct B {
2132 virtual void f();
2133 };
2134
2135 struct C : B {
2136 void f() final;
2137 };
2138matches A and C::f, but not B, C, or B::f
2139</pre></td></tr>
2140
2141
Aaron Ballman672dde22016-01-22 23:15:00 +00002142<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 +00002143<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2144operator.
2145
2146Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002147struct A {
2148 A &amp;operator=(const A &amp;);
2149 A &amp;operator=(A &amp;&amp;);
2150};
2151
2152cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2153the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002154</pre></td></tr>
2155
2156
Aaron Ballman672dde22016-01-22 23:15:00 +00002157<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 +00002158<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2159
2160Given
2161 class A {
2162 public:
2163 virtual void x();
2164 };
2165 class B : public A {
2166 public:
2167 virtual void x();
2168 };
2169 matches B::x
2170</pre></td></tr>
2171
2172
Aaron Ballman672dde22016-01-22 23:15:00 +00002173<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 +00002174<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2175
2176Given
2177 class A {
2178 public:
2179 virtual void x() = 0;
2180 };
2181 matches A::x
2182</pre></td></tr>
2183
2184
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002185<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>
2186<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2187
2188Given
2189 struct S {
2190 S(); #1
2191 S(const S &amp;) = default; #2
2192 S(S &amp;&amp;) = delete; #3
2193 };
2194cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2195</pre></td></tr>
2196
2197
Aaron Ballman672dde22016-01-22 23:15:00 +00002198<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 +00002199<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2200
2201Given
2202 class A {
2203 public:
2204 virtual void x();
2205 };
2206 matches A::x
2207</pre></td></tr>
2208
Aaron Ballman672dde22016-01-22 23:15:00 +00002209
2210<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 +00002211<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2212
2213Given
2214 class A {
2215 public:
2216 virtual void x();
2217 };
2218 class B : public A {
2219 public:
2220 void x();
2221 };
2222 matches A::x but not B::x
2223</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002224
Aaron Ballman672dde22016-01-22 23:15:00 +00002225
2226<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 +00002227<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2228
2229Matches overloaded operator names specified in strings without the
2230"operator" prefix: e.g. "&lt;&lt;".
2231
2232Given:
2233 class A { int operator*(); };
2234 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2235 A a;
2236 a &lt;&lt; a; &lt;-- This matches
2237
2238cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2239specified line and
2240cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2241matches the declaration of A.
2242
Aaron Ballman672dde22016-01-22 23:15:00 +00002243Usable 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 +00002244</pre></td></tr>
2245
2246
Aaron Ballman672dde22016-01-22 23:15:00 +00002247<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 +00002248<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2249</pre></td></tr>
2250
2251
Aaron Ballman672dde22016-01-22 23:15:00 +00002252<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 +00002253<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2254static member variable template instantiations.
2255
2256Given
2257 template&lt;typename T&gt; void A(T t) { }
2258 template&lt;&gt; void A(int N) { }
2259functionDecl(isExplicitTemplateSpecialization())
2260 matches the specialization A&lt;int&gt;().
2261
Aaron Ballman672dde22016-01-22 23:15:00 +00002262Usable 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 +00002263</pre></td></tr>
2264
2265
Aaron Ballman672dde22016-01-22 23:15:00 +00002266<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 +00002267<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2268
2269Given:
2270 class A final {};
2271
2272 struct B {
2273 virtual void f();
2274 };
2275
2276 struct C : B {
2277 void f() final;
2278 };
2279matches A and C::f, but not B, C, or B::f
2280</pre></td></tr>
2281
2282
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002283<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>
2284<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2285
2286Given:
2287 auto x = []{};
2288
2289cxxRecordDecl(isLambda()) matches the implicit class declaration of
2290decltype(x)
2291</pre></td></tr>
2292
2293
Aaron Ballman672dde22016-01-22 23:15:00 +00002294<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 +00002295<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2296isSameOrDerivedFrom(hasName(...)).
2297</pre></td></tr>
2298
2299
Aaron Ballman672dde22016-01-22 23:15:00 +00002300<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002301<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2302member variable template instantiations.
2303
2304Given
2305 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2306or
2307 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2308cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2309 matches the template instantiation of X&lt;A&gt;.
2310
2311But given
2312 template &lt;typename T&gt; class X {}; class A {};
2313 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2314cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2315 does not match, as X&lt;A&gt; is an explicit template specialization.
2316
Aaron Ballman672dde22016-01-22 23:15:00 +00002317Usable 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 +00002318</pre></td></tr>
2319
2320
Aaron Ballman672dde22016-01-22 23:15:00 +00002321<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 +00002322<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2323a specific number of arguments (including absent default arguments).
2324
2325Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2326 void f(int x, int y);
2327 f(0, 0);
2328</pre></td></tr>
2329
2330
Etienne Bergeron75e52722016-05-13 19:36:55 +00002331<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>
2332<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2333
2334Example: matches the implicit cast around 0
2335(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2336 int *p = 0;
2337</pre></td></tr>
2338
2339
Aaron Ballman672dde22016-01-22 23:15:00 +00002340<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002341<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 +00002342
Peter Wua9244b52017-06-08 22:00:58 +00002343Given
2344 f('false, 3.14, 42);
2345characterLiteral(equals(0))
2346 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2347 match false
2348floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2349 match 3.14
2350integerLiteral(equals(42))
2351 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002352
Clement Courbet43bdba42017-07-11 15:45:22 +00002353Note that you cannot directly match a negative numeric literal because the
2354minus sign is not part of the literal: It is a unary operator whose operand
2355is the positive numeric literal. Instead, you must use a unaryOperator()
2356matcher to match the minus sign:
2357
2358unaryOperator(hasOperatorName("-"),
2359 hasUnaryOperand(integerLiteral(equals(13))))
2360
Peter Wua9244b52017-06-08 22:00:58 +00002361Usable 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 +00002362 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 +00002363</pre></td></tr>
2364
2365
Peter Wua9244b52017-06-08 22:00:58 +00002366<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>
2367<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2368
2369
2370<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>
2371<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2372
2373
2374<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>
2375<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2376
2377
Aaron Ballman672dde22016-01-22 23:15:00 +00002378<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 +00002379<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2380
2381Given
2382 template&lt;typename T&gt; struct C {};
2383 C&lt;int&gt; c;
2384classTemplateSpecializationDecl(templateArgumentCountIs(1))
2385 matches C&lt;int&gt;.
2386</pre></td></tr>
2387
2388
Aaron Ballman672dde22016-01-22 23:15:00 +00002389<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 +00002390<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2391child statements.
2392
2393Example: Given
2394 { for (;;) {} }
2395compoundStmt(statementCountIs(0)))
2396 matches '{}'
2397 but does not match the outer compound statement.
2398</pre></td></tr>
2399
2400
Aaron Ballman672dde22016-01-22 23:15:00 +00002401<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 +00002402<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002403
2404Given
2405 int a[42];
2406 int b[2 * 21];
2407 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002408 char *s = "abcd";
2409 wchar_t *ws = L"abcd";
2410 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002411constantArrayType(hasSize(42))
2412 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002413stringLiteral(hasSize(4))
2414 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002415</pre></td></tr>
2416
2417
Aaron Ballman672dde22016-01-22 23:15:00 +00002418<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 +00002419<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2420declarations.
2421
2422Example: Given
2423 int a, b;
2424 int c;
2425 int d = 2, e;
2426declCountIs(2)
2427 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2428</pre></td></tr>
2429
2430
Aaron Ballman672dde22016-01-22 23:15:00 +00002431<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002432<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2433
2434Matches a node if it equals the node previously bound to ID.
2435
2436Given
2437 class X { int a; int b; };
2438cxxRecordDecl(
2439 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2440 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2441 matches the class X, as a and b have the same type.
2442
2443Note that when multiple matches are involved via forEach* matchers,
2444equalsBoundNodes acts as a filter.
2445For example:
2446compoundStmt(
2447 forEachDescendant(varDecl().bind("d")),
2448 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2449will trigger a match for each combination of variable declaration
2450and reference to that variable declaration within a compound statement.
2451</pre></td></tr>
2452
2453
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002454<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>
2455<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2456
2457Decl has pointer identity in the AST.
2458</pre></td></tr>
2459
2460
Aaron Ballman672dde22016-01-22 23:15:00 +00002461<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 +00002462<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2463
2464Given
2465 __attribute__((device)) void f() { ... }
2466decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2467f. If the matcher is use from clang-query, attr::Kind parameter should be
2468passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2469</pre></td></tr>
2470
2471
Aaron Ballman672dde22016-01-22 23:15:00 +00002472<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 +00002473<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2474partially matching a given regex.
2475
2476Example matches Y but not X
2477 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2478 #include "ASTMatcher.h"
2479 class X {};
2480ASTMatcher.h:
2481 class Y {};
2482
Aaron Ballman672dde22016-01-22 23:15:00 +00002483Usable 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 +00002484</pre></td></tr>
2485
2486
Aaron Ballman672dde22016-01-22 23:15:00 +00002487<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002488<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2489
2490Example matches X but not Y
2491 (matcher = cxxRecordDecl(isExpansionInMainFile())
2492 #include &lt;Y.h&gt;
2493 class X {};
2494Y.h:
2495 class Y {};
2496
Aaron Ballman672dde22016-01-22 23:15:00 +00002497Usable 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 +00002498</pre></td></tr>
2499
2500
Aaron Ballman672dde22016-01-22 23:15:00 +00002501<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 +00002502<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2503
2504Example matches Y but not X
2505 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2506 #include &lt;SystemHeader.h&gt;
2507 class X {};
2508SystemHeader.h:
2509 class Y {};
2510
Aaron Ballman672dde22016-01-22 23:15:00 +00002511Usable 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 +00002512</pre></td></tr>
2513
2514
Aaron Ballman672dde22016-01-22 23:15:00 +00002515<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 +00002516<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2517by the compiler (eg. implicit defaultcopy constructors).
2518</pre></td></tr>
2519
2520
Aaron Ballman672dde22016-01-22 23:15:00 +00002521<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002522<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2523
2524Given
2525 class C {
2526 public: int a;
2527 protected: int b;
2528 private: int c;
2529 };
2530fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002531 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002532</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('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002536<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2537
2538Given
2539 class C {
2540 public: int a;
2541 protected: int b;
2542 private: int c;
2543 };
2544fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002545 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002546</pre></td></tr>
2547
2548
Aaron Ballman672dde22016-01-22 23:15:00 +00002549<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 +00002550<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2551
2552Given
2553 class C {
2554 public: int a;
2555 protected: int b;
2556 private: int c;
2557 };
2558fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002559 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002560</pre></td></tr>
2561
2562
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002563<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>
2564<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2565a specific number of designators.
2566
2567Example: Given
2568 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2569 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2570designatorCountIs(2)
2571 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2572 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2573</pre></td></tr>
2574
2575
Aaron Ballman5c574342016-07-06 18:25:16 +00002576<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 +00002577<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2578bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002579
2580Given
2581 class C {
2582 int a : 2;
2583 int b : 4;
2584 int c : 2;
2585 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002586fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002587 matches 'int a;' and 'int c;' but not 'int b;'.
2588</pre></td></tr>
2589
2590
2591<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>
2592<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2593
2594Given
2595 class C {
2596 int a : 2;
2597 int b;
2598 };
2599fieldDecl(isBitField())
2600 matches 'int a;' but not 'int b;'.
2601</pre></td></tr>
2602
2603
Aaron Ballman672dde22016-01-22 23:15:00 +00002604<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 +00002605<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 +00002606
Peter Wua9244b52017-06-08 22:00:58 +00002607Given
2608 f('false, 3.14, 42);
2609characterLiteral(equals(0))
2610 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2611 match false
2612floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2613 match 3.14
2614integerLiteral(equals(42))
2615 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002616
Clement Courbet43bdba42017-07-11 15:45:22 +00002617Note that you cannot directly match a negative numeric literal because the
2618minus sign is not part of the literal: It is a unary operator whose operand
2619is the positive numeric literal. Instead, you must use a unaryOperator()
2620matcher to match the minus sign:
2621
2622unaryOperator(hasOperatorName("-"),
2623 hasUnaryOperand(integerLiteral(equals(13))))
2624
Peter Wua9244b52017-06-08 22:00:58 +00002625Usable 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 +00002626 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 +00002627</pre></td></tr>
2628
2629
Peter Wua9244b52017-06-08 22:00:58 +00002630<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>
2631<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2632
2633
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002634<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>
2635<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2636
2637Given:
2638 void f();
2639 void g() noexcept;
2640 void h() noexcept(true);
2641 void i() noexcept(false);
2642 void j() throw();
2643 void k() throw(int);
2644 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002645functionDecl(hasDynamicExceptionSpec()) and
2646 functionProtoType(hasDynamicExceptionSpec())
2647 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002648</pre></td></tr>
2649
2650
Aaron Ballman672dde22016-01-22 23:15:00 +00002651<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 +00002652<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2653
2654Matches overloaded operator names specified in strings without the
2655"operator" prefix: e.g. "&lt;&lt;".
2656
2657Given:
2658 class A { int operator*(); };
2659 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2660 A a;
2661 a &lt;&lt; a; &lt;-- This matches
2662
2663cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2664specified line and
2665cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2666matches the declaration of A.
2667
Aaron Ballman672dde22016-01-22 23:15:00 +00002668Usable 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 +00002669</pre></td></tr>
2670
2671
Aaron Ballman672dde22016-01-22 23:15:00 +00002672<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 +00002673<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2674
2675Given:
2676 constexpr int foo = 42;
2677 constexpr int bar();
2678varDecl(isConstexpr())
2679 matches the declaration of foo.
2680functionDecl(isConstexpr())
2681 matches the declaration of bar.
2682</pre></td></tr>
2683
2684
Aaron Ballman672dde22016-01-22 23:15:00 +00002685<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 +00002686<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2687
2688Given:
2689 class A { ~A(); };
2690 class B { ~B() = default; };
2691functionDecl(isDefaulted())
2692 matches the declaration of ~B, but not ~A.
2693</pre></td></tr>
2694
2695
Aaron Ballman672dde22016-01-22 23:15:00 +00002696<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002697<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2698
2699Example matches A, va, fa
2700 class A {};
2701 class B; Doesn't match, as it has no body.
2702 int va;
2703 extern int vb; Doesn't match, as it doesn't define the variable.
2704 void fa() {}
2705 void fb(); Doesn't match, as it has no body.
2706
Aaron Ballman672dde22016-01-22 23:15:00 +00002707Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002708</pre></td></tr>
2709
2710
Aaron Ballman672dde22016-01-22 23:15:00 +00002711<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 +00002712<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2713
2714Given:
2715 void Func();
2716 void DeletedFunc() = delete;
2717functionDecl(isDeleted())
2718 matches the declaration of DeletedFunc, but not Func.
2719</pre></td></tr>
2720
2721
Aaron Ballman672dde22016-01-22 23:15:00 +00002722<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 +00002723<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2724static member variable template instantiations.
2725
2726Given
2727 template&lt;typename T&gt; void A(T t) { }
2728 template&lt;&gt; void A(int N) { }
2729functionDecl(isExplicitTemplateSpecialization())
2730 matches the specialization A&lt;int&gt;().
2731
Aaron Ballman672dde22016-01-22 23:15:00 +00002732Usable 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 +00002733</pre></td></tr>
2734
2735
Aaron Ballman672dde22016-01-22 23:15:00 +00002736<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002737<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2738
2739Given:
2740 extern "C" void f() {}
2741 extern "C" { void g() {} }
2742 void h() {}
2743functionDecl(isExternC())
2744 matches the declaration of f and g, but not the declaration h
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('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002749<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2750the inline keyword.
2751
2752Given
2753 inline void f();
2754 void g();
2755 namespace n {
2756 inline namespace m {}
2757 }
2758functionDecl(isInline()) will match ::f().
2759namespaceDecl(isInline()) will match n::m.
2760</pre></td></tr>
2761
2762
Aaron Ballman672dde22016-01-22 23:15:00 +00002763<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 +00002764<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2765
2766Given:
2767 void f();
2768 void g() noexcept;
2769 void h() throw();
2770 void i() throw(int);
2771 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002772functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2773 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002774</pre></td></tr>
2775
2776
Haojian Wub3d25462016-09-26 16:01:52 +00002777<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 +00002778<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2779class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002780
2781Given:
2782 static void f() {}
2783 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002784 extern int j;
2785 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002786functionDecl(isStaticStorageClass())
2787 matches the function declaration f.
2788varDecl(isStaticStorageClass())
2789 matches the variable declaration i.
2790</pre></td></tr>
2791
2792
Aaron Ballman672dde22016-01-22 23:15:00 +00002793<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 +00002794<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2795member variable template instantiations.
2796
2797Given
2798 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2799or
2800 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2801cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2802 matches the template instantiation of X&lt;A&gt;.
2803
2804But given
2805 template &lt;typename T&gt; class X {}; class A {};
2806 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2807cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2808 does not match, as X&lt;A&gt; is an explicit template specialization.
2809
Aaron Ballman672dde22016-01-22 23:15:00 +00002810Usable 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 +00002811</pre></td></tr>
2812
2813
Aaron Ballman672dde22016-01-22 23:15:00 +00002814<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002815<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2816
2817Example matches f, but not g or h. The function i will not match, even when
2818compiled in C mode.
2819 void f(...);
2820 void g(int);
2821 template &lt;typename... Ts&gt; void h(Ts...);
2822 void i();
2823</pre></td></tr>
2824
2825
Aaron Ballman672dde22016-01-22 23:15:00 +00002826<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 +00002827<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2828specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002829
2830Given
2831 void f(int i) {}
2832 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002833 void h(int i, int j);
2834 void j(int i);
2835 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002836functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002837 matches void g(int i, int j) {}
2838functionProtoType(parameterCountIs(2))
2839 matches void h(int i, int j)
2840functionProtoType(parameterCountIs(3))
2841 matches void k(int x, int y, int z, ...);
2842</pre></td></tr>
2843
2844
Aaron Ballman230ad972016-06-07 17:34:45 +00002845<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>
2846<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2847
2848Given:
2849 void f();
2850 void g() noexcept;
2851 void h() noexcept(true);
2852 void i() noexcept(false);
2853 void j() throw();
2854 void k() throw(int);
2855 void l() throw(...);
2856functionDecl(hasDynamicExceptionSpec()) and
2857 functionProtoType(hasDynamicExceptionSpec())
2858 match the declarations of j, k, and l, but not f, g, h, or i.
2859</pre></td></tr>
2860
2861
2862<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>
2863<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2864
2865Given:
2866 void f();
2867 void g() noexcept;
2868 void h() throw();
2869 void i() throw(int);
2870 void j() noexcept(false);
2871functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2872 match the declarations of g, and h, but not f, i or j.
2873</pre></td></tr>
2874
2875
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002876<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>
2877<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2878specific parameter count.
2879
2880Given
2881 void f(int i) {}
2882 void g(int i, int j) {}
2883 void h(int i, int j);
2884 void j(int i);
2885 void k(int x, int y, int z, ...);
2886functionDecl(parameterCountIs(2))
2887 matches void g(int i, int j) {}
2888functionProtoType(parameterCountIs(2))
2889 matches void h(int i, int j)
2890functionProtoType(parameterCountIs(3))
2891 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002892</pre></td></tr>
2893
2894
Aaron Ballman672dde22016-01-22 23:15:00 +00002895<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 +00002896<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 +00002897
Peter Wua9244b52017-06-08 22:00:58 +00002898Given
2899 f('false, 3.14, 42);
2900characterLiteral(equals(0))
2901 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2902 match false
2903floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2904 match 3.14
2905integerLiteral(equals(42))
2906 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002907
Clement Courbet43bdba42017-07-11 15:45:22 +00002908Note that you cannot directly match a negative numeric literal because the
2909minus sign is not part of the literal: It is a unary operator whose operand
2910is the positive numeric literal. Instead, you must use a unaryOperator()
2911matcher to match the minus sign:
2912
2913unaryOperator(hasOperatorName("-"),
2914 hasUnaryOperand(integerLiteral(equals(13))))
2915
Peter Wua9244b52017-06-08 22:00:58 +00002916Usable 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 +00002917 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 +00002918</pre></td></tr>
2919
2920
Peter Wua9244b52017-06-08 22:00:58 +00002921<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>
2922<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2923
2924
2925<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>
2926<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2927
2928
2929<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>
2930<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2931
2932
Aaron Ballman672dde22016-01-22 23:15:00 +00002933<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 +00002934<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2935to '.'.
2936
2937Member calls on the implicit this pointer match as called with '-&gt;'.
2938
2939Given
2940 class Y {
2941 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2942 int a;
2943 static int b;
2944 };
2945memberExpr(isArrow())
2946 matches this-&gt;x, x, y.x, a, this-&gt;b
2947</pre></td></tr>
2948
2949
Aaron Ballmana086b9f2016-08-17 13:10:42 +00002950<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>
2951<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2952
2953Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2954void f() {
2955 int x;
2956 static int y;
2957}
2958int z;
2959
2960Example matches f() because it has external formal linkage despite being
2961unique to the translation unit as though it has internal likage
2962(matcher = functionDecl(hasExternalFormalLinkage()))
2963
2964namespace {
2965void f() {}
2966}
2967</pre></td></tr>
2968
2969
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002970<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 +00002971<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2972
2973Supports specifying enclosing namespaces or classes by prefixing the name
2974with '&lt;enclosing&gt;::'.
2975Does not match typedefs of an underlying type with the given name.
2976
2977Example matches X (Name == "X")
2978 class X;
2979
2980Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2981 namespace a { namespace b { class X; } }
2982</pre></td></tr>
2983
2984
Aaron Ballman672dde22016-01-22 23:15:00 +00002985<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 +00002986<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2987a substring matched by the given RegExp.
2988
2989Supports specifying enclosing namespaces or classes by
2990prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2991of an underlying type with the given name.
2992
2993Example matches X (regexp == "::X")
2994 class X;
2995
2996Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2997 namespace foo { namespace bar { class X; } }
2998</pre></td></tr>
2999
3000
Aaron Ballman672dde22016-01-22 23:15:00 +00003001<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 +00003002<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3003
3004Given
3005 namespace n {
3006 namespace {} #1
3007 }
3008namespaceDecl(isAnonymous()) will match #1 but not ::n.
3009</pre></td></tr>
3010
3011
Aaron Ballman672dde22016-01-22 23:15:00 +00003012<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 +00003013<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3014the inline keyword.
3015
3016Given
3017 inline void f();
3018 void g();
3019 namespace n {
3020 inline namespace m {}
3021 }
3022functionDecl(isInline()) will match ::f().
3023namespaceDecl(isInline()) will match n::m.
3024</pre></td></tr>
3025
3026
Aaron Ballman672dde22016-01-22 23:15:00 +00003027<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 +00003028<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3029a specific number of arguments (including absent default arguments).
3030
3031Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3032 void f(int x, int y);
3033 f(0, 0);
3034</pre></td></tr>
3035
3036
Aaron Ballman672dde22016-01-22 23:15:00 +00003037<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 +00003038<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3039
3040objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3041message expression in
3042
3043 UIWebView *webView = ...;
3044 CGRect bodyFrame = webView.frame;
3045 bodyFrame.size.height = self.bodyContentHeight;
3046 webView.frame = bodyFrame;
3047 ^---- matches here
3048</pre></td></tr>
3049
3050
Aaron Ballman672dde22016-01-22 23:15:00 +00003051<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 +00003052<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3053
3054Matches only when the selector of the objCMessageExpr is NULL. This may
3055represent an error condition in the tree!
3056</pre></td></tr>
3057
3058
Aaron Ballman672dde22016-01-22 23:15:00 +00003059<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003060<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3061
3062 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3063 matches the outer message expr in the code below, but NOT the message
3064 invocation for self.bodyView.
3065 [self.bodyView loadHTMLString:html baseURL:NULL];
3066</pre></td></tr>
3067
3068
Aaron Ballman672dde22016-01-22 23:15:00 +00003069<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003070<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3071
3072 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3073 matches self.bodyView in the code below, but NOT the outer message
3074 invocation of "loadHTMLString:baseURL:".
3075 [self.bodyView loadHTMLString:html baseURL:NULL];
3076</pre></td></tr>
3077
3078
Aaron Ballman672dde22016-01-22 23:15:00 +00003079<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003080<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3081a substring matched by the given RegExp.
3082 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3083 invocation for self.bodyView.
3084 [self.bodyView loadHTMLString:html baseURL:NULL];
3085</pre></td></tr>
3086
3087
Aaron Ballman672dde22016-01-22 23:15:00 +00003088<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 +00003089<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3090
3091 matcher = objCMessageExpr(numSelectorArgs(0));
3092 matches self.bodyView in the code below
3093
3094 matcher = objCMessageExpr(numSelectorArgs(2));
3095 matches the invocation of "loadHTMLString:baseURL:" but not that
3096 of self.bodyView
3097 [self.bodyView loadHTMLString:html baseURL:NULL];
3098</pre></td></tr>
3099
3100
Aaron Ballman672dde22016-01-22 23:15:00 +00003101<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 +00003102<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3103
3104Given
3105 class Y { public: void x(); };
3106 void z() { Y* y; y-&gt;x(); }
3107cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3108 matches y-&gt;x()
3109</pre></td></tr>
3110
3111
Aaron Ballman672dde22016-01-22 23:15:00 +00003112<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003113<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3114
3115Matches a node if it equals the node previously bound to ID.
3116
3117Given
3118 class X { int a; int b; };
3119cxxRecordDecl(
3120 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3121 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3122 matches the class X, as a and b have the same type.
3123
3124Note that when multiple matches are involved via forEach* matchers,
3125equalsBoundNodes acts as a filter.
3126For example:
3127compoundStmt(
3128 forEachDescendant(varDecl().bind("d")),
3129 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3130will trigger a match for each combination of variable declaration
3131and reference to that variable declaration within a compound statement.
3132</pre></td></tr>
3133
3134
Aaron Ballman672dde22016-01-22 23:15:00 +00003135<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003136<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3137the node, not hidden within a typedef.
3138
3139Given
3140 typedef const int const_int;
3141 const_int i;
3142 int *const j;
3143 int *volatile k;
3144 int m;
3145varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3146i is const-qualified but the qualifier is not local.
3147</pre></td></tr>
3148
3149
Aaron Ballman672dde22016-01-22 23:15:00 +00003150<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 +00003151<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3152
3153Given
3154 void a(char);
3155 void b(wchar_t);
3156 void c(double);
3157functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3158matches "a(char)", "b(wchar_t)", but not "c(double)".
3159</pre></td></tr>
3160
3161
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003162<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 +00003163<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3164the Objective-C object pointer type, which is different despite being
3165syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003166
3167Given
3168 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003169
3170 @interface Foo
3171 @end
3172 Foo *f;
3173
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003174 int j;
3175varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003176 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003177</pre></td></tr>
3178
3179
Aaron Ballman672dde22016-01-22 23:15:00 +00003180<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 +00003181<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3182include "top-level" const.
3183
3184Given
3185 void a(int);
3186 void b(int const);
3187 void c(const int);
3188 void d(const int*);
3189 void e(int const) {};
3190functionDecl(hasAnyParameter(hasType(isConstQualified())))
3191 matches "void b(int const)", "void c(const int)" and
3192 "void e(int const) {}". It does not match d as there
3193 is no top-level const on the parameter type "const int *".
3194</pre></td></tr>
3195
3196
Aaron Ballman672dde22016-01-22 23:15:00 +00003197<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 +00003198<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3199
3200Given
3201 void a(int);
3202 void b(long);
3203 void c(double);
3204functionDecl(hasAnyParameter(hasType(isInteger())))
3205matches "a(int)", "b(long)", but not "c(double)".
3206</pre></td></tr>
3207
3208
Clement Courbet42517592016-07-12 06:36:00 +00003209<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>
3210<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3211
3212Given
3213 void a(int);
3214 void b(unsigned long);
3215 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003216functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003217matches "a(int)", but not "b(unsigned long)" and "c(double)".
3218</pre></td></tr>
3219
3220
3221<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>
3222<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3223
3224Given
3225 void a(int);
3226 void b(unsigned long);
3227 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003228functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003229matches "b(unsigned long)", but not "a(int)" and "c(double)".
3230</pre></td></tr>
3231
3232
Aaron Ballman672dde22016-01-22 23:15:00 +00003233<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003234<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3235include "top-level" volatile.
3236
3237Given
3238 void a(int);
3239 void b(int volatile);
3240 void c(volatile int);
3241 void d(volatile int*);
3242 void e(int volatile) {};
3243functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3244 matches "void b(int volatile)", "void c(volatile int)" and
3245 "void e(int volatile) {}". It does not match d as there
3246 is no top-level volatile on the parameter type "volatile int *".
3247</pre></td></tr>
3248
3249
Aaron Ballman672dde22016-01-22 23:15:00 +00003250<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 +00003251<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3252
3253Example matches C, but not S or U.
3254 struct S {};
3255 class C {};
3256 union U {};
3257</pre></td></tr>
3258
3259
Aaron Ballman672dde22016-01-22 23:15:00 +00003260<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003261<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3262
3263Example matches S, but not C or U.
3264 struct S {};
3265 class C {};
3266 union U {};
3267</pre></td></tr>
3268
3269
Aaron Ballman672dde22016-01-22 23:15:00 +00003270<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 +00003271<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3272
3273Example matches U, but not C or S.
3274 struct S {};
3275 class C {};
3276 union U {};
3277</pre></td></tr>
3278
3279
Aaron Ballman672dde22016-01-22 23:15:00 +00003280<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 +00003281<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3282
3283Matches a node if it equals the node previously bound to ID.
3284
3285Given
3286 class X { int a; int b; };
3287cxxRecordDecl(
3288 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3289 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3290 matches the class X, as a and b have the same type.
3291
3292Note that when multiple matches are involved via forEach* matchers,
3293equalsBoundNodes acts as a filter.
3294For example:
3295compoundStmt(
3296 forEachDescendant(varDecl().bind("d")),
3297 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3298will trigger a match for each combination of variable declaration
3299and reference to that variable declaration within a compound statement.
3300</pre></td></tr>
3301
3302
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003303<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>
3304<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3305
3306Stmt has pointer identity in the AST.
3307</pre></td></tr>
3308
3309
Aaron Ballman672dde22016-01-22 23:15:00 +00003310<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 +00003311<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3312partially matching a given regex.
3313
3314Example matches Y but not X
3315 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3316 #include "ASTMatcher.h"
3317 class X {};
3318ASTMatcher.h:
3319 class Y {};
3320
Aaron Ballman672dde22016-01-22 23:15:00 +00003321Usable 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 +00003322</pre></td></tr>
3323
3324
Aaron Ballman672dde22016-01-22 23:15:00 +00003325<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 +00003326<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3327
3328Example matches X but not Y
3329 (matcher = cxxRecordDecl(isExpansionInMainFile())
3330 #include &lt;Y.h&gt;
3331 class X {};
3332Y.h:
3333 class Y {};
3334
Aaron Ballman672dde22016-01-22 23:15:00 +00003335Usable 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 +00003336</pre></td></tr>
3337
3338
Aaron Ballman672dde22016-01-22 23:15:00 +00003339<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 +00003340<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3341
3342Example matches Y but not X
3343 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3344 #include &lt;SystemHeader.h&gt;
3345 class X {};
3346SystemHeader.h:
3347 class Y {};
3348
Aaron Ballman672dde22016-01-22 23:15:00 +00003349Usable 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 +00003350</pre></td></tr>
3351
3352
Etienne Bergeron3588be72016-05-12 04:20:04 +00003353<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>
3354<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3355
3356Given
3357 int a[42];
3358 int b[2 * 21];
3359 int c[41], d[43];
3360 char *s = "abcd";
3361 wchar_t *ws = L"abcd";
3362 char *w = "a";
3363constantArrayType(hasSize(42))
3364 matches "int a[42]" and "int b[2 * 21]"
3365stringLiteral(hasSize(4))
3366 matches "abcd", L"abcd"
3367</pre></td></tr>
3368
3369
Aaron Ballman672dde22016-01-22 23:15:00 +00003370<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 +00003371<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3372
3373Example matches A, va, fa
3374 class A {};
3375 class B; Doesn't match, as it has no body.
3376 int va;
3377 extern int vb; Doesn't match, as it doesn't define the variable.
3378 void fa() {}
3379 void fb(); Doesn't match, as it has no body.
3380
Aaron Ballman672dde22016-01-22 23:15:00 +00003381Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003382</pre></td></tr>
3383
3384
Aaron Ballman672dde22016-01-22 23:15:00 +00003385<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 +00003386<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3387
3388Note that 'Value' is a string as the template argument's value is
3389an arbitrary precision integer. 'Value' must be euqal to the canonical
3390representation of that integral value in base 10.
3391
3392Given
3393 template&lt;int T&gt; struct A {};
3394 C&lt;42&gt; c;
3395classTemplateSpecializationDecl(
3396 hasAnyTemplateArgument(equalsIntegralValue("42")))
3397 matches the implicit instantiation of C in C&lt;42&gt;.
3398</pre></td></tr>
3399
3400
Aaron Ballman672dde22016-01-22 23:15:00 +00003401<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 +00003402<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3403
3404Given
3405 template&lt;int T&gt; struct A {};
3406 C&lt;42&gt; c;
3407classTemplateSpecializationDecl(
3408 hasAnyTemplateArgument(isIntegral()))
3409 matches the implicit instantiation of C in C&lt;42&gt;
3410 with isIntegral() matching 42.
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_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 +00003415<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3416
3417Given
3418 template&lt;typename T&gt; struct C {};
3419 C&lt;int&gt; c;
3420classTemplateSpecializationDecl(templateArgumentCountIs(1))
3421 matches C&lt;int&gt;.
3422</pre></td></tr>
3423
3424
Aaron Ballman672dde22016-01-22 23:15:00 +00003425<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 +00003426<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3427partially matching a given regex.
3428
3429Example matches Y but not X
3430 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3431 #include "ASTMatcher.h"
3432 class X {};
3433ASTMatcher.h:
3434 class Y {};
3435
Aaron Ballman672dde22016-01-22 23:15:00 +00003436Usable 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 +00003437</pre></td></tr>
3438
3439
Aaron Ballman672dde22016-01-22 23:15:00 +00003440<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 +00003441<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3442
3443Example matches X but not Y
3444 (matcher = cxxRecordDecl(isExpansionInMainFile())
3445 #include &lt;Y.h&gt;
3446 class X {};
3447Y.h:
3448 class Y {};
3449
Aaron Ballman672dde22016-01-22 23:15:00 +00003450Usable 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 +00003451</pre></td></tr>
3452
3453
Aaron Ballman672dde22016-01-22 23:15:00 +00003454<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 +00003455<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3456
3457Example matches Y but not X
3458 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3459 #include &lt;SystemHeader.h&gt;
3460 class X {};
3461SystemHeader.h:
3462 class Y {};
3463
Aaron Ballman672dde22016-01-22 23:15:00 +00003464Usable 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 +00003465</pre></td></tr>
3466
3467
Aaron Ballman672dde22016-01-22 23:15:00 +00003468<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 +00003469<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3470
3471Given
3472 struct S { bool func(); };
3473functionDecl(returns(booleanType()))
3474 matches "bool func();"
3475</pre></td></tr>
3476
3477
Aaron Ballman672dde22016-01-22 23:15:00 +00003478<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 +00003479<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3480
3481Matches a node if it equals the node previously bound to ID.
3482
3483Given
3484 class X { int a; int b; };
3485cxxRecordDecl(
3486 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3487 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3488 matches the class X, as a and b have the same type.
3489
3490Note that when multiple matches are involved via forEach* matchers,
3491equalsBoundNodes acts as a filter.
3492For example:
3493compoundStmt(
3494 forEachDescendant(varDecl().bind("d")),
3495 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3496will trigger a match for each combination of variable declaration
3497and reference to that variable declaration within a compound statement.
3498</pre></td></tr>
3499
3500
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003501<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>
3502<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3503
3504Type has pointer identity in the AST.
3505</pre></td></tr>
3506
3507
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003508<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>
3509<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3510
3511Given
3512 int i;
3513 float f;
3514realFloatingPointType()
3515 matches "float f" but not "int i"
3516</pre></td></tr>
3517
3518
Aaron Ballman672dde22016-01-22 23:15:00 +00003519<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 +00003520<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3521
3522Given
3523 struct S { void func(); };
3524functionDecl(returns(voidType()))
3525 matches "void func();"
3526</pre></td></tr>
3527
3528
Aaron Ballman672dde22016-01-22 23:15:00 +00003529<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 +00003530<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3531
3532Given
3533 int x;
3534 int s = sizeof(x) + alignof(x)
3535unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3536 matches sizeof(x)
3537</pre></td></tr>
3538
3539
Aaron Ballman672dde22016-01-22 23:15:00 +00003540<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 +00003541<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3542unary).
3543
3544Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3545 !(a || b)
3546</pre></td></tr>
3547
3548
Aaron Ballman672dde22016-01-22 23:15:00 +00003549<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 +00003550<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3551
3552Example matches x, but not y, z, or a.
3553(matcher = varDecl(hasAutomaticStorageDuration())
3554void f() {
3555 int x;
3556 static int y;
3557 thread_local int z;
3558}
3559int a;
3560</pre></td></tr>
3561
3562
Aaron Ballman672dde22016-01-22 23:15:00 +00003563<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 +00003564<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3565
3566Example matches y and z (matcher = varDecl(hasGlobalStorage())
3567void f() {
3568 int x;
3569 static int y;
3570}
3571int z;
3572</pre></td></tr>
3573
3574
Aaron Ballman672dde22016-01-22 23:15:00 +00003575<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003576<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3577non-static local variable.
3578
3579Example matches x (matcher = varDecl(hasLocalStorage())
3580void f() {
3581 int x;
3582 static int y;
3583}
3584int z;
3585</pre></td></tr>
3586
3587
Aaron Ballman672dde22016-01-22 23:15:00 +00003588<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 +00003589<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 +00003590It includes the variable declared at namespace scope and those declared
3591with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003592
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003593void f() {
3594 int x;
3595 static int y;
3596 thread_local int z;
3597}
3598int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003599static int b;
3600extern int c;
3601varDecl(hasStaticStorageDuration())
3602 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003603</pre></td></tr>
3604
3605
Aaron Ballman672dde22016-01-22 23:15:00 +00003606<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 +00003607<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3608
3609Example matches z, but not x, z, or a.
3610(matcher = varDecl(hasThreadStorageDuration())
3611void f() {
3612 int x;
3613 static int y;
3614 thread_local int z;
3615}
3616int a;
3617</pre></td></tr>
3618
3619
Aaron Ballman672dde22016-01-22 23:15:00 +00003620<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 +00003621<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3622
3623Given:
3624 constexpr int foo = 42;
3625 constexpr int bar();
3626varDecl(isConstexpr())
3627 matches the declaration of foo.
3628functionDecl(isConstexpr())
3629 matches the declaration of bar.
3630</pre></td></tr>
3631
3632
Aaron Ballman672dde22016-01-22 23:15:00 +00003633<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 +00003634<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3635
3636Example matches A, va, fa
3637 class A {};
3638 class B; Doesn't match, as it has no body.
3639 int va;
3640 extern int vb; Doesn't match, as it doesn't define the variable.
3641 void fa() {}
3642 void fb(); Doesn't match, as it has no body.
3643
Aaron Ballman672dde22016-01-22 23:15:00 +00003644Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003645</pre></td></tr>
3646
3647
Aaron Ballman672dde22016-01-22 23:15:00 +00003648<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 +00003649<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3650a C++ catch block, or an Objective-C statement.
3651
3652Example matches x (matcher = varDecl(isExceptionVariable())
3653void f(int y) {
3654 try {
3655 } catch (int x) {
3656 }
3657}
3658</pre></td></tr>
3659
3660
Aaron Ballman672dde22016-01-22 23:15:00 +00003661<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 +00003662<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3663static member variable template instantiations.
3664
3665Given
3666 template&lt;typename T&gt; void A(T t) { }
3667 template&lt;&gt; void A(int N) { }
3668functionDecl(isExplicitTemplateSpecialization())
3669 matches the specialization A&lt;int&gt;().
3670
Aaron Ballman672dde22016-01-22 23:15:00 +00003671Usable 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 +00003672</pre></td></tr>
3673
3674
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003675<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>
3676<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations.
3677
3678Given:
3679 extern "C" void f() {}
3680 extern "C" { void g() {} }
3681 void h() {}
3682functionDecl(isExternC())
3683 matches the declaration of f and g, but not the declaration h
3684</pre></td></tr>
3685
3686
Haojian Wub3d25462016-09-26 16:01:52 +00003687<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 +00003688<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3689class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003690
3691Given:
3692 static void f() {}
3693 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003694 extern int j;
3695 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003696functionDecl(isStaticStorageClass())
3697 matches the function declaration f.
3698varDecl(isStaticStorageClass())
3699 matches the variable declaration i.
3700</pre></td></tr>
3701
3702
Aaron Ballman672dde22016-01-22 23:15:00 +00003703<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 +00003704<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3705member variable template instantiations.
3706
3707Given
3708 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3709or
3710 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3711cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3712 matches the template instantiation of X&lt;A&gt;.
3713
3714But given
3715 template &lt;typename T&gt; class X {}; class A {};
3716 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3717cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3718 does not match, as X&lt;A&gt; is an explicit template specialization.
3719
Aaron Ballman672dde22016-01-22 23:15:00 +00003720Usable 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 +00003721</pre></td></tr>
3722
3723
Aaron Ballman672dde22016-01-22 23:15:00 +00003724<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 +00003725<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3726template instantiations.
3727
3728Given
3729 template&lt;typename T&gt; void A(T t) { T i; }
3730 A(0);
3731 A(0U);
3732functionDecl(isInstantiated())
3733 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3734</pre></td></tr>
3735
3736
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003737<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>
3738<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3739GNU's __null, C++11's nullptr, or C's NULL macro.
3740
3741Given:
3742 void *v1 = NULL;
3743 void *v2 = nullptr;
3744 void *v3 = __null; GNU extension
3745 char *cp = (char *)0;
3746 int *ip = 0;
3747 int i = 0;
3748expr(nullPointerConstant())
3749 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3750 initializer for i.
3751</pre></td></tr>
3752
3753
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003754<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>
3755<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3756
3757This matcher is only provided as a performance optimization of hasName.
3758 hasAnyName(a, b, c)
3759 is equivalent to, but faster than
3760 anyOf(hasName(a), hasName(b), hasName(c))
3761</pre></td></tr>
3762
3763
Aaron Ballman672dde22016-01-22 23:15:00 +00003764<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 +00003765<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3766
3767Given
3768 int j;
3769 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3770 A(0);
3771 A(0U);
3772declStmt(isInTemplateInstantiation())
3773 matches 'int i;' and 'unsigned i'.
3774unless(stmt(isInTemplateInstantiation()))
3775 will NOT match j += 42; as it's shared between the template definition and
3776 instantiation.
3777</pre></td></tr>
3778
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003779<!--END_NARROWING_MATCHERS -->
3780</table>
3781
3782<!-- ======================================================================= -->
3783<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3784<!-- ======================================================================= -->
3785
3786<p>Traversal matchers specify the relationship to other nodes that are
3787reachable from the current node.</p>
3788
3789<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3790forEachDescendant) which work on all nodes and allow users to write more generic
3791match expressions.</p>
3792
3793<table>
3794<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003795<!-- START_TRAVERSAL_MATCHERS -->
3796
3797<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>
3798<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3799
3800Unlike anyOf, eachOf will generate a match result for each
3801matching submatcher.
3802
3803For example, in:
3804 class A { int a; int b; };
3805The matcher:
3806 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3807 has(fieldDecl(hasName("b")).bind("v"))))
3808will generate two results binding "v", the first of which binds
3809the field declaration of a, the second the field declaration of
3810b.
3811
3812Usable as: Any Matcher
3813</pre></td></tr>
3814
3815
3816<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3817<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3818provided matcher.
3819
3820Example matches X, A, B, C
3821 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3822 class X {}; Matches X, because X::X is a class of name X inside X.
3823 class A { class X {}; };
3824 class B { class C { class X {}; }; };
3825
3826DescendantT must be an AST base type.
3827
3828As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3829each result that matches instead of only on the first one.
3830
3831Note: Recursively combined ForEachDescendant can cause many matches:
3832 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3833 forEachDescendant(cxxRecordDecl())
3834 )))
3835will match 10 times (plus injected class name matches) on:
3836 class A { class B { class C { class D { class E {}; }; }; }; };
3837
3838Usable as: Any Matcher
3839</pre></td></tr>
3840
3841
3842<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3843<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3844provided matcher.
3845
3846Example matches X, Y
3847 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3848 class X {}; Matches X, because X::X is a class of name X inside X.
3849 class Y { class X {}; };
3850 class Z { class Y { class X {}; }; }; Does not match Z.
3851
3852ChildT must be an AST base type.
3853
3854As opposed to 'has', 'forEach' will cause a match for each result that
3855matches instead of only on the first one.
3856
3857Usable as: Any Matcher
3858</pre></td></tr>
3859
3860
3861<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3862<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3863matcher.
3864
3865Given
3866void f() { if (true) { int x = 42; } }
3867void g() { for (;;) { int x = 43; } }
3868expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3869
3870Usable as: Any Matcher
3871</pre></td></tr>
3872
3873
3874<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3875<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3876provided matcher.
3877
3878Example matches X, Y, Z
3879 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3880 class X {}; Matches X, because X::X is a class of name X inside X.
3881 class Y { class X {}; };
3882 class Z { class Y { class X {}; }; };
3883
3884DescendantT must be an AST base type.
3885
3886Usable as: Any Matcher
3887</pre></td></tr>
3888
3889
3890<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3891<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3892provided matcher.
3893
3894Example matches X, Y
3895 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3896 class X {}; Matches X, because X::X is a class of name X inside X.
3897 class Y { class X {}; };
3898 class Z { class Y { class X {}; }; }; Does not match Z.
3899
3900ChildT must be an AST base type.
3901
3902Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003903Note that has is direct matcher, so it also matches things like implicit
3904casts and paren casts. If you are matching with expr then you should
3905probably consider using ignoringParenImpCasts like:
3906has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003907</pre></td></tr>
3908
3909
3910<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3911<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3912matcher.
3913
3914Given
3915void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3916compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3917
3918Usable as: Any Matcher
3919</pre></td></tr>
3920
3921
Etienne Bergeron5500f952016-05-30 15:25:25 +00003922<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>
3923<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3924switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003925
3926Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3927 if (true) {}
3928</pre></td></tr>
3929
3930
3931<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>
3932<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3933(binary or ternary).
3934
3935Example matches b
3936 condition ? a : b
3937 condition ?: b
3938</pre></td></tr>
3939
3940
3941<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>
3942<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3943
3944Example 1 (conditional ternary operator): matches a
3945 condition ? a : b
3946
3947Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3948 condition ?: b
3949</pre></td></tr>
3950
3951
Manuel Klimeka37e1102016-12-01 15:45:06 +00003952<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>
3953<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 +00003954matches the given matcher.
3955
3956The associated declaration is:
3957- for type nodes, the declaration of the underlying type
3958- for CallExpr, the declaration of the callee
3959- for MemberExpr, the declaration of the referenced member
3960- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00003961- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003962
3963Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3964function. e.g. various subtypes of clang::Type and various expressions.
3965
Manuel Klimeka37e1102016-12-01 15:45:06 +00003966Usable 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;,
3967 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;,
3968 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;,
3969 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;,
3970 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;,
3971 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;,
3972 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003973</pre></td></tr>
3974
3975
Aaron Ballman672dde22016-01-22 23:15:00 +00003976<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 +00003977<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3978
3979Given
3980 int i[5];
3981 void f() { i[1] = 42; }
3982arraySubscriptExpression(hasBase(implicitCastExpr(
3983 hasSourceExpression(declRefExpr()))))
3984 matches i[1] with the declRefExpr() matching i
3985</pre></td></tr>
3986
3987
Aaron Ballman672dde22016-01-22 23:15:00 +00003988<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003989<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3990
3991Given
3992 int i[5];
3993 void f() { i[1] = 42; }
3994arraySubscriptExpression(hasIndex(integerLiteral()))
3995 matches i[1] with the integerLiteral() matching 1
3996</pre></td></tr>
3997
3998
Aaron Ballman672dde22016-01-22 23:15:00 +00003999<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 +00004000<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4001
4002Example matches a (matcher = binaryOperator(hasLHS()))
4003 a || b
4004</pre></td></tr>
4005
4006
Aaron Ballman672dde22016-01-22 23:15:00 +00004007<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 +00004008<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4009
4010Example matches b (matcher = binaryOperator(hasRHS()))
4011 a || b
4012</pre></td></tr>
4013
4014
Aaron Ballman672dde22016-01-22 23:15:00 +00004015<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 +00004016<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4017type.
4018
4019Given
4020 struct A {};
4021 A a[7];
4022 int b[7];
4023arrayType(hasElementType(builtinType()))
4024 matches "int b[7]"
4025
Aaron Ballman672dde22016-01-22 23:15:00 +00004026Usable 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 +00004027</pre></td></tr>
4028
4029
Aaron Ballman672dde22016-01-22 23:15:00 +00004030<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 +00004031<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4032type.
4033
4034Given
4035 struct A {};
4036 A a[7];
4037 int b[7];
4038arrayType(hasElementType(builtinType()))
4039 matches "int b[7]"
4040
Aaron Ballman672dde22016-01-22 23:15:00 +00004041Usable 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 +00004042</pre></td></tr>
4043
4044
Aaron Ballman672dde22016-01-22 23:15:00 +00004045<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 +00004046<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4047
4048Given
4049 _Atomic(int) i;
4050 _Atomic(float) f;
4051atomicType(hasValueType(isInteger()))
4052 matches "_Atomic(int) i"
4053
Aaron Ballman672dde22016-01-22 23:15:00 +00004054Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004055</pre></td></tr>
4056
4057
Aaron Ballman672dde22016-01-22 23:15:00 +00004058<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004059<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4060
4061Given
4062 _Atomic(int) i;
4063 _Atomic(float) f;
4064atomicType(hasValueType(isInteger()))
4065 matches "_Atomic(int) i"
4066
Aaron Ballman672dde22016-01-22 23:15:00 +00004067Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004068</pre></td></tr>
4069
4070
Aaron Ballman672dde22016-01-22 23:15:00 +00004071<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004072<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4073
4074Note: There is no TypeLoc for the deduced type and thus no
4075getDeducedLoc() matcher.
4076
4077Given
4078 auto a = 1;
4079 auto b = 2.0;
4080autoType(hasDeducedType(isInteger()))
4081 matches "auto a"
4082
Aaron Ballman672dde22016-01-22 23:15:00 +00004083Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004084</pre></td></tr>
4085
4086
Aaron Ballman672dde22016-01-22 23:15:00 +00004087<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004088<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4089binary operator matches.
4090</pre></td></tr>
4091
4092
Aaron Ballman672dde22016-01-22 23:15:00 +00004093<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 +00004094<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4095
4096Example matches a (matcher = binaryOperator(hasLHS()))
4097 a || b
4098</pre></td></tr>
4099
4100
Aaron Ballman672dde22016-01-22 23:15:00 +00004101<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 +00004102<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4103
4104Example matches b (matcher = binaryOperator(hasRHS()))
4105 a || b
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_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 +00004110<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4111pointee matches a given matcher.
4112
4113Given
4114 int *a;
4115 int const *b;
4116 float const *f;
4117pointerType(pointee(isConstQualified(), isInteger()))
4118 matches "int const *b"
4119
Aaron Ballman672dde22016-01-22 23:15:00 +00004120Usable 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;,
4121 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 +00004122</pre></td></tr>
4123
4124
Aaron Ballman672dde22016-01-22 23:15:00 +00004125<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004126<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4127pointee matches a given matcher.
4128
4129Given
4130 int *a;
4131 int const *b;
4132 float const *f;
4133pointerType(pointee(isConstQualified(), isInteger()))
4134 matches "int const *b"
4135
Aaron Ballman672dde22016-01-22 23:15:00 +00004136Usable 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;,
4137 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 +00004138</pre></td></tr>
4139
4140
Aaron Ballman672dde22016-01-22 23:15:00 +00004141<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004142<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4143
4144Given
4145 void f(int i);
4146 int y;
4147 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004148callExpr(
4149 forEachArgumentWithParam(
4150 declRefExpr(to(varDecl(hasName("y")))),
4151 parmVarDecl(hasType(isInteger()))
4152))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004153 matches f(y);
4154with declRefExpr(...)
4155 matching int y
4156and parmVarDecl(...)
4157 matching int i
4158</pre></td></tr>
4159
4160
Aaron Ballman672dde22016-01-22 23:15:00 +00004161<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004162<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4163expression.
4164
4165Given
4166 void x(int, int, int) { int y; x(1, y, 42); }
4167callExpr(hasAnyArgument(declRefExpr()))
4168 matches x(1, y, 42)
4169with hasAnyArgument(...)
4170 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004171</pre></td></tr>
4172
4173
Aaron Ballman672dde22016-01-22 23:15:00 +00004174<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 +00004175<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4176call expression.
4177
4178Example matches y in x(y)
4179 (matcher = callExpr(hasArgument(0, declRefExpr())))
4180 void x(int) { int y; x(y); }
4181</pre></td></tr>
4182
4183
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004184<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>
4185<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 +00004186matches the given matcher.
4187
4188The associated declaration is:
4189- for type nodes, the declaration of the underlying type
4190- for CallExpr, the declaration of the callee
4191- for MemberExpr, the declaration of the referenced member
4192- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004193- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004194
4195Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4196function. e.g. various subtypes of clang::Type and various expressions.
4197
Manuel Klimeka37e1102016-12-01 15:45:06 +00004198Usable 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;,
4199 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;,
4200 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;,
4201 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;,
4202 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;,
4203 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;,
4204 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</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_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 +00004209<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4210
4211Given
4212 class A { A() : i(42), j(42) {} int i; int j; };
4213cxxConstructorDecl(forEachConstructorInitializer(
4214 forField(decl().bind("x"))
4215))
4216 will trigger two matches, binding for 'i' and 'j' respectively.
4217</pre></td></tr>
4218
4219
Aaron Ballman672dde22016-01-22 23:15:00 +00004220<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004221<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4222
4223Given
4224 struct Foo {
4225 Foo() : foo_(1) { }
4226 int foo_;
4227 };
4228cxxRecordDecl(has(cxxConstructorDecl(
4229 hasAnyConstructorInitializer(anything())
4230)))
4231 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4232</pre></td></tr>
4233
4234
Aaron Ballman672dde22016-01-22 23:15:00 +00004235<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 +00004236<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4237
4238Given
4239 struct Foo {
4240 Foo() : foo_(1) { }
4241 int foo_;
4242 };
4243cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4244 forField(hasName("foo_"))))))
4245 matches Foo
4246with forField matching foo_
4247</pre></td></tr>
4248
4249
Aaron Ballman672dde22016-01-22 23:15:00 +00004250<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 +00004251<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4252
4253Given
4254 struct Foo {
4255 Foo() : foo_(1) { }
4256 int foo_;
4257 };
4258cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4259 withInitializer(integerLiteral(equals(1)))))))
4260 matches Foo
4261with withInitializer matching (1)
4262</pre></td></tr>
4263
4264
Aaron Ballman672dde22016-01-22 23:15:00 +00004265<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 +00004266<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4267definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004268
4269Given
4270 for (;;) {}
4271hasBody(compoundStmt())
4272 matches 'for (;;) {}'
4273with compoundStmt()
4274 matching '{}'
4275</pre></td></tr>
4276
4277
Aaron Ballman672dde22016-01-22 23:15:00 +00004278<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 +00004279<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4280
4281Example:
4282 forStmt(hasLoopVariable(anything()))
4283matches 'int x' in
4284 for (int x : a) { }
4285</pre></td></tr>
4286
4287
Aaron Ballman672dde22016-01-22 23:15:00 +00004288<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004289<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4290
4291Example:
4292 forStmt(hasRangeInit(anything()))
4293matches 'a' in
4294 for (int x : a) { }
4295</pre></td></tr>
4296
4297
Aaron Ballman672dde22016-01-22 23:15:00 +00004298<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 +00004299<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4300
4301
Aaron Ballman672dde22016-01-22 23:15:00 +00004302<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004303<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4304
4305Example matches y.x()
4306 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4307 class Y { public: void x(); };
4308 void z() { Y y; y.x(); }",
4309
4310FIXME: Overload to allow directly matching types?
4311</pre></td></tr>
4312
4313
Aaron Ballman672dde22016-01-22 23:15:00 +00004314<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 +00004315<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4316</pre></td></tr>
4317
4318
Aaron Ballman672dde22016-01-22 23:15:00 +00004319<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 +00004320<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4321matcher, or is a pointer to a type that matches the InnerMatcher.
4322</pre></td></tr>
4323
4324
Clement Courbet6ecaec82016-07-05 07:49:31 +00004325<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 +00004326<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 +00004327produce multiple matches.
4328
4329Given
4330 class A { virtual void f(); };
4331 class B : public A { void f(); };
4332 class C : public B { void f(); };
4333cxxMethodDecl(ofClass(hasName("C")),
4334 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4335 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4336 that B::f is not overridden by C::f).
4337
4338The check can produce multiple matches in case of multiple inheritance, e.g.
4339 class A1 { virtual void f(); };
4340 class A2 { virtual void f(); };
4341 class C : public A1, public A2 { void f(); };
4342cxxMethodDecl(ofClass(hasName("C")),
4343 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4344 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4345 once with "b" binding "A2::f" and "d" binding "C::f".
4346</pre></td></tr>
4347
4348
Aaron Ballman672dde22016-01-22 23:15:00 +00004349<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 +00004350<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4351belongs to.
4352
4353FIXME: Generalize this for other kinds of declarations.
4354FIXME: What other kind of declarations would we need to generalize
4355this to?
4356
4357Example matches A() in the last line
4358 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4359 ofClass(hasName("A"))))))
4360 class A {
4361 public:
4362 A();
4363 };
4364 A a = A();
4365</pre></td></tr>
4366
4367
Manuel Klimeka37e1102016-12-01 15:45:06 +00004368<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>
4369<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 +00004370matches the given matcher.
4371
4372The associated declaration is:
4373- for type nodes, the declaration of the underlying type
4374- for CallExpr, the declaration of the callee
4375- for MemberExpr, the declaration of the referenced member
4376- for CXXConstructExpr, the declaration of the constructor
4377- for CXXNewExpr, the declaration of the operator new
4378
4379Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4380function. e.g. various subtypes of clang::Type and various expressions.
4381
Manuel Klimeka37e1102016-12-01 15:45:06 +00004382Usable 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;,
4383 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;,
4384 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;,
4385 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;,
4386 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;,
4387 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;,
4388 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004389</pre></td></tr>
4390
4391
Aaron Ballman672dde22016-01-22 23:15:00 +00004392<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 +00004393<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4394
4395Given:
4396 class A { void func(); };
4397 class B { void member(); };
4398
4399cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4400A but not B.
4401</pre></td></tr>
4402
4403
Aaron Ballman672dde22016-01-22 23:15:00 +00004404<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 +00004405<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4406a class matching Base.
4407
4408Note that a class is not considered to be derived from itself.
4409
4410Example matches Y, Z, C (Base == hasName("X"))
4411 class X;
4412 class Y : public X {}; directly derived
4413 class Z : public Y {}; indirectly derived
4414 typedef X A;
4415 typedef A B;
4416 class C : public B {}; derived from a typedef of X
4417
4418In the following example, Bar matches isDerivedFrom(hasName("X")):
4419 class Foo;
4420 typedef Foo X;
4421 class Bar : public Foo {}; derived from a type that X is a typedef of
4422</pre></td></tr>
4423
4424
Aaron Ballman672dde22016-01-22 23:15:00 +00004425<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 +00004426<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4427match Base.
4428</pre></td></tr>
4429
4430
Aaron Ballman672dde22016-01-22 23:15:00 +00004431<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 +00004432<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4433given matcher.
4434
4435Example matches y.x() (matcher = callExpr(callee(
4436 cxxMethodDecl(hasName("x")))))
4437 class Y { public: void x(); };
4438 void z() { Y y; y.x(); }
4439</pre></td></tr>
4440
4441
Aaron Ballman672dde22016-01-22 23:15:00 +00004442<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 +00004443<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4444
4445Given
4446 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4447 void f() { f(); }
4448callExpr(callee(expr()))
4449 matches this-&gt;x(), x(), y.x(), f()
4450with callee(...)
4451 matching this-&gt;x, x, y.x, f respectively
4452
Aaron Ballman672dde22016-01-22 23:15:00 +00004453Note: 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 +00004454because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004455internal::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 +00004456implemented in terms of implicit casts.
4457</pre></td></tr>
4458
4459
Aaron Ballman672dde22016-01-22 23:15:00 +00004460<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 +00004461<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4462
4463Given
4464 void f(int i);
4465 int y;
4466 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004467callExpr(
4468 forEachArgumentWithParam(
4469 declRefExpr(to(varDecl(hasName("y")))),
4470 parmVarDecl(hasType(isInteger()))
4471))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004472 matches f(y);
4473with declRefExpr(...)
4474 matching int y
4475and parmVarDecl(...)
4476 matching int i
4477</pre></td></tr>
4478
4479
Aaron Ballman672dde22016-01-22 23:15:00 +00004480<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 +00004481<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4482expression.
4483
4484Given
4485 void x(int, int, int) { int y; x(1, y, 42); }
4486callExpr(hasAnyArgument(declRefExpr()))
4487 matches x(1, y, 42)
4488with hasAnyArgument(...)
4489 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004490</pre></td></tr>
4491
4492
Aaron Ballman672dde22016-01-22 23:15:00 +00004493<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 +00004494<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4495call expression.
4496
4497Example matches y in x(y)
4498 (matcher = callExpr(hasArgument(0, declRefExpr())))
4499 void x(int) { int y; x(y); }
4500</pre></td></tr>
4501
4502
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004503<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>
4504<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 +00004505matches the given matcher.
4506
4507The associated declaration is:
4508- for type nodes, the declaration of the underlying type
4509- for CallExpr, the declaration of the callee
4510- for MemberExpr, the declaration of the referenced member
4511- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004512- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004513
4514Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4515function. e.g. various subtypes of clang::Type and various expressions.
4516
Manuel Klimeka37e1102016-12-01 15:45:06 +00004517Usable 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;,
4518 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;,
4519 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;,
4520 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;,
4521 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;,
4522 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;,
4523 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004524</pre></td></tr>
4525
4526
Aaron Ballman672dde22016-01-22 23:15:00 +00004527<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004528<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4529extension, matches the constant given in the statement.
4530
4531Given
4532 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4533caseStmt(hasCaseConstant(integerLiteral()))
4534 matches "case 1:"
4535</pre></td></tr>
4536
4537
Aaron Ballman672dde22016-01-22 23:15:00 +00004538<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 +00004539<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004540
4541
Aaron Ballman672dde22016-01-22 23:15:00 +00004542<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 +00004543<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4544functionDecl that have at least one TemplateArgument matching the given
4545InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004546
4547Given
4548 template&lt;typename T&gt; class A {};
4549 template&lt;&gt; class A&lt;double&gt; {};
4550 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004551
Haojian Wu99e39a72016-07-29 17:30:13 +00004552 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004553 void func() { f&lt;int&gt;(); };
4554
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004555classTemplateSpecializationDecl(hasAnyTemplateArgument(
4556 refersToType(asString("int"))))
4557 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004558
4559functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4560 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004561</pre></td></tr>
4562
4563
Manuel Klimek696e5052017-08-02 13:04:44 +00004564<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>
4565<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4566
4567Given
4568 tempalate&lt;typename T&gt; class A {};
4569 typedef A&lt;int&gt; B;
4570classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4571 matches 'B' with classTemplateDecl() matching the class template
4572 declaration of 'A'.
4573</pre></td></tr>
4574
4575
Aaron Ballman672dde22016-01-22 23:15:00 +00004576<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004577<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4578functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004579
4580Given
4581 template&lt;typename T, typename U&gt; class A {};
4582 A&lt;bool, int&gt; b;
4583 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004584
Haojian Wu99e39a72016-07-29 17:30:13 +00004585 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004586 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004587classTemplateSpecializationDecl(hasTemplateArgument(
4588 1, refersToType(asString("int"))))
4589 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004590
4591functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4592 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004593</pre></td></tr>
4594
4595
Aaron Ballman672dde22016-01-22 23:15:00 +00004596<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 +00004597<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4598type.
4599
4600Given
4601 struct A {};
4602 A a[7];
4603 int b[7];
4604arrayType(hasElementType(builtinType()))
4605 matches "int b[7]"
4606
Aaron Ballman672dde22016-01-22 23:15:00 +00004607Usable 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 +00004608</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_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 +00004612<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4613type.
4614
4615Given
4616 struct A {};
4617 A a[7];
4618 int b[7];
4619arrayType(hasElementType(builtinType()))
4620 matches "int b[7]"
4621
Aaron Ballman672dde22016-01-22 23:15:00 +00004622Usable 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 +00004623</pre></td></tr>
4624
4625
Aaron Ballman672dde22016-01-22 23:15:00 +00004626<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 +00004627<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 +00004628a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004629
4630Given
4631 { {}; 1+2; }
4632hasAnySubstatement(compoundStmt())
4633 matches '{ {}; 1+2; }'
4634with compoundStmt()
4635 matching '{}'
4636</pre></td></tr>
4637
4638
Aaron Ballman672dde22016-01-22 23:15:00 +00004639<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 +00004640<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4641</pre></td></tr>
4642
4643
Manuel Klimeka37e1102016-12-01 15:45:06 +00004644<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>
4645<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 +00004646matches the given matcher.
4647
4648The associated declaration is:
4649- for type nodes, the declaration of the underlying type
4650- for CallExpr, the declaration of the callee
4651- for MemberExpr, the declaration of the referenced member
4652- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004653- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004654
4655Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4656function. e.g. various subtypes of clang::Type and various expressions.
4657
Manuel Klimeka37e1102016-12-01 15:45:06 +00004658Usable 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;,
4659 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;,
4660 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;,
4661 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;,
4662 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;,
4663 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;,
4664 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004665</pre></td></tr>
4666
4667
Aaron Ballman672dde22016-01-22 23:15:00 +00004668<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 +00004669<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4670specific using shadow declaration.
4671
4672Given
4673 namespace a { void f() {} }
4674 using a::f;
4675 void g() {
4676 f(); Matches this ..
4677 a::f(); .. but not this.
4678 }
4679declRefExpr(throughUsingDecl(anything()))
4680 matches f()
4681</pre></td></tr>
4682
4683
Aaron Ballman672dde22016-01-22 23:15:00 +00004684<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 +00004685<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4686specified matcher.
4687
4688Example matches x in if(x)
4689 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4690 bool x;
4691 if (x) {}
4692</pre></td></tr>
4693
4694
Aaron Ballman672dde22016-01-22 23:15:00 +00004695<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 +00004696<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4697
4698Note that this does not work for global declarations because the AST
4699breaks up multiple-declaration DeclStmt's into multiple single-declaration
4700DeclStmt's.
4701Example: Given non-global declarations
4702 int a, b = 0;
4703 int c;
4704 int d = 2, e;
4705declStmt(containsDeclaration(
4706 0, varDecl(hasInitializer(anything()))))
4707 matches only 'int d = 2, e;', and
4708declStmt(containsDeclaration(1, varDecl()))
4709 matches 'int a, b = 0' as well as 'int d = 2, e;'
4710 but 'int c;' is not matched.
4711</pre></td></tr>
4712
4713
Aaron Ballman672dde22016-01-22 23:15:00 +00004714<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 +00004715<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4716
4717Given
4718 int a, b;
4719 int c;
4720declStmt(hasSingleDecl(anything()))
4721 matches 'int c;' but not 'int a, b;'.
4722</pre></td></tr>
4723
4724
Aaron Ballman672dde22016-01-22 23:15:00 +00004725<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 +00004726<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4727the inner matcher.
4728
4729Given
4730 int x;
4731declaratorDecl(hasTypeLoc(loc(asString("int"))))
4732 matches int x
4733</pre></td></tr>
4734
4735
Aaron Ballman672dde22016-01-22 23:15:00 +00004736<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 +00004737<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4738Decl, matches InnerMatcher.
4739
4740Given
4741 namespace N {
4742 namespace M {
4743 class D {};
4744 }
4745 }
4746
4747cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4748declaration of class D.
4749</pre></td></tr>
4750
4751
Aaron Ballman672dde22016-01-22 23:15:00 +00004752<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 +00004753<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4754definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004755
4756Given
4757 for (;;) {}
4758hasBody(compoundStmt())
4759 matches 'for (;;) {}'
4760with compoundStmt()
4761 matching '{}'
4762</pre></td></tr>
4763
4764
Aaron Ballman672dde22016-01-22 23:15:00 +00004765<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004766<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 +00004767switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004768
4769Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4770 if (true) {}
4771</pre></td></tr>
4772
4773
Aaron Ballman672dde22016-01-22 23:15:00 +00004774<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 +00004775<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4776matches InnerMatcher if the qualifier exists.
4777
4778Given
4779 namespace N {
4780 namespace M {
4781 class D {};
4782 }
4783 }
4784 N::M::D d;
4785
4786elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4787matches the type of the variable declaration of d.
4788</pre></td></tr>
4789
4790
Aaron Ballman672dde22016-01-22 23:15:00 +00004791<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004792<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4793
4794Given
4795 namespace N {
4796 namespace M {
4797 class D {};
4798 }
4799 }
4800 N::M::D d;
4801
4802elaboratedType(namesType(recordType(
4803hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4804declaration of d.
4805</pre></td></tr>
4806
4807
Manuel Klimeka37e1102016-12-01 15:45:06 +00004808<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>
4809<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 +00004810matches the given matcher.
4811
4812The associated declaration is:
4813- for type nodes, the declaration of the underlying type
4814- for CallExpr, the declaration of the callee
4815- for MemberExpr, the declaration of the referenced member
4816- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004817- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004818
4819Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4820function. e.g. various subtypes of clang::Type and various expressions.
4821
Manuel Klimeka37e1102016-12-01 15:45:06 +00004822Usable 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;,
4823 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;,
4824 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;,
4825 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;,
4826 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;,
4827 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;,
4828 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004829</pre></td></tr>
4830
4831
Aaron Ballman672dde22016-01-22 23:15:00 +00004832<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 +00004833<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4834
4835(Note: Clang's AST refers to other conversions as "casts" too, and calls
4836actual casts "explicit" casts.)
4837</pre></td></tr>
4838
4839
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004840<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>
4841<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 +00004842declaration's type.
4843
4844In case of a value declaration (for example a variable declaration),
4845this resolves one layer of indirection. For example, in the value
4846declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4847X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4848declaration of x.
4849
4850Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4851 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4852 class X {};
4853 void y(X &amp;x) { x; X z; }
4854
Aaron Ballman672dde22016-01-22 23:15:00 +00004855Usable 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 +00004856</pre></td></tr>
4857
4858
Aaron Ballman672dde22016-01-22 23:15:00 +00004859<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 +00004860<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4861matcher.
4862
4863Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4864 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004865 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004866 class X {};
4867 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004868 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004869</pre></td></tr>
4870
4871
Aaron Ballman672dde22016-01-22 23:15:00 +00004872<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004873<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4874are stripped off.
4875
4876Parentheses and explicit casts are not discarded.
4877Given
4878 int arr[5];
4879 int a = 0;
4880 char b = 0;
4881 const int c = a;
4882 int *d = arr;
4883 long e = (long) 0l;
4884The matchers
4885 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4886 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4887would match the declarations for a, b, c, and d, but not e.
4888While
4889 varDecl(hasInitializer(integerLiteral()))
4890 varDecl(hasInitializer(declRefExpr()))
4891only match the declarations for b, c, and d.
4892</pre></td></tr>
4893
4894
Cong Liu8a02efb2016-06-24 09:38:03 +00004895<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>
4896<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4897nodes are stripped off.
4898
4899Parentheses and explicit casts are not discarded.
4900Given
4901 class C {};
4902 C a = C();
4903 C b;
4904 C c = b;
4905The matchers
4906 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4907would match the declarations for a, b, and c.
4908While
4909 varDecl(hasInitializer(cxxConstructExpr()))
4910only match the declarations for b and c.
4911</pre></td></tr>
4912
4913
Aaron Ballman672dde22016-01-22 23:15:00 +00004914<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004915<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4916casts are stripped off.
4917
4918Implicit and non-C Style casts are also discarded.
4919Given
4920 int a = 0;
4921 char b = (0);
4922 void* c = reinterpret_cast&lt;char*&gt;(0);
4923 char d = char(0);
4924The matcher
4925 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4926would match the declarations for a, b, c, and d.
4927while
4928 varDecl(hasInitializer(integerLiteral()))
4929only match the declaration for a.
4930</pre></td></tr>
4931
4932
Aaron Ballman672dde22016-01-22 23:15:00 +00004933<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 +00004934<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4935parentheses are stripped off.
4936
4937Explicit casts are not discarded.
4938Given
4939 int arr[5];
4940 int a = 0;
4941 char b = (0);
4942 const int c = a;
4943 int *d = (arr);
4944 long e = ((long) 0l);
4945The matchers
4946 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4947 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4948would match the declarations for a, b, c, and d, but not e.
4949while
4950 varDecl(hasInitializer(integerLiteral()))
4951 varDecl(hasInitializer(declRefExpr()))
4952would only match the declaration for a.
4953</pre></td></tr>
4954
4955
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00004956<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>
4957<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4958
4959Given
4960 class C {
4961 int a = 2;
4962 int b = 3;
4963 int c;
4964 };
4965fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4966 matches 'int a;' but not 'int b;'.
4967fieldDecl(hasInClassInitializer(anything()))
4968 matches 'int a;' and 'int b;' but not 'int c;'.
4969</pre></td></tr>
4970
4971
Aaron Ballman672dde22016-01-22 23:15:00 +00004972<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 +00004973<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4974definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004975
4976Given
4977 for (;;) {}
4978hasBody(compoundStmt())
4979 matches 'for (;;) {}'
4980with compoundStmt()
4981 matching '{}'
4982</pre></td></tr>
4983
4984
Aaron Ballman672dde22016-01-22 23:15:00 +00004985<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004986<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 +00004987switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004988
4989Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4990 if (true) {}
4991</pre></td></tr>
4992
4993
Aaron Ballman672dde22016-01-22 23:15:00 +00004994<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 +00004995<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4996
4997Example:
4998 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4999matches '++x' in
5000 for (x; x &lt; N; ++x) { }
5001</pre></td></tr>
5002
5003
Aaron Ballman672dde22016-01-22 23:15:00 +00005004<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 +00005005<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5006
5007Example:
5008 forStmt(hasLoopInit(declStmt()))
5009matches 'int x = 0' in
5010 for (int x = 0; x &lt; N; ++x) { }
5011</pre></td></tr>
5012
5013
Aaron Ballman672dde22016-01-22 23:15:00 +00005014<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 +00005015<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5016
5017Does not match the 'this' parameter of a method.
5018
5019Given
5020 class X { void f(int x, int y, int z) {} };
5021cxxMethodDecl(hasAnyParameter(hasName("y")))
5022 matches f(int x, int y, int z) {}
5023with hasAnyParameter(...)
5024 matching int y
5025</pre></td></tr>
5026
5027
Haojian Wud898b092016-07-29 13:57:27 +00005028<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>
5029<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5030functionDecl that have at least one TemplateArgument matching the given
5031InnerMatcher.
5032
5033Given
5034 template&lt;typename T&gt; class A {};
5035 template&lt;&gt; class A&lt;double&gt; {};
5036 A&lt;int&gt; a;
5037
Haojian Wu99e39a72016-07-29 17:30:13 +00005038 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005039 void func() { f&lt;int&gt;(); };
5040
5041classTemplateSpecializationDecl(hasAnyTemplateArgument(
5042 refersToType(asString("int"))))
5043 matches the specialization A&lt;int&gt;
5044
5045functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5046 matches the specialization f&lt;int&gt;
5047</pre></td></tr>
5048
5049
Aaron Ballman672dde22016-01-22 23:15:00 +00005050<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 +00005051<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5052definition that has a given body.
5053
5054Given
5055 for (;;) {}
5056hasBody(compoundStmt())
5057 matches 'for (;;) {}'
5058with compoundStmt()
5059 matching '{}'
5060</pre></td></tr>
5061
5062
Aaron Ballman672dde22016-01-22 23:15:00 +00005063<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005064<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5065
5066Given
5067 class X { void f(int x) {} };
5068cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5069 matches f(int x) {}
5070with hasParameter(...)
5071 matching int x
5072</pre></td></tr>
5073
5074
Haojian Wud898b092016-07-29 13:57:27 +00005075<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>
5076<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5077functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5078
5079Given
5080 template&lt;typename T, typename U&gt; class A {};
5081 A&lt;bool, int&gt; b;
5082 A&lt;int, bool&gt; c;
5083
Haojian Wu99e39a72016-07-29 17:30:13 +00005084 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005085 void func() { f&lt;int&gt;(); };
5086classTemplateSpecializationDecl(hasTemplateArgument(
5087 1, refersToType(asString("int"))))
5088 matches the specialization A&lt;bool, int&gt;
5089
5090functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5091 matches the specialization f&lt;int&gt;
5092</pre></td></tr>
5093
5094
Aaron Ballman672dde22016-01-22 23:15:00 +00005095<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 +00005096<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5097
5098Given:
5099 class X { int f() { return 1; } };
5100cxxMethodDecl(returns(asString("int")))
5101 matches int f() { return 1; }
5102</pre></td></tr>
5103
5104
Aaron Ballman672dde22016-01-22 23:15:00 +00005105<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 +00005106<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 +00005107switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005108
5109Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5110 if (true) {}
5111</pre></td></tr>
5112
5113
Aaron Ballman672dde22016-01-22 23:15:00 +00005114<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 +00005115<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5116
5117Given
5118 if (A* a = GetAPointer()) {}
5119hasConditionVariableStatement(...)
5120 matches 'A* a = GetAPointer()'.
5121</pre></td></tr>
5122
5123
Aaron Ballman672dde22016-01-22 23:15:00 +00005124<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 +00005125<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5126
5127Examples matches the if statement
5128 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5129 if (false) false; else true;
5130</pre></td></tr>
5131
5132
Aaron Ballman672dde22016-01-22 23:15:00 +00005133<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 +00005134<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5135
5136Examples matches the if statement
5137 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5138 if (false) true; else false;
5139</pre></td></tr>
5140
5141
Aaron Ballman672dde22016-01-22 23:15:00 +00005142<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 +00005143<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5144matcher.
5145
5146FIXME: Unit test this matcher
5147</pre></td></tr>
5148
5149
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005150<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>
5151<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5152(if expression have it).
5153</pre></td></tr>
5154
5155
Manuel Klimeka37e1102016-12-01 15:45:06 +00005156<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 +00005157<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5158matches the given matcher.
5159
5160The associated declaration is:
5161- for type nodes, the declaration of the underlying type
5162- for CallExpr, the declaration of the callee
5163- for MemberExpr, the declaration of the referenced member
5164- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005165- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005166
5167Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5168function. e.g. various subtypes of clang::Type and various expressions.
5169
Manuel Klimeka37e1102016-12-01 15:45:06 +00005170Usable 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;,
5171 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;,
5172 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;,
5173 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;,
5174 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;,
5175 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;,
5176 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5177</pre></td></tr>
5178
5179
5180<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>
5181<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5182matches the given matcher.
5183
5184The associated declaration is:
5185- for type nodes, the declaration of the underlying type
5186- for CallExpr, the declaration of the callee
5187- for MemberExpr, the declaration of the referenced member
5188- for CXXConstructExpr, the declaration of the constructor
5189- for CXXNewExpr, the declaration of the operator new
5190
5191Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5192function. e.g. various subtypes of clang::Type and various expressions.
5193
5194Usable 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;,
5195 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;,
5196 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;,
5197 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;,
5198 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;,
5199 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;,
5200 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005201</pre></td></tr>
5202
5203
Aaron Ballman672dde22016-01-22 23:15:00 +00005204<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 +00005205<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5206matches the given matcher.
5207
5208The associated declaration is:
5209- for type nodes, the declaration of the underlying type
5210- for CallExpr, the declaration of the callee
5211- for MemberExpr, the declaration of the referenced member
5212- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005213- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005214
5215Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5216function. e.g. various subtypes of clang::Type and various expressions.
5217
Manuel Klimeka37e1102016-12-01 15:45:06 +00005218Usable 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;,
5219 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;,
5220 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;,
5221 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;,
5222 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;,
5223 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;,
5224 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005225</pre></td></tr>
5226
5227
Aaron Ballman672dde22016-01-22 23:15:00 +00005228<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 +00005229<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5230matched by a given matcher.
5231
5232Given
5233 struct X { int m; };
5234 void f(X x) { x.m; m; }
5235memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5236 matches "x.m" and "m"
5237with hasObjectExpression(...)
5238 matching "x" and the implicit object expression of "m" which has type X*.
5239</pre></td></tr>
5240
5241
Aaron Ballman672dde22016-01-22 23:15:00 +00005242<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 +00005243<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5244given matcher.
5245
5246Given
5247 struct { int first, second; } first, second;
5248 int i(second.first);
5249 int j(first.second);
5250memberExpr(member(hasName("first")))
5251 matches second.first
5252 but not first.second (because the member name there is "second").
5253</pre></td></tr>
5254
5255
Aaron Ballman672dde22016-01-22 23:15:00 +00005256<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005257<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5258pointee matches a given matcher.
5259
5260Given
5261 int *a;
5262 int const *b;
5263 float const *f;
5264pointerType(pointee(isConstQualified(), isInteger()))
5265 matches "int const *b"
5266
Aaron Ballman672dde22016-01-22 23:15:00 +00005267Usable 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;,
5268 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 +00005269</pre></td></tr>
5270
5271
Aaron Ballman672dde22016-01-22 23:15:00 +00005272<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 +00005273<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5274pointee matches a given matcher.
5275
5276Given
5277 int *a;
5278 int const *b;
5279 float const *f;
5280pointerType(pointee(isConstQualified(), isInteger()))
5281 matches "int const *b"
5282
Aaron Ballman672dde22016-01-22 23:15:00 +00005283Usable 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;,
5284 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 +00005285</pre></td></tr>
5286
5287
Martin Bohme8cef2c22016-08-09 15:07:52 +00005288<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>
5289<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5290matcher.
5291
5292Given
5293 namespace N { template&lt;class T&gt; void f(T t); }
5294 template &lt;class T&gt; void g() { using N::f; f(T()); }
5295unresolvedLookupExpr(hasAnyDeclaration(
5296 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5297 matches the use of f in g() .
5298</pre></td></tr>
5299
5300
Aaron Ballman672dde22016-01-22 23:15:00 +00005301<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005302<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5303
5304Given
5305 struct A { struct B { struct C {}; }; };
5306 A::B::C c;
5307nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5308 matches "A::"
5309</pre></td></tr>
5310
5311
Aaron Ballman672dde22016-01-22 23:15:00 +00005312<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 +00005313<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5314given TypeLoc.
5315
5316Given
5317 struct A { struct B { struct C {}; }; };
5318 A::B::C c;
5319nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5320 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5321 matches "A::"
5322</pre></td></tr>
5323
5324
Aaron Ballman672dde22016-01-22 23:15:00 +00005325<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 +00005326<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5327
5328Given
5329 struct A { struct B { struct C {}; }; };
5330 A::B::C c;
5331nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5332 matches "A::"
5333</pre></td></tr>
5334
5335
Aaron Ballman672dde22016-01-22 23:15:00 +00005336<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 +00005337<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5338given namespace matcher.
5339
5340Given
5341 namespace ns { struct A {}; }
5342 ns::A a;
5343nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5344 matches "ns::"
5345</pre></td></tr>
5346
5347
Aaron Ballman672dde22016-01-22 23:15:00 +00005348<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 +00005349<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5350given QualType matcher without qualifiers.
5351
5352Given
5353 struct A { struct B { struct C {}; }; };
5354 A::B::C c;
5355nestedNameSpecifier(specifiesType(
5356 hasDeclaration(cxxRecordDecl(hasName("A")))
5357))
5358 matches "A::"
5359</pre></td></tr>
5360
5361
Aaron Ballman672dde22016-01-22 23:15:00 +00005362<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 +00005363<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5364call expression.
5365
5366Example matches y in x(y)
5367 (matcher = callExpr(hasArgument(0, declRefExpr())))
5368 void x(int) { int y; x(y); }
5369</pre></td></tr>
5370
5371
Aaron Ballman672dde22016-01-22 23:15:00 +00005372<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005373<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5374
5375Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005376matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005377matches the [webView ...] message invocation.
5378 NSString *webViewJavaScript = ...
5379 UIWebView *webView = ...
5380 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5381</pre></td></tr>
5382
5383
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005384<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>
5385<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5386
5387
Martin Bohme8cef2c22016-08-09 15:07:52 +00005388<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>
5389<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5390overloads matches the given matcher.
5391
5392Given
5393 template &lt;typename T&gt; void foo(T);
5394 template &lt;typename T&gt; void bar(T);
5395 template &lt;typename T&gt; void baz(T t) {
5396 foo(t);
5397 bar(t);
5398 }
5399unresolvedLookupExpr(hasAnyDeclaration(
5400 functionTemplateDecl(hasName("foo"))))
5401 matches foo in foo(t); but not bar in bar(t);
5402</pre></td></tr>
5403
5404
Aaron Ballman672dde22016-01-22 23:15:00 +00005405<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 +00005406<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5407
5408Given
5409 int (*ptr_to_array)[4];
5410 int (*ptr_to_func)(int);
5411
5412varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5413ptr_to_func but not ptr_to_array.
5414
Aaron Ballman672dde22016-01-22 23:15:00 +00005415Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005416</pre></td></tr>
5417
5418
Aaron Ballman672dde22016-01-22 23:15:00 +00005419<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 +00005420<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5421pointee matches a given matcher.
5422
5423Given
5424 int *a;
5425 int const *b;
5426 float const *f;
5427pointerType(pointee(isConstQualified(), isInteger()))
5428 matches "int const *b"
5429
Aaron Ballman672dde22016-01-22 23:15:00 +00005430Usable 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;,
5431 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 +00005432</pre></td></tr>
5433
5434
Aaron Ballman672dde22016-01-22 23:15:00 +00005435<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 +00005436<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5437pointee matches a given matcher.
5438
5439Given
5440 int *a;
5441 int const *b;
5442 float const *f;
5443pointerType(pointee(isConstQualified(), isInteger()))
5444 matches "int const *b"
5445
Aaron Ballman672dde22016-01-22 23:15:00 +00005446Usable 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;,
5447 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 +00005448</pre></td></tr>
5449
5450
Aaron Ballman672dde22016-01-22 23:15:00 +00005451<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 +00005452<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5453
5454Given:
5455 typedef int &amp;int_ref;
5456 int a;
5457 int_ref b = a;
5458
5459varDecl(hasType(qualType(referenceType()))))) will not match the
5460declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5461</pre></td></tr>
5462
5463
Aaron Ballman672dde22016-01-22 23:15:00 +00005464<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005465<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5466matches the given matcher.
5467
5468The associated declaration is:
5469- for type nodes, the declaration of the underlying type
5470- for CallExpr, the declaration of the callee
5471- for MemberExpr, the declaration of the referenced member
5472- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005473- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005474
5475Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5476function. e.g. various subtypes of clang::Type and various expressions.
5477
Manuel Klimeka37e1102016-12-01 15:45:06 +00005478Usable 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;,
5479 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;,
5480 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;,
5481 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;,
5482 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;,
5483 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;,
5484 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005485</pre></td></tr>
5486
5487
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005488<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>
5489<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5490
5491Given
5492 void (*fp)(void);
5493The matcher
5494 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5495would match the declaration for fp.
5496</pre></td></tr>
5497
5498
Aaron Ballman672dde22016-01-22 23:15:00 +00005499<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 +00005500<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5501</pre></td></tr>
5502
5503
Aaron Ballman672dde22016-01-22 23:15:00 +00005504<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 +00005505<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5506matches the specified matcher.
5507
5508Example matches y-&gt;x()
5509 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5510 cxxRecordDecl(hasName("Y")))))))
5511 class Y { public: void x(); };
5512 void z() { Y *y; y-&gt;x(); }
5513</pre></td></tr>
5514
5515
Aaron Ballman672dde22016-01-22 23:15:00 +00005516<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 +00005517<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5518</pre></td></tr>
5519
5520
Aaron Ballman672dde22016-01-22 23:15:00 +00005521<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 +00005522<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5523type matches the specified matcher.
5524
5525Example matches X &amp;x and const X &amp;y
5526 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5527 class X {
5528 void a(X b) {
5529 X &amp;x = b;
5530 const X &amp;y = b;
5531 }
5532 };
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_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 +00005537<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5538matches the given matcher.
5539
5540The associated declaration is:
5541- for type nodes, the declaration of the underlying type
5542- for CallExpr, the declaration of the callee
5543- for MemberExpr, the declaration of the referenced member
5544- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005545- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005546
5547Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5548function. e.g. various subtypes of clang::Type and various expressions.
5549
Manuel Klimeka37e1102016-12-01 15:45:06 +00005550Usable 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;,
5551 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;,
5552 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;,
5553 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;,
5554 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;,
5555 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;,
5556 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005557</pre></td></tr>
5558
5559
Aaron Ballman672dde22016-01-22 23:15:00 +00005560<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 +00005561<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5562pointee matches a given matcher.
5563
5564Given
5565 int *a;
5566 int const *b;
5567 float const *f;
5568pointerType(pointee(isConstQualified(), isInteger()))
5569 matches "int const *b"
5570
Aaron Ballman672dde22016-01-22 23:15:00 +00005571Usable 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;,
5572 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 +00005573</pre></td></tr>
5574
5575
Aaron Ballman672dde22016-01-22 23:15:00 +00005576<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 +00005577<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5578pointee matches a given matcher.
5579
5580Given
5581 int *a;
5582 int const *b;
5583 float const *f;
5584pointerType(pointee(isConstQualified(), isInteger()))
5585 matches "int const *b"
5586
Aaron Ballman672dde22016-01-22 23:15:00 +00005587Usable 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;,
5588 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 +00005589</pre></td></tr>
5590
5591
Alexander Kornienko976921d2016-03-22 11:03:03 +00005592<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>
5593<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5594
5595Given
5596 return a + b;
5597hasReturnValue(binaryOperator())
5598 matches 'return a + b'
5599with binaryOperator()
5600 matching 'a + b'
5601</pre></td></tr>
5602
5603
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005604<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>
5605<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5606a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5607
5608Given
5609 { {}; 1+2; }
5610hasAnySubstatement(compoundStmt())
5611 matches '{ {}; 1+2; }'
5612with compoundStmt()
5613 matching '{}'
5614</pre></td></tr>
5615
5616
Aaron Ballman672dde22016-01-22 23:15:00 +00005617<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005618<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5619alignof.
5620</pre></td></tr>
5621
5622
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005623<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 +00005624<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 +00005625
5626Given:
5627F&amp; operator=(const F&amp; o) {
5628 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5629 return *this;
5630}
5631returnStmt(forFunction(hasName("operator=")))
5632 matches 'return *this'
5633 but does match 'return &gt; 0'
5634</pre></td></tr>
5635
5636
Aaron Ballman672dde22016-01-22 23:15:00 +00005637<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 +00005638<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5639sizeof.
5640</pre></td></tr>
5641
5642
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005643<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>
5644<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5645type that matches the provided matcher.
5646
5647Given
5648 template &lt;typename T&gt;
5649 double F(T t);
5650 int i;
5651 double j = F(i);
5652
5653substTemplateTypeParmType(hasReplacementType(type())) matches int
5654</pre></td></tr>
5655
5656
Aaron Ballman672dde22016-01-22 23:15:00 +00005657<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 +00005658<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5659statement. This matcher may produce multiple matches.
5660
5661Given
5662 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5663switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5664 matches four times, with "c" binding each of "case 1:", "case 2:",
5665"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5666"switch (1)", "switch (2)" and "switch (2)".
5667</pre></td></tr>
5668
5669
Etienne Bergeron5500f952016-05-30 15:25:25 +00005670<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>
5671<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5672switch statement or conditional operator.
5673
5674Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5675 if (true) {}
5676</pre></td></tr>
5677
5678
Aaron Ballman672dde22016-01-22 23:15:00 +00005679<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 +00005680<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5681matches the given matcher.
5682
5683The associated declaration is:
5684- for type nodes, the declaration of the underlying type
5685- for CallExpr, the declaration of the callee
5686- for MemberExpr, the declaration of the referenced member
5687- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005688- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005689
5690Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5691function. e.g. various subtypes of clang::Type and various expressions.
5692
Manuel Klimeka37e1102016-12-01 15:45:06 +00005693Usable 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;,
5694 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;,
5695 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;,
5696 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;,
5697 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;,
5698 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;,
5699 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005700</pre></td></tr>
5701
5702
Aaron Ballman672dde22016-01-22 23:15:00 +00005703<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 +00005704<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5705
5706Given
5707 template&lt;typename T&gt; struct A {};
5708 struct B { B* next; };
5709 A&lt;&amp;B::next&gt; a;
5710templateSpecializationType(hasAnyTemplateArgument(
5711 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5712 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5713 B::next
5714</pre></td></tr>
5715
5716
Aaron Ballman672dde22016-01-22 23:15:00 +00005717<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 +00005718<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5719declaration.
5720
5721Given
5722 template&lt;typename T&gt; struct A {};
5723 struct B { B* next; };
5724 A&lt;&amp;B::next&gt; a;
5725classTemplateSpecializationDecl(hasAnyTemplateArgument(
5726 refersToDeclaration(fieldDecl(hasName("next"))))
5727 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5728 B::next
5729</pre></td></tr>
5730
5731
Aaron Ballman672dde22016-01-22 23:15:00 +00005732<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 +00005733<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5734
5735Given
5736 template&lt;int T&gt; struct A {};
5737 C&lt;42&gt; c;
5738classTemplateSpecializationDecl(
5739 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5740 matches the implicit instantiation of C in C&lt;42&gt;.
5741</pre></td></tr>
5742
5743
Haojian Wub33b02e2016-07-29 15:45:11 +00005744<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>
5745<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5746
5747Given
5748 template&lt;template &lt;typename&gt; class S&gt; class X {};
5749 template&lt;typename T&gt; class Y {};"
5750 X&lt;Y&gt; xi;
5751classTemplateSpecializationDecl(hasAnyTemplateArgument(
5752 refersToTemplate(templateName())))
5753 matches the specialization X&lt;Y&gt;
5754</pre></td></tr>
5755
5756
Aaron Ballman672dde22016-01-22 23:15:00 +00005757<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 +00005758<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5759
5760Given
5761 struct X {};
5762 template&lt;typename T&gt; struct A {};
5763 A&lt;X&gt; a;
5764classTemplateSpecializationDecl(hasAnyTemplateArgument(
5765 refersToType(class(hasName("X")))))
5766 matches the specialization A&lt;X&gt;
5767</pre></td></tr>
5768
5769
Aaron Ballman672dde22016-01-22 23:15:00 +00005770<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 +00005771<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5772functionDecl that have at least one TemplateArgument matching the given
5773InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005774
5775Given
5776 template&lt;typename T&gt; class A {};
5777 template&lt;&gt; class A&lt;double&gt; {};
5778 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005779
Haojian Wu99e39a72016-07-29 17:30:13 +00005780 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005781 void func() { f&lt;int&gt;(); };
5782
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005783classTemplateSpecializationDecl(hasAnyTemplateArgument(
5784 refersToType(asString("int"))))
5785 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005786
5787functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5788 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005789</pre></td></tr>
5790
5791
Aaron Ballman672dde22016-01-22 23:15:00 +00005792<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 +00005793<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5794matches the given matcher.
5795
5796The associated declaration is:
5797- for type nodes, the declaration of the underlying type
5798- for CallExpr, the declaration of the callee
5799- for MemberExpr, the declaration of the referenced member
5800- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005801- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005802
5803Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5804function. e.g. various subtypes of clang::Type and various expressions.
5805
Manuel Klimeka37e1102016-12-01 15:45:06 +00005806Usable 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;,
5807 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;,
5808 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;,
5809 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;,
5810 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;,
5811 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;,
5812 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005813</pre></td></tr>
5814
5815
Aaron Ballman672dde22016-01-22 23:15:00 +00005816<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005817<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5818functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005819
5820Given
5821 template&lt;typename T, typename U&gt; class A {};
5822 A&lt;bool, int&gt; b;
5823 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005824
Haojian Wu99e39a72016-07-29 17:30:13 +00005825 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005826 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005827classTemplateSpecializationDecl(hasTemplateArgument(
5828 1, refersToType(asString("int"))))
5829 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005830
5831functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5832 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005833</pre></td></tr>
5834
5835
Aaron Ballman672dde22016-01-22 23:15:00 +00005836<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 +00005837<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5838matches the given matcher.
5839
5840The associated declaration is:
5841- for type nodes, the declaration of the underlying type
5842- for CallExpr, the declaration of the callee
5843- for MemberExpr, the declaration of the referenced member
5844- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005845- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005846
5847Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5848function. e.g. various subtypes of clang::Type and various expressions.
5849
Manuel Klimeka37e1102016-12-01 15:45:06 +00005850Usable 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;,
5851 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;,
5852 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;,
5853 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;,
5854 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;,
5855 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;,
5856 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005857</pre></td></tr>
5858
5859
5860<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>
5861<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5862
5863Generates results for each match.
5864
5865For example, in:
5866 class A { class B {}; class C {}; };
5867The matcher:
5868 cxxRecordDecl(hasName("::A"),
5869 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5870will generate results for A, B and C.
5871
5872Usable as: Any Matcher
5873</pre></td></tr>
5874
5875
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005876<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 +00005877<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5878matcher.
5879
5880Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5881 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5882 and U (matcher = typedefDecl(hasType(asString("int")))
5883 class X {};
5884 void y(X &amp;x) { x; X z; }
5885 typedef int U;
5886</pre></td></tr>
5887
5888
Aaron Ballman672dde22016-01-22 23:15:00 +00005889<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 +00005890<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5891matches the given matcher.
5892
5893The associated declaration is:
5894- for type nodes, the declaration of the underlying type
5895- for CallExpr, the declaration of the callee
5896- for MemberExpr, the declaration of the referenced member
5897- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005898- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005899
5900Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5901function. e.g. various subtypes of clang::Type and various expressions.
5902
Manuel Klimeka37e1102016-12-01 15:45:06 +00005903Usable 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;,
5904 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;,
5905 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;,
5906 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;,
5907 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;,
5908 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;,
5909 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5910</pre></td></tr>
5911
5912
5913<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>
5914<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5915type of the matched node.
5916
5917For example, in:
5918 class A {};
5919 using B = A;
5920The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5921both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005922</pre></td></tr>
5923
5924
Aaron Ballman672dde22016-01-22 23:15:00 +00005925<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 +00005926<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5927
5928Given
5929 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5930unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5931 matches sizeof(a) and alignof(c)
5932</pre></td></tr>
5933
5934
Aaron Ballman672dde22016-01-22 23:15:00 +00005935<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 +00005936<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5937
5938Example matches true (matcher = hasUnaryOperand(
5939 cxxBoolLiteral(equals(true))))
5940 !true
5941</pre></td></tr>
5942
5943
Aaron Ballman672dde22016-01-22 23:15:00 +00005944<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 +00005945<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5946matches the given matcher.
5947
5948The associated declaration is:
5949- for type nodes, the declaration of the underlying type
5950- for CallExpr, the declaration of the callee
5951- for MemberExpr, the declaration of the referenced member
5952- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005953- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005954
5955Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5956function. e.g. various subtypes of clang::Type and various expressions.
5957
Manuel Klimeka37e1102016-12-01 15:45:06 +00005958Usable 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;,
5959 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;,
5960 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;,
5961 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;,
5962 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;,
5963 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;,
5964 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005965</pre></td></tr>
5966
5967
Aaron Ballman672dde22016-01-22 23:15:00 +00005968<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 +00005969<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5970
5971Given
5972 namespace X { void b(); }
5973 using X::b;
5974usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5975 matches using X::b </pre></td></tr>
5976
5977
Aaron Ballman672dde22016-01-22 23:15:00 +00005978<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 +00005979<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5980matched by the given matcher.
5981
5982Given
5983 namespace X { int a; void b(); }
5984 using X::a;
5985 using X::b;
5986usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5987 matches using X::b but not using X::a </pre></td></tr>
5988
5989
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005990<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>
5991<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 +00005992declaration's type.
5993
5994In case of a value declaration (for example a variable declaration),
5995this resolves one layer of indirection. For example, in the value
5996declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5997X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5998declaration of x.
5999
6000Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6001 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6002 class X {};
6003 void y(X &amp;x) { x; X z; }
6004
Aaron Ballman672dde22016-01-22 23:15:00 +00006005Usable 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 +00006006</pre></td></tr>
6007
6008
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006009<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>
6010<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 +00006011matcher.
6012
6013Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6014 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006015 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006016 class X {};
6017 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006018 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006019</pre></td></tr>
6020
6021
Aaron Ballman672dde22016-01-22 23:15:00 +00006022<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 +00006023<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6024that matches the given matcher.
6025
6026Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6027 bool y() { return true; }
6028 bool x = y();
6029</pre></td></tr>
6030
6031
Aaron Ballman672dde22016-01-22 23:15:00 +00006032<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 +00006033<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6034expression.
6035
6036Given
6037 void f(int b) {
6038 int a[b];
6039 }
6040variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6041 varDecl(hasName("b")))))))
6042 matches "int a[b]"
6043</pre></td></tr>
6044
6045
Aaron Ballman672dde22016-01-22 23:15:00 +00006046<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 +00006047<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6048definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006049
6050Given
6051 for (;;) {}
6052hasBody(compoundStmt())
6053 matches 'for (;;) {}'
6054with compoundStmt()
6055 matching '{}'
6056</pre></td></tr>
6057
6058
Aaron Ballman672dde22016-01-22 23:15:00 +00006059<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 +00006060<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 +00006061switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006062
6063Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6064 if (true) {}
6065</pre></td></tr>
6066
6067
Aaron Ballman672dde22016-01-22 23:15:00 +00006068<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 +00006069<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6070NestedNameSpecifier-matcher matches.
6071</pre></td></tr>
6072
6073
Aaron Ballman672dde22016-01-22 23:15:00 +00006074<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 +00006075<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6076QualType-matcher matches.
6077</pre></td></tr>
6078
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006079<!--END_TRAVERSAL_MATCHERS -->
6080</table>
6081
6082</div>
6083</body>
6084</html>
6085
6086