blob: cb5020af49c6173cb7fcb6fc3923d1a1c3aef06b [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
Aaron Ballman672dde22016-01-22 23:15:00 +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('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 +00001733<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1734
1735Given
1736 template &lt;typename T&gt;
1737 class C { };
1738
1739 template class C&lt;int&gt;; A
1740 C&lt;char&gt; var; B
1741
1742templateSpecializationType() matches the type of the explicit
1743instantiation in A and the type of the variable declaration in B.
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('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 +00001748<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1749
1750Example matches T, but not int.
1751 (matcher = templateTypeParmType())
1752 template &lt;typename T&gt; void f(int i);
1753</pre></td></tr>
1754
1755
Aaron Ballman672dde22016-01-22 23:15:00 +00001756<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 +00001757<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1758</pre></td></tr>
1759
1760
Aaron Ballman672dde22016-01-22 23:15:00 +00001761<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 +00001762<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1763
1764Given
1765 typedef int X;
1766typedefType()
1767 matches "typedef int X"
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('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 +00001772<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1773
1774Given:
1775 typedef __underlying_type(T) type;
1776unaryTransformType()
1777 matches "__underlying_type(T)"
1778</pre></td></tr>
1779
1780
Aaron Ballman672dde22016-01-22 23:15:00 +00001781<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 +00001782<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1783integer-constant-expression.
1784
1785Given
1786 void f() {
1787 int a[] = { 2, 3 }
1788 int b[42];
1789 int c[a[0]];
1790 }
1791variableArrayType()
1792 matches "int c[a[0]]"
1793</pre></td></tr>
1794
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001795<!--END_DECL_MATCHERS -->
1796</table>
1797
1798<!-- ======================================================================= -->
1799<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1800<!-- ======================================================================= -->
1801
1802<p>Narrowing matchers match certain attributes on the current node, thus
1803narrowing down the set of nodes of the current type to match on.</p>
1804
1805<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1806which allow users to create more powerful match expressions.</p>
1807
1808<table>
1809<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001810<!-- START_NARROWING_MATCHERS -->
1811
1812<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>
1813<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1814
1815Usable as: Any Matcher
1816</pre></td></tr>
1817
1818
1819<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>
1820<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1821
1822Usable as: Any Matcher
1823</pre></td></tr>
1824
1825
1826<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1827<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1828
1829Useful when another matcher requires a child matcher, but there's no
1830additional constraint. This will often be used with an explicit conversion
1831to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1832
1833Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1834"int* p" and "void f()" in
1835 int* p;
1836 void f();
1837
1838Usable as: Any Matcher
1839</pre></td></tr>
1840
1841
1842<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1843<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1844
1845Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1846 class X {};
1847 class Y {};
1848
1849Usable as: Any Matcher
1850</pre></td></tr>
1851
1852
Aaron Ballman672dde22016-01-22 23:15:00 +00001853<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 +00001854<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1855unary).
1856
1857Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1858 !(a || b)
1859</pre></td></tr>
1860
1861
Peter Wua9244b52017-06-08 22:00:58 +00001862<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>
1863<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 +00001864
Peter Wua9244b52017-06-08 22:00:58 +00001865Given
1866 f('false, 3.14, 42);
1867characterLiteral(equals(0))
1868 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1869 match false
1870floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1871 match 3.14
1872integerLiteral(equals(42))
1873 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001874
Clement Courbet43bdba42017-07-11 15:45:22 +00001875Note that you cannot directly match a negative numeric literal because the
1876minus sign is not part of the literal: It is a unary operator whose operand
1877is the positive numeric literal. Instead, you must use a unaryOperator()
1878matcher to match the minus sign:
1879
1880unaryOperator(hasOperatorName("-"),
1881 hasUnaryOperand(integerLiteral(equals(13))))
1882
Peter Wua9244b52017-06-08 22:00:58 +00001883Usable 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 +00001884 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 +00001885</pre></td></tr>
1886
1887
Peter Wua9244b52017-06-08 22:00:58 +00001888<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>
1889<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1890
1891
1892<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>
1893<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1894
1895
1896<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>
1897<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1898
1899
Aaron Ballman672dde22016-01-22 23:15:00 +00001900<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001901<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1902
1903Given
1904 try {
1905 ...
1906 } catch (int) {
1907 ...
1908 } catch (...) {
1909 ...
1910 }
1911endcode
1912cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1913</pre></td></tr>
1914
1915
Aaron Ballman672dde22016-01-22 23:15:00 +00001916<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 +00001917<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1918a specific number of arguments (including absent default arguments).
1919
1920Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1921 void f(int x, int y);
1922 f(0, 0);
1923</pre></td></tr>
1924
1925
Aaron Ballman672dde22016-01-22 23:15:00 +00001926<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 +00001927<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1928</pre></td></tr>
1929
1930
Aaron Ballmana35b8fc2016-03-09 17:11:51 +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('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
1932<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1933zero initialization.
1934
1935Given
1936void foo() {
1937 struct point { double x; double y; };
1938 point pt[2] = { { 1.0, 2.0 } };
1939}
1940initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1941will match the implicit array filler for pt[1].
1942</pre></td></tr>
1943
1944
Aaron Ballman672dde22016-01-22 23:15:00 +00001945<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 +00001946<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1947
1948Given
1949 struct S {
1950 S(); #1
1951 S(const S &amp;); #2
1952 S(S &amp;&amp;); #3
1953 };
1954cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1955</pre></td></tr>
1956
1957
Aaron Ballman672dde22016-01-22 23:15:00 +00001958<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 +00001959<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1960
1961Given
1962 struct S {
1963 S(); #1
1964 S(const S &amp;); #2
1965 S(S &amp;&amp;); #3
1966 };
1967cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1968</pre></td></tr>
1969
1970
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00001971<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>
1972<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1973
1974Given
1975 struct S {
1976 S(); #1
1977 S(int) {} #2
1978 S(S &amp;&amp;) : S() {} #3
1979 };
1980 S::S() : S(0) {} #4
1981cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1982#1 or #2.
1983</pre></td></tr>
1984
1985
Aaron Ballman672dde22016-01-22 23:15:00 +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('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001987<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1988the explicit keyword.
1989
1990Given
1991 struct S {
1992 S(int); #1
1993 explicit S(double); #2
1994 operator int(); #3
1995 explicit operator bool(); #4
1996 };
1997cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1998cxxConversionDecl(isExplicit()) will match #4, but not #3.
1999</pre></td></tr>
2000
2001
Aaron Ballman672dde22016-01-22 23:15:00 +00002002<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 +00002003<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2004
2005Given
2006 struct S {
2007 S(); #1
2008 S(const S &amp;); #2
2009 S(S &amp;&amp;); #3
2010 };
2011cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2012</pre></td></tr>
2013
2014
Aaron Ballman672dde22016-01-22 23:15:00 +00002015<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 +00002016<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2017the explicit keyword.
2018
2019Given
2020 struct S {
2021 S(int); #1
2022 explicit S(double); #2
2023 operator int(); #3
2024 explicit operator bool(); #4
2025 };
2026cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2027cxxConversionDecl(isExplicit()) will match #4, but not #3.
2028</pre></td></tr>
2029
2030
Aaron Ballman672dde22016-01-22 23:15:00 +00002031<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 +00002032<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2033opposed to a member.
2034
2035Given
2036 struct B {};
2037 struct D : B {
2038 int I;
2039 D(int i) : I(i) {}
2040 };
2041 struct E : B {
2042 E() : B() {}
2043 };
2044cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2045 will match E(), but not match D(int).
2046</pre></td></tr>
2047
2048
Aaron Ballman672dde22016-01-22 23:15:00 +00002049<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 +00002050<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2051opposed to a base.
2052
2053Given
2054 struct B {};
2055 struct D : B {
2056 int I;
2057 D(int i) : I(i) {}
2058 };
2059 struct E : B {
2060 E() : B() {}
2061 };
2062cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2063 will match D(int), but not match E().
2064</pre></td></tr>
2065
2066
Aaron Ballman672dde22016-01-22 23:15:00 +00002067<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 +00002068<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2069code (as opposed to implicitly added by the compiler).
2070
2071Given
2072 struct Foo {
2073 Foo() { }
2074 Foo(int) : foo_("A") { }
2075 string foo_;
2076 };
2077cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2078 will match Foo(int), but not Foo()
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_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 +00002083<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2084
2085Given
2086struct A {
2087 void foo() const;
2088 void bar();
2089};
2090
2091cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2092</pre></td></tr>
2093
2094
Aaron Ballman672dde22016-01-22 23:15:00 +00002095<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 +00002096<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2097operator.
2098
2099Given
2100struct A {
2101 A &amp;operator=(const A &amp;);
2102 A &amp;operator=(A &amp;&amp;);
2103};
2104
2105cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2106the second one.
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('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002111<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2112
2113Given:
2114 class A final {};
2115
2116 struct B {
2117 virtual void f();
2118 };
2119
2120 struct C : B {
2121 void f() final;
2122 };
2123matches A and C::f, but not B, C, or B::f
2124</pre></td></tr>
2125
2126
Aaron Ballman672dde22016-01-22 23:15:00 +00002127<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 +00002128<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2129operator.
2130
2131Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002132struct A {
2133 A &amp;operator=(const A &amp;);
2134 A &amp;operator=(A &amp;&amp;);
2135};
2136
2137cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2138the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002139</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('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002143<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2144
2145Given
2146 class A {
2147 public:
2148 virtual void x();
2149 };
2150 class B : public A {
2151 public:
2152 virtual void x();
2153 };
2154 matches B::x
2155</pre></td></tr>
2156
2157
Aaron Ballman672dde22016-01-22 23:15:00 +00002158<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 +00002159<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2160
2161Given
2162 class A {
2163 public:
2164 virtual void x() = 0;
2165 };
2166 matches A::x
2167</pre></td></tr>
2168
2169
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002170<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>
2171<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2172
2173Given
2174 struct S {
2175 S(); #1
2176 S(const S &amp;) = default; #2
2177 S(S &amp;&amp;) = delete; #3
2178 };
2179cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2180</pre></td></tr>
2181
2182
Aaron Ballman672dde22016-01-22 23:15:00 +00002183<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002184<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2185
2186Given
2187 class A {
2188 public:
2189 virtual void x();
2190 };
2191 matches A::x
2192</pre></td></tr>
2193
Aaron Ballman672dde22016-01-22 23:15:00 +00002194
2195<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 +00002196<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2197
2198Given
2199 class A {
2200 public:
2201 virtual void x();
2202 };
2203 class B : public A {
2204 public:
2205 void x();
2206 };
2207 matches A::x but not B::x
2208</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002209
Aaron Ballman672dde22016-01-22 23:15:00 +00002210
2211<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 +00002212<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2213
2214Matches overloaded operator names specified in strings without the
2215"operator" prefix: e.g. "&lt;&lt;".
2216
2217Given:
2218 class A { int operator*(); };
2219 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2220 A a;
2221 a &lt;&lt; a; &lt;-- This matches
2222
2223cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2224specified line and
2225cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2226matches the declaration of A.
2227
Aaron Ballman672dde22016-01-22 23:15:00 +00002228Usable 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 +00002229</pre></td></tr>
2230
2231
Aaron Ballman672dde22016-01-22 23:15:00 +00002232<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 +00002233<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2234</pre></td></tr>
2235
2236
Aaron Ballman672dde22016-01-22 23:15:00 +00002237<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 +00002238<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2239static member variable template instantiations.
2240
2241Given
2242 template&lt;typename T&gt; void A(T t) { }
2243 template&lt;&gt; void A(int N) { }
2244functionDecl(isExplicitTemplateSpecialization())
2245 matches the specialization A&lt;int&gt;().
2246
Aaron Ballman672dde22016-01-22 23:15:00 +00002247Usable 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 +00002248</pre></td></tr>
2249
2250
Aaron Ballman672dde22016-01-22 23:15:00 +00002251<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002252<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2253
2254Given:
2255 class A final {};
2256
2257 struct B {
2258 virtual void f();
2259 };
2260
2261 struct C : B {
2262 void f() final;
2263 };
2264matches A and C::f, but not B, C, or B::f
2265</pre></td></tr>
2266
2267
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002268<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>
2269<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2270
2271Given:
2272 auto x = []{};
2273
2274cxxRecordDecl(isLambda()) matches the implicit class declaration of
2275decltype(x)
2276</pre></td></tr>
2277
2278
Aaron Ballman672dde22016-01-22 23:15:00 +00002279<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 +00002280<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2281isSameOrDerivedFrom(hasName(...)).
2282</pre></td></tr>
2283
2284
Aaron Ballman672dde22016-01-22 23:15:00 +00002285<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 +00002286<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2287member variable template instantiations.
2288
2289Given
2290 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2291or
2292 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2293cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2294 matches the template instantiation of X&lt;A&gt;.
2295
2296But given
2297 template &lt;typename T&gt; class X {}; class A {};
2298 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2299cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2300 does not match, as X&lt;A&gt; is an explicit template specialization.
2301
Aaron Ballman672dde22016-01-22 23:15:00 +00002302Usable 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 +00002303</pre></td></tr>
2304
2305
Aaron Ballman672dde22016-01-22 23:15:00 +00002306<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 +00002307<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2308a specific number of arguments (including absent default arguments).
2309
2310Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2311 void f(int x, int y);
2312 f(0, 0);
2313</pre></td></tr>
2314
2315
Etienne Bergeron75e52722016-05-13 19:36:55 +00002316<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>
2317<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2318
2319Example: matches the implicit cast around 0
2320(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2321 int *p = 0;
2322</pre></td></tr>
2323
2324
Aaron Ballman672dde22016-01-22 23:15:00 +00002325<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 +00002326<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 +00002327
Peter Wua9244b52017-06-08 22:00:58 +00002328Given
2329 f('false, 3.14, 42);
2330characterLiteral(equals(0))
2331 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2332 match false
2333floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2334 match 3.14
2335integerLiteral(equals(42))
2336 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002337
Clement Courbet43bdba42017-07-11 15:45:22 +00002338Note that you cannot directly match a negative numeric literal because the
2339minus sign is not part of the literal: It is a unary operator whose operand
2340is the positive numeric literal. Instead, you must use a unaryOperator()
2341matcher to match the minus sign:
2342
2343unaryOperator(hasOperatorName("-"),
2344 hasUnaryOperand(integerLiteral(equals(13))))
2345
Peter Wua9244b52017-06-08 22:00:58 +00002346Usable 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 +00002347 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 +00002348</pre></td></tr>
2349
2350
Peter Wua9244b52017-06-08 22:00:58 +00002351<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>
2352<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2353
2354
2355<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>
2356<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2357
2358
2359<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>
2360<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2361
2362
Aaron Ballman672dde22016-01-22 23:15:00 +00002363<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002364<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2365
2366Given
2367 template&lt;typename T&gt; struct C {};
2368 C&lt;int&gt; c;
2369classTemplateSpecializationDecl(templateArgumentCountIs(1))
2370 matches C&lt;int&gt;.
2371</pre></td></tr>
2372
2373
Aaron Ballman672dde22016-01-22 23:15:00 +00002374<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002375<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2376child statements.
2377
2378Example: Given
2379 { for (;;) {} }
2380compoundStmt(statementCountIs(0)))
2381 matches '{}'
2382 but does not match the outer compound statement.
2383</pre></td></tr>
2384
2385
Aaron Ballman672dde22016-01-22 23:15:00 +00002386<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 +00002387<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002388
2389Given
2390 int a[42];
2391 int b[2 * 21];
2392 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002393 char *s = "abcd";
2394 wchar_t *ws = L"abcd";
2395 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002396constantArrayType(hasSize(42))
2397 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002398stringLiteral(hasSize(4))
2399 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002400</pre></td></tr>
2401
2402
Aaron Ballman672dde22016-01-22 23:15:00 +00002403<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002404<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2405declarations.
2406
2407Example: Given
2408 int a, b;
2409 int c;
2410 int d = 2, e;
2411declCountIs(2)
2412 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2413</pre></td></tr>
2414
2415
Aaron Ballman672dde22016-01-22 23:15:00 +00002416<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 +00002417<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2418
2419Matches a node if it equals the node previously bound to ID.
2420
2421Given
2422 class X { int a; int b; };
2423cxxRecordDecl(
2424 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2425 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2426 matches the class X, as a and b have the same type.
2427
2428Note that when multiple matches are involved via forEach* matchers,
2429equalsBoundNodes acts as a filter.
2430For example:
2431compoundStmt(
2432 forEachDescendant(varDecl().bind("d")),
2433 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2434will trigger a match for each combination of variable declaration
2435and reference to that variable declaration within a compound statement.
2436</pre></td></tr>
2437
2438
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002439<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>
2440<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2441
2442Decl has pointer identity in the AST.
2443</pre></td></tr>
2444
2445
Aaron Ballman672dde22016-01-22 23:15:00 +00002446<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 +00002447<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2448
2449Given
2450 __attribute__((device)) void f() { ... }
2451decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2452f. If the matcher is use from clang-query, attr::Kind parameter should be
2453passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2454</pre></td></tr>
2455
2456
Aaron Ballman672dde22016-01-22 23:15:00 +00002457<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 +00002458<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2459partially matching a given regex.
2460
2461Example matches Y but not X
2462 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2463 #include "ASTMatcher.h"
2464 class X {};
2465ASTMatcher.h:
2466 class Y {};
2467
Aaron Ballman672dde22016-01-22 23:15:00 +00002468Usable 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 +00002469</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('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002473<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2474
2475Example matches X but not Y
2476 (matcher = cxxRecordDecl(isExpansionInMainFile())
2477 #include &lt;Y.h&gt;
2478 class X {};
2479Y.h:
2480 class Y {};
2481
Aaron Ballman672dde22016-01-22 23:15:00 +00002482Usable 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 +00002483</pre></td></tr>
2484
2485
Aaron Ballman672dde22016-01-22 23:15:00 +00002486<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 +00002487<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2488
2489Example matches Y but not X
2490 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2491 #include &lt;SystemHeader.h&gt;
2492 class X {};
2493SystemHeader.h:
2494 class Y {};
2495
Aaron Ballman672dde22016-01-22 23:15:00 +00002496Usable 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 +00002497</pre></td></tr>
2498
2499
Aaron Ballman672dde22016-01-22 23:15:00 +00002500<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 +00002501<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2502by the compiler (eg. implicit defaultcopy constructors).
2503</pre></td></tr>
2504
2505
Aaron Ballman672dde22016-01-22 23:15:00 +00002506<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 +00002507<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2508
2509Given
2510 class C {
2511 public: int a;
2512 protected: int b;
2513 private: int c;
2514 };
2515fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002516 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002517</pre></td></tr>
2518
2519
Aaron Ballman672dde22016-01-22 23:15:00 +00002520<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 +00002521<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2522
2523Given
2524 class C {
2525 public: int a;
2526 protected: int b;
2527 private: int c;
2528 };
2529fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002530 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002531</pre></td></tr>
2532
2533
Aaron Ballman672dde22016-01-22 23:15:00 +00002534<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 +00002535<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2536
2537Given
2538 class C {
2539 public: int a;
2540 protected: int b;
2541 private: int c;
2542 };
2543fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002544 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002545</pre></td></tr>
2546
2547
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002548<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>
2549<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2550a specific number of designators.
2551
2552Example: Given
2553 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2554 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2555designatorCountIs(2)
2556 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2557 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2558</pre></td></tr>
2559
2560
Aaron Ballman5c574342016-07-06 18:25:16 +00002561<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 +00002562<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2563bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002564
2565Given
2566 class C {
2567 int a : 2;
2568 int b : 4;
2569 int c : 2;
2570 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002571fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002572 matches 'int a;' and 'int c;' but not 'int b;'.
2573</pre></td></tr>
2574
2575
2576<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>
2577<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2578
2579Given
2580 class C {
2581 int a : 2;
2582 int b;
2583 };
2584fieldDecl(isBitField())
2585 matches 'int a;' but not 'int b;'.
2586</pre></td></tr>
2587
2588
Aaron Ballman672dde22016-01-22 23:15:00 +00002589<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 +00002590<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 +00002591
Peter Wua9244b52017-06-08 22:00:58 +00002592Given
2593 f('false, 3.14, 42);
2594characterLiteral(equals(0))
2595 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2596 match false
2597floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2598 match 3.14
2599integerLiteral(equals(42))
2600 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002601
Clement Courbet43bdba42017-07-11 15:45:22 +00002602Note that you cannot directly match a negative numeric literal because the
2603minus sign is not part of the literal: It is a unary operator whose operand
2604is the positive numeric literal. Instead, you must use a unaryOperator()
2605matcher to match the minus sign:
2606
2607unaryOperator(hasOperatorName("-"),
2608 hasUnaryOperand(integerLiteral(equals(13))))
2609
Peter Wua9244b52017-06-08 22:00:58 +00002610Usable 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 +00002611 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 +00002612</pre></td></tr>
2613
2614
Peter Wua9244b52017-06-08 22:00:58 +00002615<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>
2616<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2617
2618
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002619<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>
2620<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2621
2622Given:
2623 void f();
2624 void g() noexcept;
2625 void h() noexcept(true);
2626 void i() noexcept(false);
2627 void j() throw();
2628 void k() throw(int);
2629 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002630functionDecl(hasDynamicExceptionSpec()) and
2631 functionProtoType(hasDynamicExceptionSpec())
2632 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002633</pre></td></tr>
2634
2635
Aaron Ballman672dde22016-01-22 23:15:00 +00002636<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 +00002637<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2638
2639Matches overloaded operator names specified in strings without the
2640"operator" prefix: e.g. "&lt;&lt;".
2641
2642Given:
2643 class A { int operator*(); };
2644 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2645 A a;
2646 a &lt;&lt; a; &lt;-- This matches
2647
2648cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2649specified line and
2650cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2651matches the declaration of A.
2652
Aaron Ballman672dde22016-01-22 23:15:00 +00002653Usable 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 +00002654</pre></td></tr>
2655
2656
Aaron Ballman672dde22016-01-22 23:15:00 +00002657<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002658<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2659
2660Given:
2661 constexpr int foo = 42;
2662 constexpr int bar();
2663varDecl(isConstexpr())
2664 matches the declaration of foo.
2665functionDecl(isConstexpr())
2666 matches the declaration of bar.
2667</pre></td></tr>
2668
2669
Aaron Ballman672dde22016-01-22 23:15:00 +00002670<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 +00002671<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2672
2673Given:
2674 class A { ~A(); };
2675 class B { ~B() = default; };
2676functionDecl(isDefaulted())
2677 matches the declaration of ~B, but not ~A.
2678</pre></td></tr>
2679
2680
Aaron Ballman672dde22016-01-22 23:15:00 +00002681<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 +00002682<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2683
2684Example matches A, va, fa
2685 class A {};
2686 class B; Doesn't match, as it has no body.
2687 int va;
2688 extern int vb; Doesn't match, as it doesn't define the variable.
2689 void fa() {}
2690 void fb(); Doesn't match, as it has no body.
2691
Aaron Ballman672dde22016-01-22 23:15:00 +00002692Usable 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 +00002693</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('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002697<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2698
2699Given:
2700 void Func();
2701 void DeletedFunc() = delete;
2702functionDecl(isDeleted())
2703 matches the declaration of DeletedFunc, but not Func.
2704</pre></td></tr>
2705
2706
Aaron Ballman672dde22016-01-22 23:15:00 +00002707<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 +00002708<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2709static member variable template instantiations.
2710
2711Given
2712 template&lt;typename T&gt; void A(T t) { }
2713 template&lt;&gt; void A(int N) { }
2714functionDecl(isExplicitTemplateSpecialization())
2715 matches the specialization A&lt;int&gt;().
2716
Aaron Ballman672dde22016-01-22 23:15:00 +00002717Usable 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 +00002718</pre></td></tr>
2719
2720
Aaron Ballman672dde22016-01-22 23:15:00 +00002721<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 +00002722<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2723
2724Given:
2725 extern "C" void f() {}
2726 extern "C" { void g() {} }
2727 void h() {}
2728functionDecl(isExternC())
2729 matches the declaration of f and g, but not the declaration h
2730</pre></td></tr>
2731
2732
Aaron Ballman672dde22016-01-22 23:15:00 +00002733<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 +00002734<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2735the inline keyword.
2736
2737Given
2738 inline void f();
2739 void g();
2740 namespace n {
2741 inline namespace m {}
2742 }
2743functionDecl(isInline()) will match ::f().
2744namespaceDecl(isInline()) will match n::m.
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('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002749<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2750
2751Given:
2752 void f();
2753 void g() noexcept;
2754 void h() throw();
2755 void i() throw(int);
2756 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002757functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2758 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002759</pre></td></tr>
2760
2761
Haojian Wub3d25462016-09-26 16:01:52 +00002762<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 +00002763<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2764class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002765
2766Given:
2767 static void f() {}
2768 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002769 extern int j;
2770 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002771functionDecl(isStaticStorageClass())
2772 matches the function declaration f.
2773varDecl(isStaticStorageClass())
2774 matches the variable declaration i.
2775</pre></td></tr>
2776
2777
Aaron Ballman672dde22016-01-22 23:15:00 +00002778<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 +00002779<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2780member variable template instantiations.
2781
2782Given
2783 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2784or
2785 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2786cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2787 matches the template instantiation of X&lt;A&gt;.
2788
2789But given
2790 template &lt;typename T&gt; class X {}; class A {};
2791 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2792cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2793 does not match, as X&lt;A&gt; is an explicit template specialization.
2794
Aaron Ballman672dde22016-01-22 23:15:00 +00002795Usable 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 +00002796</pre></td></tr>
2797
2798
Aaron Ballman672dde22016-01-22 23:15:00 +00002799<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 +00002800<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2801
2802Example matches f, but not g or h. The function i will not match, even when
2803compiled in C mode.
2804 void f(...);
2805 void g(int);
2806 template &lt;typename... Ts&gt; void h(Ts...);
2807 void i();
2808</pre></td></tr>
2809
2810
Aaron Ballman672dde22016-01-22 23:15:00 +00002811<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 +00002812<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2813specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002814
2815Given
2816 void f(int i) {}
2817 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002818 void h(int i, int j);
2819 void j(int i);
2820 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002821functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002822 matches void g(int i, int j) {}
2823functionProtoType(parameterCountIs(2))
2824 matches void h(int i, int j)
2825functionProtoType(parameterCountIs(3))
2826 matches void k(int x, int y, int z, ...);
2827</pre></td></tr>
2828
2829
Aaron Ballman230ad972016-06-07 17:34:45 +00002830<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>
2831<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2832
2833Given:
2834 void f();
2835 void g() noexcept;
2836 void h() noexcept(true);
2837 void i() noexcept(false);
2838 void j() throw();
2839 void k() throw(int);
2840 void l() throw(...);
2841functionDecl(hasDynamicExceptionSpec()) and
2842 functionProtoType(hasDynamicExceptionSpec())
2843 match the declarations of j, k, and l, but not f, g, h, or i.
2844</pre></td></tr>
2845
2846
2847<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>
2848<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2849
2850Given:
2851 void f();
2852 void g() noexcept;
2853 void h() throw();
2854 void i() throw(int);
2855 void j() noexcept(false);
2856functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2857 match the declarations of g, and h, but not f, i or j.
2858</pre></td></tr>
2859
2860
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002861<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>
2862<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2863specific parameter count.
2864
2865Given
2866 void f(int i) {}
2867 void g(int i, int j) {}
2868 void h(int i, int j);
2869 void j(int i);
2870 void k(int x, int y, int z, ...);
2871functionDecl(parameterCountIs(2))
2872 matches void g(int i, int j) {}
2873functionProtoType(parameterCountIs(2))
2874 matches void h(int i, int j)
2875functionProtoType(parameterCountIs(3))
2876 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002877</pre></td></tr>
2878
2879
Aaron Ballman672dde22016-01-22 23:15:00 +00002880<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 +00002881<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 +00002882
Peter Wua9244b52017-06-08 22:00:58 +00002883Given
2884 f('false, 3.14, 42);
2885characterLiteral(equals(0))
2886 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2887 match false
2888floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2889 match 3.14
2890integerLiteral(equals(42))
2891 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002892
Clement Courbet43bdba42017-07-11 15:45:22 +00002893Note that you cannot directly match a negative numeric literal because the
2894minus sign is not part of the literal: It is a unary operator whose operand
2895is the positive numeric literal. Instead, you must use a unaryOperator()
2896matcher to match the minus sign:
2897
2898unaryOperator(hasOperatorName("-"),
2899 hasUnaryOperand(integerLiteral(equals(13))))
2900
Peter Wua9244b52017-06-08 22:00:58 +00002901Usable 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 +00002902 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 +00002903</pre></td></tr>
2904
2905
Peter Wua9244b52017-06-08 22:00:58 +00002906<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>
2907<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2908
2909
2910<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>
2911<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2912
2913
2914<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>
2915<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2916
2917
Aaron Ballman672dde22016-01-22 23:15:00 +00002918<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 +00002919<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2920to '.'.
2921
2922Member calls on the implicit this pointer match as called with '-&gt;'.
2923
2924Given
2925 class Y {
2926 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2927 int a;
2928 static int b;
2929 };
2930memberExpr(isArrow())
2931 matches this-&gt;x, x, y.x, a, this-&gt;b
2932</pre></td></tr>
2933
2934
Aaron Ballmana086b9f2016-08-17 13:10:42 +00002935<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>
2936<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2937
2938Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2939void f() {
2940 int x;
2941 static int y;
2942}
2943int z;
2944
2945Example matches f() because it has external formal linkage despite being
2946unique to the translation unit as though it has internal likage
2947(matcher = functionDecl(hasExternalFormalLinkage()))
2948
2949namespace {
2950void f() {}
2951}
2952</pre></td></tr>
2953
2954
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002955<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 +00002956<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2957
2958Supports specifying enclosing namespaces or classes by prefixing the name
2959with '&lt;enclosing&gt;::'.
2960Does not match typedefs of an underlying type with the given name.
2961
2962Example matches X (Name == "X")
2963 class X;
2964
2965Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2966 namespace a { namespace b { class X; } }
2967</pre></td></tr>
2968
2969
Aaron Ballman672dde22016-01-22 23:15:00 +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('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002971<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2972a substring matched by the given RegExp.
2973
2974Supports specifying enclosing namespaces or classes by
2975prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2976of an underlying type with the given name.
2977
2978Example matches X (regexp == "::X")
2979 class X;
2980
2981Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2982 namespace foo { namespace bar { class X; } }
2983</pre></td></tr>
2984
2985
Aaron Ballman672dde22016-01-22 23:15:00 +00002986<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 +00002987<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2988
2989Given
2990 namespace n {
2991 namespace {} #1
2992 }
2993namespaceDecl(isAnonymous()) will match #1 but not ::n.
2994</pre></td></tr>
2995
2996
Aaron Ballman672dde22016-01-22 23:15:00 +00002997<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 +00002998<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2999the inline keyword.
3000
3001Given
3002 inline void f();
3003 void g();
3004 namespace n {
3005 inline namespace m {}
3006 }
3007functionDecl(isInline()) will match ::f().
3008namespaceDecl(isInline()) will match n::m.
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_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 +00003013<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3014a specific number of arguments (including absent default arguments).
3015
3016Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3017 void f(int x, int y);
3018 f(0, 0);
3019</pre></td></tr>
3020
3021
Aaron Ballman672dde22016-01-22 23:15:00 +00003022<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 +00003023<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3024
3025objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3026message expression in
3027
3028 UIWebView *webView = ...;
3029 CGRect bodyFrame = webView.frame;
3030 bodyFrame.size.height = self.bodyContentHeight;
3031 webView.frame = bodyFrame;
3032 ^---- matches here
3033</pre></td></tr>
3034
3035
Aaron Ballman672dde22016-01-22 23:15:00 +00003036<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 +00003037<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3038
3039Matches only when the selector of the objCMessageExpr is NULL. This may
3040represent an error condition in the tree!
3041</pre></td></tr>
3042
3043
Aaron Ballman672dde22016-01-22 23:15:00 +00003044<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 +00003045<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3046
3047 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3048 matches the outer message expr in the code below, but NOT the message
3049 invocation for self.bodyView.
3050 [self.bodyView loadHTMLString:html baseURL:NULL];
3051</pre></td></tr>
3052
3053
Aaron Ballman672dde22016-01-22 23:15:00 +00003054<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 +00003055<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3056
3057 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3058 matches self.bodyView in the code below, but NOT the outer message
3059 invocation of "loadHTMLString:baseURL:".
3060 [self.bodyView loadHTMLString:html baseURL:NULL];
3061</pre></td></tr>
3062
3063
Aaron Ballman672dde22016-01-22 23:15:00 +00003064<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 +00003065<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3066a substring matched by the given RegExp.
3067 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3068 invocation for self.bodyView.
3069 [self.bodyView loadHTMLString:html baseURL:NULL];
3070</pre></td></tr>
3071
3072
Aaron Ballman672dde22016-01-22 23:15:00 +00003073<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 +00003074<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3075
3076 matcher = objCMessageExpr(numSelectorArgs(0));
3077 matches self.bodyView in the code below
3078
3079 matcher = objCMessageExpr(numSelectorArgs(2));
3080 matches the invocation of "loadHTMLString:baseURL:" but not that
3081 of self.bodyView
3082 [self.bodyView loadHTMLString:html baseURL:NULL];
3083</pre></td></tr>
3084
3085
Aaron Ballman672dde22016-01-22 23:15:00 +00003086<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 +00003087<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3088
3089Given
3090 class Y { public: void x(); };
3091 void z() { Y* y; y-&gt;x(); }
3092cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3093 matches y-&gt;x()
3094</pre></td></tr>
3095
3096
Aaron Ballman672dde22016-01-22 23:15:00 +00003097<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 +00003098<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3099
3100Matches a node if it equals the node previously bound to ID.
3101
3102Given
3103 class X { int a; int b; };
3104cxxRecordDecl(
3105 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3106 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3107 matches the class X, as a and b have the same type.
3108
3109Note that when multiple matches are involved via forEach* matchers,
3110equalsBoundNodes acts as a filter.
3111For example:
3112compoundStmt(
3113 forEachDescendant(varDecl().bind("d")),
3114 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3115will trigger a match for each combination of variable declaration
3116and reference to that variable declaration within a compound statement.
3117</pre></td></tr>
3118
3119
Aaron Ballman672dde22016-01-22 23:15:00 +00003120<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 +00003121<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3122the node, not hidden within a typedef.
3123
3124Given
3125 typedef const int const_int;
3126 const_int i;
3127 int *const j;
3128 int *volatile k;
3129 int m;
3130varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3131i is const-qualified but the qualifier is not local.
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('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
Samuel Benzaquen30747f72015-12-22 21:06:36 +00003136<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3137
3138Given
3139 void a(char);
3140 void b(wchar_t);
3141 void c(double);
3142functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3143matches "a(char)", "b(wchar_t)", but not "c(double)".
3144</pre></td></tr>
3145
3146
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003147<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 +00003148<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3149the Objective-C object pointer type, which is different despite being
3150syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003151
3152Given
3153 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003154
3155 @interface Foo
3156 @end
3157 Foo *f;
3158
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003159 int j;
3160varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003161 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003162</pre></td></tr>
3163
3164
Aaron Ballman672dde22016-01-22 23:15:00 +00003165<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 +00003166<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3167include "top-level" const.
3168
3169Given
3170 void a(int);
3171 void b(int const);
3172 void c(const int);
3173 void d(const int*);
3174 void e(int const) {};
3175functionDecl(hasAnyParameter(hasType(isConstQualified())))
3176 matches "void b(int const)", "void c(const int)" and
3177 "void e(int const) {}". It does not match d as there
3178 is no top-level const on the parameter type "const int *".
3179</pre></td></tr>
3180
3181
Aaron Ballman672dde22016-01-22 23:15:00 +00003182<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 +00003183<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3184
3185Given
3186 void a(int);
3187 void b(long);
3188 void c(double);
3189functionDecl(hasAnyParameter(hasType(isInteger())))
3190matches "a(int)", "b(long)", but not "c(double)".
3191</pre></td></tr>
3192
3193
Clement Courbet42517592016-07-12 06:36:00 +00003194<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>
3195<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3196
3197Given
3198 void a(int);
3199 void b(unsigned long);
3200 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003201functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003202matches "a(int)", but not "b(unsigned long)" and "c(double)".
3203</pre></td></tr>
3204
3205
3206<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>
3207<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3208
3209Given
3210 void a(int);
3211 void b(unsigned long);
3212 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003213functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003214matches "b(unsigned long)", but not "a(int)" and "c(double)".
3215</pre></td></tr>
3216
3217
Aaron Ballman672dde22016-01-22 23:15:00 +00003218<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
Aaron Ballman6290fc92015-11-23 17:09:24 +00003219<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3220include "top-level" volatile.
3221
3222Given
3223 void a(int);
3224 void b(int volatile);
3225 void c(volatile int);
3226 void d(volatile int*);
3227 void e(int volatile) {};
3228functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3229 matches "void b(int volatile)", "void c(volatile int)" and
3230 "void e(int volatile) {}". It does not match d as there
3231 is no top-level volatile on the parameter type "volatile int *".
3232</pre></td></tr>
3233
3234
Aaron Ballman672dde22016-01-22 23:15:00 +00003235<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 +00003236<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3237
3238Example matches C, but not S or U.
3239 struct S {};
3240 class C {};
3241 union U {};
3242</pre></td></tr>
3243
3244
Aaron Ballman672dde22016-01-22 23:15:00 +00003245<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 +00003246<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3247
3248Example matches S, but not C or U.
3249 struct S {};
3250 class C {};
3251 union U {};
3252</pre></td></tr>
3253
3254
Aaron Ballman672dde22016-01-22 23:15:00 +00003255<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 +00003256<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3257
3258Example matches U, but not C or S.
3259 struct S {};
3260 class C {};
3261 union U {};
3262</pre></td></tr>
3263
3264
Aaron Ballman672dde22016-01-22 23:15:00 +00003265<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 +00003266<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3267
3268Matches a node if it equals the node previously bound to ID.
3269
3270Given
3271 class X { int a; int b; };
3272cxxRecordDecl(
3273 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3274 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3275 matches the class X, as a and b have the same type.
3276
3277Note that when multiple matches are involved via forEach* matchers,
3278equalsBoundNodes acts as a filter.
3279For example:
3280compoundStmt(
3281 forEachDescendant(varDecl().bind("d")),
3282 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3283will trigger a match for each combination of variable declaration
3284and reference to that variable declaration within a compound statement.
3285</pre></td></tr>
3286
3287
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003288<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>
3289<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3290
3291Stmt has pointer identity in the AST.
3292</pre></td></tr>
3293
3294
Aaron Ballman672dde22016-01-22 23:15:00 +00003295<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 +00003296<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3297partially matching a given regex.
3298
3299Example matches Y but not X
3300 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3301 #include "ASTMatcher.h"
3302 class X {};
3303ASTMatcher.h:
3304 class Y {};
3305
Aaron Ballman672dde22016-01-22 23:15:00 +00003306Usable 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 +00003307</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('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003311<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3312
3313Example matches X but not Y
3314 (matcher = cxxRecordDecl(isExpansionInMainFile())
3315 #include &lt;Y.h&gt;
3316 class X {};
3317Y.h:
3318 class Y {};
3319
Aaron Ballman672dde22016-01-22 23:15:00 +00003320Usable 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 +00003321</pre></td></tr>
3322
3323
Aaron Ballman672dde22016-01-22 23:15:00 +00003324<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 +00003325<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3326
3327Example matches Y but not X
3328 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3329 #include &lt;SystemHeader.h&gt;
3330 class X {};
3331SystemHeader.h:
3332 class Y {};
3333
Aaron Ballman672dde22016-01-22 23:15:00 +00003334Usable 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 +00003335</pre></td></tr>
3336
3337
Etienne Bergeron3588be72016-05-12 04:20:04 +00003338<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>
3339<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3340
3341Given
3342 int a[42];
3343 int b[2 * 21];
3344 int c[41], d[43];
3345 char *s = "abcd";
3346 wchar_t *ws = L"abcd";
3347 char *w = "a";
3348constantArrayType(hasSize(42))
3349 matches "int a[42]" and "int b[2 * 21]"
3350stringLiteral(hasSize(4))
3351 matches "abcd", L"abcd"
3352</pre></td></tr>
3353
3354
Aaron Ballman672dde22016-01-22 23:15:00 +00003355<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 +00003356<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3357
3358Example matches A, va, fa
3359 class A {};
3360 class B; Doesn't match, as it has no body.
3361 int va;
3362 extern int vb; Doesn't match, as it doesn't define the variable.
3363 void fa() {}
3364 void fb(); Doesn't match, as it has no body.
3365
Aaron Ballman672dde22016-01-22 23:15:00 +00003366Usable 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 +00003367</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_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 +00003371<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3372
3373Note that 'Value' is a string as the template argument's value is
3374an arbitrary precision integer. 'Value' must be euqal to the canonical
3375representation of that integral value in base 10.
3376
3377Given
3378 template&lt;int T&gt; struct A {};
3379 C&lt;42&gt; c;
3380classTemplateSpecializationDecl(
3381 hasAnyTemplateArgument(equalsIntegralValue("42")))
3382 matches the implicit instantiation of C in C&lt;42&gt;.
3383</pre></td></tr>
3384
3385
Aaron Ballman672dde22016-01-22 23:15:00 +00003386<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 +00003387<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3388
3389Given
3390 template&lt;int T&gt; struct A {};
3391 C&lt;42&gt; c;
3392classTemplateSpecializationDecl(
3393 hasAnyTemplateArgument(isIntegral()))
3394 matches the implicit instantiation of C in C&lt;42&gt;
3395 with isIntegral() matching 42.
3396</pre></td></tr>
3397
3398
Aaron Ballman672dde22016-01-22 23:15:00 +00003399<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 +00003400<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3401
3402Given
3403 template&lt;typename T&gt; struct C {};
3404 C&lt;int&gt; c;
3405classTemplateSpecializationDecl(templateArgumentCountIs(1))
3406 matches C&lt;int&gt;.
3407</pre></td></tr>
3408
3409
Aaron Ballman672dde22016-01-22 23:15:00 +00003410<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 +00003411<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3412partially matching a given regex.
3413
3414Example matches Y but not X
3415 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3416 #include "ASTMatcher.h"
3417 class X {};
3418ASTMatcher.h:
3419 class Y {};
3420
Aaron Ballman672dde22016-01-22 23:15:00 +00003421Usable 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 +00003422</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('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003426<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3427
3428Example matches X but not Y
3429 (matcher = cxxRecordDecl(isExpansionInMainFile())
3430 #include &lt;Y.h&gt;
3431 class X {};
3432Y.h:
3433 class Y {};
3434
Aaron Ballman672dde22016-01-22 23:15:00 +00003435Usable 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 +00003436</pre></td></tr>
3437
3438
Aaron Ballman672dde22016-01-22 23:15:00 +00003439<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 +00003440<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3441
3442Example matches Y but not X
3443 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3444 #include &lt;SystemHeader.h&gt;
3445 class X {};
3446SystemHeader.h:
3447 class Y {};
3448
Aaron Ballman672dde22016-01-22 23:15:00 +00003449Usable 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 +00003450</pre></td></tr>
3451
3452
Aaron Ballman672dde22016-01-22 23:15:00 +00003453<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 +00003454<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3455
3456Given
3457 struct S { bool func(); };
3458functionDecl(returns(booleanType()))
3459 matches "bool func();"
3460</pre></td></tr>
3461
3462
Aaron Ballman672dde22016-01-22 23:15:00 +00003463<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 +00003464<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3465
3466Matches a node if it equals the node previously bound to ID.
3467
3468Given
3469 class X { int a; int b; };
3470cxxRecordDecl(
3471 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3472 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3473 matches the class X, as a and b have the same type.
3474
3475Note that when multiple matches are involved via forEach* matchers,
3476equalsBoundNodes acts as a filter.
3477For example:
3478compoundStmt(
3479 forEachDescendant(varDecl().bind("d")),
3480 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3481will trigger a match for each combination of variable declaration
3482and reference to that variable declaration within a compound statement.
3483</pre></td></tr>
3484
3485
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003486<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>
3487<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3488
3489Type has pointer identity in the AST.
3490</pre></td></tr>
3491
3492
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003493<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>
3494<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3495
3496Given
3497 int i;
3498 float f;
3499realFloatingPointType()
3500 matches "float f" but not "int i"
3501</pre></td></tr>
3502
3503
Aaron Ballman672dde22016-01-22 23:15:00 +00003504<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 +00003505<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3506
3507Given
3508 struct S { void func(); };
3509functionDecl(returns(voidType()))
3510 matches "void func();"
3511</pre></td></tr>
3512
3513
Aaron Ballman672dde22016-01-22 23:15:00 +00003514<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 +00003515<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3516
3517Given
3518 int x;
3519 int s = sizeof(x) + alignof(x)
3520unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3521 matches sizeof(x)
3522</pre></td></tr>
3523
3524
Aaron Ballman672dde22016-01-22 23:15:00 +00003525<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003526<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3527unary).
3528
3529Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3530 !(a || b)
3531</pre></td></tr>
3532
3533
Aaron Ballman672dde22016-01-22 23:15:00 +00003534<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003535<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3536
3537Example matches x, but not y, z, or a.
3538(matcher = varDecl(hasAutomaticStorageDuration())
3539void f() {
3540 int x;
3541 static int y;
3542 thread_local int z;
3543}
3544int a;
3545</pre></td></tr>
3546
3547
Aaron Ballman672dde22016-01-22 23:15:00 +00003548<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 +00003549<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3550
3551Example matches y and z (matcher = varDecl(hasGlobalStorage())
3552void f() {
3553 int x;
3554 static int y;
3555}
3556int z;
3557</pre></td></tr>
3558
3559
Aaron Ballman672dde22016-01-22 23:15:00 +00003560<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 +00003561<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3562non-static local variable.
3563
3564Example matches x (matcher = varDecl(hasLocalStorage())
3565void f() {
3566 int x;
3567 static int y;
3568}
3569int z;
3570</pre></td></tr>
3571
3572
Aaron Ballman672dde22016-01-22 23:15:00 +00003573<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 +00003574<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 +00003575It includes the variable declared at namespace scope and those declared
3576with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003577
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003578void f() {
3579 int x;
3580 static int y;
3581 thread_local int z;
3582}
3583int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003584static int b;
3585extern int c;
3586varDecl(hasStaticStorageDuration())
3587 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003588</pre></td></tr>
3589
3590
Aaron Ballman672dde22016-01-22 23:15:00 +00003591<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 +00003592<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3593
3594Example matches z, but not x, z, or a.
3595(matcher = varDecl(hasThreadStorageDuration())
3596void f() {
3597 int x;
3598 static int y;
3599 thread_local int z;
3600}
3601int a;
3602</pre></td></tr>
3603
3604
Aaron Ballman672dde22016-01-22 23:15:00 +00003605<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003606<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3607
3608Given:
3609 constexpr int foo = 42;
3610 constexpr int bar();
3611varDecl(isConstexpr())
3612 matches the declaration of foo.
3613functionDecl(isConstexpr())
3614 matches the declaration of bar.
3615</pre></td></tr>
3616
3617
Aaron Ballman672dde22016-01-22 23:15:00 +00003618<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 +00003619<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3620
3621Example matches A, va, fa
3622 class A {};
3623 class B; Doesn't match, as it has no body.
3624 int va;
3625 extern int vb; Doesn't match, as it doesn't define the variable.
3626 void fa() {}
3627 void fb(); Doesn't match, as it has no body.
3628
Aaron Ballman672dde22016-01-22 23:15:00 +00003629Usable 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 +00003630</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('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003634<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3635a C++ catch block, or an Objective-C statement.
3636
3637Example matches x (matcher = varDecl(isExceptionVariable())
3638void f(int y) {
3639 try {
3640 } catch (int x) {
3641 }
3642}
3643</pre></td></tr>
3644
3645
Aaron Ballman672dde22016-01-22 23:15:00 +00003646<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 +00003647<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3648static member variable template instantiations.
3649
3650Given
3651 template&lt;typename T&gt; void A(T t) { }
3652 template&lt;&gt; void A(int N) { }
3653functionDecl(isExplicitTemplateSpecialization())
3654 matches the specialization A&lt;int&gt;().
3655
Aaron Ballman672dde22016-01-22 23:15:00 +00003656Usable 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 +00003657</pre></td></tr>
3658
3659
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003660<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
3661<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations.
3662
3663Given:
3664 extern "C" void f() {}
3665 extern "C" { void g() {} }
3666 void h() {}
3667functionDecl(isExternC())
3668 matches the declaration of f and g, but not the declaration h
3669</pre></td></tr>
3670
3671
Haojian Wub3d25462016-09-26 16:01:52 +00003672<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 +00003673<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3674class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003675
3676Given:
3677 static void f() {}
3678 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003679 extern int j;
3680 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003681functionDecl(isStaticStorageClass())
3682 matches the function declaration f.
3683varDecl(isStaticStorageClass())
3684 matches the variable declaration i.
3685</pre></td></tr>
3686
3687
Aaron Ballman672dde22016-01-22 23:15:00 +00003688<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 +00003689<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3690member variable template instantiations.
3691
3692Given
3693 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3694or
3695 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3696cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3697 matches the template instantiation of X&lt;A&gt;.
3698
3699But given
3700 template &lt;typename T&gt; class X {}; class A {};
3701 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3702cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3703 does not match, as X&lt;A&gt; is an explicit template specialization.
3704
Aaron Ballman672dde22016-01-22 23:15:00 +00003705Usable 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 +00003706</pre></td></tr>
3707
3708
Aaron Ballman672dde22016-01-22 23:15:00 +00003709<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 +00003710<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3711template instantiations.
3712
3713Given
3714 template&lt;typename T&gt; void A(T t) { T i; }
3715 A(0);
3716 A(0U);
3717functionDecl(isInstantiated())
3718 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3719</pre></td></tr>
3720
3721
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003722<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>
3723<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3724GNU's __null, C++11's nullptr, or C's NULL macro.
3725
3726Given:
3727 void *v1 = NULL;
3728 void *v2 = nullptr;
3729 void *v3 = __null; GNU extension
3730 char *cp = (char *)0;
3731 int *ip = 0;
3732 int i = 0;
3733expr(nullPointerConstant())
3734 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3735 initializer for i.
3736</pre></td></tr>
3737
3738
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003739<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>
3740<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3741
3742This matcher is only provided as a performance optimization of hasName.
3743 hasAnyName(a, b, c)
3744 is equivalent to, but faster than
3745 anyOf(hasName(a), hasName(b), hasName(c))
3746</pre></td></tr>
3747
3748
Aaron Ballman672dde22016-01-22 23:15:00 +00003749<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 +00003750<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3751
3752Given
3753 int j;
3754 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3755 A(0);
3756 A(0U);
3757declStmt(isInTemplateInstantiation())
3758 matches 'int i;' and 'unsigned i'.
3759unless(stmt(isInTemplateInstantiation()))
3760 will NOT match j += 42; as it's shared between the template definition and
3761 instantiation.
3762</pre></td></tr>
3763
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003764<!--END_NARROWING_MATCHERS -->
3765</table>
3766
3767<!-- ======================================================================= -->
3768<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3769<!-- ======================================================================= -->
3770
3771<p>Traversal matchers specify the relationship to other nodes that are
3772reachable from the current node.</p>
3773
3774<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3775forEachDescendant) which work on all nodes and allow users to write more generic
3776match expressions.</p>
3777
3778<table>
3779<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003780<!-- START_TRAVERSAL_MATCHERS -->
3781
3782<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>
3783<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3784
3785Unlike anyOf, eachOf will generate a match result for each
3786matching submatcher.
3787
3788For example, in:
3789 class A { int a; int b; };
3790The matcher:
3791 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3792 has(fieldDecl(hasName("b")).bind("v"))))
3793will generate two results binding "v", the first of which binds
3794the field declaration of a, the second the field declaration of
3795b.
3796
3797Usable as: Any Matcher
3798</pre></td></tr>
3799
3800
3801<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3802<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3803provided matcher.
3804
3805Example matches X, A, B, C
3806 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3807 class X {}; Matches X, because X::X is a class of name X inside X.
3808 class A { class X {}; };
3809 class B { class C { class X {}; }; };
3810
3811DescendantT must be an AST base type.
3812
3813As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3814each result that matches instead of only on the first one.
3815
3816Note: Recursively combined ForEachDescendant can cause many matches:
3817 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3818 forEachDescendant(cxxRecordDecl())
3819 )))
3820will match 10 times (plus injected class name matches) on:
3821 class A { class B { class C { class D { class E {}; }; }; }; };
3822
3823Usable as: Any Matcher
3824</pre></td></tr>
3825
3826
3827<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3828<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3829provided matcher.
3830
3831Example matches X, Y
3832 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3833 class X {}; Matches X, because X::X is a class of name X inside X.
3834 class Y { class X {}; };
3835 class Z { class Y { class X {}; }; }; Does not match Z.
3836
3837ChildT must be an AST base type.
3838
3839As opposed to 'has', 'forEach' will cause a match for each result that
3840matches instead of only on the first one.
3841
3842Usable as: Any Matcher
3843</pre></td></tr>
3844
3845
3846<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3847<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3848matcher.
3849
3850Given
3851void f() { if (true) { int x = 42; } }
3852void g() { for (;;) { int x = 43; } }
3853expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3854
3855Usable as: Any Matcher
3856</pre></td></tr>
3857
3858
3859<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3860<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3861provided matcher.
3862
3863Example matches X, Y, Z
3864 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3865 class X {}; Matches X, because X::X is a class of name X inside X.
3866 class Y { class X {}; };
3867 class Z { class Y { class X {}; }; };
3868
3869DescendantT must be an AST base type.
3870
3871Usable as: Any Matcher
3872</pre></td></tr>
3873
3874
3875<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3876<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3877provided matcher.
3878
3879Example matches X, Y
3880 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3881 class X {}; Matches X, because X::X is a class of name X inside X.
3882 class Y { class X {}; };
3883 class Z { class Y { class X {}; }; }; Does not match Z.
3884
3885ChildT must be an AST base type.
3886
3887Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003888Note that has is direct matcher, so it also matches things like implicit
3889casts and paren casts. If you are matching with expr then you should
3890probably consider using ignoringParenImpCasts like:
3891has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003892</pre></td></tr>
3893
3894
3895<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3896<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3897matcher.
3898
3899Given
3900void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3901compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3902
3903Usable as: Any Matcher
3904</pre></td></tr>
3905
3906
Etienne Bergeron5500f952016-05-30 15:25:25 +00003907<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>
3908<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3909switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003910
3911Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3912 if (true) {}
3913</pre></td></tr>
3914
3915
3916<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>
3917<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3918(binary or ternary).
3919
3920Example matches b
3921 condition ? a : b
3922 condition ?: b
3923</pre></td></tr>
3924
3925
3926<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>
3927<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3928
3929Example 1 (conditional ternary operator): matches a
3930 condition ? a : b
3931
3932Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3933 condition ?: b
3934</pre></td></tr>
3935
3936
Manuel Klimeka37e1102016-12-01 15:45:06 +00003937<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>
3938<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 +00003939matches the given matcher.
3940
3941The associated declaration is:
3942- for type nodes, the declaration of the underlying type
3943- for CallExpr, the declaration of the callee
3944- for MemberExpr, the declaration of the referenced member
3945- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00003946- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003947
3948Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3949function. e.g. various subtypes of clang::Type and various expressions.
3950
Manuel Klimeka37e1102016-12-01 15:45:06 +00003951Usable 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;,
3952 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;,
3953 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;,
3954 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;,
3955 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;,
3956 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;,
3957 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003958</pre></td></tr>
3959
3960
Aaron Ballman672dde22016-01-22 23:15:00 +00003961<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 +00003962<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3963
3964Given
3965 int i[5];
3966 void f() { i[1] = 42; }
3967arraySubscriptExpression(hasBase(implicitCastExpr(
3968 hasSourceExpression(declRefExpr()))))
3969 matches i[1] with the declRefExpr() matching i
3970</pre></td></tr>
3971
3972
Aaron Ballman672dde22016-01-22 23:15:00 +00003973<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 +00003974<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3975
3976Given
3977 int i[5];
3978 void f() { i[1] = 42; }
3979arraySubscriptExpression(hasIndex(integerLiteral()))
3980 matches i[1] with the integerLiteral() matching 1
3981</pre></td></tr>
3982
3983
Aaron Ballman672dde22016-01-22 23:15:00 +00003984<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 +00003985<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
3986
3987Example matches a (matcher = binaryOperator(hasLHS()))
3988 a || b
3989</pre></td></tr>
3990
3991
Aaron Ballman672dde22016-01-22 23:15:00 +00003992<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 +00003993<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
3994
3995Example matches b (matcher = binaryOperator(hasRHS()))
3996 a || b
3997</pre></td></tr>
3998
3999
Aaron Ballman672dde22016-01-22 23:15:00 +00004000<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 +00004001<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4002type.
4003
4004Given
4005 struct A {};
4006 A a[7];
4007 int b[7];
4008arrayType(hasElementType(builtinType()))
4009 matches "int b[7]"
4010
Aaron Ballman672dde22016-01-22 23:15:00 +00004011Usable 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 +00004012</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_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 +00004016<tr><td colspan="4" class="doc" id="hasElementType0"><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_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 +00004031<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4032
4033Given
4034 _Atomic(int) i;
4035 _Atomic(float) f;
4036atomicType(hasValueType(isInteger()))
4037 matches "_Atomic(int) i"
4038
Aaron Ballman672dde22016-01-22 23:15:00 +00004039Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004040</pre></td></tr>
4041
4042
Aaron Ballman672dde22016-01-22 23:15:00 +00004043<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 +00004044<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4045
4046Given
4047 _Atomic(int) i;
4048 _Atomic(float) f;
4049atomicType(hasValueType(isInteger()))
4050 matches "_Atomic(int) i"
4051
Aaron Ballman672dde22016-01-22 23:15:00 +00004052Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004053</pre></td></tr>
4054
4055
Aaron Ballman672dde22016-01-22 23:15:00 +00004056<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 +00004057<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4058
4059Note: There is no TypeLoc for the deduced type and thus no
4060getDeducedLoc() matcher.
4061
4062Given
4063 auto a = 1;
4064 auto b = 2.0;
4065autoType(hasDeducedType(isInteger()))
4066 matches "auto a"
4067
Aaron Ballman672dde22016-01-22 23:15:00 +00004068Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004069</pre></td></tr>
4070
4071
Aaron Ballman672dde22016-01-22 23:15:00 +00004072<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 +00004073<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4074binary operator matches.
4075</pre></td></tr>
4076
4077
Aaron Ballman672dde22016-01-22 23:15:00 +00004078<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 +00004079<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4080
4081Example matches a (matcher = binaryOperator(hasLHS()))
4082 a || b
4083</pre></td></tr>
4084
4085
Aaron Ballman672dde22016-01-22 23:15:00 +00004086<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 +00004087<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4088
4089Example matches b (matcher = binaryOperator(hasRHS()))
4090 a || b
4091</pre></td></tr>
4092
4093
Aaron Ballman672dde22016-01-22 23:15:00 +00004094<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 +00004095<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4096pointee matches a given matcher.
4097
4098Given
4099 int *a;
4100 int const *b;
4101 float const *f;
4102pointerType(pointee(isConstQualified(), isInteger()))
4103 matches "int const *b"
4104
Aaron Ballman672dde22016-01-22 23:15:00 +00004105Usable 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;,
4106 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 +00004107</pre></td></tr>
4108
4109
Aaron Ballman672dde22016-01-22 23:15:00 +00004110<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 +00004111<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4112pointee matches a given matcher.
4113
4114Given
4115 int *a;
4116 int const *b;
4117 float const *f;
4118pointerType(pointee(isConstQualified(), isInteger()))
4119 matches "int const *b"
4120
Aaron Ballman672dde22016-01-22 23:15:00 +00004121Usable 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;,
4122 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 +00004123</pre></td></tr>
4124
4125
Aaron Ballman672dde22016-01-22 23:15:00 +00004126<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 +00004127<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4128
4129Given
4130 void f(int i);
4131 int y;
4132 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004133callExpr(
4134 forEachArgumentWithParam(
4135 declRefExpr(to(varDecl(hasName("y")))),
4136 parmVarDecl(hasType(isInteger()))
4137))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004138 matches f(y);
4139with declRefExpr(...)
4140 matching int y
4141and parmVarDecl(...)
4142 matching int i
4143</pre></td></tr>
4144
4145
Aaron Ballman672dde22016-01-22 23:15:00 +00004146<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004147<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4148expression.
4149
4150Given
4151 void x(int, int, int) { int y; x(1, y, 42); }
4152callExpr(hasAnyArgument(declRefExpr()))
4153 matches x(1, y, 42)
4154with hasAnyArgument(...)
4155 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004156</pre></td></tr>
4157
4158
Aaron Ballman672dde22016-01-22 23:15:00 +00004159<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 +00004160<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4161call expression.
4162
4163Example matches y in x(y)
4164 (matcher = callExpr(hasArgument(0, declRefExpr())))
4165 void x(int) { int y; x(y); }
4166</pre></td></tr>
4167
4168
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004169<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>
4170<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 +00004171matches the given matcher.
4172
4173The associated declaration is:
4174- for type nodes, the declaration of the underlying type
4175- for CallExpr, the declaration of the callee
4176- for MemberExpr, the declaration of the referenced member
4177- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004178- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004179
4180Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4181function. e.g. various subtypes of clang::Type and various expressions.
4182
Manuel Klimeka37e1102016-12-01 15:45:06 +00004183Usable 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;,
4184 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;,
4185 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;,
4186 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;,
4187 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;,
4188 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;,
4189 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004190</pre></td></tr>
4191
4192
Aaron Ballman672dde22016-01-22 23:15:00 +00004193<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 +00004194<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4195
4196Given
4197 class A { A() : i(42), j(42) {} int i; int j; };
4198cxxConstructorDecl(forEachConstructorInitializer(
4199 forField(decl().bind("x"))
4200))
4201 will trigger two matches, binding for 'i' and 'j' respectively.
4202</pre></td></tr>
4203
4204
Aaron Ballman672dde22016-01-22 23:15:00 +00004205<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 +00004206<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4207
4208Given
4209 struct Foo {
4210 Foo() : foo_(1) { }
4211 int foo_;
4212 };
4213cxxRecordDecl(has(cxxConstructorDecl(
4214 hasAnyConstructorInitializer(anything())
4215)))
4216 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
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_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 +00004221<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4222
4223Given
4224 struct Foo {
4225 Foo() : foo_(1) { }
4226 int foo_;
4227 };
4228cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4229 forField(hasName("foo_"))))))
4230 matches Foo
4231with forField matching foo_
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('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 +00004236<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4237
4238Given
4239 struct Foo {
4240 Foo() : foo_(1) { }
4241 int foo_;
4242 };
4243cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4244 withInitializer(integerLiteral(equals(1)))))))
4245 matches Foo
4246with withInitializer matching (1)
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_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 +00004251<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4252definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004253
4254Given
4255 for (;;) {}
4256hasBody(compoundStmt())
4257 matches 'for (;;) {}'
4258with compoundStmt()
4259 matching '{}'
4260</pre></td></tr>
4261
4262
Aaron Ballman672dde22016-01-22 23:15:00 +00004263<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 +00004264<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4265
4266Example:
4267 forStmt(hasLoopVariable(anything()))
4268matches 'int x' in
4269 for (int x : a) { }
4270</pre></td></tr>
4271
4272
Aaron Ballman672dde22016-01-22 23:15:00 +00004273<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 +00004274<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4275
4276Example:
4277 forStmt(hasRangeInit(anything()))
4278matches 'a' in
4279 for (int x : a) { }
4280</pre></td></tr>
4281
4282
Aaron Ballman672dde22016-01-22 23:15:00 +00004283<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 +00004284<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4285
4286
Aaron Ballman672dde22016-01-22 23:15:00 +00004287<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 +00004288<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4289
4290Example matches y.x()
4291 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4292 class Y { public: void x(); };
4293 void z() { Y y; y.x(); }",
4294
4295FIXME: Overload to allow directly matching types?
4296</pre></td></tr>
4297
4298
Aaron Ballman672dde22016-01-22 23:15:00 +00004299<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 +00004300<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4301</pre></td></tr>
4302
4303
Aaron Ballman672dde22016-01-22 23:15:00 +00004304<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 +00004305<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4306matcher, or is a pointer to a type that matches the InnerMatcher.
4307</pre></td></tr>
4308
4309
Clement Courbet6ecaec82016-07-05 07:49:31 +00004310<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 +00004311<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 +00004312produce multiple matches.
4313
4314Given
4315 class A { virtual void f(); };
4316 class B : public A { void f(); };
4317 class C : public B { void f(); };
4318cxxMethodDecl(ofClass(hasName("C")),
4319 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4320 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4321 that B::f is not overridden by C::f).
4322
4323The check can produce multiple matches in case of multiple inheritance, e.g.
4324 class A1 { virtual void f(); };
4325 class A2 { virtual void f(); };
4326 class C : public A1, public A2 { void f(); };
4327cxxMethodDecl(ofClass(hasName("C")),
4328 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4329 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4330 once with "b" binding "A2::f" and "d" binding "C::f".
4331</pre></td></tr>
4332
4333
Aaron Ballman672dde22016-01-22 23:15:00 +00004334<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 +00004335<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4336belongs to.
4337
4338FIXME: Generalize this for other kinds of declarations.
4339FIXME: What other kind of declarations would we need to generalize
4340this to?
4341
4342Example matches A() in the last line
4343 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4344 ofClass(hasName("A"))))))
4345 class A {
4346 public:
4347 A();
4348 };
4349 A a = A();
4350</pre></td></tr>
4351
4352
Manuel Klimeka37e1102016-12-01 15:45:06 +00004353<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>
4354<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 +00004355matches the given matcher.
4356
4357The associated declaration is:
4358- for type nodes, the declaration of the underlying type
4359- for CallExpr, the declaration of the callee
4360- for MemberExpr, the declaration of the referenced member
4361- for CXXConstructExpr, the declaration of the constructor
4362- for CXXNewExpr, the declaration of the operator new
4363
4364Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4365function. e.g. various subtypes of clang::Type and various expressions.
4366
Manuel Klimeka37e1102016-12-01 15:45:06 +00004367Usable 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;,
4368 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;,
4369 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;,
4370 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;,
4371 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;,
4372 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;,
4373 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004374</pre></td></tr>
4375
4376
Aaron Ballman672dde22016-01-22 23:15:00 +00004377<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 +00004378<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4379
4380Given:
4381 class A { void func(); };
4382 class B { void member(); };
4383
4384cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4385A but not B.
4386</pre></td></tr>
4387
4388
Aaron Ballman672dde22016-01-22 23:15:00 +00004389<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 +00004390<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4391a class matching Base.
4392
4393Note that a class is not considered to be derived from itself.
4394
4395Example matches Y, Z, C (Base == hasName("X"))
4396 class X;
4397 class Y : public X {}; directly derived
4398 class Z : public Y {}; indirectly derived
4399 typedef X A;
4400 typedef A B;
4401 class C : public B {}; derived from a typedef of X
4402
4403In the following example, Bar matches isDerivedFrom(hasName("X")):
4404 class Foo;
4405 typedef Foo X;
4406 class Bar : public Foo {}; derived from a type that X is a typedef of
4407</pre></td></tr>
4408
4409
Aaron Ballman672dde22016-01-22 23:15:00 +00004410<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 +00004411<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4412match Base.
4413</pre></td></tr>
4414
4415
Aaron Ballman672dde22016-01-22 23:15:00 +00004416<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 +00004417<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4418given matcher.
4419
4420Example matches y.x() (matcher = callExpr(callee(
4421 cxxMethodDecl(hasName("x")))))
4422 class Y { public: void x(); };
4423 void z() { Y y; y.x(); }
4424</pre></td></tr>
4425
4426
Aaron Ballman672dde22016-01-22 23:15:00 +00004427<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004428<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4429
4430Given
4431 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4432 void f() { f(); }
4433callExpr(callee(expr()))
4434 matches this-&gt;x(), x(), y.x(), f()
4435with callee(...)
4436 matching this-&gt;x, x, y.x, f respectively
4437
Aaron Ballman672dde22016-01-22 23:15:00 +00004438Note: 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 +00004439because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004440internal::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 +00004441implemented in terms of implicit casts.
4442</pre></td></tr>
4443
4444
Aaron Ballman672dde22016-01-22 23:15:00 +00004445<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 +00004446<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4447
4448Given
4449 void f(int i);
4450 int y;
4451 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004452callExpr(
4453 forEachArgumentWithParam(
4454 declRefExpr(to(varDecl(hasName("y")))),
4455 parmVarDecl(hasType(isInteger()))
4456))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004457 matches f(y);
4458with declRefExpr(...)
4459 matching int y
4460and parmVarDecl(...)
4461 matching int i
4462</pre></td></tr>
4463
4464
Aaron Ballman672dde22016-01-22 23:15:00 +00004465<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004466<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4467expression.
4468
4469Given
4470 void x(int, int, int) { int y; x(1, y, 42); }
4471callExpr(hasAnyArgument(declRefExpr()))
4472 matches x(1, y, 42)
4473with hasAnyArgument(...)
4474 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004475</pre></td></tr>
4476
4477
Aaron Ballman672dde22016-01-22 23:15:00 +00004478<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 +00004479<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4480call expression.
4481
4482Example matches y in x(y)
4483 (matcher = callExpr(hasArgument(0, declRefExpr())))
4484 void x(int) { int y; x(y); }
4485</pre></td></tr>
4486
4487
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004488<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>
4489<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 +00004490matches the given matcher.
4491
4492The associated declaration is:
4493- for type nodes, the declaration of the underlying type
4494- for CallExpr, the declaration of the callee
4495- for MemberExpr, the declaration of the referenced member
4496- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004497- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004498
4499Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4500function. e.g. various subtypes of clang::Type and various expressions.
4501
Manuel Klimeka37e1102016-12-01 15:45:06 +00004502Usable 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;,
4503 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;,
4504 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;,
4505 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;,
4506 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;,
4507 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;,
4508 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004509</pre></td></tr>
4510
4511
Aaron Ballman672dde22016-01-22 23:15:00 +00004512<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 +00004513<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4514extension, matches the constant given in the statement.
4515
4516Given
4517 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4518caseStmt(hasCaseConstant(integerLiteral()))
4519 matches "case 1:"
4520</pre></td></tr>
4521
4522
Aaron Ballman672dde22016-01-22 23:15:00 +00004523<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004524<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004525
4526
Aaron Ballman672dde22016-01-22 23:15:00 +00004527<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 +00004528<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4529functionDecl that have at least one TemplateArgument matching the given
4530InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004531
4532Given
4533 template&lt;typename T&gt; class A {};
4534 template&lt;&gt; class A&lt;double&gt; {};
4535 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004536
Haojian Wu99e39a72016-07-29 17:30:13 +00004537 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004538 void func() { f&lt;int&gt;(); };
4539
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004540classTemplateSpecializationDecl(hasAnyTemplateArgument(
4541 refersToType(asString("int"))))
4542 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004543
4544functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4545 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004546</pre></td></tr>
4547
4548
Aaron Ballman672dde22016-01-22 23:15:00 +00004549<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004550<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4551functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004552
4553Given
4554 template&lt;typename T, typename U&gt; class A {};
4555 A&lt;bool, int&gt; b;
4556 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004557
Haojian Wu99e39a72016-07-29 17:30:13 +00004558 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004559 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004560classTemplateSpecializationDecl(hasTemplateArgument(
4561 1, refersToType(asString("int"))))
4562 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004563
4564functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4565 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004566</pre></td></tr>
4567
4568
Aaron Ballman672dde22016-01-22 23:15:00 +00004569<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 +00004570<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4571type.
4572
4573Given
4574 struct A {};
4575 A a[7];
4576 int b[7];
4577arrayType(hasElementType(builtinType()))
4578 matches "int b[7]"
4579
Aaron Ballman672dde22016-01-22 23:15:00 +00004580Usable 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 +00004581</pre></td></tr>
4582
4583
Aaron Ballman672dde22016-01-22 23:15:00 +00004584<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 +00004585<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4586type.
4587
4588Given
4589 struct A {};
4590 A a[7];
4591 int b[7];
4592arrayType(hasElementType(builtinType()))
4593 matches "int b[7]"
4594
Aaron Ballman672dde22016-01-22 23:15:00 +00004595Usable 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 +00004596</pre></td></tr>
4597
4598
Aaron Ballman672dde22016-01-22 23:15:00 +00004599<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 +00004600<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 +00004601a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004602
4603Given
4604 { {}; 1+2; }
4605hasAnySubstatement(compoundStmt())
4606 matches '{ {}; 1+2; }'
4607with compoundStmt()
4608 matching '{}'
4609</pre></td></tr>
4610
4611
Aaron Ballman672dde22016-01-22 23:15:00 +00004612<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 +00004613<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4614</pre></td></tr>
4615
4616
Manuel Klimeka37e1102016-12-01 15:45:06 +00004617<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>
4618<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 +00004619matches the given matcher.
4620
4621The associated declaration is:
4622- for type nodes, the declaration of the underlying type
4623- for CallExpr, the declaration of the callee
4624- for MemberExpr, the declaration of the referenced member
4625- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004626- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004627
4628Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4629function. e.g. various subtypes of clang::Type and various expressions.
4630
Manuel Klimeka37e1102016-12-01 15:45:06 +00004631Usable 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;,
4632 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;,
4633 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;,
4634 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;,
4635 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;,
4636 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;,
4637 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004638</pre></td></tr>
4639
4640
Aaron Ballman672dde22016-01-22 23:15:00 +00004641<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 +00004642<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4643specific using shadow declaration.
4644
4645Given
4646 namespace a { void f() {} }
4647 using a::f;
4648 void g() {
4649 f(); Matches this ..
4650 a::f(); .. but not this.
4651 }
4652declRefExpr(throughUsingDecl(anything()))
4653 matches f()
4654</pre></td></tr>
4655
4656
Aaron Ballman672dde22016-01-22 23:15:00 +00004657<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 +00004658<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4659specified matcher.
4660
4661Example matches x in if(x)
4662 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4663 bool x;
4664 if (x) {}
4665</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_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 +00004669<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4670
4671Note that this does not work for global declarations because the AST
4672breaks up multiple-declaration DeclStmt's into multiple single-declaration
4673DeclStmt's.
4674Example: Given non-global declarations
4675 int a, b = 0;
4676 int c;
4677 int d = 2, e;
4678declStmt(containsDeclaration(
4679 0, varDecl(hasInitializer(anything()))))
4680 matches only 'int d = 2, e;', and
4681declStmt(containsDeclaration(1, varDecl()))
4682 matches 'int a, b = 0' as well as 'int d = 2, e;'
4683 but 'int c;' is not matched.
4684</pre></td></tr>
4685
4686
Aaron Ballman672dde22016-01-22 23:15:00 +00004687<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 +00004688<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4689
4690Given
4691 int a, b;
4692 int c;
4693declStmt(hasSingleDecl(anything()))
4694 matches 'int c;' but not 'int a, b;'.
4695</pre></td></tr>
4696
4697
Aaron Ballman672dde22016-01-22 23:15:00 +00004698<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004699<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4700the inner matcher.
4701
4702Given
4703 int x;
4704declaratorDecl(hasTypeLoc(loc(asString("int"))))
4705 matches int x
4706</pre></td></tr>
4707
4708
Aaron Ballman672dde22016-01-22 23:15:00 +00004709<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 +00004710<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4711Decl, matches InnerMatcher.
4712
4713Given
4714 namespace N {
4715 namespace M {
4716 class D {};
4717 }
4718 }
4719
4720cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4721declaration of class D.
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_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 +00004726<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4727definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004728
4729Given
4730 for (;;) {}
4731hasBody(compoundStmt())
4732 matches 'for (;;) {}'
4733with compoundStmt()
4734 matching '{}'
4735</pre></td></tr>
4736
4737
Aaron Ballman672dde22016-01-22 23:15:00 +00004738<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 +00004739<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 +00004740switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004741
4742Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4743 if (true) {}
4744</pre></td></tr>
4745
4746
Aaron Ballman672dde22016-01-22 23:15:00 +00004747<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 +00004748<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4749matches InnerMatcher if the qualifier exists.
4750
4751Given
4752 namespace N {
4753 namespace M {
4754 class D {};
4755 }
4756 }
4757 N::M::D d;
4758
4759elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4760matches the type of the variable declaration of d.
4761</pre></td></tr>
4762
4763
Aaron Ballman672dde22016-01-22 23:15:00 +00004764<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 +00004765<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4766
4767Given
4768 namespace N {
4769 namespace M {
4770 class D {};
4771 }
4772 }
4773 N::M::D d;
4774
4775elaboratedType(namesType(recordType(
4776hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4777declaration of d.
4778</pre></td></tr>
4779
4780
Manuel Klimeka37e1102016-12-01 15:45:06 +00004781<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>
4782<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 +00004783matches the given matcher.
4784
4785The associated declaration is:
4786- for type nodes, the declaration of the underlying type
4787- for CallExpr, the declaration of the callee
4788- for MemberExpr, the declaration of the referenced member
4789- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004790- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004791
4792Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4793function. e.g. various subtypes of clang::Type and various expressions.
4794
Manuel Klimeka37e1102016-12-01 15:45:06 +00004795Usable 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;,
4796 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;,
4797 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;,
4798 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;,
4799 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;,
4800 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;,
4801 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004802</pre></td></tr>
4803
4804
Aaron Ballman672dde22016-01-22 23:15:00 +00004805<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 +00004806<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4807
4808(Note: Clang's AST refers to other conversions as "casts" too, and calls
4809actual casts "explicit" casts.)
4810</pre></td></tr>
4811
4812
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004813<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>
4814<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 +00004815declaration's type.
4816
4817In case of a value declaration (for example a variable declaration),
4818this resolves one layer of indirection. For example, in the value
4819declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4820X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4821declaration of x.
4822
4823Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4824 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4825 class X {};
4826 void y(X &amp;x) { x; X z; }
4827
Aaron Ballman672dde22016-01-22 23:15:00 +00004828Usable 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 +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_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 +00004833<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4834matcher.
4835
4836Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4837 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004838 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004839 class X {};
4840 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004841 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004842</pre></td></tr>
4843
4844
Aaron Ballman672dde22016-01-22 23:15:00 +00004845<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004846<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4847are stripped off.
4848
4849Parentheses and explicit casts are not discarded.
4850Given
4851 int arr[5];
4852 int a = 0;
4853 char b = 0;
4854 const int c = a;
4855 int *d = arr;
4856 long e = (long) 0l;
4857The matchers
4858 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4859 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4860would match the declarations for a, b, c, and d, but not e.
4861While
4862 varDecl(hasInitializer(integerLiteral()))
4863 varDecl(hasInitializer(declRefExpr()))
4864only match the declarations for b, c, and d.
4865</pre></td></tr>
4866
4867
Cong Liu8a02efb2016-06-24 09:38:03 +00004868<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>
4869<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4870nodes are stripped off.
4871
4872Parentheses and explicit casts are not discarded.
4873Given
4874 class C {};
4875 C a = C();
4876 C b;
4877 C c = b;
4878The matchers
4879 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4880would match the declarations for a, b, and c.
4881While
4882 varDecl(hasInitializer(cxxConstructExpr()))
4883only match the declarations for b and c.
4884</pre></td></tr>
4885
4886
Aaron Ballman672dde22016-01-22 23:15:00 +00004887<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 +00004888<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4889casts are stripped off.
4890
4891Implicit and non-C Style casts are also discarded.
4892Given
4893 int a = 0;
4894 char b = (0);
4895 void* c = reinterpret_cast&lt;char*&gt;(0);
4896 char d = char(0);
4897The matcher
4898 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4899would match the declarations for a, b, c, and d.
4900while
4901 varDecl(hasInitializer(integerLiteral()))
4902only match the declaration for a.
4903</pre></td></tr>
4904
4905
Aaron Ballman672dde22016-01-22 23:15:00 +00004906<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 +00004907<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4908parentheses are stripped off.
4909
4910Explicit casts are not discarded.
4911Given
4912 int arr[5];
4913 int a = 0;
4914 char b = (0);
4915 const int c = a;
4916 int *d = (arr);
4917 long e = ((long) 0l);
4918The matchers
4919 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4920 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4921would match the declarations for a, b, c, and d, but not e.
4922while
4923 varDecl(hasInitializer(integerLiteral()))
4924 varDecl(hasInitializer(declRefExpr()))
4925would only match the declaration for a.
4926</pre></td></tr>
4927
4928
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00004929<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>
4930<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4931
4932Given
4933 class C {
4934 int a = 2;
4935 int b = 3;
4936 int c;
4937 };
4938fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4939 matches 'int a;' but not 'int b;'.
4940fieldDecl(hasInClassInitializer(anything()))
4941 matches 'int a;' and 'int b;' but not 'int c;'.
4942</pre></td></tr>
4943
4944
Aaron Ballman672dde22016-01-22 23:15:00 +00004945<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 +00004946<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4947definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004948
4949Given
4950 for (;;) {}
4951hasBody(compoundStmt())
4952 matches 'for (;;) {}'
4953with compoundStmt()
4954 matching '{}'
4955</pre></td></tr>
4956
4957
Aaron Ballman672dde22016-01-22 23:15:00 +00004958<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 +00004959<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 +00004960switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004961
4962Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4963 if (true) {}
4964</pre></td></tr>
4965
4966
Aaron Ballman672dde22016-01-22 23:15:00 +00004967<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 +00004968<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4969
4970Example:
4971 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4972matches '++x' in
4973 for (x; x &lt; N; ++x) { }
4974</pre></td></tr>
4975
4976
Aaron Ballman672dde22016-01-22 23:15:00 +00004977<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 +00004978<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
4979
4980Example:
4981 forStmt(hasLoopInit(declStmt()))
4982matches 'int x = 0' in
4983 for (int x = 0; x &lt; N; ++x) { }
4984</pre></td></tr>
4985
4986
Aaron Ballman672dde22016-01-22 23:15:00 +00004987<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 +00004988<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
4989
4990Does not match the 'this' parameter of a method.
4991
4992Given
4993 class X { void f(int x, int y, int z) {} };
4994cxxMethodDecl(hasAnyParameter(hasName("y")))
4995 matches f(int x, int y, int z) {}
4996with hasAnyParameter(...)
4997 matching int y
4998</pre></td></tr>
4999
5000
Haojian Wud898b092016-07-29 13:57:27 +00005001<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>
5002<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5003functionDecl that have at least one TemplateArgument matching the given
5004InnerMatcher.
5005
5006Given
5007 template&lt;typename T&gt; class A {};
5008 template&lt;&gt; class A&lt;double&gt; {};
5009 A&lt;int&gt; a;
5010
Haojian Wu99e39a72016-07-29 17:30:13 +00005011 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005012 void func() { f&lt;int&gt;(); };
5013
5014classTemplateSpecializationDecl(hasAnyTemplateArgument(
5015 refersToType(asString("int"))))
5016 matches the specialization A&lt;int&gt;
5017
5018functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5019 matches the specialization f&lt;int&gt;
5020</pre></td></tr>
5021
5022
Aaron Ballman672dde22016-01-22 23:15:00 +00005023<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005024<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5025definition that has a given body.
5026
5027Given
5028 for (;;) {}
5029hasBody(compoundStmt())
5030 matches 'for (;;) {}'
5031with compoundStmt()
5032 matching '{}'
5033</pre></td></tr>
5034
5035
Aaron Ballman672dde22016-01-22 23:15:00 +00005036<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 +00005037<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5038
5039Given
5040 class X { void f(int x) {} };
5041cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5042 matches f(int x) {}
5043with hasParameter(...)
5044 matching int x
5045</pre></td></tr>
5046
5047
Haojian Wud898b092016-07-29 13:57:27 +00005048<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>
5049<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5050functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5051
5052Given
5053 template&lt;typename T, typename U&gt; class A {};
5054 A&lt;bool, int&gt; b;
5055 A&lt;int, bool&gt; c;
5056
Haojian Wu99e39a72016-07-29 17:30:13 +00005057 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005058 void func() { f&lt;int&gt;(); };
5059classTemplateSpecializationDecl(hasTemplateArgument(
5060 1, refersToType(asString("int"))))
5061 matches the specialization A&lt;bool, int&gt;
5062
5063functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5064 matches the specialization f&lt;int&gt;
5065</pre></td></tr>
5066
5067
Aaron Ballman672dde22016-01-22 23:15:00 +00005068<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 +00005069<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5070
5071Given:
5072 class X { int f() { return 1; } };
5073cxxMethodDecl(returns(asString("int")))
5074 matches int f() { return 1; }
5075</pre></td></tr>
5076
5077
Aaron Ballman672dde22016-01-22 23:15:00 +00005078<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 +00005079<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 +00005080switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005081
5082Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5083 if (true) {}
5084</pre></td></tr>
5085
5086
Aaron Ballman672dde22016-01-22 23:15:00 +00005087<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 +00005088<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5089
5090Given
5091 if (A* a = GetAPointer()) {}
5092hasConditionVariableStatement(...)
5093 matches 'A* a = GetAPointer()'.
5094</pre></td></tr>
5095
5096
Aaron Ballman672dde22016-01-22 23:15:00 +00005097<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 +00005098<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5099
5100Examples matches the if statement
5101 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5102 if (false) false; else true;
5103</pre></td></tr>
5104
5105
Aaron Ballman672dde22016-01-22 23:15:00 +00005106<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005107<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5108
5109Examples matches the if statement
5110 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5111 if (false) true; else false;
5112</pre></td></tr>
5113
5114
Aaron Ballman672dde22016-01-22 23:15:00 +00005115<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 +00005116<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5117matcher.
5118
5119FIXME: Unit test this matcher
5120</pre></td></tr>
5121
5122
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005123<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>
5124<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5125(if expression have it).
5126</pre></td></tr>
5127
5128
Manuel Klimeka37e1102016-12-01 15:45:06 +00005129<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 +00005130<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5131matches the given matcher.
5132
5133The associated declaration is:
5134- for type nodes, the declaration of the underlying type
5135- for CallExpr, the declaration of the callee
5136- for MemberExpr, the declaration of the referenced member
5137- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005138- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005139
5140Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5141function. e.g. various subtypes of clang::Type and various expressions.
5142
Manuel Klimeka37e1102016-12-01 15:45:06 +00005143Usable 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;,
5144 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;,
5145 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;,
5146 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;,
5147 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;,
5148 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;,
5149 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5150</pre></td></tr>
5151
5152
5153<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>
5154<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5155matches the given matcher.
5156
5157The associated declaration is:
5158- for type nodes, the declaration of the underlying type
5159- for CallExpr, the declaration of the callee
5160- for MemberExpr, the declaration of the referenced member
5161- for CXXConstructExpr, the declaration of the constructor
5162- for CXXNewExpr, the declaration of the operator new
5163
5164Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5165function. e.g. various subtypes of clang::Type and various expressions.
5166
5167Usable 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;,
5168 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;,
5169 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;,
5170 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;,
5171 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;,
5172 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;,
5173 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005174</pre></td></tr>
5175
5176
Aaron Ballman672dde22016-01-22 23:15:00 +00005177<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 +00005178<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5179matches the given matcher.
5180
5181The associated declaration is:
5182- for type nodes, the declaration of the underlying type
5183- for CallExpr, the declaration of the callee
5184- for MemberExpr, the declaration of the referenced member
5185- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005186- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005187
5188Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5189function. e.g. various subtypes of clang::Type and various expressions.
5190
Manuel Klimeka37e1102016-12-01 15:45:06 +00005191Usable 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;,
5192 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;,
5193 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;,
5194 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;,
5195 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;,
5196 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;,
5197 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005198</pre></td></tr>
5199
5200
Aaron Ballman672dde22016-01-22 23:15:00 +00005201<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005202<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5203matched by a given matcher.
5204
5205Given
5206 struct X { int m; };
5207 void f(X x) { x.m; m; }
5208memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5209 matches "x.m" and "m"
5210with hasObjectExpression(...)
5211 matching "x" and the implicit object expression of "m" which has type X*.
5212</pre></td></tr>
5213
5214
Aaron Ballman672dde22016-01-22 23:15:00 +00005215<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 +00005216<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5217given matcher.
5218
5219Given
5220 struct { int first, second; } first, second;
5221 int i(second.first);
5222 int j(first.second);
5223memberExpr(member(hasName("first")))
5224 matches second.first
5225 but not first.second (because the member name there is "second").
5226</pre></td></tr>
5227
5228
Aaron Ballman672dde22016-01-22 23:15:00 +00005229<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 +00005230<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5231pointee matches a given matcher.
5232
5233Given
5234 int *a;
5235 int const *b;
5236 float const *f;
5237pointerType(pointee(isConstQualified(), isInteger()))
5238 matches "int const *b"
5239
Aaron Ballman672dde22016-01-22 23:15:00 +00005240Usable 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;,
5241 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 +00005242</pre></td></tr>
5243
5244
Aaron Ballman672dde22016-01-22 23:15:00 +00005245<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005246<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5247pointee matches a given matcher.
5248
5249Given
5250 int *a;
5251 int const *b;
5252 float const *f;
5253pointerType(pointee(isConstQualified(), isInteger()))
5254 matches "int const *b"
5255
Aaron Ballman672dde22016-01-22 23:15:00 +00005256Usable 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;,
5257 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 +00005258</pre></td></tr>
5259
5260
Martin Bohme8cef2c22016-08-09 15:07:52 +00005261<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>
5262<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5263matcher.
5264
5265Given
5266 namespace N { template&lt;class T&gt; void f(T t); }
5267 template &lt;class T&gt; void g() { using N::f; f(T()); }
5268unresolvedLookupExpr(hasAnyDeclaration(
5269 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5270 matches the use of f in g() .
5271</pre></td></tr>
5272
5273
Aaron Ballman672dde22016-01-22 23:15:00 +00005274<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 +00005275<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5276
5277Given
5278 struct A { struct B { struct C {}; }; };
5279 A::B::C c;
5280nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5281 matches "A::"
5282</pre></td></tr>
5283
5284
Aaron Ballman672dde22016-01-22 23:15:00 +00005285<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005286<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5287given TypeLoc.
5288
5289Given
5290 struct A { struct B { struct C {}; }; };
5291 A::B::C c;
5292nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5293 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5294 matches "A::"
5295</pre></td></tr>
5296
5297
Aaron Ballman672dde22016-01-22 23:15:00 +00005298<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 +00005299<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5300
5301Given
5302 struct A { struct B { struct C {}; }; };
5303 A::B::C c;
5304nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5305 matches "A::"
5306</pre></td></tr>
5307
5308
Aaron Ballman672dde22016-01-22 23:15:00 +00005309<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 +00005310<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5311given namespace matcher.
5312
5313Given
5314 namespace ns { struct A {}; }
5315 ns::A a;
5316nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5317 matches "ns::"
5318</pre></td></tr>
5319
5320
Aaron Ballman672dde22016-01-22 23:15:00 +00005321<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 +00005322<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5323given QualType matcher without qualifiers.
5324
5325Given
5326 struct A { struct B { struct C {}; }; };
5327 A::B::C c;
5328nestedNameSpecifier(specifiesType(
5329 hasDeclaration(cxxRecordDecl(hasName("A")))
5330))
5331 matches "A::"
5332</pre></td></tr>
5333
5334
Aaron Ballman672dde22016-01-22 23:15:00 +00005335<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005336<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5337call expression.
5338
5339Example matches y in x(y)
5340 (matcher = callExpr(hasArgument(0, declRefExpr())))
5341 void x(int) { int y; x(y); }
5342</pre></td></tr>
5343
5344
Aaron Ballman672dde22016-01-22 23:15:00 +00005345<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 +00005346<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5347
5348Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005349matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005350matches the [webView ...] message invocation.
5351 NSString *webViewJavaScript = ...
5352 UIWebView *webView = ...
5353 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5354</pre></td></tr>
5355
5356
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005357<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>
5358<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5359
5360
Martin Bohme8cef2c22016-08-09 15:07:52 +00005361<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>
5362<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5363overloads matches the given matcher.
5364
5365Given
5366 template &lt;typename T&gt; void foo(T);
5367 template &lt;typename T&gt; void bar(T);
5368 template &lt;typename T&gt; void baz(T t) {
5369 foo(t);
5370 bar(t);
5371 }
5372unresolvedLookupExpr(hasAnyDeclaration(
5373 functionTemplateDecl(hasName("foo"))))
5374 matches foo in foo(t); but not bar in bar(t);
5375</pre></td></tr>
5376
5377
Aaron Ballman672dde22016-01-22 23:15:00 +00005378<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 +00005379<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5380
5381Given
5382 int (*ptr_to_array)[4];
5383 int (*ptr_to_func)(int);
5384
5385varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5386ptr_to_func but not ptr_to_array.
5387
Aaron Ballman672dde22016-01-22 23:15:00 +00005388Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005389</pre></td></tr>
5390
5391
Aaron Ballman672dde22016-01-22 23:15:00 +00005392<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 +00005393<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5394pointee matches a given matcher.
5395
5396Given
5397 int *a;
5398 int const *b;
5399 float const *f;
5400pointerType(pointee(isConstQualified(), isInteger()))
5401 matches "int const *b"
5402
Aaron Ballman672dde22016-01-22 23:15:00 +00005403Usable 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;,
5404 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 +00005405</pre></td></tr>
5406
5407
Aaron Ballman672dde22016-01-22 23:15:00 +00005408<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 +00005409<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5410pointee matches a given matcher.
5411
5412Given
5413 int *a;
5414 int const *b;
5415 float const *f;
5416pointerType(pointee(isConstQualified(), isInteger()))
5417 matches "int const *b"
5418
Aaron Ballman672dde22016-01-22 23:15:00 +00005419Usable 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;,
5420 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 +00005421</pre></td></tr>
5422
5423
Aaron Ballman672dde22016-01-22 23:15:00 +00005424<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 +00005425<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5426
5427Given:
5428 typedef int &amp;int_ref;
5429 int a;
5430 int_ref b = a;
5431
5432varDecl(hasType(qualType(referenceType()))))) will not match the
5433declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5434</pre></td></tr>
5435
5436
Aaron Ballman672dde22016-01-22 23:15:00 +00005437<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 +00005438<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5439matches the given matcher.
5440
5441The associated declaration is:
5442- for type nodes, the declaration of the underlying type
5443- for CallExpr, the declaration of the callee
5444- for MemberExpr, the declaration of the referenced member
5445- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005446- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005447
5448Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5449function. e.g. various subtypes of clang::Type and various expressions.
5450
Manuel Klimeka37e1102016-12-01 15:45:06 +00005451Usable 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;,
5452 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;,
5453 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;,
5454 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;,
5455 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;,
5456 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;,
5457 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005458</pre></td></tr>
5459
5460
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005461<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>
5462<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5463
5464Given
5465 void (*fp)(void);
5466The matcher
5467 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5468would match the declaration for fp.
5469</pre></td></tr>
5470
5471
Aaron Ballman672dde22016-01-22 23:15:00 +00005472<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 +00005473<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5474</pre></td></tr>
5475
5476
Aaron Ballman672dde22016-01-22 23:15:00 +00005477<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 +00005478<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5479matches the specified matcher.
5480
5481Example matches y-&gt;x()
5482 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5483 cxxRecordDecl(hasName("Y")))))))
5484 class Y { public: void x(); };
5485 void z() { Y *y; y-&gt;x(); }
5486</pre></td></tr>
5487
5488
Aaron Ballman672dde22016-01-22 23:15:00 +00005489<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 +00005490<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5491</pre></td></tr>
5492
5493
Aaron Ballman672dde22016-01-22 23:15:00 +00005494<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005495<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5496type matches the specified matcher.
5497
5498Example matches X &amp;x and const X &amp;y
5499 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5500 class X {
5501 void a(X b) {
5502 X &amp;x = b;
5503 const X &amp;y = b;
5504 }
5505 };
5506</pre></td></tr>
5507
5508
Aaron Ballman672dde22016-01-22 23:15:00 +00005509<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 +00005510<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5511matches the given matcher.
5512
5513The associated declaration is:
5514- for type nodes, the declaration of the underlying type
5515- for CallExpr, the declaration of the callee
5516- for MemberExpr, the declaration of the referenced member
5517- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005518- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005519
5520Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5521function. e.g. various subtypes of clang::Type and various expressions.
5522
Manuel Klimeka37e1102016-12-01 15:45:06 +00005523Usable 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;,
5524 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;,
5525 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;,
5526 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;,
5527 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;,
5528 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;,
5529 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005530</pre></td></tr>
5531
5532
Aaron Ballman672dde22016-01-22 23:15:00 +00005533<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 +00005534<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5535pointee matches a given matcher.
5536
5537Given
5538 int *a;
5539 int const *b;
5540 float const *f;
5541pointerType(pointee(isConstQualified(), isInteger()))
5542 matches "int const *b"
5543
Aaron Ballman672dde22016-01-22 23:15:00 +00005544Usable 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;,
5545 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 +00005546</pre></td></tr>
5547
5548
Aaron Ballman672dde22016-01-22 23:15:00 +00005549<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 +00005550<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5551pointee matches a given matcher.
5552
5553Given
5554 int *a;
5555 int const *b;
5556 float const *f;
5557pointerType(pointee(isConstQualified(), isInteger()))
5558 matches "int const *b"
5559
Aaron Ballman672dde22016-01-22 23:15:00 +00005560Usable 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;,
5561 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 +00005562</pre></td></tr>
5563
5564
Alexander Kornienko976921d2016-03-22 11:03:03 +00005565<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>
5566<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5567
5568Given
5569 return a + b;
5570hasReturnValue(binaryOperator())
5571 matches 'return a + b'
5572with binaryOperator()
5573 matching 'a + b'
5574</pre></td></tr>
5575
5576
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005577<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>
5578<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5579a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5580
5581Given
5582 { {}; 1+2; }
5583hasAnySubstatement(compoundStmt())
5584 matches '{ {}; 1+2; }'
5585with compoundStmt()
5586 matching '{}'
5587</pre></td></tr>
5588
5589
Aaron Ballman672dde22016-01-22 23:15:00 +00005590<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 +00005591<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5592alignof.
5593</pre></td></tr>
5594
5595
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005596<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 +00005597<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 +00005598
5599Given:
5600F&amp; operator=(const F&amp; o) {
5601 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5602 return *this;
5603}
5604returnStmt(forFunction(hasName("operator=")))
5605 matches 'return *this'
5606 but does match 'return &gt; 0'
5607</pre></td></tr>
5608
5609
Aaron Ballman672dde22016-01-22 23:15:00 +00005610<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 +00005611<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5612sizeof.
5613</pre></td></tr>
5614
5615
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005616<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>
5617<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5618type that matches the provided matcher.
5619
5620Given
5621 template &lt;typename T&gt;
5622 double F(T t);
5623 int i;
5624 double j = F(i);
5625
5626substTemplateTypeParmType(hasReplacementType(type())) matches int
5627</pre></td></tr>
5628
5629
Aaron Ballman672dde22016-01-22 23:15:00 +00005630<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005631<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5632statement. This matcher may produce multiple matches.
5633
5634Given
5635 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5636switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5637 matches four times, with "c" binding each of "case 1:", "case 2:",
5638"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5639"switch (1)", "switch (2)" and "switch (2)".
5640</pre></td></tr>
5641
5642
Etienne Bergeron5500f952016-05-30 15:25:25 +00005643<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>
5644<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5645switch statement or conditional operator.
5646
5647Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5648 if (true) {}
5649</pre></td></tr>
5650
5651
Aaron Ballman672dde22016-01-22 23:15:00 +00005652<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005653<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5654matches the given matcher.
5655
5656The associated declaration is:
5657- for type nodes, the declaration of the underlying type
5658- for CallExpr, the declaration of the callee
5659- for MemberExpr, the declaration of the referenced member
5660- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005661- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005662
5663Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5664function. e.g. various subtypes of clang::Type and various expressions.
5665
Manuel Klimeka37e1102016-12-01 15:45:06 +00005666Usable 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;,
5667 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;,
5668 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;,
5669 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;,
5670 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;,
5671 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;,
5672 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005673</pre></td></tr>
5674
5675
Aaron Ballman672dde22016-01-22 23:15:00 +00005676<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005677<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5678
5679Given
5680 template&lt;typename T&gt; struct A {};
5681 struct B { B* next; };
5682 A&lt;&amp;B::next&gt; a;
5683templateSpecializationType(hasAnyTemplateArgument(
5684 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5685 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5686 B::next
5687</pre></td></tr>
5688
5689
Aaron Ballman672dde22016-01-22 23:15:00 +00005690<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 +00005691<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5692declaration.
5693
5694Given
5695 template&lt;typename T&gt; struct A {};
5696 struct B { B* next; };
5697 A&lt;&amp;B::next&gt; a;
5698classTemplateSpecializationDecl(hasAnyTemplateArgument(
5699 refersToDeclaration(fieldDecl(hasName("next"))))
5700 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5701 B::next
5702</pre></td></tr>
5703
5704
Aaron Ballman672dde22016-01-22 23:15:00 +00005705<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 +00005706<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5707
5708Given
5709 template&lt;int T&gt; struct A {};
5710 C&lt;42&gt; c;
5711classTemplateSpecializationDecl(
5712 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5713 matches the implicit instantiation of C in C&lt;42&gt;.
5714</pre></td></tr>
5715
5716
Haojian Wub33b02e2016-07-29 15:45:11 +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('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>
5718<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5719
5720Given
5721 template&lt;template &lt;typename&gt; class S&gt; class X {};
5722 template&lt;typename T&gt; class Y {};"
5723 X&lt;Y&gt; xi;
5724classTemplateSpecializationDecl(hasAnyTemplateArgument(
5725 refersToTemplate(templateName())))
5726 matches the specialization X&lt;Y&gt;
5727</pre></td></tr>
5728
5729
Aaron Ballman672dde22016-01-22 23:15:00 +00005730<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 +00005731<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5732
5733Given
5734 struct X {};
5735 template&lt;typename T&gt; struct A {};
5736 A&lt;X&gt; a;
5737classTemplateSpecializationDecl(hasAnyTemplateArgument(
5738 refersToType(class(hasName("X")))))
5739 matches the specialization A&lt;X&gt;
5740</pre></td></tr>
5741
5742
Aaron Ballman672dde22016-01-22 23:15:00 +00005743<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 +00005744<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5745functionDecl that have at least one TemplateArgument matching the given
5746InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005747
5748Given
5749 template&lt;typename T&gt; class A {};
5750 template&lt;&gt; class A&lt;double&gt; {};
5751 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005752
Haojian Wu99e39a72016-07-29 17:30:13 +00005753 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005754 void func() { f&lt;int&gt;(); };
5755
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005756classTemplateSpecializationDecl(hasAnyTemplateArgument(
5757 refersToType(asString("int"))))
5758 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005759
5760functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5761 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005762</pre></td></tr>
5763
5764
Aaron Ballman672dde22016-01-22 23:15:00 +00005765<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 +00005766<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5767matches the given matcher.
5768
5769The associated declaration is:
5770- for type nodes, the declaration of the underlying type
5771- for CallExpr, the declaration of the callee
5772- for MemberExpr, the declaration of the referenced member
5773- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005774- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005775
5776Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5777function. e.g. various subtypes of clang::Type and various expressions.
5778
Manuel Klimeka37e1102016-12-01 15:45:06 +00005779Usable 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;,
5780 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;,
5781 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;,
5782 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;,
5783 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;,
5784 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;,
5785 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005786</pre></td></tr>
5787
5788
Aaron Ballman672dde22016-01-22 23:15:00 +00005789<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 +00005790<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5791functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005792
5793Given
5794 template&lt;typename T, typename U&gt; class A {};
5795 A&lt;bool, int&gt; b;
5796 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005797
Haojian Wu99e39a72016-07-29 17:30:13 +00005798 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005799 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005800classTemplateSpecializationDecl(hasTemplateArgument(
5801 1, refersToType(asString("int"))))
5802 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005803
5804functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5805 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005806</pre></td></tr>
5807
5808
Aaron Ballman672dde22016-01-22 23:15:00 +00005809<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 +00005810<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5811matches the given matcher.
5812
5813The associated declaration is:
5814- for type nodes, the declaration of the underlying type
5815- for CallExpr, the declaration of the callee
5816- for MemberExpr, the declaration of the referenced member
5817- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005818- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005819
5820Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5821function. e.g. various subtypes of clang::Type and various expressions.
5822
Manuel Klimeka37e1102016-12-01 15:45:06 +00005823Usable 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;,
5824 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;,
5825 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;,
5826 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;,
5827 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;,
5828 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;,
5829 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005830</pre></td></tr>
5831
5832
5833<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>
5834<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5835
5836Generates results for each match.
5837
5838For example, in:
5839 class A { class B {}; class C {}; };
5840The matcher:
5841 cxxRecordDecl(hasName("::A"),
5842 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5843will generate results for A, B and C.
5844
5845Usable as: Any Matcher
5846</pre></td></tr>
5847
5848
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005849<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 +00005850<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5851matcher.
5852
5853Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5854 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5855 and U (matcher = typedefDecl(hasType(asString("int")))
5856 class X {};
5857 void y(X &amp;x) { x; X z; }
5858 typedef int U;
5859</pre></td></tr>
5860
5861
Aaron Ballman672dde22016-01-22 23:15:00 +00005862<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 +00005863<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5864matches the given matcher.
5865
5866The associated declaration is:
5867- for type nodes, the declaration of the underlying type
5868- for CallExpr, the declaration of the callee
5869- for MemberExpr, the declaration of the referenced member
5870- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005871- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005872
5873Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5874function. e.g. various subtypes of clang::Type and various expressions.
5875
Manuel Klimeka37e1102016-12-01 15:45:06 +00005876Usable 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;,
5877 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;,
5878 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;,
5879 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;,
5880 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;,
5881 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;,
5882 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5883</pre></td></tr>
5884
5885
5886<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>
5887<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5888type of the matched node.
5889
5890For example, in:
5891 class A {};
5892 using B = A;
5893The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5894both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005895</pre></td></tr>
5896
5897
Aaron Ballman672dde22016-01-22 23:15:00 +00005898<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 +00005899<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5900
5901Given
5902 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5903unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5904 matches sizeof(a) and alignof(c)
5905</pre></td></tr>
5906
5907
Aaron Ballman672dde22016-01-22 23:15:00 +00005908<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 +00005909<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5910
5911Example matches true (matcher = hasUnaryOperand(
5912 cxxBoolLiteral(equals(true))))
5913 !true
5914</pre></td></tr>
5915
5916
Aaron Ballman672dde22016-01-22 23:15:00 +00005917<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 +00005918<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5919matches the given matcher.
5920
5921The associated declaration is:
5922- for type nodes, the declaration of the underlying type
5923- for CallExpr, the declaration of the callee
5924- for MemberExpr, the declaration of the referenced member
5925- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005926- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005927
5928Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5929function. e.g. various subtypes of clang::Type and various expressions.
5930
Manuel Klimeka37e1102016-12-01 15:45:06 +00005931Usable 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;,
5932 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;,
5933 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;,
5934 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;,
5935 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;,
5936 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;,
5937 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005938</pre></td></tr>
5939
5940
Aaron Ballman672dde22016-01-22 23:15:00 +00005941<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 +00005942<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5943
5944Given
5945 namespace X { void b(); }
5946 using X::b;
5947usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5948 matches using X::b </pre></td></tr>
5949
5950
Aaron Ballman672dde22016-01-22 23:15:00 +00005951<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 +00005952<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5953matched by the given matcher.
5954
5955Given
5956 namespace X { int a; void b(); }
5957 using X::a;
5958 using X::b;
5959usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5960 matches using X::b but not using X::a </pre></td></tr>
5961
5962
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005963<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>
5964<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 +00005965declaration's type.
5966
5967In case of a value declaration (for example a variable declaration),
5968this resolves one layer of indirection. For example, in the value
5969declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5970X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5971declaration of x.
5972
5973Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5974 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5975 class X {};
5976 void y(X &amp;x) { x; X z; }
5977
Aaron Ballman672dde22016-01-22 23:15:00 +00005978Usable 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 +00005979</pre></td></tr>
5980
5981
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005982<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>
5983<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 +00005984matcher.
5985
5986Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5987 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005988 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005989 class X {};
5990 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005991 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005992</pre></td></tr>
5993
5994
Aaron Ballman672dde22016-01-22 23:15:00 +00005995<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 +00005996<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
5997that matches the given matcher.
5998
5999Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6000 bool y() { return true; }
6001 bool x = y();
6002</pre></td></tr>
6003
6004
Aaron Ballman672dde22016-01-22 23:15:00 +00006005<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 +00006006<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6007expression.
6008
6009Given
6010 void f(int b) {
6011 int a[b];
6012 }
6013variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6014 varDecl(hasName("b")))))))
6015 matches "int a[b]"
6016</pre></td></tr>
6017
6018
Aaron Ballman672dde22016-01-22 23:15:00 +00006019<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 +00006020<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6021definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006022
6023Given
6024 for (;;) {}
6025hasBody(compoundStmt())
6026 matches 'for (;;) {}'
6027with compoundStmt()
6028 matching '{}'
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_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 +00006033<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 +00006034switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006035
6036Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6037 if (true) {}
6038</pre></td></tr>
6039
6040
Aaron Ballman672dde22016-01-22 23:15:00 +00006041<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 +00006042<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6043NestedNameSpecifier-matcher matches.
6044</pre></td></tr>
6045
6046
Aaron Ballman672dde22016-01-22 23:15:00 +00006047<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 +00006048<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6049QualType-matcher matches.
6050</pre></td></tr>
6051
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006052<!--END_TRAVERSAL_MATCHERS -->
6053</table>
6054
6055</div>
6056</body>
6057</html>
6058
6059