blob: a807672121b2406e871875de28f22382f8c42cfc [file] [log] [blame]
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10 padding: .33em;
11}
12td.doc {
13 display: none;
14 border-bottom: 1px solid black;
15}
16td.name:hover {
17 color: blue;
18 cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23 if (!id) return;
24 row = document.getElementById(id);
25 if (row.style.display != 'table-cell')
26 row.style.display = 'table-cell';
27 else
28 row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66 ifStmt(hasTrueExpression(
67 expr(hasDescendant(
68 ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000101<!-- START_DECL_MATCHERS -->
102
Aaron Ballman672dde22016-01-22 23:15:00 +0000103<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107 class C {
108 C() : i(42) {}
109 int i;
110 };
111</pre></td></tr>
112
113
Aaron Ballman672dde22016-01-22 23:15:00 +0000114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118 class C {
119 public:
120 int a;
121 };
122accessSpecDecl()
123 matches 'public:'
124</pre></td></tr>
125
126
Aaron Ballman672dde22016-01-22 23:15:00 +0000127<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000128<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
129
130Example matches Z
131 template&lt;class T&gt; class Z {};
132</pre></td></tr>
133
134
Aaron Ballman672dde22016-01-22 23:15:00 +0000135<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000136<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
137
138Given
139 template&lt;typename T&gt; class A {};
140 template&lt;&gt; class A&lt;double&gt; {};
141 A&lt;int&gt; a;
142classTemplateSpecializationDecl()
143 matches the specializations A&lt;int&gt; and A&lt;double&gt;
144</pre></td></tr>
145
146
Aaron Ballman672dde22016-01-22 23:15:00 +0000147<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000148<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
149
150Example matches Foo::Foo() and Foo::Foo(int)
151 class Foo {
152 public:
153 Foo();
154 Foo(int);
155 int DoSomething();
156 };
157</pre></td></tr>
158
159
Aaron Ballman672dde22016-01-22 23:15:00 +0000160<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000161<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
162
163Example matches the operator.
164 class X { operator int() const; };
165</pre></td></tr>
166
167
Aaron Ballman672dde22016-01-22 23:15:00 +0000168<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000169<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
170
171Example matches Foo::~Foo()
172 class Foo {
173 public:
174 virtual ~Foo();
175 };
176</pre></td></tr>
177
178
Aaron Ballman672dde22016-01-22 23:15:00 +0000179<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000180<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
181
182Example matches y
183 class X { void y(); };
184</pre></td></tr>
185
186
Aaron Ballman672dde22016-01-22 23:15:00 +0000187<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000188<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
189
190Example matches X, Z
191 class X;
192 template&lt;class T&gt; class Z {};
193</pre></td></tr>
194
195
Aaron Ballman672dde22016-01-22 23:15:00 +0000196<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000197<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
198
199Examples matches X, C, and the friend declaration inside C;
200 void X();
201 class C {
202 friend X;
203 };
204</pre></td></tr>
205
206
Aaron Ballman672dde22016-01-22 23:15:00 +0000207<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000208<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
209and non-type template parameter declarations).
210
211Given
212 class X { int y; };
213declaratorDecl()
214 matches int y.
215</pre></td></tr>
216
217
Aaron Ballman672dde22016-01-22 23:15:00 +0000218<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000219<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
220
221Example matches A, B, C
222 enum X {
223 A, B, C
224 };
225</pre></td></tr>
226
227
Aaron Ballman672dde22016-01-22 23:15:00 +0000228<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000229<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
230
231Example matches X
232 enum X {
233 A, B, C
234 };
235</pre></td></tr>
236
237
Aaron Ballman672dde22016-01-22 23:15:00 +0000238<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000239<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
240
241Given
242 class X { int m; };
243fieldDecl()
244 matches 'm'.
245</pre></td></tr>
246
247
Aaron Ballman672dde22016-01-22 23:15:00 +0000248<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000249<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
250
251Given
252 class X { friend void foo(); };
253friendDecl()
254 matches 'friend void foo()'.
255</pre></td></tr>
256
257
Aaron Ballman672dde22016-01-22 23:15:00 +0000258<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000259<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
260
261Example matches f
262 void f();
263</pre></td></tr>
264
265
Aaron Ballman672dde22016-01-22 23:15:00 +0000266<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000267<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
268
269Example matches f
270 template&lt;class T&gt; void f(T t) {}
271</pre></td></tr>
272
273
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000274<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
275<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
276
277Given
278 goto FOO;
279 FOO: bar();
280labelDecl()
281 matches 'FOO:'
282</pre></td></tr>
283
284
Aaron Ballman672dde22016-01-22 23:15:00 +0000285<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000286<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
287
288Given
289 extern "C" {}
290linkageSpecDecl()
291 matches "extern "C" {}"
292</pre></td></tr>
293
294
Aaron Ballman672dde22016-01-22 23:15:00 +0000295<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000296<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
297
298Example matches X, S, the anonymous union type, i, and U;
299 typedef int X;
300 struct S {
301 union {
302 int i;
303 } U;
304 };
305</pre></td></tr>
306
307
Aaron Ballman672dde22016-01-22 23:15:00 +0000308<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000309<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
310
311Given
312 namespace test {}
313 namespace alias = ::test;
314namespaceAliasDecl()
315 matches "namespace alias" but not "namespace test"
316</pre></td></tr>
317
318
Aaron Ballman672dde22016-01-22 23:15:00 +0000319<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000320<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
321
322Given
323 namespace {}
324 namespace test {}
325namespaceDecl()
326 matches "namespace {}" and "namespace test {}"
327</pre></td></tr>
328
329
Aaron Ballman672dde22016-01-22 23:15:00 +0000330<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000331<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
332
333Given
334 template &lt;typename T, int N&gt; struct C {};
335nonTypeTemplateParmDecl()
336 matches 'N', but not 'T'.
337</pre></td></tr>
338
339
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000340<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
341<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
342
343Example matches Foo (Additions)
344 @interface Foo (Additions)
345 @end
346</pre></td></tr>
347
348
Dave Lee55540a02017-10-26 15:53:37 +0000349<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
350<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
351
352Example matches Foo (Additions)
353 @implementation Foo (Additions)
354 @end
355</pre></td></tr>
356
357
Dave Leee6d362c2017-09-10 21:00:15 +0000358<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
359<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
360
361Example matches Foo
362 @implementation Foo
363 @end
364</pre></td></tr>
365
366
Aaron Ballman672dde22016-01-22 23:15:00 +0000367<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000368<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
369
370Example matches Foo
371 @interface Foo
372 @end
373</pre></td></tr>
374
375
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000376<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
377<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
378
379Example matches _enabled
380 @implementation Foo {
381 BOOL _enabled;
382 }
383 @end
384</pre></td></tr>
385
386
387<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
388<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
389
390Example matches both declaration and definition of -[Foo method]
391 @interface Foo
392 - (void)method;
393 @end
394
395 @implementation Foo
396 - (void)method {}
397 @end
398</pre></td></tr>
399
400
401<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
402<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
403
404Example matches enabled
405 @interface Foo
406 @property BOOL enabled;
407 @end
408</pre></td></tr>
409
410
411<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
412<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
413
414Example matches FooDelegate
415 @protocol FooDelegate
416 @end
417</pre></td></tr>
418
419
Aaron Ballman672dde22016-01-22 23:15:00 +0000420<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000421<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
422
423Given
424 void f(int x);
425parmVarDecl()
426 matches int x.
427</pre></td></tr>
428
429
Aaron Ballman672dde22016-01-22 23:15:00 +0000430<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000431<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
432
433Example matches X, Z, U, and S
434 class X;
435 template&lt;class T&gt; class Z {};
436 struct S {};
437 union U {};
438</pre></td></tr>
439
440
Aaron Ballman672dde22016-01-22 23:15:00 +0000441<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000442<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
443
444Example:
445 staticAssertExpr()
446matches
447 static_assert(sizeof(S) == sizeof(int))
448in
449 struct S {
450 int x;
451 };
452 static_assert(sizeof(S) == sizeof(int));
453</pre></td></tr>
454
455
Aaron Ballman672dde22016-01-22 23:15:00 +0000456<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000457<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
458
459Given
460 template &lt;typename T, int N&gt; struct C {};
461templateTypeParmDecl()
462 matches 'T', but not 'N'.
463</pre></td></tr>
464
465
Aaron Ballman672dde22016-01-22 23:15:00 +0000466<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000467<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
468
469Given
470 int X;
471 namespace NS {
472 int Y;
473 } namespace NS
474decl(hasDeclContext(translationUnitDecl()))
475 matches "int X", but not "int Y".
476</pre></td></tr>
477
478
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000479<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
480<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
481
482Given
483 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000484 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000485typeAliasDecl()
486 matches "using Y = int", but not "typedef int X"
487</pre></td></tr>
488
489
Eric Liu285f8042017-03-28 12:56:47 +0000490<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
491<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
492
493typeAliasTemplateDecl() matches
494 template &lt;typename T&gt;
495 using Y = X&lt;T&gt;;
496</pre></td></tr>
497
498
Aaron Ballman672dde22016-01-22 23:15:00 +0000499<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000500<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
501
502Given
503 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000504 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000505typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000506 matches "typedef int X", but not "using Y = int"
507</pre></td></tr>
508
509
510<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
511<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
512
513Given
514 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000515 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000516typedefNameDecl()
517 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000518</pre></td></tr>
519
520
Aaron Ballman672dde22016-01-22 23:15:00 +0000521<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000522<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
523typename.
524
525Given
526 template &lt;typename T&gt;
527 struct Base { typedef T Foo; };
528
529 template&lt;typename T&gt;
530 struct S : private Base&lt;T&gt; {
531 using typename Base&lt;T&gt;::Foo;
532 };
533unresolvedUsingTypenameDecl()
534 matches using Base&lt;T&gt;::Foo </pre></td></tr>
535
536
Aaron Ballman672dde22016-01-22 23:15:00 +0000537<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000538<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
539
540Given
541 template&lt;typename X&gt;
542 class C : private X {
543 using X::x;
544 };
545unresolvedUsingValueDecl()
546 matches using X::x </pre></td></tr>
547
548
Aaron Ballman672dde22016-01-22 23:15:00 +0000549<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000550<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
551
552Given
553 namespace X { int x; }
554 using X::x;
555usingDecl()
556 matches using X::x </pre></td></tr>
557
558
Aaron Ballman672dde22016-01-22 23:15:00 +0000559<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000560<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
561
562Given
563 namespace X { int x; }
564 using namespace X;
565usingDirectiveDecl()
566 matches using namespace X </pre></td></tr>
567
568
Aaron Ballman672dde22016-01-22 23:15:00 +0000569<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000570<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
571
572Example matches A, B, C and F
573 enum X { A, B, C };
574 void F();
575</pre></td></tr>
576
577
Aaron Ballman672dde22016-01-22 23:15:00 +0000578<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000579<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
580
581Note: this does not match declarations of member variables, which are
582"field" declarations in Clang parlance.
583
584Example matches a
585 int a;
586</pre></td></tr>
587
588
Aaron Ballman672dde22016-01-22 23:15:00 +0000589<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000590<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
591</pre></td></tr>
592
593
Aaron Ballman672dde22016-01-22 23:15:00 +0000594<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000595<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
596
597Given
598 namespace ns {
599 struct A { static void f(); };
600 void A::f() {}
601 void g() { A::f(); }
602 }
603 ns::A a;
604nestedNameSpecifier()
605 matches "ns::" and both "A::"
606</pre></td></tr>
607
608
Aaron Ballman672dde22016-01-22 23:15:00 +0000609<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000610<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
611</pre></td></tr>
612
613
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000614<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
615<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
616
617Given
618 FOO: bar();
619 void *ptr = &amp;&amp;FOO;
620 goto *bar;
621addrLabelExpr()
622 matches '&amp;&amp;FOO'
623</pre></td></tr>
624
625
Aaron Ballman672dde22016-01-22 23:15:00 +0000626<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000627<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
628
629Given
630 int i = a[1];
631arraySubscriptExpr()
632 matches "a[1]"
633</pre></td></tr>
634
635
Aaron Ballman672dde22016-01-22 23:15:00 +0000636<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000637<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
638
639 int i = 100;
640 __asm("mov al, 2");
641asmStmt()
642 matches '__asm("mov al, 2")'
643</pre></td></tr>
644
645
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000646<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
647<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
648Example matches __atomic_load_n(ptr, 1)
649 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
650</pre></td></tr>
651
652
653<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
654<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
655
656Example matches a ?: b
657 (a ?: b) + 42;
658</pre></td></tr>
659
660
Aaron Ballman672dde22016-01-22 23:15:00 +0000661<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000662<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
663
664Example matches a || b
665 !(a || b)
666</pre></td></tr>
667
668
Aaron Ballman672dde22016-01-22 23:15:00 +0000669<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000670<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
671
672Given
673 while (true) { break; }
674breakStmt()
675 matches 'break'
676</pre></td></tr>
677
678
Aaron Ballman672dde22016-01-22 23:15:00 +0000679<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000680<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
681
Artem Dergachevded92a92016-11-11 22:34:53 +0000682Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000683 int i = (int) 2.2f;
684</pre></td></tr>
685
686
Aaron Ballman672dde22016-01-22 23:15:00 +0000687<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000688<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
689
690Example matches x.y() and y()
691 X x;
692 x.y();
693 y();
694</pre></td></tr>
695
696
Aaron Ballman672dde22016-01-22 23:15:00 +0000697<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000698<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
699
700Given
701 switch(a) { case 42: break; default: break; }
702caseStmt()
Fangrui Song55942ab2018-01-22 22:34:15 +0000703 matches 'case 42:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000704</pre></td></tr>
705
706
Aaron Ballman672dde22016-01-22 23:15:00 +0000707<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000708<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
709
710Example: castExpr() matches each of the following:
711 (int) 3;
712 const_cast&lt;Expr *&gt;(SubExpr);
713 char c = 0;
714but does not match
715 int i = (0);
716 int k = 0;
717</pre></td></tr>
718
719
Aaron Ballman672dde22016-01-22 23:15:00 +0000720<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000721<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
722
723Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
724though.
725
726Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000727 char ch = 'a';
728 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000729</pre></td></tr>
730
731
Aaron Ballman672dde22016-01-22 23:15:00 +0000732<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000733<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
734
735Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000736 int array[4] = {1};
737 vector int myvec = (vector int)(1, 2);
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000738</pre></td></tr>
739
740
Aaron Ballman672dde22016-01-22 23:15:00 +0000741<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000742<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
743
Fangrui Song55942ab2018-01-22 22:34:15 +0000744Example matches '{}' and '{{}}' in 'for (;;) {{}}'
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000745 for (;;) {{}}
746</pre></td></tr>
747
748
Aaron Ballman672dde22016-01-22 23:15:00 +0000749<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000750<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
751
752Example matches a ? b : c
753 (a ? b : c) + 42
754</pre></td></tr>
755
756
Aaron Ballman672dde22016-01-22 23:15:00 +0000757<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000758<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
759
760Given
761 while (true) { continue; }
762continueStmt()
763 matches 'continue'
764</pre></td></tr>
765
766
Aaron Ballman672dde22016-01-22 23:15:00 +0000767<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000768<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
769
770Example matches,
771 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
772</pre></td></tr>
773
774
Aaron Ballman672dde22016-01-22 23:15:00 +0000775<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000776<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
777
778Example matches FunctionTakesString(GetStringByValue())
779 (matcher = cxxBindTemporaryExpr())
780 FunctionTakesString(GetStringByValue());
781 FunctionTakesStringByPointer(GetStringPointer());
782</pre></td></tr>
783
784
Aaron Ballman672dde22016-01-22 23:15:00 +0000785<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000786<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
787
788Example matches true
789 true
790</pre></td></tr>
791
792
Aaron Ballman672dde22016-01-22 23:15:00 +0000793<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000794<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
795
796 try {} catch(int i) {}
797cxxCatchStmt()
798 matches 'catch(int i)'
799</pre></td></tr>
800
801
Aaron Ballman672dde22016-01-22 23:15:00 +0000802<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000803<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
804
805Example: Matches const_cast&lt;int*&gt;(&amp;r) in
806 int n = 42;
807 const int &amp;r(n);
808 int* p = const_cast&lt;int*&gt;(&amp;r);
809</pre></td></tr>
810
811
Aaron Ballman672dde22016-01-22 23:15:00 +0000812<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000813<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
814
815Example matches string(ptr, n) and ptr within arguments of f
816 (matcher = cxxConstructExpr())
817 void f(const string &amp;a, const string &amp;b);
818 char *ptr;
819 int n;
820 f(string(ptr, n), ptr);
821</pre></td></tr>
822
823
Aaron Ballman672dde22016-01-22 23:15:00 +0000824<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000825<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
826
827Example matches the CXXDefaultArgExpr placeholder inserted for the
828 default value of the second parameter in the call expression f(42)
829 (matcher = cxxDefaultArgExpr())
830 void f(int x, int y = 0);
831 f(42);
832</pre></td></tr>
833
834
Aaron Ballman672dde22016-01-22 23:15:00 +0000835<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000836<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
837
838Given
839 delete X;
840cxxDeleteExpr()
841 matches 'delete X'.
842</pre></td></tr>
843
844
Aaron Ballman672dde22016-01-22 23:15:00 +0000845<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000846<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
847
848Example:
849 cxxDynamicCastExpr()
850matches
851 dynamic_cast&lt;D*&gt;(&amp;b);
852in
853 struct B { virtual ~B() {} }; struct D : B {};
854 B b;
855 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
856</pre></td></tr>
857
858
Aaron Ballman672dde22016-01-22 23:15:00 +0000859<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000860<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
861
862cxxForRangeStmt() matches 'for (auto a : i)'
863 int i[] = {1, 2, 3}; for (auto a : i);
864 for(int j = 0; j &lt; 5; ++j);
865</pre></td></tr>
866
867
Aaron Ballman672dde22016-01-22 23:15:00 +0000868<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000869<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
870
871Example: Matches Foo(bar);
872 Foo f = bar;
873 Foo g = (Foo) bar;
874 Foo h = Foo(bar);
875</pre></td></tr>
876
877
Aaron Ballman672dde22016-01-22 23:15:00 +0000878<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000879<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
880
881Example matches x.y()
882 X x;
883 x.y();
884</pre></td></tr>
885
886
Aaron Ballman672dde22016-01-22 23:15:00 +0000887<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000888<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
889
890Given
891 new X;
892cxxNewExpr()
893 matches 'new X'.
894</pre></td></tr>
895
896
Aaron Ballman672dde22016-01-22 23:15:00 +0000897<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000898<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
899</pre></td></tr>
900
901
Aaron Ballman672dde22016-01-22 23:15:00 +0000902<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000903<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
904
905Note that if an operator isn't overloaded, it won't match. Instead, use
906binaryOperator matcher.
907Currently it does not match operators such as new delete.
908FIXME: figure out why these do not match?
909
910Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
911 (matcher = cxxOperatorCallExpr())
912 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
913 ostream &amp;o; int b = 1, c = 1;
914 o &lt;&lt; b &lt;&lt; c;
915</pre></td></tr>
916
917
Aaron Ballman672dde22016-01-22 23:15:00 +0000918<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000919<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
920
921Either the source expression or the destination type can be matched
922using has(), but hasDestinationType() is more specific and can be
923more readable.
924
925Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
926 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
927</pre></td></tr>
928
929
Aaron Ballman672dde22016-01-22 23:15:00 +0000930<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000931<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
932
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000933See also: hasDestinationType
934See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000935
936Example:
937 cxxStaticCastExpr()
938matches
939 static_cast&lt;long&gt;(8)
940in
941 long eight(static_cast&lt;long&gt;(8));
942</pre></td></tr>
943
944
Jakub Kuderski64b6c782017-05-05 21:01:12 +0000945<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
946<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
947
948Given
949 std::vector&lt;int&gt; a({ 1, 2, 3 });
950 std::vector&lt;int&gt; b = { 4, 5 };
951 int c[] = { 6, 7 };
952 std::pair&lt;int, int&gt; d = { 8, 9 };
953cxxStdInitializerListExpr()
954 matches "{ 1, 2, 3 }" and "{ 4, 5 }"
955</pre></td></tr>
956
957
Aaron Ballman672dde22016-01-22 23:15:00 +0000958<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000959<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
960
961Example: Matches Foo(bar, bar)
962 Foo h = Foo(bar, bar);
963</pre></td></tr>
964
965
Aaron Ballman672dde22016-01-22 23:15:00 +0000966<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000967<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
968
969Example matches the implicit this expression in "return i".
970 (matcher = cxxThisExpr())
971struct foo {
972 int i;
973 int f() { return i; }
974};
975</pre></td></tr>
976
977
Aaron Ballman672dde22016-01-22 23:15:00 +0000978<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000979<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
980
981 try { throw 5; } catch(int i) {}
982cxxThrowExpr()
983 matches 'throw 5'
984</pre></td></tr>
985
986
Aaron Ballman672dde22016-01-22 23:15:00 +0000987<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000988<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
989
990 try {} catch(int i) {}
991cxxTryStmt()
992 matches 'try {}'
993</pre></td></tr>
994
995
Aaron Ballman672dde22016-01-22 23:15:00 +0000996<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000997<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
998
999Example matches T(t) in return statement of f
1000 (matcher = cxxUnresolvedConstructExpr())
1001 template &lt;typename T&gt;
1002 void f(const T&amp; t) { return T(t); }
1003</pre></td></tr>
1004
1005
Aaron Ballman672dde22016-01-22 23:15:00 +00001006<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001007<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1008
1009Example matches x in if (x)
1010 bool x;
1011 if (x) {}
1012</pre></td></tr>
1013
1014
Aaron Ballman672dde22016-01-22 23:15:00 +00001015<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001016<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1017
1018Given
1019 int a;
1020declStmt()
1021 matches 'int a'.
1022</pre></td></tr>
1023
1024
Aaron Ballman672dde22016-01-22 23:15:00 +00001025<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001026<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1027
1028Given
1029 switch(a) { case 42: break; default: break; }
1030defaultStmt()
Fangrui Song55942ab2018-01-22 22:34:15 +00001031 matches 'default:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001032</pre></td></tr>
1033
1034
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001035<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1036<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1037
1038Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1039 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1040</pre></td></tr>
1041
1042
Aaron Ballman672dde22016-01-22 23:15:00 +00001043<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001044<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1045
1046Given
1047 do {} while (true);
1048doStmt()
1049 matches 'do {} while(true)'
1050</pre></td></tr>
1051
1052
Aaron Ballman672dde22016-01-22 23:15:00 +00001053<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001054<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1055
1056Matches any cast expression written in user code, whether it be a
1057C-style cast, a functional-style cast, or a keyword cast.
1058
1059Does not match implicit conversions.
1060
1061Note: the name "explicitCast" is chosen to match Clang's terminology, as
1062Clang uses the term "cast" to apply to implicit conversions as well as to
1063actual cast expressions.
1064
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001065See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001066
1067Example: matches all five of the casts in
1068 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1069but does not match the implicit conversion in
1070 long ell = 42;
1071</pre></td></tr>
1072
1073
Aaron Ballman672dde22016-01-22 23:15:00 +00001074<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001075<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1076
1077Example matches x()
1078 void f() { x(); }
1079</pre></td></tr>
1080
1081
Aaron Ballman672dde22016-01-22 23:15:00 +00001082<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001083<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1084of the sub-expression's evaluation.
1085
1086Example matches std::string()
1087 const std::string str = std::string();
1088</pre></td></tr>
1089
1090
Aaron Ballman672dde22016-01-22 23:15:00 +00001091<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001092<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10931.0, 1.0f, 1.0L and 1e10.
1094
1095Does not match implicit conversions such as
1096 float a = 10;
1097</pre></td></tr>
1098
1099
Aaron Ballman672dde22016-01-22 23:15:00 +00001100<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001101<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1102
1103Example matches 'for (;;) {}'
1104 for (;;) {}
1105 int i[] = {1, 2, 3}; for (auto a : i);
1106</pre></td></tr>
1107
1108
Aaron Ballman672dde22016-01-22 23:15:00 +00001109<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001110<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1111</pre></td></tr>
1112
1113
Aaron Ballman672dde22016-01-22 23:15:00 +00001114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001115<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1116
1117Given
1118 goto FOO;
1119 FOO: bar();
1120gotoStmt()
1121 matches 'goto FOO'
1122</pre></td></tr>
1123
1124
Aaron Ballman672dde22016-01-22 23:15:00 +00001125<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001126<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1127
1128Example matches 'if (x) {}'
1129 if (x) {}
1130</pre></td></tr>
1131
1132
Aaron Ballman672dde22016-01-22 23:15:00 +00001133<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001134<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1135
1136This matches many different places, including function call return value
1137eliding, as well as any type conversions.
1138</pre></td></tr>
1139
1140
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001141<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1142<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1143
1144Given
1145 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1146implicitValueInitExpr()
1147 matches "[0].y" (implicitly)
1148</pre></td></tr>
1149
1150
Aaron Ballman672dde22016-01-22 23:15:00 +00001151<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001152<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1153
1154Given
1155 int a[] = { 1, 2 };
1156 struct B { int x, y; };
1157 B b = { 5, 6 };
1158initListExpr()
1159 matches "{ 1, 2 }" and "{ 5, 6 }"
1160</pre></td></tr>
1161
1162
Aaron Ballman672dde22016-01-22 23:15:00 +00001163<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001164<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11651, 1L, 0x1 and 1U.
1166
1167Does not match character-encoded integers such as L'a'.
1168</pre></td></tr>
1169
1170
Aaron Ballman672dde22016-01-22 23:15:00 +00001171<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001172<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1173
1174Given
1175 goto FOO;
1176 FOO: bar();
1177labelStmt()
1178 matches 'FOO:'
1179</pre></td></tr>
1180
1181
Aaron Ballman672dde22016-01-22 23:15:00 +00001182<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001183<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1184
1185Example matches [&amp;](){return 5;}
1186 [&amp;](){return 5;}
1187</pre></td></tr>
1188
1189
Aaron Ballman672dde22016-01-22 23:15:00 +00001190<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001191<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1192
1193Example: Given
Jakub Kuderski64b6c782017-05-05 21:01:12 +00001194 struct T {void func();};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001195 T f();
1196 void g(T);
1197materializeTemporaryExpr() matches 'f()' in these statements
1198 T u(f());
1199 g(f());
Fangrui Song55942ab2018-01-22 22:34:15 +00001200 f().func();
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001201but does not match
1202 f();
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001203</pre></td></tr>
1204
1205
Aaron Ballman672dde22016-01-22 23:15:00 +00001206<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001207<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1208
1209Given
1210 class Y {
1211 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1212 int a; static int b;
1213 };
1214memberExpr()
1215 matches this-&gt;x, x, y.x, a, this-&gt;b
1216</pre></td></tr>
1217
1218
Aaron Ballman672dde22016-01-22 23:15:00 +00001219<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001220<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1221
1222 foo();;
1223nullStmt()
1224 matches the second ';'
1225</pre></td></tr>
1226
1227
Dave Lee0934fdc2017-11-11 22:46:15 +00001228<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1229<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1230
1231Example matches @catch
1232 @try {}
1233 @catch (...) {}
1234</pre></td></tr>
1235
1236
1237<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1238<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1239
1240Example matches @finally
1241 @try {}
1242 @finally {}
1243</pre></td></tr>
1244
1245
Aaron Ballman672dde22016-01-22 23:15:00 +00001246<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001247<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1248
1249The innermost message send invokes the "alloc" class method on the
1250NSString class, while the outermost message send invokes the
1251"initWithString" instance method on the object returned from
1252NSString's "alloc". This matcher should match both message sends.
1253 [[NSString alloc] initWithString:@"Hello"]
1254</pre></td></tr>
1255
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001256
Dave Lee0934fdc2017-11-11 22:46:15 +00001257<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001258<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
Dave Lee0934fdc2017-11-11 22:46:15 +00001259
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001260Example matches @throw obj;
Dave Lee0934fdc2017-11-11 22:46:15 +00001261</pre></td></tr>
1262
1263
1264<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
1265<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1266
1267Example matches @try
1268 @try {}
1269 @catch (...) {}
1270</pre></td></tr>
1271
1272
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001273<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>
1274<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1275to reference another expressions and can be met
1276in BinaryConditionalOperators, for example.
1277
1278Example matches 'a'
1279 (a ?: c) + 42;
1280</pre></td></tr>
1281
1282
Aaron Ballman672dde22016-01-22 23:15:00 +00001283<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 +00001284<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1285
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001286Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001287 int foo() { return 1; }
1288 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001289</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001290
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001291
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001292<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1293<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1294ParenListExprs don't have a predefined type and are used for late parsing.
1295In the final AST, they can be met in template declarations.
1296
1297Given
1298 template&lt;typename T&gt; class X {
1299 void f() {
1300 X x(*this);
1301 int a = 0, b = 1; int i = (a, b);
1302 }
1303 };
1304parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1305has a predefined type and is a ParenExpr, not a ParenListExpr.
1306</pre></td></tr>
1307
1308
1309<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>
1310<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1311
1312Example: Matches __func__
1313 printf("%s", __func__);
1314</pre></td></tr>
1315
1316
Aaron Ballman672dde22016-01-22 23:15:00 +00001317<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 +00001318<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1319
1320Given
1321 return 1;
1322returnStmt()
1323 matches 'return 1'
1324</pre></td></tr>
1325
1326
Aaron Ballman672dde22016-01-22 23:15:00 +00001327<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 +00001328<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1329
1330Given
1331 { ++a; }
1332stmt()
1333 matches both the compound statement '{ ++a; }' and '++a'.
1334</pre></td></tr>
1335
1336
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001337<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>
1338<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1339
1340Example match: ({ int X = 4; X; })
1341 int C = ({ int X = 4; 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('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 +00001346<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1347
1348Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001349 char *s = "abcd";
1350 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001351</pre></td></tr>
1352
1353
Aaron Ballman672dde22016-01-22 23:15:00 +00001354<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 +00001355<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1356
1357Given
1358 template &lt;int N&gt;
1359 struct A { static const int n = N; };
1360 struct B : public A&lt;42&gt; {};
1361substNonTypeTemplateParmExpr()
1362 matches "N" in the right-hand side of "static const int n = N;"
1363</pre></td></tr>
1364
1365
Aaron Ballman672dde22016-01-22 23:15:00 +00001366<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 +00001367<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1368
1369Given
1370 switch(a) { case 42: break; default: break; }
1371switchCase()
Fangrui Song55942ab2018-01-22 22:34:15 +00001372 matches 'case 42:' and 'default:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001373</pre></td></tr>
1374
1375
Aaron Ballman672dde22016-01-22 23:15:00 +00001376<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 +00001377<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1378
1379Given
1380 switch(a) { case 42: break; default: break; }
1381switchStmt()
1382 matches 'switch(a)'.
1383</pre></td></tr>
1384
1385
Aaron Ballman672dde22016-01-22 23:15:00 +00001386<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 +00001387<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1388
1389Given
1390 Foo x = bar;
1391 int y = sizeof(x) + alignof(x);
1392unaryExprOrTypeTraitExpr()
1393 matches sizeof(x) and alignof(x)
1394</pre></td></tr>
1395
1396
Aaron Ballman672dde22016-01-22 23:15:00 +00001397<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 +00001398<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1399
1400Example matches !a
1401 !a || b
1402</pre></td></tr>
1403
1404
Haojian Wu7751c922016-05-18 12:53:59 +00001405<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>
1406<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1407but could not be resolved to a specific declaration.
1408
1409Given
1410 template&lt;typename T&gt;
1411 T foo() { T a; return a; }
1412 template&lt;typename T&gt;
1413 void bar() {
1414 foo&lt;T&gt;();
1415 }
1416unresolvedLookupExpr()
1417 matches foo&lt;T&gt;() </pre></td></tr>
1418
1419
Aaron Ballman672dde22016-01-22 23:15:00 +00001420<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 +00001421<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1422
1423Example match: "foo"_suffix
1424</pre></td></tr>
1425
1426
Aaron Ballman672dde22016-01-22 23:15:00 +00001427<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 +00001428<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1429
1430Given
1431 while (true) {}
1432whileStmt()
1433 matches 'while (true) {}'.
1434</pre></td></tr>
1435
1436
Aaron Ballman672dde22016-01-22 23:15:00 +00001437<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 +00001438<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1439
1440Given
1441 template &lt;typename T&gt; struct C {};
1442 C&lt;int&gt; c;
1443templateArgument()
1444 matches 'int' in C&lt;int&gt;.
1445</pre></td></tr>
1446
1447
Haojian Wub33b02e2016-07-29 15:45:11 +00001448<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>
1449<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1450
1451Given
1452 template &lt;typename T&gt; class X { };
1453 X&lt;int&gt; xi;
1454templateName()
1455 matches 'X' in X&lt;int&gt;.
1456</pre></td></tr>
1457
1458
Aaron Ballman672dde22016-01-22 23:15:00 +00001459<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 +00001460<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1461</pre></td></tr>
1462
1463
Aaron Ballman672dde22016-01-22 23:15:00 +00001464<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 +00001465<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1466
1467Given
1468 int a[] = { 2, 3 };
1469 int b[4];
1470 void f() { int c[a[0]]; }
1471arrayType()
1472 matches "int a[]", "int b[4]" and "int c[a[0]]";
1473</pre></td></tr>
1474
1475
Aaron Ballman672dde22016-01-22 23:15:00 +00001476<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 +00001477<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1478
1479Given
1480 _Atomic(int) i;
1481atomicType()
1482 matches "_Atomic(int) i"
1483</pre></td></tr>
1484
1485
Aaron Ballman672dde22016-01-22 23:15:00 +00001486<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 +00001487<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1488
1489Given:
1490 auto n = 4;
1491 int v[] = { 2, 3 }
1492 for (auto i : v) { }
1493autoType()
1494 matches "auto n" and "auto i"
1495</pre></td></tr>
1496
1497
Aaron Ballman672dde22016-01-22 23:15:00 +00001498<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 +00001499<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1500"void (^)(int)".
1501
1502The pointee is always required to be a FunctionType.
1503</pre></td></tr>
1504
1505
Aaron Ballman672dde22016-01-22 23:15:00 +00001506<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 +00001507<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1508
1509Given
1510 struct A {};
1511 A a;
1512 int b;
1513 float c;
1514 bool d;
1515builtinType()
1516 matches "int b", "float c" and "bool d"
1517</pre></td></tr>
1518
1519
Aaron Ballman672dde22016-01-22 23:15:00 +00001520<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 +00001521<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1522
1523Given
1524 _Complex float f;
1525complexType()
1526 matches "_Complex float f"
1527</pre></td></tr>
1528
1529
Aaron Ballman672dde22016-01-22 23:15:00 +00001530<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001531<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1532
1533Given
1534 void() {
1535 int a[2];
1536 int b[] = { 2, 3 };
1537 int c[b[0]];
1538 }
1539constantArrayType()
1540 matches "int a[2]"
1541</pre></td></tr>
1542
1543
Aaron Ballman672dde22016-01-22 23:15:00 +00001544<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 +00001545<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1546Example matches i[] in declaration of f.
1547 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1548Example matches i[1].
1549 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1550 void f(int i[]) {
1551 i[1] = 0;
1552 }
1553</pre></td></tr>
1554
1555
Aaron Ballman672dde22016-01-22 23:15:00 +00001556<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 +00001557<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1558
1559Given
1560 template&lt;typename T, int Size&gt;
1561 class array {
1562 T data[Size];
1563 };
1564dependentSizedArrayType
1565 matches "T data[Size]"
1566</pre></td></tr>
1567
1568
Aaron Ballman672dde22016-01-22 23:15:00 +00001569<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 +00001570<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1571qualified name.
1572
1573Given
1574 namespace N {
1575 namespace M {
1576 class D {};
1577 }
1578 }
1579 class C {};
1580
1581 class C c;
1582 N::M::D d;
1583
1584elaboratedType() matches the type of the variable declarations of both
1585c and d.
1586</pre></td></tr>
1587
1588
Haojian Wue775de82016-06-30 07:50:01 +00001589<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>
1590<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1591
1592Given
1593 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001594 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001595
1596 C c;
1597 S s;
1598
1599enumType() matches the type of the variable declarations of both c and
1600s.
1601</pre></td></tr>
1602
1603
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001604<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1605<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1606
1607Given
1608 int (*f)(int);
1609 void g();
1610functionProtoType()
1611 matches "int (*f)(int)" and the type of "g" in C++ mode.
1612 In C mode, "g" is not matched because it does not contain a prototype.
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('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 +00001617<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1618
1619Given
1620 int (*f)(int);
1621 void g();
1622functionType()
1623 matches "int (*f)(int)" and the type of "g".
1624</pre></td></tr>
1625
1626
Aaron Ballman672dde22016-01-22 23:15:00 +00001627<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 +00001628<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1629
1630Given
1631 int a[] = { 2, 3 };
1632 int b[42];
1633 void f(int c[]) { int d[a[0]]; };
1634incompleteArrayType()
1635 matches "int a[]" and "int c[]"
1636</pre></td></tr>
1637
1638
Aaron Ballman672dde22016-01-22 23:15:00 +00001639<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 +00001640<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1641
1642Example matches S s, but not S&lt;T&gt; s.
1643 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1644 template &lt;typename T&gt; struct S {
1645 void f(S s);
1646 void g(S&lt;T&gt; s);
1647 };
1648</pre></td></tr>
1649
1650
Aaron Ballman672dde22016-01-22 23:15:00 +00001651<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 +00001652<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1653
1654Given:
1655 int *a;
1656 int &amp;b = *a;
1657 int &amp;&amp;c = 1;
1658 auto &amp;d = b;
1659 auto &amp;&amp;e = c;
1660 auto &amp;&amp;f = 2;
1661 int g = 5;
1662
1663lValueReferenceType() matches the types of b, d, and e. e is
1664matched since the type is deduced as int&amp; by reference collapsing rules.
1665</pre></td></tr>
1666
1667
Aaron Ballman672dde22016-01-22 23:15:00 +00001668<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 +00001669<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1670Given
1671 struct A { int i; }
1672 A::* ptr = A::i;
1673memberPointerType()
1674 matches "A::* ptr"
1675</pre></td></tr>
1676
1677
Aaron Ballman672dde22016-01-22 23:15:00 +00001678<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 +00001679<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1680a pointer type, despite being syntactically similar.
1681
1682Given
1683 int *a;
1684
1685 @interface Foo
1686 @end
1687 Foo *f;
1688pointerType()
1689 matches "Foo *f", but does not match "int *a".
1690</pre></td></tr>
1691
1692
Aaron Ballman672dde22016-01-22 23:15:00 +00001693<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 +00001694<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1695
1696Given
1697 int (*ptr_to_array)[4];
1698 int *array_of_ptrs[4];
1699
1700varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1701array_of_ptrs.
1702</pre></td></tr>
1703
1704
Aaron Ballman672dde22016-01-22 23:15:00 +00001705<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 +00001706<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1707types.
1708
1709Given
1710 int *a;
1711 int &amp;b = *a;
1712 int c = 5;
1713
1714 @interface Foo
1715 @end
1716 Foo *f;
1717pointerType()
1718 matches "int *a", but does not match "Foo *f".
1719</pre></td></tr>
1720
1721
Aaron Ballman672dde22016-01-22 23:15:00 +00001722<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 +00001723<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1724
1725Given:
1726 int *a;
1727 int &amp;b = *a;
1728 int &amp;&amp;c = 1;
1729 auto &amp;d = b;
1730 auto &amp;&amp;e = c;
1731 auto &amp;&amp;f = 2;
1732 int g = 5;
1733
1734rValueReferenceType() matches the types of c and f. e is not
1735matched as it is deduced to int&amp; by reference collapsing rules.
1736</pre></td></tr>
1737
1738
Aaron Ballman672dde22016-01-22 23:15:00 +00001739<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001740<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1741
1742Given
1743 class C {};
1744 struct S {};
1745
1746 C c;
1747 S s;
1748
1749recordType() matches the type of the variable declarations of both c
1750and s.
1751</pre></td></tr>
1752
1753
Aaron Ballman672dde22016-01-22 23:15:00 +00001754<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 +00001755<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1756
1757Given
1758 int *a;
1759 int &amp;b = *a;
1760 int &amp;&amp;c = 1;
1761 auto &amp;d = b;
1762 auto &amp;&amp;e = c;
1763 auto &amp;&amp;f = 2;
1764 int g = 5;
1765
1766referenceType() matches the types of b, c, d, e, and f.
1767</pre></td></tr>
1768
1769
Aaron Ballman672dde22016-01-22 23:15:00 +00001770<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 +00001771<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1772template type parameter.
1773
1774Given
1775 template &lt;typename T&gt;
1776 void F(T t) {
1777 int i = 1 + t;
1778 }
1779
1780substTemplateTypeParmType() matches the type of 't' but not '1'
1781</pre></td></tr>
1782
1783
Manuel Klimek696e5052017-08-02 13:04:44 +00001784<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
1785<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1786
1787Given
1788 enum E {};
1789 class C {};
1790
1791 E e;
1792 C c;
1793
1794tagType() matches the type of the variable declarations of both e
1795and c.
1796</pre></td></tr>
1797
1798
Aaron Ballman672dde22016-01-22 23:15:00 +00001799<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 +00001800<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1801
1802Given
1803 template &lt;typename T&gt;
1804 class C { };
1805
1806 template class C&lt;int&gt;; A
1807 C&lt;char&gt; var; B
1808
1809templateSpecializationType() matches the type of the explicit
1810instantiation in A and the type of the variable declaration in B.
1811</pre></td></tr>
1812
1813
Aaron Ballman672dde22016-01-22 23:15:00 +00001814<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 +00001815<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1816
1817Example matches T, but not int.
1818 (matcher = templateTypeParmType())
1819 template &lt;typename T&gt; void f(int i);
1820</pre></td></tr>
1821
1822
Aaron Ballman672dde22016-01-22 23:15:00 +00001823<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 +00001824<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1825</pre></td></tr>
1826
1827
Aaron Ballman672dde22016-01-22 23:15:00 +00001828<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 +00001829<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1830
1831Given
1832 typedef int X;
1833typedefType()
1834 matches "typedef int X"
1835</pre></td></tr>
1836
1837
Aaron Ballman672dde22016-01-22 23:15:00 +00001838<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 +00001839<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1840
1841Given:
1842 typedef __underlying_type(T) type;
1843unaryTransformType()
1844 matches "__underlying_type(T)"
1845</pre></td></tr>
1846
1847
Aaron Ballman672dde22016-01-22 23:15:00 +00001848<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 +00001849<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1850integer-constant-expression.
1851
1852Given
1853 void f() {
1854 int a[] = { 2, 3 }
1855 int b[42];
1856 int c[a[0]];
1857 }
1858variableArrayType()
1859 matches "int c[a[0]]"
1860</pre></td></tr>
1861
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001862<!--END_DECL_MATCHERS -->
1863</table>
1864
1865<!-- ======================================================================= -->
1866<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1867<!-- ======================================================================= -->
1868
1869<p>Narrowing matchers match certain attributes on the current node, thus
1870narrowing down the set of nodes of the current type to match on.</p>
1871
1872<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1873which allow users to create more powerful match expressions.</p>
1874
1875<table>
1876<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001877<!-- START_NARROWING_MATCHERS -->
1878
1879<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>
1880<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1881
1882Usable as: Any Matcher
1883</pre></td></tr>
1884
1885
1886<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>
1887<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1888
1889Usable as: Any Matcher
1890</pre></td></tr>
1891
1892
1893<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1894<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1895
1896Useful when another matcher requires a child matcher, but there's no
1897additional constraint. This will often be used with an explicit conversion
1898to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1899
1900Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1901"int* p" and "void f()" in
1902 int* p;
1903 void f();
1904
1905Usable as: Any Matcher
1906</pre></td></tr>
1907
1908
1909<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1910<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1911
1912Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1913 class X {};
1914 class Y {};
1915
1916Usable as: Any Matcher
1917</pre></td></tr>
1918
1919
Aaron Ballman672dde22016-01-22 23:15:00 +00001920<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 +00001921<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1922unary).
1923
1924Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1925 !(a || b)
1926</pre></td></tr>
1927
1928
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001929<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>
1930<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1931
1932
1933<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>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00001934<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 +00001935
Peter Wua9244b52017-06-08 22:00:58 +00001936Given
1937 f('false, 3.14, 42);
1938characterLiteral(equals(0))
1939 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1940 match false
1941floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1942 match 3.14
1943integerLiteral(equals(42))
1944 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001945
Clement Courbet43bdba42017-07-11 15:45:22 +00001946Note that you cannot directly match a negative numeric literal because the
1947minus sign is not part of the literal: It is a unary operator whose operand
1948is the positive numeric literal. Instead, you must use a unaryOperator()
1949matcher to match the minus sign:
1950
1951unaryOperator(hasOperatorName("-"),
1952 hasUnaryOperand(integerLiteral(equals(13))))
1953
Peter Wua9244b52017-06-08 22:00:58 +00001954Usable 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 +00001955 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 +00001956</pre></td></tr>
1957
1958
Peter Wua9244b52017-06-08 22:00:58 +00001959<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>
1960<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1961
1962
1963<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>
1964<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1965
1966
Aaron Ballman672dde22016-01-22 23:15:00 +00001967<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 +00001968<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1969
1970Given
1971 try {
1972 ...
1973 } catch (int) {
1974 ...
1975 } catch (...) {
1976 ...
1977 }
1978endcode
1979cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1980</pre></td></tr>
1981
1982
Aaron Ballman672dde22016-01-22 23:15:00 +00001983<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 +00001984<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1985a specific number of arguments (including absent default arguments).
1986
1987Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1988 void f(int x, int y);
1989 f(0, 0);
1990</pre></td></tr>
1991
1992
Aaron Ballman672dde22016-01-22 23:15:00 +00001993<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 +00001994<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1995</pre></td></tr>
1996
1997
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001998<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>
1999<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2000zero initialization.
2001
2002Given
2003void foo() {
2004 struct point { double x; double y; };
2005 point pt[2] = { { 1.0, 2.0 } };
2006}
2007initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2008will match the implicit array filler for pt[1].
2009</pre></td></tr>
2010
2011
Aaron Ballman672dde22016-01-22 23:15:00 +00002012<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 +00002013<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2014
2015Given
2016 struct S {
2017 S(); #1
2018 S(const S &amp;); #2
2019 S(S &amp;&amp;); #3
2020 };
2021cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2022</pre></td></tr>
2023
2024
Aaron Ballman672dde22016-01-22 23:15:00 +00002025<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 +00002026<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2027
2028Given
2029 struct S {
2030 S(); #1
2031 S(const S &amp;); #2
2032 S(S &amp;&amp;); #3
2033 };
2034cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2035</pre></td></tr>
2036
2037
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002038<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>
2039<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2040
2041Given
2042 struct S {
2043 S(); #1
2044 S(int) {} #2
2045 S(S &amp;&amp;) : S() {} #3
2046 };
2047 S::S() : S(0) {} #4
2048cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2049#1 or #2.
2050</pre></td></tr>
2051
2052
Aaron Ballman672dde22016-01-22 23:15:00 +00002053<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 +00002054<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2055the explicit keyword.
2056
2057Given
2058 struct S {
2059 S(int); #1
2060 explicit S(double); #2
2061 operator int(); #3
2062 explicit operator bool(); #4
2063 };
2064cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2065cxxConversionDecl(isExplicit()) will match #4, but not #3.
2066</pre></td></tr>
2067
2068
Aaron Ballman672dde22016-01-22 23:15:00 +00002069<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 +00002070<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2071
2072Given
2073 struct S {
2074 S(); #1
2075 S(const S &amp;); #2
2076 S(S &amp;&amp;); #3
2077 };
2078cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
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_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 +00002083<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2084the explicit keyword.
2085
2086Given
2087 struct S {
2088 S(int); #1
2089 explicit S(double); #2
2090 operator int(); #3
2091 explicit operator bool(); #4
2092 };
2093cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2094cxxConversionDecl(isExplicit()) will match #4, but not #3.
2095</pre></td></tr>
2096
2097
Aaron Ballman672dde22016-01-22 23:15:00 +00002098<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 +00002099<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2100opposed to a member.
2101
2102Given
2103 struct B {};
2104 struct D : B {
2105 int I;
2106 D(int i) : I(i) {}
2107 };
2108 struct E : B {
2109 E() : B() {}
2110 };
2111cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2112 will match E(), but not match D(int).
2113</pre></td></tr>
2114
2115
Aaron Ballman672dde22016-01-22 23:15:00 +00002116<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 +00002117<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2118opposed to a base.
2119
2120Given
2121 struct B {};
2122 struct D : B {
2123 int I;
2124 D(int i) : I(i) {}
2125 };
2126 struct E : B {
2127 E() : B() {}
2128 };
2129cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2130 will match D(int), but not match E().
2131</pre></td></tr>
2132
2133
Aaron Ballman672dde22016-01-22 23:15:00 +00002134<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002135<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2136code (as opposed to implicitly added by the compiler).
2137
2138Given
2139 struct Foo {
2140 Foo() { }
2141 Foo(int) : foo_("A") { }
2142 string foo_;
2143 };
2144cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2145 will match Foo(int), but not Foo()
2146</pre></td></tr>
2147
2148
Aaron Ballman672dde22016-01-22 23:15:00 +00002149<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 +00002150<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2151
2152Given
2153struct A {
2154 void foo() const;
2155 void bar();
2156};
2157
2158cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2159</pre></td></tr>
2160
2161
Aaron Ballman672dde22016-01-22 23:15:00 +00002162<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 +00002163<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2164operator.
2165
2166Given
2167struct A {
2168 A &amp;operator=(const A &amp;);
2169 A &amp;operator=(A &amp;&amp;);
2170};
2171
2172cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2173the second one.
2174</pre></td></tr>
2175
2176
Aaron Ballman672dde22016-01-22 23:15:00 +00002177<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 +00002178<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2179
2180Given:
2181 class A final {};
2182
2183 struct B {
2184 virtual void f();
2185 };
2186
2187 struct C : B {
2188 void f() final;
2189 };
2190matches A and C::f, but not B, C, or B::f
2191</pre></td></tr>
2192
2193
Aaron Ballman672dde22016-01-22 23:15:00 +00002194<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 +00002195<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2196operator.
2197
2198Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002199struct A {
2200 A &amp;operator=(const A &amp;);
2201 A &amp;operator=(A &amp;&amp;);
2202};
2203
2204cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2205the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002206</pre></td></tr>
2207
2208
Aaron Ballman672dde22016-01-22 23:15:00 +00002209<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 +00002210<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2211
2212Given
2213 class A {
2214 public:
2215 virtual void x();
2216 };
2217 class B : public A {
2218 public:
2219 virtual void x();
2220 };
2221 matches B::x
2222</pre></td></tr>
2223
2224
Aaron Ballman672dde22016-01-22 23:15:00 +00002225<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 +00002226<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2227
2228Given
2229 class A {
2230 public:
2231 virtual void x() = 0;
2232 };
2233 matches A::x
2234</pre></td></tr>
2235
2236
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002237<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>
2238<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2239
2240Given
2241 struct S {
2242 S(); #1
2243 S(const S &amp;) = default; #2
2244 S(S &amp;&amp;) = delete; #3
2245 };
2246cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2247</pre></td></tr>
2248
2249
Aaron Ballman672dde22016-01-22 23:15:00 +00002250<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 +00002251<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2252
2253Given
2254 class A {
2255 public:
2256 virtual void x();
2257 };
2258 matches A::x
2259</pre></td></tr>
2260
Aaron Ballman672dde22016-01-22 23:15:00 +00002261
2262<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 +00002263<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2264
2265Given
2266 class A {
2267 public:
2268 virtual void x();
2269 };
2270 class B : public A {
2271 public:
2272 void x();
2273 };
2274 matches A::x but not B::x
2275</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002276
Aaron Ballman672dde22016-01-22 23:15:00 +00002277
Adam Baloghda488a62017-11-23 12:43:20 +00002278<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2279<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2280
2281Given:
2282 MyClass *p1 = new MyClass[10];
2283cxxNewExpr(isArray())
2284 matches the expression 'new MyClass[10]'.
2285</pre></td></tr>
2286
2287
Aaron Ballman672dde22016-01-22 23:15:00 +00002288<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 +00002289<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2290
2291Matches overloaded operator names specified in strings without the
2292"operator" prefix: e.g. "&lt;&lt;".
2293
2294Given:
2295 class A { int operator*(); };
2296 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2297 A a;
2298 a &lt;&lt; a; &lt;-- This matches
2299
2300cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2301specified line and
2302cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2303matches the declaration of A.
2304
Aaron Ballman672dde22016-01-22 23:15:00 +00002305Usable 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 +00002306</pre></td></tr>
2307
2308
Aaron Ballman813e36c2017-11-29 21:21:51 +00002309<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
2310<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2311
2312Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2313class x {};
2314class y;
2315</pre></td></tr>
2316
2317
Aaron Ballman672dde22016-01-22 23:15:00 +00002318<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 +00002319<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2320</pre></td></tr>
2321
2322
Aaron Ballman672dde22016-01-22 23:15:00 +00002323<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 +00002324<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2325static member variable template instantiations.
2326
2327Given
2328 template&lt;typename T&gt; void A(T t) { }
2329 template&lt;&gt; void A(int N) { }
2330functionDecl(isExplicitTemplateSpecialization())
2331 matches the specialization A&lt;int&gt;().
2332
Aaron Ballman672dde22016-01-22 23:15:00 +00002333Usable 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 +00002334</pre></td></tr>
2335
2336
Aaron Ballman672dde22016-01-22 23:15:00 +00002337<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 +00002338<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2339
2340Given:
2341 class A final {};
2342
2343 struct B {
2344 virtual void f();
2345 };
2346
2347 struct C : B {
2348 void f() final;
2349 };
2350matches A and C::f, but not B, C, or B::f
2351</pre></td></tr>
2352
2353
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002354<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>
2355<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2356
2357Given:
2358 auto x = []{};
2359
2360cxxRecordDecl(isLambda()) matches the implicit class declaration of
2361decltype(x)
2362</pre></td></tr>
2363
2364
Aaron Ballman672dde22016-01-22 23:15:00 +00002365<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 +00002366<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2367isSameOrDerivedFrom(hasName(...)).
2368</pre></td></tr>
2369
2370
Aaron Ballman672dde22016-01-22 23:15:00 +00002371<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 +00002372<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2373member variable template instantiations.
2374
2375Given
2376 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2377or
2378 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2379cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2380 matches the template instantiation of X&lt;A&gt;.
2381
2382But given
2383 template &lt;typename T&gt; class X {}; class A {};
2384 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2385cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2386 does not match, as X&lt;A&gt; is an explicit template specialization.
2387
Aaron Ballman672dde22016-01-22 23:15:00 +00002388Usable 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 +00002389</pre></td></tr>
2390
2391
Aaron Ballman672dde22016-01-22 23:15:00 +00002392<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 +00002393<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2394a specific number of arguments (including absent default arguments).
2395
2396Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2397 void f(int x, int y);
2398 f(0, 0);
2399</pre></td></tr>
2400
2401
Etienne Bergeron75e52722016-05-13 19:36:55 +00002402<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>
2403<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2404
2405Example: matches the implicit cast around 0
2406(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2407 int *p = 0;
2408</pre></td></tr>
2409
2410
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002411<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>
2412<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2413
2414
2415<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>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002416<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 +00002417
Peter Wua9244b52017-06-08 22:00:58 +00002418Given
2419 f('false, 3.14, 42);
2420characterLiteral(equals(0))
2421 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2422 match false
2423floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2424 match 3.14
2425integerLiteral(equals(42))
2426 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002427
Clement Courbet43bdba42017-07-11 15:45:22 +00002428Note that you cannot directly match a negative numeric literal because the
2429minus sign is not part of the literal: It is a unary operator whose operand
2430is the positive numeric literal. Instead, you must use a unaryOperator()
2431matcher to match the minus sign:
2432
2433unaryOperator(hasOperatorName("-"),
2434 hasUnaryOperand(integerLiteral(equals(13))))
2435
Peter Wua9244b52017-06-08 22:00:58 +00002436Usable 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 +00002437 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 +00002438</pre></td></tr>
2439
2440
Peter Wua9244b52017-06-08 22:00:58 +00002441<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>
2442<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2443
2444
2445<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>
2446<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2447
2448
Aaron Ballman672dde22016-01-22 23:15:00 +00002449<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 +00002450<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2451
2452Given
2453 template&lt;typename T&gt; struct C {};
2454 C&lt;int&gt; c;
2455classTemplateSpecializationDecl(templateArgumentCountIs(1))
2456 matches C&lt;int&gt;.
2457</pre></td></tr>
2458
2459
Aaron Ballman672dde22016-01-22 23:15:00 +00002460<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 +00002461<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2462child statements.
2463
2464Example: Given
2465 { for (;;) {} }
2466compoundStmt(statementCountIs(0)))
2467 matches '{}'
2468 but does not match the outer compound statement.
2469</pre></td></tr>
2470
2471
Aaron Ballman672dde22016-01-22 23:15:00 +00002472<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002473<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002474
2475Given
2476 int a[42];
2477 int b[2 * 21];
2478 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002479 char *s = "abcd";
2480 wchar_t *ws = L"abcd";
2481 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002482constantArrayType(hasSize(42))
2483 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002484stringLiteral(hasSize(4))
2485 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002486</pre></td></tr>
2487
2488
Aaron Ballman672dde22016-01-22 23:15:00 +00002489<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 +00002490<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2491declarations.
2492
2493Example: Given
2494 int a, b;
2495 int c;
2496 int d = 2, e;
2497declCountIs(2)
2498 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2499</pre></td></tr>
2500
2501
Aaron Ballman672dde22016-01-22 23:15:00 +00002502<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 +00002503<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2504
2505Matches a node if it equals the node previously bound to ID.
2506
2507Given
2508 class X { int a; int b; };
2509cxxRecordDecl(
2510 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2511 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2512 matches the class X, as a and b have the same type.
2513
2514Note that when multiple matches are involved via forEach* matchers,
2515equalsBoundNodes acts as a filter.
2516For example:
2517compoundStmt(
2518 forEachDescendant(varDecl().bind("d")),
2519 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2520will trigger a match for each combination of variable declaration
2521and reference to that variable declaration within a compound statement.
2522</pre></td></tr>
2523
2524
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002525<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
2526<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2527
2528Decl has pointer identity in the AST.
2529</pre></td></tr>
2530
2531
Aaron Ballman672dde22016-01-22 23:15:00 +00002532<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 +00002533<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2534
2535Given
2536 __attribute__((device)) void f() { ... }
2537decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2538f. If the matcher is use from clang-query, attr::Kind parameter should be
2539passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2540</pre></td></tr>
2541
2542
Aaron Ballman672dde22016-01-22 23:15:00 +00002543<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 +00002544<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2545partially matching a given regex.
2546
2547Example matches Y but not X
2548 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2549 #include "ASTMatcher.h"
2550 class X {};
2551ASTMatcher.h:
2552 class Y {};
2553
Aaron Ballman672dde22016-01-22 23:15:00 +00002554Usable 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 +00002555</pre></td></tr>
2556
2557
Aaron Ballman672dde22016-01-22 23:15:00 +00002558<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 +00002559<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2560
2561Example matches X but not Y
2562 (matcher = cxxRecordDecl(isExpansionInMainFile())
2563 #include &lt;Y.h&gt;
2564 class X {};
2565Y.h:
2566 class Y {};
2567
Aaron Ballman672dde22016-01-22 23:15:00 +00002568Usable 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 +00002569</pre></td></tr>
2570
2571
Aaron Ballman672dde22016-01-22 23:15:00 +00002572<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 +00002573<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2574
2575Example matches Y but not X
2576 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2577 #include &lt;SystemHeader.h&gt;
2578 class X {};
2579SystemHeader.h:
2580 class Y {};
2581
Aaron Ballman672dde22016-01-22 23:15:00 +00002582Usable 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 +00002583</pre></td></tr>
2584
2585
Aaron Ballman672dde22016-01-22 23:15:00 +00002586<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002587<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2588by the compiler (eg. implicit defaultcopy constructors).
2589</pre></td></tr>
2590
2591
Aaron Ballman672dde22016-01-22 23:15:00 +00002592<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 +00002593<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2594
2595Given
2596 class C {
2597 public: int a;
2598 protected: int b;
2599 private: int c;
2600 };
2601fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002602 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002603</pre></td></tr>
2604
2605
Aaron Ballman672dde22016-01-22 23:15:00 +00002606<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 +00002607<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2608
2609Given
2610 class C {
2611 public: int a;
2612 protected: int b;
2613 private: int c;
2614 };
2615fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002616 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002617</pre></td></tr>
2618
2619
Aaron Ballman672dde22016-01-22 23:15:00 +00002620<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 +00002621<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2622
2623Given
2624 class C {
2625 public: int a;
2626 protected: int b;
2627 private: int c;
2628 };
2629fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002630 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002631</pre></td></tr>
2632
2633
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002634<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>
2635<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2636a specific number of designators.
2637
2638Example: Given
2639 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2640 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2641designatorCountIs(2)
2642 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2643 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2644</pre></td></tr>
2645
2646
Haojian Wu9c3be3a2018-01-18 09:47:57 +00002647<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
2648<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2649
2650Example matches Y (matcher = enumDecl(isScoped()))
2651enum X {};
2652enum class Y {};
2653</pre></td></tr>
2654
2655
Aaron Ballman5c574342016-07-06 18:25:16 +00002656<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 +00002657<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2658bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002659
2660Given
2661 class C {
2662 int a : 2;
2663 int b : 4;
2664 int c : 2;
2665 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002666fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002667 matches 'int a;' and 'int c;' but not 'int b;'.
2668</pre></td></tr>
2669
2670
2671<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>
2672<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2673
2674Given
2675 class C {
2676 int a : 2;
2677 int b;
2678 };
2679fieldDecl(isBitField())
2680 matches 'int a;' but not 'int b;'.
2681</pre></td></tr>
2682
2683
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002684<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>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002685<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 +00002686
Peter Wua9244b52017-06-08 22:00:58 +00002687Given
2688 f('false, 3.14, 42);
2689characterLiteral(equals(0))
2690 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2691 match false
2692floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2693 match 3.14
2694integerLiteral(equals(42))
2695 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002696
Clement Courbet43bdba42017-07-11 15:45:22 +00002697Note that you cannot directly match a negative numeric literal because the
2698minus sign is not part of the literal: It is a unary operator whose operand
2699is the positive numeric literal. Instead, you must use a unaryOperator()
2700matcher to match the minus sign:
2701
2702unaryOperator(hasOperatorName("-"),
2703 hasUnaryOperand(integerLiteral(equals(13))))
2704
Peter Wua9244b52017-06-08 22:00:58 +00002705Usable 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 +00002706 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 +00002707</pre></td></tr>
2708
2709
Peter Wua9244b52017-06-08 22:00:58 +00002710<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>
2711<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2712
2713
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002714<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2715<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2716
2717Given:
2718 void f();
2719 void g() noexcept;
2720 void h() noexcept(true);
2721 void i() noexcept(false);
2722 void j() throw();
2723 void k() throw(int);
2724 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002725functionDecl(hasDynamicExceptionSpec()) and
2726 functionProtoType(hasDynamicExceptionSpec())
2727 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002728</pre></td></tr>
2729
2730
Aaron Ballman672dde22016-01-22 23:15:00 +00002731<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 +00002732<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2733
2734Matches overloaded operator names specified in strings without the
2735"operator" prefix: e.g. "&lt;&lt;".
2736
2737Given:
2738 class A { int operator*(); };
2739 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2740 A a;
2741 a &lt;&lt; a; &lt;-- This matches
2742
2743cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2744specified line and
2745cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2746matches the declaration of A.
2747
Aaron Ballman672dde22016-01-22 23:15:00 +00002748Usable 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 +00002749</pre></td></tr>
2750
2751
Julie Hockett239d25a2018-01-22 22:45:23 +00002752<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
2753<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
2754
2755Example matches Y (matcher = functionDecl(hasTrailingReturn()))
2756int X() {}
2757auto Y() -&gt; int {}
2758</pre></td></tr>
2759
2760
Aaron Ballman672dde22016-01-22 23:15:00 +00002761<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 +00002762<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2763
2764Given:
2765 constexpr int foo = 42;
2766 constexpr int bar();
2767varDecl(isConstexpr())
2768 matches the declaration of foo.
2769functionDecl(isConstexpr())
2770 matches the declaration of bar.
2771</pre></td></tr>
2772
2773
Aaron Ballman672dde22016-01-22 23:15:00 +00002774<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 +00002775<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2776
2777Given:
2778 class A { ~A(); };
2779 class B { ~B() = default; };
2780functionDecl(isDefaulted())
2781 matches the declaration of ~B, but not ~A.
2782</pre></td></tr>
2783
2784
Dave Leebe398682017-11-14 14:17:26 +00002785<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
2786<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002787
2788Example matches A, va, fa
2789 class A {};
2790 class B; Doesn't match, as it has no body.
2791 int va;
2792 extern int vb; Doesn't match, as it doesn't define the variable.
2793 void fa() {}
2794 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00002795 @interface X
2796 - (void)ma; Doesn't match, interface is declaration.
2797 @end
2798 @implementation X
2799 - (void)ma {}
2800 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002801
Dave Leebe398682017-11-14 14:17:26 +00002802Usable 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;,
2803 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002804</pre></td></tr>
2805
2806
Aaron Ballman672dde22016-01-22 23:15:00 +00002807<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 +00002808<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2809
2810Given:
2811 void Func();
2812 void DeletedFunc() = delete;
2813functionDecl(isDeleted())
2814 matches the declaration of DeletedFunc, but not Func.
2815</pre></td></tr>
2816
2817
Aaron Ballman672dde22016-01-22 23:15:00 +00002818<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 +00002819<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2820static member variable template instantiations.
2821
2822Given
2823 template&lt;typename T&gt; void A(T t) { }
2824 template&lt;&gt; void A(int N) { }
2825functionDecl(isExplicitTemplateSpecialization())
2826 matches the specialization A&lt;int&gt;().
2827
Aaron Ballman672dde22016-01-22 23:15:00 +00002828Usable 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 +00002829</pre></td></tr>
2830
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002831
Aaron Ballman672dde22016-01-22 23:15:00 +00002832<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002833<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002834
2835Given:
2836 extern "C" void f() {}
2837 extern "C" { void g() {} }
2838 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002839 extern "C" int x = 1;
2840 extern "C" int y = 2;
2841 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002842functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002843 matches the declaration of f and g, but not the declaration of h.
2844varDecl(isExternC())
2845 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002846</pre></td></tr>
2847
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002848
Aaron Ballman672dde22016-01-22 23:15:00 +00002849<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002850<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2851the inline keyword.
2852
2853Given
2854 inline void f();
2855 void g();
2856 namespace n {
2857 inline namespace m {}
2858 }
2859functionDecl(isInline()) will match ::f().
2860namespaceDecl(isInline()) will match n::m.
2861</pre></td></tr>
2862
2863
Roman Lebedev6c3871b2018-01-17 19:40:55 +00002864<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
2865<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
2866
2867Given
2868 void nope();
2869 [[noreturn]] void a();
2870 __attribute__((noreturn)) void b();
2871 struct c { [[noreturn]] c(); };
2872functionDecl(isNoReturn())
2873 matches all of those except
2874 void nope();
2875</pre></td></tr>
2876
2877
Aaron Ballman672dde22016-01-22 23:15:00 +00002878<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 +00002879<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2880
2881Given:
2882 void f();
2883 void g() noexcept;
2884 void h() throw();
2885 void i() throw(int);
2886 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002887functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2888 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002889</pre></td></tr>
2890
2891
Haojian Wub3d25462016-09-26 16:01:52 +00002892<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 +00002893<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2894class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002895
2896Given:
2897 static void f() {}
2898 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002899 extern int j;
2900 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002901functionDecl(isStaticStorageClass())
2902 matches the function declaration f.
2903varDecl(isStaticStorageClass())
2904 matches the variable declaration i.
2905</pre></td></tr>
2906
2907
Aaron Ballman672dde22016-01-22 23:15:00 +00002908<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 +00002909<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2910member variable template instantiations.
2911
2912Given
2913 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2914or
2915 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2916cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2917 matches the template instantiation of X&lt;A&gt;.
2918
2919But given
2920 template &lt;typename T&gt; class X {}; class A {};
2921 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2922cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2923 does not match, as X&lt;A&gt; is an explicit template specialization.
2924
Aaron Ballman672dde22016-01-22 23:15:00 +00002925Usable 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 +00002926</pre></td></tr>
2927
2928
Aaron Ballman672dde22016-01-22 23:15:00 +00002929<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 +00002930<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2931
2932Example matches f, but not g or h. The function i will not match, even when
2933compiled in C mode.
2934 void f(...);
2935 void g(int);
2936 template &lt;typename... Ts&gt; void h(Ts...);
2937 void i();
2938</pre></td></tr>
2939
2940
Aaron Ballman672dde22016-01-22 23:15:00 +00002941<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 +00002942<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2943specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002944
2945Given
2946 void f(int i) {}
2947 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002948 void h(int i, int j);
2949 void j(int i);
2950 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002951functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00002952 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002953functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00002954 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002955functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00002956 matches k
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002957</pre></td></tr>
2958
2959
Aaron Ballman230ad972016-06-07 17:34:45 +00002960<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>
2961<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2962
2963Given:
2964 void f();
2965 void g() noexcept;
2966 void h() noexcept(true);
2967 void i() noexcept(false);
2968 void j() throw();
2969 void k() throw(int);
2970 void l() throw(...);
2971functionDecl(hasDynamicExceptionSpec()) and
2972 functionProtoType(hasDynamicExceptionSpec())
2973 match the declarations of j, k, and l, but not f, g, h, or i.
2974</pre></td></tr>
2975
2976
2977<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>
2978<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2979
2980Given:
2981 void f();
2982 void g() noexcept;
2983 void h() throw();
2984 void i() throw(int);
2985 void j() noexcept(false);
2986functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2987 match the declarations of g, and h, but not f, i or j.
2988</pre></td></tr>
2989
2990
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002991<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>
2992<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2993specific parameter count.
2994
2995Given
2996 void f(int i) {}
2997 void g(int i, int j) {}
2998 void h(int i, int j);
2999 void j(int i);
3000 void k(int x, int y, int z, ...);
3001functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003002 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003003functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003004 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003005functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003006 matches k
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003007</pre></td></tr>
3008
3009
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003010<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>
3011<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3012
3013
3014<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>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00003015<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 +00003016
Peter Wua9244b52017-06-08 22:00:58 +00003017Given
3018 f('false, 3.14, 42);
3019characterLiteral(equals(0))
3020 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3021 match false
3022floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3023 match 3.14
3024integerLiteral(equals(42))
3025 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003026
Clement Courbet43bdba42017-07-11 15:45:22 +00003027Note that you cannot directly match a negative numeric literal because the
3028minus sign is not part of the literal: It is a unary operator whose operand
3029is the positive numeric literal. Instead, you must use a unaryOperator()
3030matcher to match the minus sign:
3031
3032unaryOperator(hasOperatorName("-"),
3033 hasUnaryOperand(integerLiteral(equals(13))))
3034
Peter Wua9244b52017-06-08 22:00:58 +00003035Usable 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 +00003036 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 +00003037</pre></td></tr>
3038
3039
Peter Wua9244b52017-06-08 22:00:58 +00003040<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>
3041<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3042
3043
3044<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>
3045<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3046
3047
Aaron Ballman672dde22016-01-22 23:15:00 +00003048<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 +00003049<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3050to '.'.
3051
3052Member calls on the implicit this pointer match as called with '-&gt;'.
3053
3054Given
3055 class Y {
3056 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3057 int a;
3058 static int b;
3059 };
3060memberExpr(isArrow())
3061 matches this-&gt;x, x, y.x, a, this-&gt;b
3062</pre></td></tr>
3063
3064
Aaron Ballmana086b9f2016-08-17 13:10:42 +00003065<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>
3066<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3067
3068Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3069void f() {
3070 int x;
3071 static int y;
3072}
3073int z;
3074
3075Example matches f() because it has external formal linkage despite being
3076unique to the translation unit as though it has internal likage
3077(matcher = functionDecl(hasExternalFormalLinkage()))
3078
3079namespace {
3080void f() {}
3081}
3082</pre></td></tr>
3083
3084
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003085<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>const std::string Name</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003086<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3087
3088Supports specifying enclosing namespaces or classes by prefixing the name
3089with '&lt;enclosing&gt;::'.
3090Does not match typedefs of an underlying type with the given name.
3091
3092Example matches X (Name == "X")
3093 class X;
3094
3095Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3096 namespace a { namespace b { class X; } }
3097</pre></td></tr>
3098
3099
Aaron Ballman672dde22016-01-22 23:15:00 +00003100<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003101<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3102a substring matched by the given RegExp.
3103
3104Supports specifying enclosing namespaces or classes by
3105prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3106of an underlying type with the given name.
3107
3108Example matches X (regexp == "::X")
3109 class X;
3110
3111Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3112 namespace foo { namespace bar { class X; } }
3113</pre></td></tr>
3114
3115
Aaron Ballman672dde22016-01-22 23:15:00 +00003116<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 +00003117<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3118
3119Given
3120 namespace n {
3121 namespace {} #1
3122 }
3123namespaceDecl(isAnonymous()) will match #1 but not ::n.
3124</pre></td></tr>
3125
3126
Aaron Ballman672dde22016-01-22 23:15:00 +00003127<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 +00003128<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3129the inline keyword.
3130
3131Given
3132 inline void f();
3133 void g();
3134 namespace n {
3135 inline namespace m {}
3136 }
3137functionDecl(isInline()) will match ::f().
3138namespaceDecl(isInline()) will match n::m.
3139</pre></td></tr>
3140
3141
Aaron Ballman672dde22016-01-22 23:15:00 +00003142<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003143<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3144a specific number of arguments (including absent default arguments).
3145
3146Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3147 void f(int x, int y);
3148 f(0, 0);
3149</pre></td></tr>
3150
3151
Aaron Ballman672dde22016-01-22 23:15:00 +00003152<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003153<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3154
3155objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3156message expression in
3157
3158 UIWebView *webView = ...;
3159 CGRect bodyFrame = webView.frame;
3160 bodyFrame.size.height = self.bodyContentHeight;
3161 webView.frame = bodyFrame;
3162 ^---- matches here
3163</pre></td></tr>
3164
3165
Aaron Ballman672dde22016-01-22 23:15:00 +00003166<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 +00003167<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3168
3169Matches only when the selector of the objCMessageExpr is NULL. This may
3170represent an error condition in the tree!
3171</pre></td></tr>
3172
3173
Aaron Ballman672dde22016-01-22 23:15:00 +00003174<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 +00003175<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3176
3177 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3178 matches the outer message expr in the code below, but NOT the message
3179 invocation for self.bodyView.
3180 [self.bodyView loadHTMLString:html baseURL:NULL];
3181</pre></td></tr>
3182
3183
Aaron Ballman672dde22016-01-22 23:15:00 +00003184<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 +00003185<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3186
3187 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3188 matches self.bodyView in the code below, but NOT the outer message
3189 invocation of "loadHTMLString:baseURL:".
3190 [self.bodyView loadHTMLString:html baseURL:NULL];
3191</pre></td></tr>
3192
3193
Aaron Ballman672dde22016-01-22 23:15:00 +00003194<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 +00003195<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3196a substring matched by the given RegExp.
3197 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3198 invocation for self.bodyView.
3199 [self.bodyView loadHTMLString:html baseURL:NULL];
3200</pre></td></tr>
3201
3202
Aaron Ballman672dde22016-01-22 23:15:00 +00003203<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 +00003204<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3205
3206 matcher = objCMessageExpr(numSelectorArgs(0));
3207 matches self.bodyView in the code below
3208
3209 matcher = objCMessageExpr(numSelectorArgs(2));
3210 matches the invocation of "loadHTMLString:baseURL:" but not that
3211 of self.bodyView
3212 [self.bodyView loadHTMLString:html baseURL:NULL];
3213</pre></td></tr>
3214
3215
Dave Leebe398682017-11-14 14:17:26 +00003216<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
3217<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3218
3219Example matches A, va, fa
3220 class A {};
3221 class B; Doesn't match, as it has no body.
3222 int va;
3223 extern int vb; Doesn't match, as it doesn't define the variable.
3224 void fa() {}
3225 void fb(); Doesn't match, as it has no body.
3226 @interface X
3227 - (void)ma; Doesn't match, interface is declaration.
3228 @end
3229 @implementation X
3230 - (void)ma {}
3231 @end
3232
3233Usable 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;,
3234 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3235</pre></td></tr>
3236
3237
Aaron Ballman5f8980a2017-11-21 19:22:34 +00003238<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
3239<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3240
3241Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3242void x(int val) {}
3243void y(int val = 0) {}
3244</pre></td></tr>
3245
3246
Aaron Ballman672dde22016-01-22 23:15:00 +00003247<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 +00003248<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3249
3250Given
3251 class Y { public: void x(); };
3252 void z() { Y* y; y-&gt;x(); }
3253cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3254 matches y-&gt;x()
3255</pre></td></tr>
3256
3257
Aaron Ballman672dde22016-01-22 23:15:00 +00003258<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 +00003259<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3260
3261Matches a node if it equals the node previously bound to ID.
3262
3263Given
3264 class X { int a; int b; };
3265cxxRecordDecl(
3266 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3267 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3268 matches the class X, as a and b have the same type.
3269
3270Note that when multiple matches are involved via forEach* matchers,
3271equalsBoundNodes acts as a filter.
3272For example:
3273compoundStmt(
3274 forEachDescendant(varDecl().bind("d")),
3275 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3276will trigger a match for each combination of variable declaration
3277and reference to that variable declaration within a compound statement.
3278</pre></td></tr>
3279
3280
Aaron Ballman672dde22016-01-22 23:15:00 +00003281<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 +00003282<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3283the node, not hidden within a typedef.
3284
3285Given
3286 typedef const int const_int;
3287 const_int i;
3288 int *const j;
3289 int *volatile k;
3290 int m;
3291varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3292i is const-qualified but the qualifier is not local.
3293</pre></td></tr>
3294
3295
Aaron Ballman672dde22016-01-22 23:15:00 +00003296<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 +00003297<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3298
3299Given
3300 void a(char);
3301 void b(wchar_t);
3302 void c(double);
3303functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3304matches "a(char)", "b(wchar_t)", but not "c(double)".
3305</pre></td></tr>
3306
3307
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003308<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 +00003309<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3310the Objective-C object pointer type, which is different despite being
3311syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003312
3313Given
3314 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003315
3316 @interface Foo
3317 @end
3318 Foo *f;
3319
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003320 int j;
3321varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003322 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003323</pre></td></tr>
3324
3325
Aaron Ballman672dde22016-01-22 23:15:00 +00003326<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003327<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3328include "top-level" const.
3329
3330Given
3331 void a(int);
3332 void b(int const);
3333 void c(const int);
3334 void d(const int*);
3335 void e(int const) {};
3336functionDecl(hasAnyParameter(hasType(isConstQualified())))
3337 matches "void b(int const)", "void c(const int)" and
3338 "void e(int const) {}". It does not match d as there
3339 is no top-level const on the parameter type "const int *".
3340</pre></td></tr>
3341
3342
Aaron Ballman672dde22016-01-22 23:15:00 +00003343<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 +00003344<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3345
3346Given
3347 void a(int);
3348 void b(long);
3349 void c(double);
3350functionDecl(hasAnyParameter(hasType(isInteger())))
3351matches "a(int)", "b(long)", but not "c(double)".
3352</pre></td></tr>
3353
3354
Clement Courbet42517592016-07-12 06:36:00 +00003355<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>
3356<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3357
3358Given
3359 void a(int);
3360 void b(unsigned long);
3361 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003362functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003363matches "a(int)", but not "b(unsigned long)" and "c(double)".
3364</pre></td></tr>
3365
3366
3367<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>
3368<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3369
3370Given
3371 void a(int);
3372 void b(unsigned long);
3373 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003374functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003375matches "b(unsigned long)", but not "a(int)" and "c(double)".
3376</pre></td></tr>
3377
3378
Aaron Ballman672dde22016-01-22 23:15:00 +00003379<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 +00003380<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3381include "top-level" volatile.
3382
3383Given
3384 void a(int);
3385 void b(int volatile);
3386 void c(volatile int);
3387 void d(volatile int*);
3388 void e(int volatile) {};
3389functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3390 matches "void b(int volatile)", "void c(volatile int)" and
3391 "void e(int volatile) {}". It does not match d as there
3392 is no top-level volatile on the parameter type "volatile int *".
3393</pre></td></tr>
3394
3395
Aaron Ballman672dde22016-01-22 23:15:00 +00003396<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 +00003397<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3398
3399Example matches C, but not S or U.
3400 struct S {};
3401 class C {};
3402 union U {};
3403</pre></td></tr>
3404
3405
Aaron Ballman672dde22016-01-22 23:15:00 +00003406<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 +00003407<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3408
3409Example matches S, but not C or U.
3410 struct S {};
3411 class C {};
3412 union U {};
3413</pre></td></tr>
3414
3415
Aaron Ballman672dde22016-01-22 23:15:00 +00003416<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 +00003417<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3418
3419Example matches U, but not C or S.
3420 struct S {};
3421 class C {};
3422 union U {};
3423</pre></td></tr>
3424
3425
Aaron Ballman672dde22016-01-22 23:15:00 +00003426<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003427<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3428
3429Matches a node if it equals the node previously bound to ID.
3430
3431Given
3432 class X { int a; int b; };
3433cxxRecordDecl(
3434 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3435 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3436 matches the class X, as a and b have the same type.
3437
3438Note that when multiple matches are involved via forEach* matchers,
3439equalsBoundNodes acts as a filter.
3440For example:
3441compoundStmt(
3442 forEachDescendant(varDecl().bind("d")),
3443 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3444will trigger a match for each combination of variable declaration
3445and reference to that variable declaration within a compound statement.
3446</pre></td></tr>
3447
3448
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003449<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>
3450<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3451
3452Stmt has pointer identity in the AST.
3453</pre></td></tr>
3454
3455
Aaron Ballman672dde22016-01-22 23:15:00 +00003456<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 +00003457<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3458partially matching a given regex.
3459
3460Example matches Y but not X
3461 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3462 #include "ASTMatcher.h"
3463 class X {};
3464ASTMatcher.h:
3465 class Y {};
3466
Aaron Ballman672dde22016-01-22 23:15:00 +00003467Usable 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 +00003468</pre></td></tr>
3469
3470
Aaron Ballman672dde22016-01-22 23:15:00 +00003471<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 +00003472<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3473
3474Example matches X but not Y
3475 (matcher = cxxRecordDecl(isExpansionInMainFile())
3476 #include &lt;Y.h&gt;
3477 class X {};
3478Y.h:
3479 class Y {};
3480
Aaron Ballman672dde22016-01-22 23:15:00 +00003481Usable 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 +00003482</pre></td></tr>
3483
3484
Aaron Ballman672dde22016-01-22 23:15:00 +00003485<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 +00003486<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3487
3488Example matches Y but not X
3489 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3490 #include &lt;SystemHeader.h&gt;
3491 class X {};
3492SystemHeader.h:
3493 class Y {};
3494
Aaron Ballman672dde22016-01-22 23:15:00 +00003495Usable 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 +00003496</pre></td></tr>
3497
3498
Etienne Bergeron3588be72016-05-12 04:20:04 +00003499<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>
3500<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3501
3502Given
3503 int a[42];
3504 int b[2 * 21];
3505 int c[41], d[43];
3506 char *s = "abcd";
3507 wchar_t *ws = L"abcd";
3508 char *w = "a";
3509constantArrayType(hasSize(42))
3510 matches "int a[42]" and "int b[2 * 21]"
3511stringLiteral(hasSize(4))
3512 matches "abcd", L"abcd"
3513</pre></td></tr>
3514
3515
Aaron Ballman672dde22016-01-22 23:15:00 +00003516<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 +00003517<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3518
3519Example matches A, va, fa
3520 class A {};
3521 class B; Doesn't match, as it has no body.
3522 int va;
3523 extern int vb; Doesn't match, as it doesn't define the variable.
3524 void fa() {}
3525 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003526 @interface X
3527 - (void)ma; Doesn't match, interface is declaration.
3528 @end
3529 @implementation X
3530 - (void)ma {}
3531 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003532
Dave Leebe398682017-11-14 14:17:26 +00003533Usable 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;,
3534 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003535</pre></td></tr>
3536
3537
Aaron Ballman672dde22016-01-22 23:15:00 +00003538<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 +00003539<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3540
3541Note that 'Value' is a string as the template argument's value is
3542an arbitrary precision integer. 'Value' must be euqal to the canonical
3543representation of that integral value in base 10.
3544
3545Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003546 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003547 C&lt;42&gt; c;
3548classTemplateSpecializationDecl(
3549 hasAnyTemplateArgument(equalsIntegralValue("42")))
3550 matches the implicit instantiation of C in C&lt;42&gt;.
3551</pre></td></tr>
3552
3553
Aaron Ballman672dde22016-01-22 23:15:00 +00003554<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 +00003555<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3556
3557Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003558 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003559 C&lt;42&gt; c;
3560classTemplateSpecializationDecl(
3561 hasAnyTemplateArgument(isIntegral()))
3562 matches the implicit instantiation of C in C&lt;42&gt;
3563 with isIntegral() matching 42.
3564</pre></td></tr>
3565
3566
Aaron Ballman672dde22016-01-22 23:15:00 +00003567<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 +00003568<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3569
3570Given
3571 template&lt;typename T&gt; struct C {};
3572 C&lt;int&gt; c;
3573classTemplateSpecializationDecl(templateArgumentCountIs(1))
3574 matches C&lt;int&gt;.
3575</pre></td></tr>
3576
3577
Aaron Ballman672dde22016-01-22 23:15:00 +00003578<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 +00003579<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3580partially matching a given regex.
3581
3582Example matches Y but not X
3583 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3584 #include "ASTMatcher.h"
3585 class X {};
3586ASTMatcher.h:
3587 class Y {};
3588
Aaron Ballman672dde22016-01-22 23:15:00 +00003589Usable 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 +00003590</pre></td></tr>
3591
3592
Aaron Ballman672dde22016-01-22 23:15:00 +00003593<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 +00003594<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3595
3596Example matches X but not Y
3597 (matcher = cxxRecordDecl(isExpansionInMainFile())
3598 #include &lt;Y.h&gt;
3599 class X {};
3600Y.h:
3601 class Y {};
3602
Aaron Ballman672dde22016-01-22 23:15:00 +00003603Usable 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 +00003604</pre></td></tr>
3605
3606
Aaron Ballman672dde22016-01-22 23:15:00 +00003607<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 +00003608<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3609
3610Example matches Y but not X
3611 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3612 #include &lt;SystemHeader.h&gt;
3613 class X {};
3614SystemHeader.h:
3615 class Y {};
3616
Aaron Ballman672dde22016-01-22 23:15:00 +00003617Usable 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 +00003618</pre></td></tr>
3619
3620
Aaron Ballman672dde22016-01-22 23:15:00 +00003621<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 +00003622<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3623
3624Given
3625 struct S { bool func(); };
3626functionDecl(returns(booleanType()))
3627 matches "bool func();"
3628</pre></td></tr>
3629
3630
Aaron Ballman672dde22016-01-22 23:15:00 +00003631<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003632<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3633
3634Matches a node if it equals the node previously bound to ID.
3635
3636Given
3637 class X { int a; int b; };
3638cxxRecordDecl(
3639 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3640 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3641 matches the class X, as a and b have the same type.
3642
3643Note that when multiple matches are involved via forEach* matchers,
3644equalsBoundNodes acts as a filter.
3645For example:
3646compoundStmt(
3647 forEachDescendant(varDecl().bind("d")),
3648 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3649will trigger a match for each combination of variable declaration
3650and reference to that variable declaration within a compound statement.
3651</pre></td></tr>
3652
3653
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003654<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>
3655<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3656
3657Type has pointer identity in the AST.
3658</pre></td></tr>
3659
3660
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003661<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>
3662<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3663
3664Given
3665 int i;
3666 float f;
3667realFloatingPointType()
3668 matches "float f" but not "int i"
3669</pre></td></tr>
3670
3671
Aaron Ballman672dde22016-01-22 23:15:00 +00003672<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 +00003673<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3674
3675Given
3676 struct S { void func(); };
3677functionDecl(returns(voidType()))
3678 matches "void func();"
3679</pre></td></tr>
3680
3681
Aaron Ballman672dde22016-01-22 23:15:00 +00003682<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 +00003683<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3684
3685Given
3686 int x;
3687 int s = sizeof(x) + alignof(x)
3688unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3689 matches sizeof(x)
3690</pre></td></tr>
3691
3692
Aaron Ballman672dde22016-01-22 23:15:00 +00003693<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 +00003694<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3695unary).
3696
3697Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3698 !(a || b)
3699</pre></td></tr>
3700
3701
Aaron Ballman672dde22016-01-22 23:15:00 +00003702<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 +00003703<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3704
3705Example matches x, but not y, z, or a.
3706(matcher = varDecl(hasAutomaticStorageDuration())
3707void f() {
3708 int x;
3709 static int y;
3710 thread_local int z;
3711}
3712int a;
3713</pre></td></tr>
3714
3715
Aaron Ballman672dde22016-01-22 23:15:00 +00003716<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 +00003717<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3718
3719Example matches y and z (matcher = varDecl(hasGlobalStorage())
3720void f() {
3721 int x;
3722 static int y;
3723}
3724int z;
3725</pre></td></tr>
3726
3727
Aaron Ballman672dde22016-01-22 23:15:00 +00003728<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 +00003729<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3730non-static local variable.
3731
3732Example matches x (matcher = varDecl(hasLocalStorage())
3733void f() {
3734 int x;
3735 static int y;
3736}
3737int z;
3738</pre></td></tr>
3739
3740
Aaron Ballman672dde22016-01-22 23:15:00 +00003741<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 +00003742<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 +00003743It includes the variable declared at namespace scope and those declared
3744with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003745
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003746void f() {
3747 int x;
3748 static int y;
3749 thread_local int z;
3750}
3751int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003752static int b;
3753extern int c;
3754varDecl(hasStaticStorageDuration())
3755 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003756</pre></td></tr>
3757
3758
Aaron Ballman672dde22016-01-22 23:15:00 +00003759<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 +00003760<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3761
3762Example matches z, but not x, z, or a.
3763(matcher = varDecl(hasThreadStorageDuration())
3764void f() {
3765 int x;
3766 static int y;
3767 thread_local int z;
3768}
3769int a;
3770</pre></td></tr>
3771
3772
Aaron Ballman672dde22016-01-22 23:15:00 +00003773<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 +00003774<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3775
3776Given:
3777 constexpr int foo = 42;
3778 constexpr int bar();
3779varDecl(isConstexpr())
3780 matches the declaration of foo.
3781functionDecl(isConstexpr())
3782 matches the declaration of bar.
3783</pre></td></tr>
3784
3785
Aaron Ballman672dde22016-01-22 23:15:00 +00003786<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 +00003787<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3788
3789Example matches A, va, fa
3790 class A {};
3791 class B; Doesn't match, as it has no body.
3792 int va;
3793 extern int vb; Doesn't match, as it doesn't define the variable.
3794 void fa() {}
3795 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003796 @interface X
3797 - (void)ma; Doesn't match, interface is declaration.
3798 @end
3799 @implementation X
3800 - (void)ma {}
3801 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003802
Dave Leebe398682017-11-14 14:17:26 +00003803Usable 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;,
3804 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003805</pre></td></tr>
3806
3807
Aaron Ballman672dde22016-01-22 23:15:00 +00003808<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003809<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3810a C++ catch block, or an Objective-C statement.
3811
3812Example matches x (matcher = varDecl(isExceptionVariable())
3813void f(int y) {
3814 try {
3815 } catch (int x) {
3816 }
3817}
3818</pre></td></tr>
3819
3820
Aaron Ballman672dde22016-01-22 23:15:00 +00003821<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 +00003822<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3823static member variable template instantiations.
3824
3825Given
3826 template&lt;typename T&gt; void A(T t) { }
3827 template&lt;&gt; void A(int N) { }
3828functionDecl(isExplicitTemplateSpecialization())
3829 matches the specialization A&lt;int&gt;().
3830
Aaron Ballman672dde22016-01-22 23:15:00 +00003831Usable 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 +00003832</pre></td></tr>
3833
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003834
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003835<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003836<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003837
3838Given:
3839 extern "C" void f() {}
3840 extern "C" { void g() {} }
3841 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003842 extern "C" int x = 1;
3843 extern "C" int y = 2;
3844 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003845functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003846 matches the declaration of f and g, but not the declaration of h.
3847varDecl(isExternC())
3848 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003849</pre></td></tr>
3850
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003851
Haojian Wub3d25462016-09-26 16:01:52 +00003852<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 +00003853<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3854class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003855
3856Given:
3857 static void f() {}
3858 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003859 extern int j;
3860 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003861functionDecl(isStaticStorageClass())
3862 matches the function declaration f.
3863varDecl(isStaticStorageClass())
3864 matches the variable declaration i.
3865</pre></td></tr>
3866
3867
Aaron Ballman672dde22016-01-22 23:15:00 +00003868<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 +00003869<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3870member variable template instantiations.
3871
3872Given
3873 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3874or
3875 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3876cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3877 matches the template instantiation of X&lt;A&gt;.
3878
3879But given
3880 template &lt;typename T&gt; class X {}; class A {};
3881 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3882cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3883 does not match, as X&lt;A&gt; is an explicit template specialization.
3884
Aaron Ballman672dde22016-01-22 23:15:00 +00003885Usable 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 +00003886</pre></td></tr>
3887
3888
Aaron Ballman672dde22016-01-22 23:15:00 +00003889<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 +00003890<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3891template instantiations.
3892
3893Given
3894 template&lt;typename T&gt; void A(T t) { T i; }
3895 A(0);
3896 A(0U);
3897functionDecl(isInstantiated())
3898 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3899</pre></td></tr>
3900
3901
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003902<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>
3903<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3904GNU's __null, C++11's nullptr, or C's NULL macro.
3905
3906Given:
3907 void *v1 = NULL;
3908 void *v2 = nullptr;
3909 void *v3 = __null; GNU extension
3910 char *cp = (char *)0;
3911 int *ip = 0;
3912 int i = 0;
3913expr(nullPointerConstant())
3914 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3915 initializer for i.
3916</pre></td></tr>
3917
3918
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003919<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>
3920<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3921
3922This matcher is only provided as a performance optimization of hasName.
3923 hasAnyName(a, b, c)
3924 is equivalent to, but faster than
3925 anyOf(hasName(a), hasName(b), hasName(c))
3926</pre></td></tr>
3927
3928
Aaron Ballman672dde22016-01-22 23:15:00 +00003929<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 +00003930<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3931
3932Given
3933 int j;
3934 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3935 A(0);
3936 A(0U);
3937declStmt(isInTemplateInstantiation())
3938 matches 'int i;' and 'unsigned i'.
3939unless(stmt(isInTemplateInstantiation()))
3940 will NOT match j += 42; as it's shared between the template definition and
3941 instantiation.
3942</pre></td></tr>
3943
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003944<!--END_NARROWING_MATCHERS -->
3945</table>
3946
3947<!-- ======================================================================= -->
3948<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3949<!-- ======================================================================= -->
3950
3951<p>Traversal matchers specify the relationship to other nodes that are
3952reachable from the current node.</p>
3953
3954<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3955forEachDescendant) which work on all nodes and allow users to write more generic
3956match expressions.</p>
3957
3958<table>
3959<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003960<!-- START_TRAVERSAL_MATCHERS -->
3961
3962<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>
3963<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3964
3965Unlike anyOf, eachOf will generate a match result for each
3966matching submatcher.
3967
3968For example, in:
3969 class A { int a; int b; };
3970The matcher:
3971 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3972 has(fieldDecl(hasName("b")).bind("v"))))
3973will generate two results binding "v", the first of which binds
3974the field declaration of a, the second the field declaration of
3975b.
3976
3977Usable as: Any Matcher
3978</pre></td></tr>
3979
3980
3981<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3982<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3983provided matcher.
3984
Fangrui Song55942ab2018-01-22 22:34:15 +00003985Example matches X, A, A::X, B, B::C, B::C::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003986 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
Fangrui Song55942ab2018-01-22 22:34:15 +00003987 class X {};
3988 class A { class X {}; }; Matches A, because A::X is a class of name
3989 X inside A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003990 class B { class C { class X {}; }; };
3991
3992DescendantT must be an AST base type.
3993
3994As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3995each result that matches instead of only on the first one.
3996
3997Note: Recursively combined ForEachDescendant can cause many matches:
3998 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3999 forEachDescendant(cxxRecordDecl())
4000 )))
4001will match 10 times (plus injected class name matches) on:
4002 class A { class B { class C { class D { class E {}; }; }; }; };
4003
4004Usable as: Any Matcher
4005</pre></td></tr>
4006
4007
4008<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4009<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4010provided matcher.
4011
Fangrui Song55942ab2018-01-22 22:34:15 +00004012Example matches X, Y, Y::X, Z::Y, Z::Y::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004013 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
Fangrui Song55942ab2018-01-22 22:34:15 +00004014 class X {};
4015 class Y { class X {}; }; Matches Y, because Y::X is a class of name X
4016 inside Y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004017 class Z { class Y { class X {}; }; }; Does not match Z.
4018
4019ChildT must be an AST base type.
4020
4021As opposed to 'has', 'forEach' will cause a match for each result that
4022matches instead of only on the first one.
4023
4024Usable as: Any Matcher
4025</pre></td></tr>
4026
4027
4028<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4029<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4030matcher.
4031
4032Given
4033void f() { if (true) { int x = 42; } }
4034void g() { for (;;) { int x = 43; } }
4035expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4036
4037Usable as: Any Matcher
4038</pre></td></tr>
4039
4040
4041<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4042<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4043provided matcher.
4044
4045Example matches X, Y, Z
4046 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4047 class X {}; Matches X, because X::X is a class of name X inside X.
4048 class Y { class X {}; };
4049 class Z { class Y { class X {}; }; };
4050
4051DescendantT must be an AST base type.
4052
4053Usable as: Any Matcher
4054</pre></td></tr>
4055
4056
4057<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4058<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4059provided matcher.
4060
4061Example matches X, Y
4062 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4063 class X {}; Matches X, because X::X is a class of name X inside X.
4064 class Y { class X {}; };
4065 class Z { class Y { class X {}; }; }; Does not match Z.
4066
4067ChildT must be an AST base type.
4068
4069Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00004070Note that has is direct matcher, so it also matches things like implicit
4071casts and paren casts. If you are matching with expr then you should
4072probably consider using ignoringParenImpCasts like:
4073has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004074</pre></td></tr>
4075
4076
4077<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4078<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4079matcher.
4080
4081Given
4082void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4083compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4084
4085Usable as: Any Matcher
4086</pre></td></tr>
4087
4088
Etienne Bergeron5500f952016-05-30 15:25:25 +00004089<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>
4090<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4091switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004092
4093Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4094 if (true) {}
4095</pre></td></tr>
4096
4097
4098<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>
4099<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4100(binary or ternary).
4101
4102Example matches b
4103 condition ? a : b
4104 condition ?: b
4105</pre></td></tr>
4106
4107
4108<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>
4109<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4110
4111Example 1 (conditional ternary operator): matches a
4112 condition ? a : b
4113
4114Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4115 condition ?: b
4116</pre></td></tr>
4117
4118
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004119<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00004120<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 +00004121matches the given matcher.
4122
4123The associated declaration is:
4124- for type nodes, the declaration of the underlying type
4125- for CallExpr, the declaration of the callee
4126- for MemberExpr, the declaration of the referenced member
4127- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004128- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004129
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004130For type nodes, hasDeclaration will generally match the declaration of the
4131sugared type. Given
4132 class X {};
4133 typedef X Y;
4134 Y y;
4135in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4136typedefDecl. A common use case is to match the underlying, desugared type.
4137This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4138 varDecl(hasType(hasUnqualifiedDesugaredType(
4139 recordType(hasDeclaration(decl())))))
4140In this matcher, the decl will match the CXXRecordDecl of class X.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004141
Manuel Klimeka37e1102016-12-01 15:45:06 +00004142Usable 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;,
4143 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;,
4144 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;,
4145 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;,
4146 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;,
4147 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;,
4148 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004149</pre></td></tr>
4150
4151
Aaron Ballman672dde22016-01-22 23:15:00 +00004152<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004153<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4154
4155Given
4156 int i[5];
4157 void f() { i[1] = 42; }
4158arraySubscriptExpression(hasBase(implicitCastExpr(
4159 hasSourceExpression(declRefExpr()))))
4160 matches i[1] with the declRefExpr() matching i
4161</pre></td></tr>
4162
4163
Aaron Ballman672dde22016-01-22 23:15:00 +00004164<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 +00004165<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4166
4167Given
4168 int i[5];
4169 void f() { i[1] = 42; }
4170arraySubscriptExpression(hasIndex(integerLiteral()))
4171 matches i[1] with the integerLiteral() matching 1
4172</pre></td></tr>
4173
4174
Aaron Ballman672dde22016-01-22 23:15:00 +00004175<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 +00004176<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4177
4178Example matches a (matcher = binaryOperator(hasLHS()))
4179 a || b
4180</pre></td></tr>
4181
4182
Aaron Ballman672dde22016-01-22 23:15:00 +00004183<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 +00004184<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4185
4186Example matches b (matcher = binaryOperator(hasRHS()))
4187 a || b
4188</pre></td></tr>
4189
4190
Aaron Ballman672dde22016-01-22 23:15:00 +00004191<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 +00004192<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4193type.
4194
4195Given
4196 struct A {};
4197 A a[7];
4198 int b[7];
4199arrayType(hasElementType(builtinType()))
4200 matches "int b[7]"
4201
Aaron Ballman672dde22016-01-22 23:15:00 +00004202Usable 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 +00004203</pre></td></tr>
4204
4205
Aaron Ballman672dde22016-01-22 23:15:00 +00004206<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 +00004207<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4208type.
4209
4210Given
4211 struct A {};
4212 A a[7];
4213 int b[7];
4214arrayType(hasElementType(builtinType()))
4215 matches "int b[7]"
4216
Aaron Ballman672dde22016-01-22 23:15:00 +00004217Usable 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 +00004218</pre></td></tr>
4219
4220
Aaron Ballman672dde22016-01-22 23:15:00 +00004221<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 +00004222<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4223
4224Given
4225 _Atomic(int) i;
4226 _Atomic(float) f;
4227atomicType(hasValueType(isInteger()))
4228 matches "_Atomic(int) i"
4229
Aaron Ballman672dde22016-01-22 23:15:00 +00004230Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004231</pre></td></tr>
4232
4233
Aaron Ballman672dde22016-01-22 23:15:00 +00004234<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 +00004235<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4236
4237Given
4238 _Atomic(int) i;
4239 _Atomic(float) f;
4240atomicType(hasValueType(isInteger()))
4241 matches "_Atomic(int) i"
4242
Aaron Ballman672dde22016-01-22 23:15:00 +00004243Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004244</pre></td></tr>
4245
4246
Aaron Ballman672dde22016-01-22 23:15:00 +00004247<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 +00004248<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4249
4250Note: There is no TypeLoc for the deduced type and thus no
4251getDeducedLoc() matcher.
4252
4253Given
4254 auto a = 1;
4255 auto b = 2.0;
4256autoType(hasDeducedType(isInteger()))
4257 matches "auto a"
4258
Aaron Ballman672dde22016-01-22 23:15:00 +00004259Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004260</pre></td></tr>
4261
4262
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004263<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>const 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 +00004264<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4265binary operator matches.
4266</pre></td></tr>
4267
4268
Aaron Ballman672dde22016-01-22 23:15:00 +00004269<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 +00004270<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4271
4272Example matches a (matcher = binaryOperator(hasLHS()))
4273 a || b
4274</pre></td></tr>
4275
4276
Aaron Ballman672dde22016-01-22 23:15:00 +00004277<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 +00004278<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4279
4280Example matches b (matcher = binaryOperator(hasRHS()))
4281 a || b
4282</pre></td></tr>
4283
4284
Aaron Ballman672dde22016-01-22 23:15:00 +00004285<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 +00004286<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4287pointee matches a given matcher.
4288
4289Given
4290 int *a;
4291 int const *b;
4292 float const *f;
4293pointerType(pointee(isConstQualified(), isInteger()))
4294 matches "int const *b"
4295
Aaron Ballman672dde22016-01-22 23:15:00 +00004296Usable 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;,
4297 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 +00004298</pre></td></tr>
4299
4300
Aaron Ballman672dde22016-01-22 23:15:00 +00004301<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 +00004302<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4303pointee matches a given matcher.
4304
4305Given
4306 int *a;
4307 int const *b;
4308 float const *f;
4309pointerType(pointee(isConstQualified(), isInteger()))
4310 matches "int const *b"
4311
Aaron Ballman672dde22016-01-22 23:15:00 +00004312Usable 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;,
4313 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 +00004314</pre></td></tr>
4315
4316
Aaron Ballman672dde22016-01-22 23:15:00 +00004317<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 +00004318<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4319
4320Given
4321 void f(int i);
4322 int y;
4323 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004324callExpr(
4325 forEachArgumentWithParam(
4326 declRefExpr(to(varDecl(hasName("y")))),
4327 parmVarDecl(hasType(isInteger()))
4328))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004329 matches f(y);
4330with declRefExpr(...)
4331 matching int y
4332and parmVarDecl(...)
4333 matching int i
4334</pre></td></tr>
4335
4336
Aaron Ballman672dde22016-01-22 23:15:00 +00004337<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004338<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4339expression.
4340
4341Given
4342 void x(int, int, int) { int y; x(1, y, 42); }
4343callExpr(hasAnyArgument(declRefExpr()))
4344 matches x(1, y, 42)
4345with hasAnyArgument(...)
4346 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004347</pre></td></tr>
4348
4349
Aaron Ballman672dde22016-01-22 23:15:00 +00004350<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 +00004351<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4352call expression.
4353
4354Example matches y in x(y)
4355 (matcher = callExpr(hasArgument(0, declRefExpr())))
4356 void x(int) { int y; x(y); }
4357</pre></td></tr>
4358
4359
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004360<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004361<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 +00004362matches the given matcher.
4363
4364The associated declaration is:
4365- for type nodes, the declaration of the underlying type
4366- for CallExpr, the declaration of the callee
4367- for MemberExpr, the declaration of the referenced member
4368- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004369- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004370
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004371For type nodes, hasDeclaration will generally match the declaration of the
4372sugared type. Given
4373 class X {};
4374 typedef X Y;
4375 Y y;
4376in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4377typedefDecl. A common use case is to match the underlying, desugared type.
4378This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4379 varDecl(hasType(hasUnqualifiedDesugaredType(
4380 recordType(hasDeclaration(decl())))))
4381In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004382
Manuel Klimeka37e1102016-12-01 15:45:06 +00004383Usable 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;,
4384 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;,
4385 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;,
4386 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;,
4387 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;,
4388 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;,
4389 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004390</pre></td></tr>
4391
4392
Aaron Ballman672dde22016-01-22 23:15:00 +00004393<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 +00004394<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4395
4396Given
4397 class A { A() : i(42), j(42) {} int i; int j; };
4398cxxConstructorDecl(forEachConstructorInitializer(
4399 forField(decl().bind("x"))
4400))
4401 will trigger two matches, binding for 'i' and 'j' respectively.
4402</pre></td></tr>
4403
4404
Aaron Ballman672dde22016-01-22 23:15:00 +00004405<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 +00004406<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4407
4408Given
4409 struct Foo {
4410 Foo() : foo_(1) { }
4411 int foo_;
4412 };
4413cxxRecordDecl(has(cxxConstructorDecl(
4414 hasAnyConstructorInitializer(anything())
4415)))
4416 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4417</pre></td></tr>
4418
4419
Aaron Ballman672dde22016-01-22 23:15:00 +00004420<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 +00004421<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4422
4423Given
4424 struct Foo {
4425 Foo() : foo_(1) { }
4426 int foo_;
4427 };
4428cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4429 forField(hasName("foo_"))))))
4430 matches Foo
4431with forField matching foo_
4432</pre></td></tr>
4433
4434
Aaron Ballman672dde22016-01-22 23:15:00 +00004435<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004436<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4437
4438Given
4439 struct Foo {
4440 Foo() : foo_(1) { }
4441 int foo_;
4442 };
4443cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4444 withInitializer(integerLiteral(equals(1)))))))
4445 matches Foo
4446with withInitializer matching (1)
4447</pre></td></tr>
4448
4449
Aaron Ballman672dde22016-01-22 23:15:00 +00004450<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 +00004451<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4452definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004453
4454Given
4455 for (;;) {}
4456hasBody(compoundStmt())
4457 matches 'for (;;) {}'
4458with compoundStmt()
4459 matching '{}'
4460</pre></td></tr>
4461
4462
Aaron Ballman672dde22016-01-22 23:15:00 +00004463<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004464<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4465
4466Example:
4467 forStmt(hasLoopVariable(anything()))
4468matches 'int x' in
4469 for (int x : a) { }
4470</pre></td></tr>
4471
4472
Aaron Ballman672dde22016-01-22 23:15:00 +00004473<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 +00004474<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4475
4476Example:
4477 forStmt(hasRangeInit(anything()))
4478matches 'a' in
4479 for (int x : a) { }
4480</pre></td></tr>
4481
4482
Aaron Ballman672dde22016-01-22 23:15:00 +00004483<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 +00004484<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4485
4486
Aaron Ballman672dde22016-01-22 23:15:00 +00004487<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 +00004488<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4489
4490Example matches y.x()
4491 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4492 class Y { public: void x(); };
Fangrui Song55942ab2018-01-22 22:34:15 +00004493 void z() { Y y; y.x(); }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004494
4495FIXME: Overload to allow directly matching types?
4496</pre></td></tr>
4497
4498
Aaron Ballman672dde22016-01-22 23:15:00 +00004499<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 +00004500<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4501</pre></td></tr>
4502
4503
Aaron Ballman672dde22016-01-22 23:15:00 +00004504<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 +00004505<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4506matcher, or is a pointer to a type that matches the InnerMatcher.
4507</pre></td></tr>
4508
4509
Clement Courbet6ecaec82016-07-05 07:49:31 +00004510<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 +00004511<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 +00004512produce multiple matches.
4513
4514Given
4515 class A { virtual void f(); };
4516 class B : public A { void f(); };
4517 class C : public B { void f(); };
4518cxxMethodDecl(ofClass(hasName("C")),
4519 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4520 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4521 that B::f is not overridden by C::f).
4522
4523The check can produce multiple matches in case of multiple inheritance, e.g.
4524 class A1 { virtual void f(); };
4525 class A2 { virtual void f(); };
4526 class C : public A1, public A2 { void f(); };
4527cxxMethodDecl(ofClass(hasName("C")),
4528 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4529 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4530 once with "b" binding "A2::f" and "d" binding "C::f".
4531</pre></td></tr>
4532
4533
Aaron Ballman672dde22016-01-22 23:15:00 +00004534<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 +00004535<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4536belongs to.
4537
4538FIXME: Generalize this for other kinds of declarations.
4539FIXME: What other kind of declarations would we need to generalize
4540this to?
4541
4542Example matches A() in the last line
4543 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4544 ofClass(hasName("A"))))))
4545 class A {
4546 public:
4547 A();
4548 };
4549 A a = A();
4550</pre></td></tr>
4551
4552
Adam Baloghda488a62017-11-23 12:43:20 +00004553<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4554<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
4555
4556Given:
4557 MyClass *p1 = new MyClass[10];
4558cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
4559 matches the expression 'new MyClass[10]'.
4560</pre></td></tr>
4561
4562
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004563<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00004564<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 +00004565matches the given matcher.
4566
4567The associated declaration is:
4568- for type nodes, the declaration of the underlying type
4569- for CallExpr, the declaration of the callee
4570- for MemberExpr, the declaration of the referenced member
4571- for CXXConstructExpr, the declaration of the constructor
4572- for CXXNewExpr, the declaration of the operator new
4573
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004574For type nodes, hasDeclaration will generally match the declaration of the
4575sugared type. Given
4576 class X {};
4577 typedef X Y;
4578 Y y;
4579in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4580typedefDecl. A common use case is to match the underlying, desugared type.
4581This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4582 varDecl(hasType(hasUnqualifiedDesugaredType(
4583 recordType(hasDeclaration(decl())))))
4584In this matcher, the decl will match the CXXRecordDecl of class X.
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004585
Manuel Klimeka37e1102016-12-01 15:45:06 +00004586Usable 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;,
4587 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;,
4588 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;,
4589 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;,
4590 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;,
4591 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;,
4592 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004593</pre></td></tr>
4594
4595
Aaron Ballman672dde22016-01-22 23:15:00 +00004596<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004597<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4598
4599Given:
4600 class A { void func(); };
4601 class B { void member(); };
4602
4603cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4604A but not B.
4605</pre></td></tr>
4606
4607
Aaron Ballman672dde22016-01-22 23:15:00 +00004608<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 +00004609<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4610a class matching Base.
4611
4612Note that a class is not considered to be derived from itself.
4613
4614Example matches Y, Z, C (Base == hasName("X"))
4615 class X;
4616 class Y : public X {}; directly derived
4617 class Z : public Y {}; indirectly derived
4618 typedef X A;
4619 typedef A B;
4620 class C : public B {}; derived from a typedef of X
4621
4622In the following example, Bar matches isDerivedFrom(hasName("X")):
4623 class Foo;
4624 typedef Foo X;
4625 class Bar : public Foo {}; derived from a type that X is a typedef of
4626</pre></td></tr>
4627
4628
Aaron Ballman672dde22016-01-22 23:15:00 +00004629<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 +00004630<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4631match Base.
4632</pre></td></tr>
4633
4634
Aaron Ballman672dde22016-01-22 23:15:00 +00004635<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004636<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4637given matcher.
4638
4639Example matches y.x() (matcher = callExpr(callee(
4640 cxxMethodDecl(hasName("x")))))
4641 class Y { public: void x(); };
4642 void z() { Y y; y.x(); }
4643</pre></td></tr>
4644
4645
Aaron Ballman672dde22016-01-22 23:15:00 +00004646<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 +00004647<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4648
4649Given
4650 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4651 void f() { f(); }
4652callExpr(callee(expr()))
4653 matches this-&gt;x(), x(), y.x(), f()
4654with callee(...)
4655 matching this-&gt;x, x, y.x, f respectively
4656
Aaron Ballman672dde22016-01-22 23:15:00 +00004657Note: 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 +00004658because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004659internal::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 +00004660implemented in terms of implicit casts.
4661</pre></td></tr>
4662
4663
Aaron Ballman672dde22016-01-22 23:15:00 +00004664<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 +00004665<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4666
4667Given
4668 void f(int i);
4669 int y;
4670 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004671callExpr(
4672 forEachArgumentWithParam(
4673 declRefExpr(to(varDecl(hasName("y")))),
4674 parmVarDecl(hasType(isInteger()))
4675))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004676 matches f(y);
4677with declRefExpr(...)
4678 matching int y
4679and parmVarDecl(...)
4680 matching int i
4681</pre></td></tr>
4682
4683
Aaron Ballman672dde22016-01-22 23:15:00 +00004684<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004685<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4686expression.
4687
4688Given
4689 void x(int, int, int) { int y; x(1, y, 42); }
4690callExpr(hasAnyArgument(declRefExpr()))
4691 matches x(1, y, 42)
4692with hasAnyArgument(...)
4693 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004694</pre></td></tr>
4695
4696
Aaron Ballman672dde22016-01-22 23:15:00 +00004697<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 +00004698<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4699call expression.
4700
4701Example matches y in x(y)
4702 (matcher = callExpr(hasArgument(0, declRefExpr())))
4703 void x(int) { int y; x(y); }
4704</pre></td></tr>
4705
4706
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004707<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004708<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 +00004709matches the given matcher.
4710
4711The associated declaration is:
4712- for type nodes, the declaration of the underlying type
4713- for CallExpr, the declaration of the callee
4714- for MemberExpr, the declaration of the referenced member
4715- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004716- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004717
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004718For type nodes, hasDeclaration will generally match the declaration of the
4719sugared type. Given
4720 class X {};
4721 typedef X Y;
4722 Y y;
4723in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4724typedefDecl. A common use case is to match the underlying, desugared type.
4725This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4726 varDecl(hasType(hasUnqualifiedDesugaredType(
4727 recordType(hasDeclaration(decl())))))
4728In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004729
Manuel Klimeka37e1102016-12-01 15:45:06 +00004730Usable 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;,
4731 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;,
4732 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;,
4733 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;,
4734 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;,
4735 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;,
4736 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004737</pre></td></tr>
4738
4739
Aaron Ballman672dde22016-01-22 23:15:00 +00004740<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 +00004741<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4742extension, matches the constant given in the statement.
4743
4744Given
4745 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4746caseStmt(hasCaseConstant(integerLiteral()))
4747 matches "case 1:"
4748</pre></td></tr>
4749
4750
Aaron Ballman672dde22016-01-22 23:15:00 +00004751<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>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004752<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
4753or opaque value's source expression matches the given matcher.
4754
4755Example 1: matches "a string"
4756(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
4757class URL { URL(string); };
4758URL url = "a string";
4759
4760Example 2: matches 'b' (matcher =
4761opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
4762int a = b ?: 1;
4763</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004764
4765
Aaron Ballman672dde22016-01-22 23:15:00 +00004766<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 +00004767<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4768functionDecl that have at least one TemplateArgument matching the given
4769InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004770
4771Given
4772 template&lt;typename T&gt; class A {};
4773 template&lt;&gt; class A&lt;double&gt; {};
4774 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004775
Haojian Wu99e39a72016-07-29 17:30:13 +00004776 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004777 void func() { f&lt;int&gt;(); };
4778
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004779classTemplateSpecializationDecl(hasAnyTemplateArgument(
4780 refersToType(asString("int"))))
4781 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004782
4783functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4784 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004785</pre></td></tr>
4786
4787
Manuel Klimek696e5052017-08-02 13:04:44 +00004788<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
4789<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4790
4791Given
4792 tempalate&lt;typename T&gt; class A {};
4793 typedef A&lt;int&gt; B;
4794classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4795 matches 'B' with classTemplateDecl() matching the class template
4796 declaration of 'A'.
4797</pre></td></tr>
4798
4799
Aaron Ballman672dde22016-01-22 23:15:00 +00004800<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 +00004801<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4802functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004803
4804Given
4805 template&lt;typename T, typename U&gt; class A {};
4806 A&lt;bool, int&gt; b;
4807 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004808
Fangrui Song55942ab2018-01-22 22:34:15 +00004809 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00004810 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004811classTemplateSpecializationDecl(hasTemplateArgument(
4812 1, refersToType(asString("int"))))
4813 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004814
4815functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4816 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004817</pre></td></tr>
4818
4819
Aaron Ballman672dde22016-01-22 23:15:00 +00004820<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 +00004821<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4822type.
4823
4824Given
4825 struct A {};
4826 A a[7];
4827 int b[7];
4828arrayType(hasElementType(builtinType()))
4829 matches "int b[7]"
4830
Aaron Ballman672dde22016-01-22 23:15:00 +00004831Usable 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 +00004832</pre></td></tr>
4833
4834
Aaron Ballman672dde22016-01-22 23:15:00 +00004835<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 +00004836<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4837type.
4838
4839Given
4840 struct A {};
4841 A a[7];
4842 int b[7];
4843arrayType(hasElementType(builtinType()))
4844 matches "int b[7]"
4845
Aaron Ballman672dde22016-01-22 23:15:00 +00004846Usable 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 +00004847</pre></td></tr>
4848
4849
Aaron Ballman672dde22016-01-22 23:15:00 +00004850<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004851<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 +00004852a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004853
4854Given
4855 { {}; 1+2; }
4856hasAnySubstatement(compoundStmt())
4857 matches '{ {}; 1+2; }'
4858with compoundStmt()
4859 matching '{}'
4860</pre></td></tr>
4861
4862
Aaron Ballman672dde22016-01-22 23:15:00 +00004863<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 +00004864<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4865</pre></td></tr>
4866
4867
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004868<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00004869<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 +00004870matches the given matcher.
4871
4872The associated declaration is:
4873- for type nodes, the declaration of the underlying type
4874- for CallExpr, the declaration of the callee
4875- for MemberExpr, the declaration of the referenced member
4876- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004877- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004878
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004879For type nodes, hasDeclaration will generally match the declaration of the
4880sugared type. Given
4881 class X {};
4882 typedef X Y;
4883 Y y;
4884in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4885typedefDecl. A common use case is to match the underlying, desugared type.
4886This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4887 varDecl(hasType(hasUnqualifiedDesugaredType(
4888 recordType(hasDeclaration(decl())))))
4889In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004890
Manuel Klimeka37e1102016-12-01 15:45:06 +00004891Usable 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;,
4892 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;,
4893 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;,
4894 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;,
4895 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;,
4896 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;,
4897 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004898</pre></td></tr>
4899
4900
Aaron Ballman672dde22016-01-22 23:15:00 +00004901<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004902<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4903specific using shadow declaration.
4904
4905Given
4906 namespace a { void f() {} }
4907 using a::f;
4908 void g() {
4909 f(); Matches this ..
4910 a::f(); .. but not this.
4911 }
4912declRefExpr(throughUsingDecl(anything()))
4913 matches f()
4914</pre></td></tr>
4915
4916
Aaron Ballman672dde22016-01-22 23:15:00 +00004917<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 +00004918<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4919specified matcher.
4920
4921Example matches x in if(x)
4922 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4923 bool x;
4924 if (x) {}
4925</pre></td></tr>
4926
4927
Aaron Ballman672dde22016-01-22 23:15:00 +00004928<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 +00004929<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4930
4931Note that this does not work for global declarations because the AST
4932breaks up multiple-declaration DeclStmt's into multiple single-declaration
4933DeclStmt's.
4934Example: Given non-global declarations
4935 int a, b = 0;
4936 int c;
4937 int d = 2, e;
4938declStmt(containsDeclaration(
4939 0, varDecl(hasInitializer(anything()))))
4940 matches only 'int d = 2, e;', and
4941declStmt(containsDeclaration(1, varDecl()))
4942 matches 'int a, b = 0' as well as 'int d = 2, e;'
4943 but 'int c;' is not matched.
4944</pre></td></tr>
4945
4946
Aaron Ballman672dde22016-01-22 23:15:00 +00004947<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 +00004948<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4949
4950Given
4951 int a, b;
4952 int c;
4953declStmt(hasSingleDecl(anything()))
4954 matches 'int c;' but not 'int a, b;'.
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_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 +00004959<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4960the inner matcher.
4961
4962Given
4963 int x;
4964declaratorDecl(hasTypeLoc(loc(asString("int"))))
4965 matches int x
4966</pre></td></tr>
4967
4968
Aaron Ballman672dde22016-01-22 23:15:00 +00004969<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 +00004970<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4971Decl, matches InnerMatcher.
4972
4973Given
4974 namespace N {
4975 namespace M {
4976 class D {};
4977 }
4978 }
4979
4980cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4981declaration of class D.
4982</pre></td></tr>
4983
4984
Aaron Ballman672dde22016-01-22 23:15:00 +00004985<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004986<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4987definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004988
4989Given
4990 for (;;) {}
4991hasBody(compoundStmt())
4992 matches 'for (;;) {}'
4993with compoundStmt()
4994 matching '{}'
4995</pre></td></tr>
4996
4997
Aaron Ballman672dde22016-01-22 23:15:00 +00004998<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 +00004999<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 +00005000switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005001
5002Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5003 if (true) {}
5004</pre></td></tr>
5005
5006
Aaron Ballman672dde22016-01-22 23:15:00 +00005007<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 +00005008<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5009matches InnerMatcher if the qualifier exists.
5010
5011Given
5012 namespace N {
5013 namespace M {
5014 class D {};
5015 }
5016 }
5017 N::M::D d;
5018
5019elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5020matches the type of the variable declaration of d.
5021</pre></td></tr>
5022
5023
Aaron Ballman672dde22016-01-22 23:15:00 +00005024<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 +00005025<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5026
5027Given
5028 namespace N {
5029 namespace M {
5030 class D {};
5031 }
5032 }
5033 N::M::D d;
5034
5035elaboratedType(namesType(recordType(
5036hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5037declaration of d.
5038</pre></td></tr>
5039
5040
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005041<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005042<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 +00005043matches the given matcher.
5044
5045The associated declaration is:
5046- for type nodes, the declaration of the underlying type
5047- for CallExpr, the declaration of the callee
5048- for MemberExpr, the declaration of the referenced member
5049- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005050- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005051
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005052For type nodes, hasDeclaration will generally match the declaration of the
5053sugared type. Given
5054 class X {};
5055 typedef X Y;
5056 Y y;
5057in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5058typedefDecl. A common use case is to match the underlying, desugared type.
5059This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5060 varDecl(hasType(hasUnqualifiedDesugaredType(
5061 recordType(hasDeclaration(decl())))))
5062In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005063
Manuel Klimeka37e1102016-12-01 15:45:06 +00005064Usable 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;,
5065 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;,
5066 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;,
5067 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;,
5068 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;,
5069 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;,
5070 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005071</pre></td></tr>
5072
5073
Aaron Ballman672dde22016-01-22 23:15:00 +00005074<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 +00005075<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5076
5077(Note: Clang's AST refers to other conversions as "casts" too, and calls
5078actual casts "explicit" casts.)
5079</pre></td></tr>
5080
5081
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005082<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>
5083<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 +00005084declaration's type.
5085
5086In case of a value declaration (for example a variable declaration),
5087this resolves one layer of indirection. For example, in the value
5088declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5089X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5090declaration of x.
5091
5092Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5093 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5094 class X {};
5095 void y(X &amp;x) { x; X z; }
5096
Aaron Ballman672dde22016-01-22 23:15:00 +00005097Usable 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 +00005098</pre></td></tr>
5099
5100
Aaron Ballman672dde22016-01-22 23:15:00 +00005101<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 +00005102<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5103matcher.
5104
5105Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5106 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005107 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005108 class X {};
5109 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005110 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005111</pre></td></tr>
5112
5113
Aaron Ballman672dde22016-01-22 23:15:00 +00005114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005115<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5116are stripped off.
5117
5118Parentheses and explicit casts are not discarded.
5119Given
5120 int arr[5];
5121 int a = 0;
5122 char b = 0;
5123 const int c = a;
5124 int *d = arr;
5125 long e = (long) 0l;
5126The matchers
5127 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5128 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5129would match the declarations for a, b, c, and d, but not e.
5130While
5131 varDecl(hasInitializer(integerLiteral()))
5132 varDecl(hasInitializer(declRefExpr()))
5133only match the declarations for b, c, and d.
5134</pre></td></tr>
5135
5136
Cong Liu8a02efb2016-06-24 09:38:03 +00005137<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>
5138<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5139nodes are stripped off.
5140
5141Parentheses and explicit casts are not discarded.
5142Given
5143 class C {};
5144 C a = C();
5145 C b;
5146 C c = b;
5147The matchers
5148 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5149would match the declarations for a, b, and c.
5150While
5151 varDecl(hasInitializer(cxxConstructExpr()))
5152only match the declarations for b and c.
5153</pre></td></tr>
5154
5155
Aaron Ballman672dde22016-01-22 23:15:00 +00005156<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 +00005157<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5158casts are stripped off.
5159
5160Implicit and non-C Style casts are also discarded.
5161Given
5162 int a = 0;
5163 char b = (0);
5164 void* c = reinterpret_cast&lt;char*&gt;(0);
5165 char d = char(0);
5166The matcher
5167 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5168would match the declarations for a, b, c, and d.
5169while
5170 varDecl(hasInitializer(integerLiteral()))
5171only match the declaration for a.
5172</pre></td></tr>
5173
5174
Aaron Ballman672dde22016-01-22 23:15:00 +00005175<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 +00005176<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5177parentheses are stripped off.
5178
5179Explicit casts are not discarded.
5180Given
5181 int arr[5];
5182 int a = 0;
5183 char b = (0);
5184 const int c = a;
5185 int *d = (arr);
5186 long e = ((long) 0l);
5187The matchers
5188 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5189 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5190would match the declarations for a, b, c, and d, but not e.
5191while
5192 varDecl(hasInitializer(integerLiteral()))
5193 varDecl(hasInitializer(declRefExpr()))
5194would only match the declaration for a.
5195</pre></td></tr>
5196
5197
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00005198<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>
5199<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5200
5201Given
5202 class C {
5203 int a = 2;
5204 int b = 3;
5205 int c;
5206 };
5207fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5208 matches 'int a;' but not 'int b;'.
5209fieldDecl(hasInClassInitializer(anything()))
5210 matches 'int a;' and 'int b;' but not 'int c;'.
5211</pre></td></tr>
5212
5213
Aaron Ballman672dde22016-01-22 23:15:00 +00005214<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 +00005215<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5216definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005217
5218Given
5219 for (;;) {}
5220hasBody(compoundStmt())
5221 matches 'for (;;) {}'
5222with compoundStmt()
5223 matching '{}'
5224</pre></td></tr>
5225
5226
Aaron Ballman672dde22016-01-22 23:15:00 +00005227<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 +00005228<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 +00005229switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005230
5231Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5232 if (true) {}
5233</pre></td></tr>
5234
5235
Aaron Ballman672dde22016-01-22 23:15:00 +00005236<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005237<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5238
5239Example:
5240 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5241matches '++x' in
5242 for (x; x &lt; N; ++x) { }
5243</pre></td></tr>
5244
5245
Aaron Ballman672dde22016-01-22 23:15:00 +00005246<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 +00005247<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5248
5249Example:
5250 forStmt(hasLoopInit(declStmt()))
5251matches 'int x = 0' in
5252 for (int x = 0; x &lt; N; ++x) { }
5253</pre></td></tr>
5254
5255
Aaron Ballman672dde22016-01-22 23:15:00 +00005256<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005257<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5258
5259Does not match the 'this' parameter of a method.
5260
5261Given
5262 class X { void f(int x, int y, int z) {} };
5263cxxMethodDecl(hasAnyParameter(hasName("y")))
5264 matches f(int x, int y, int z) {}
5265with hasAnyParameter(...)
5266 matching int y
5267</pre></td></tr>
5268
5269
Haojian Wud898b092016-07-29 13:57:27 +00005270<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>
5271<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5272functionDecl that have at least one TemplateArgument matching the given
5273InnerMatcher.
5274
5275Given
5276 template&lt;typename T&gt; class A {};
5277 template&lt;&gt; class A&lt;double&gt; {};
5278 A&lt;int&gt; a;
5279
Haojian Wu99e39a72016-07-29 17:30:13 +00005280 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005281 void func() { f&lt;int&gt;(); };
5282
5283classTemplateSpecializationDecl(hasAnyTemplateArgument(
5284 refersToType(asString("int"))))
5285 matches the specialization A&lt;int&gt;
5286
5287functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5288 matches the specialization f&lt;int&gt;
5289</pre></td></tr>
5290
5291
Aaron Ballman672dde22016-01-22 23:15:00 +00005292<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 +00005293<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5294definition that has a given body.
5295
5296Given
5297 for (;;) {}
5298hasBody(compoundStmt())
5299 matches 'for (;;) {}'
5300with compoundStmt()
5301 matching '{}'
5302</pre></td></tr>
5303
5304
Aaron Ballman672dde22016-01-22 23:15:00 +00005305<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 +00005306<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5307
5308Given
5309 class X { void f(int x) {} };
5310cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5311 matches f(int x) {}
5312with hasParameter(...)
5313 matching int x
5314</pre></td></tr>
5315
5316
Haojian Wud898b092016-07-29 13:57:27 +00005317<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>
5318<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5319functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5320
5321Given
5322 template&lt;typename T, typename U&gt; class A {};
5323 A&lt;bool, int&gt; b;
5324 A&lt;int, bool&gt; c;
5325
Fangrui Song55942ab2018-01-22 22:34:15 +00005326 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005327 void func() { f&lt;int&gt;(); };
5328classTemplateSpecializationDecl(hasTemplateArgument(
5329 1, refersToType(asString("int"))))
5330 matches the specialization A&lt;bool, int&gt;
5331
5332functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5333 matches the specialization f&lt;int&gt;
5334</pre></td></tr>
5335
5336
Aaron Ballman672dde22016-01-22 23:15:00 +00005337<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 +00005338<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5339
5340Given:
5341 class X { int f() { return 1; } };
5342cxxMethodDecl(returns(asString("int")))
5343 matches int f() { return 1; }
5344</pre></td></tr>
5345
5346
Aaron Ballman672dde22016-01-22 23:15:00 +00005347<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 +00005348<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 +00005349switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005350
5351Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5352 if (true) {}
5353</pre></td></tr>
5354
5355
Aaron Ballman672dde22016-01-22 23:15:00 +00005356<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 +00005357<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5358
5359Given
5360 if (A* a = GetAPointer()) {}
5361hasConditionVariableStatement(...)
5362 matches 'A* a = GetAPointer()'.
5363</pre></td></tr>
5364
5365
Aaron Ballman672dde22016-01-22 23:15:00 +00005366<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 +00005367<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5368
5369Examples matches the if statement
5370 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5371 if (false) false; else true;
5372</pre></td></tr>
5373
5374
Aaron Ballman672dde22016-01-22 23:15:00 +00005375<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 +00005376<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5377
5378Examples matches the if statement
5379 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5380 if (false) true; else false;
5381</pre></td></tr>
5382
5383
Aaron Ballman672dde22016-01-22 23:15:00 +00005384<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005385<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5386matcher.
5387
5388FIXME: Unit test this matcher
5389</pre></td></tr>
5390
5391
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005392<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>
5393<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5394(if expression have it).
5395</pre></td></tr>
5396
5397
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005398<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>const 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 +00005399<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5400matches the given matcher.
5401
5402The associated declaration is:
5403- for type nodes, the declaration of the underlying type
5404- for CallExpr, the declaration of the callee
5405- for MemberExpr, the declaration of the referenced member
5406- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005407- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005408
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005409For type nodes, hasDeclaration will generally match the declaration of the
5410sugared type. Given
5411 class X {};
5412 typedef X Y;
5413 Y y;
5414in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5415typedefDecl. A common use case is to match the underlying, desugared type.
5416This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5417 varDecl(hasType(hasUnqualifiedDesugaredType(
5418 recordType(hasDeclaration(decl())))))
5419In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005420
Manuel Klimeka37e1102016-12-01 15:45:06 +00005421Usable 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;,
5422 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;,
5423 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;,
5424 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;,
5425 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;,
5426 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;,
5427 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5428</pre></td></tr>
5429
5430
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005431<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005432<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5433matches the given matcher.
5434
5435The associated declaration is:
5436- for type nodes, the declaration of the underlying type
5437- for CallExpr, the declaration of the callee
5438- for MemberExpr, the declaration of the referenced member
5439- for CXXConstructExpr, the declaration of the constructor
5440- for CXXNewExpr, the declaration of the operator new
5441
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005442For type nodes, hasDeclaration will generally match the declaration of the
5443sugared type. Given
5444 class X {};
5445 typedef X Y;
5446 Y y;
5447in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5448typedefDecl. A common use case is to match the underlying, desugared type.
5449This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5450 varDecl(hasType(hasUnqualifiedDesugaredType(
5451 recordType(hasDeclaration(decl())))))
5452In this matcher, the decl will match the CXXRecordDecl of class X.
Manuel Klimeka37e1102016-12-01 15:45:06 +00005453
5454Usable 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;,
5455 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;,
5456 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;,
5457 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;,
5458 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;,
5459 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;,
5460 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005461</pre></td></tr>
5462
5463
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005464<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005465<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5466matches the given matcher.
5467
5468The associated declaration is:
5469- for type nodes, the declaration of the underlying type
5470- for CallExpr, the declaration of the callee
5471- for MemberExpr, the declaration of the referenced member
5472- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005473- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005474
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005475For type nodes, hasDeclaration will generally match the declaration of the
5476sugared type. Given
5477 class X {};
5478 typedef X Y;
5479 Y y;
5480in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5481typedefDecl. A common use case is to match the underlying, desugared type.
5482This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5483 varDecl(hasType(hasUnqualifiedDesugaredType(
5484 recordType(hasDeclaration(decl())))))
5485In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005486
Manuel Klimeka37e1102016-12-01 15:45:06 +00005487Usable 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;,
5488 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;,
5489 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;,
5490 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;,
5491 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;,
5492 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;,
5493 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005494</pre></td></tr>
5495
5496
Aaron Ballman672dde22016-01-22 23:15:00 +00005497<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 +00005498<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5499matched by a given matcher.
5500
5501Given
5502 struct X { int m; };
5503 void f(X x) { x.m; m; }
5504memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5505 matches "x.m" and "m"
5506with hasObjectExpression(...)
5507 matching "x" and the implicit object expression of "m" which has type X*.
5508</pre></td></tr>
5509
5510
Aaron Ballman672dde22016-01-22 23:15:00 +00005511<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 +00005512<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5513given matcher.
5514
5515Given
5516 struct { int first, second; } first, second;
5517 int i(second.first);
5518 int j(first.second);
5519memberExpr(member(hasName("first")))
5520 matches second.first
5521 but not first.second (because the member name there is "second").
5522</pre></td></tr>
5523
5524
Aaron Ballman672dde22016-01-22 23:15:00 +00005525<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 +00005526<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5527pointee matches a given matcher.
5528
5529Given
5530 int *a;
5531 int const *b;
5532 float const *f;
5533pointerType(pointee(isConstQualified(), isInteger()))
5534 matches "int const *b"
5535
Aaron Ballman672dde22016-01-22 23:15:00 +00005536Usable 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;,
5537 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 +00005538</pre></td></tr>
5539
5540
Aaron Ballman672dde22016-01-22 23:15:00 +00005541<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 +00005542<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5543pointee matches a given matcher.
5544
5545Given
5546 int *a;
5547 int const *b;
5548 float const *f;
5549pointerType(pointee(isConstQualified(), isInteger()))
5550 matches "int const *b"
5551
Aaron Ballman672dde22016-01-22 23:15:00 +00005552Usable 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;,
5553 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 +00005554</pre></td></tr>
5555
5556
Martin Bohme8cef2c22016-08-09 15:07:52 +00005557<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>
5558<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5559matcher.
5560
5561Given
5562 namespace N { template&lt;class T&gt; void f(T t); }
5563 template &lt;class T&gt; void g() { using N::f; f(T()); }
5564unresolvedLookupExpr(hasAnyDeclaration(
5565 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5566 matches the use of f in g() .
5567</pre></td></tr>
5568
5569
Aaron Ballman672dde22016-01-22 23:15:00 +00005570<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 +00005571<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5572
5573Given
5574 struct A { struct B { struct C {}; }; };
5575 A::B::C c;
5576nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5577 matches "A::"
5578</pre></td></tr>
5579
5580
Aaron Ballman672dde22016-01-22 23:15:00 +00005581<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 +00005582<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5583given TypeLoc.
5584
5585Given
5586 struct A { struct B { struct C {}; }; };
5587 A::B::C c;
5588nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5589 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5590 matches "A::"
5591</pre></td></tr>
5592
5593
Aaron Ballman672dde22016-01-22 23:15:00 +00005594<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 +00005595<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5596
5597Given
5598 struct A { struct B { struct C {}; }; };
5599 A::B::C c;
5600nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5601 matches "A::"
5602</pre></td></tr>
5603
5604
Aaron Ballman672dde22016-01-22 23:15:00 +00005605<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 +00005606<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5607given namespace matcher.
5608
5609Given
5610 namespace ns { struct A {}; }
5611 ns::A a;
5612nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5613 matches "ns::"
5614</pre></td></tr>
5615
5616
Aaron Ballman672dde22016-01-22 23:15:00 +00005617<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005618<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5619given QualType matcher without qualifiers.
5620
5621Given
5622 struct A { struct B { struct C {}; }; };
5623 A::B::C c;
5624nestedNameSpecifier(specifiesType(
5625 hasDeclaration(cxxRecordDecl(hasName("A")))
5626))
5627 matches "A::"
5628</pre></td></tr>
5629
5630
Aaron Ballman672dde22016-01-22 23:15:00 +00005631<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 +00005632<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5633call expression.
5634
5635Example matches y in x(y)
5636 (matcher = callExpr(hasArgument(0, declRefExpr())))
5637 void x(int) { int y; x(y); }
5638</pre></td></tr>
5639
5640
Aaron Ballman672dde22016-01-22 23:15:00 +00005641<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 +00005642<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5643
5644Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005645matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005646matches the [webView ...] message invocation.
5647 NSString *webViewJavaScript = ...
5648 UIWebView *webView = ...
5649 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5650</pre></td></tr>
5651
5652
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005653<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>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005654<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
5655or opaque value's source expression matches the given matcher.
5656
5657Example 1: matches "a string"
5658(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5659class URL { URL(string); };
5660URL url = "a string";
5661
5662Example 2: matches 'b' (matcher =
5663opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5664int a = b ?: 1;
5665</pre></td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005666
5667
Martin Bohme8cef2c22016-08-09 15:07:52 +00005668<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>
5669<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5670overloads matches the given matcher.
5671
5672Given
5673 template &lt;typename T&gt; void foo(T);
5674 template &lt;typename T&gt; void bar(T);
5675 template &lt;typename T&gt; void baz(T t) {
5676 foo(t);
5677 bar(t);
5678 }
5679unresolvedLookupExpr(hasAnyDeclaration(
5680 functionTemplateDecl(hasName("foo"))))
5681 matches foo in foo(t); but not bar in bar(t);
5682</pre></td></tr>
5683
5684
Aaron Ballman672dde22016-01-22 23:15:00 +00005685<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 +00005686<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5687
5688Given
5689 int (*ptr_to_array)[4];
5690 int (*ptr_to_func)(int);
5691
5692varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5693ptr_to_func but not ptr_to_array.
5694
Aaron Ballman672dde22016-01-22 23:15:00 +00005695Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005696</pre></td></tr>
5697
5698
Aaron Ballman672dde22016-01-22 23:15:00 +00005699<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 +00005700<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5701pointee matches a given matcher.
5702
5703Given
5704 int *a;
5705 int const *b;
5706 float const *f;
5707pointerType(pointee(isConstQualified(), isInteger()))
5708 matches "int const *b"
5709
Aaron Ballman672dde22016-01-22 23:15:00 +00005710Usable 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;,
5711 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 +00005712</pre></td></tr>
5713
5714
Aaron Ballman672dde22016-01-22 23:15:00 +00005715<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 +00005716<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5717pointee matches a given matcher.
5718
5719Given
5720 int *a;
5721 int const *b;
5722 float const *f;
5723pointerType(pointee(isConstQualified(), isInteger()))
5724 matches "int const *b"
5725
Aaron Ballman672dde22016-01-22 23:15:00 +00005726Usable 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;,
5727 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 +00005728</pre></td></tr>
5729
5730
Aaron Ballman672dde22016-01-22 23:15:00 +00005731<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 +00005732<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5733
5734Given:
5735 typedef int &amp;int_ref;
5736 int a;
5737 int_ref b = a;
5738
5739varDecl(hasType(qualType(referenceType()))))) will not match the
5740declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5741</pre></td></tr>
5742
5743
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005744<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>const 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 +00005745<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5746matches the given matcher.
5747
5748The associated declaration is:
5749- for type nodes, the declaration of the underlying type
5750- for CallExpr, the declaration of the callee
5751- for MemberExpr, the declaration of the referenced member
5752- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005753- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005754
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005755For type nodes, hasDeclaration will generally match the declaration of the
5756sugared type. Given
5757 class X {};
5758 typedef X Y;
5759 Y y;
5760in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5761typedefDecl. A common use case is to match the underlying, desugared type.
5762This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5763 varDecl(hasType(hasUnqualifiedDesugaredType(
5764 recordType(hasDeclaration(decl())))))
5765In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005766
Manuel Klimeka37e1102016-12-01 15:45:06 +00005767Usable 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;,
5768 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;,
5769 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;,
5770 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;,
5771 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;,
5772 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;,
5773 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005774</pre></td></tr>
5775
5776
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005777<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>
5778<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5779
5780Given
5781 void (*fp)(void);
5782The matcher
5783 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5784would match the declaration for fp.
5785</pre></td></tr>
5786
5787
Aaron Ballman672dde22016-01-22 23:15:00 +00005788<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005789<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5790</pre></td></tr>
5791
5792
Aaron Ballman672dde22016-01-22 23:15:00 +00005793<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 +00005794<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5795matches the specified matcher.
5796
5797Example matches y-&gt;x()
5798 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5799 cxxRecordDecl(hasName("Y")))))))
5800 class Y { public: void x(); };
5801 void z() { Y *y; y-&gt;x(); }
5802</pre></td></tr>
5803
5804
Aaron Ballman672dde22016-01-22 23:15:00 +00005805<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 +00005806<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5807</pre></td></tr>
5808
5809
Aaron Ballman672dde22016-01-22 23:15:00 +00005810<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005811<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5812type matches the specified matcher.
5813
5814Example matches X &amp;x and const X &amp;y
5815 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5816 class X {
5817 void a(X b) {
5818 X &amp;x = b;
5819 const X &amp;y = b;
5820 }
5821 };
5822</pre></td></tr>
5823
5824
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005825<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>const 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 +00005826<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5827matches the given matcher.
5828
5829The associated declaration is:
5830- for type nodes, the declaration of the underlying type
5831- for CallExpr, the declaration of the callee
5832- for MemberExpr, the declaration of the referenced member
5833- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005834- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005835
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005836For type nodes, hasDeclaration will generally match the declaration of the
5837sugared type. Given
5838 class X {};
5839 typedef X Y;
5840 Y y;
5841in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5842typedefDecl. A common use case is to match the underlying, desugared type.
5843This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5844 varDecl(hasType(hasUnqualifiedDesugaredType(
5845 recordType(hasDeclaration(decl())))))
5846In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005847
Manuel Klimeka37e1102016-12-01 15:45:06 +00005848Usable 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;,
5849 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;,
5850 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;,
5851 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;,
5852 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;,
5853 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;,
5854 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005855</pre></td></tr>
5856
5857
Aaron Ballman672dde22016-01-22 23:15:00 +00005858<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 +00005859<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5860pointee matches a given matcher.
5861
5862Given
5863 int *a;
5864 int const *b;
5865 float const *f;
5866pointerType(pointee(isConstQualified(), isInteger()))
5867 matches "int const *b"
5868
Aaron Ballman672dde22016-01-22 23:15:00 +00005869Usable 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;,
5870 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 +00005871</pre></td></tr>
5872
5873
Aaron Ballman672dde22016-01-22 23:15:00 +00005874<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 +00005875<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5876pointee matches a given matcher.
5877
5878Given
5879 int *a;
5880 int const *b;
5881 float const *f;
5882pointerType(pointee(isConstQualified(), isInteger()))
5883 matches "int const *b"
5884
Aaron Ballman672dde22016-01-22 23:15:00 +00005885Usable 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;,
5886 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 +00005887</pre></td></tr>
5888
5889
Alexander Kornienko976921d2016-03-22 11:03:03 +00005890<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>
5891<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5892
5893Given
5894 return a + b;
5895hasReturnValue(binaryOperator())
5896 matches 'return a + b'
5897with binaryOperator()
5898 matching 'a + b'
5899</pre></td></tr>
5900
5901
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005902<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>
5903<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5904a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5905
5906Given
5907 { {}; 1+2; }
5908hasAnySubstatement(compoundStmt())
5909 matches '{ {}; 1+2; }'
5910with compoundStmt()
5911 matching '{}'
5912</pre></td></tr>
5913
5914
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005915<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>const 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 +00005916<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5917alignof.
5918</pre></td></tr>
5919
5920
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005921<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 +00005922<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 +00005923
5924Given:
5925F&amp; operator=(const F&amp; o) {
5926 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5927 return *this;
5928}
5929returnStmt(forFunction(hasName("operator=")))
5930 matches 'return *this'
5931 but does match 'return &gt; 0'
5932</pre></td></tr>
5933
5934
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005935<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>const 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 +00005936<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5937sizeof.
5938</pre></td></tr>
5939
5940
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005941<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>
5942<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5943type that matches the provided matcher.
5944
5945Given
5946 template &lt;typename T&gt;
5947 double F(T t);
5948 int i;
5949 double j = F(i);
5950
5951substTemplateTypeParmType(hasReplacementType(type())) matches int
5952</pre></td></tr>
5953
5954
Aaron Ballman672dde22016-01-22 23:15:00 +00005955<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 +00005956<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5957statement. This matcher may produce multiple matches.
5958
5959Given
5960 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5961switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5962 matches four times, with "c" binding each of "case 1:", "case 2:",
5963"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5964"switch (1)", "switch (2)" and "switch (2)".
5965</pre></td></tr>
5966
5967
Etienne Bergeron5500f952016-05-30 15:25:25 +00005968<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>
5969<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5970switch statement or conditional operator.
5971
5972Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5973 if (true) {}
5974</pre></td></tr>
5975
5976
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005977<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>const 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 +00005978<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5979matches the given matcher.
5980
5981The associated declaration is:
5982- for type nodes, the declaration of the underlying type
5983- for CallExpr, the declaration of the callee
5984- for MemberExpr, the declaration of the referenced member
5985- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005986- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005987
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005988For type nodes, hasDeclaration will generally match the declaration of the
5989sugared type. Given
5990 class X {};
5991 typedef X Y;
5992 Y y;
5993in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5994typedefDecl. A common use case is to match the underlying, desugared type.
5995This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5996 varDecl(hasType(hasUnqualifiedDesugaredType(
5997 recordType(hasDeclaration(decl())))))
5998In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005999
Manuel Klimeka37e1102016-12-01 15:45:06 +00006000Usable 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;,
6001 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;,
6002 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;,
6003 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;,
6004 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;,
6005 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;,
6006 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006007</pre></td></tr>
6008
6009
Aaron Ballman672dde22016-01-22 23:15:00 +00006010<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 +00006011<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6012
6013Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006014 struct B { int next; };
6015 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006016 A&lt;&amp;B::next&gt; a;
6017templateSpecializationType(hasAnyTemplateArgument(
6018 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6019 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6020 B::next
6021</pre></td></tr>
6022
6023
Aaron Ballman672dde22016-01-22 23:15:00 +00006024<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 +00006025<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6026declaration.
6027
6028Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006029 struct B { int next; };
6030 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006031 A&lt;&amp;B::next&gt; a;
6032classTemplateSpecializationDecl(hasAnyTemplateArgument(
Fangrui Song55942ab2018-01-22 22:34:15 +00006033 refersToDeclaration(fieldDecl(hasName("next")))))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006034 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6035 B::next
6036</pre></td></tr>
6037
6038
Aaron Ballman672dde22016-01-22 23:15:00 +00006039<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 +00006040<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6041
6042Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006043 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006044 C&lt;42&gt; c;
6045classTemplateSpecializationDecl(
6046 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6047 matches the implicit instantiation of C in C&lt;42&gt;.
6048</pre></td></tr>
6049
6050
Haojian Wub33b02e2016-07-29 15:45:11 +00006051<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>
6052<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6053
6054Given
6055 template&lt;template &lt;typename&gt; class S&gt; class X {};
6056 template&lt;typename T&gt; class Y {};"
6057 X&lt;Y&gt; xi;
6058classTemplateSpecializationDecl(hasAnyTemplateArgument(
6059 refersToTemplate(templateName())))
6060 matches the specialization X&lt;Y&gt;
6061</pre></td></tr>
6062
6063
Aaron Ballman672dde22016-01-22 23:15:00 +00006064<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 +00006065<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6066
6067Given
6068 struct X {};
6069 template&lt;typename T&gt; struct A {};
6070 A&lt;X&gt; a;
6071classTemplateSpecializationDecl(hasAnyTemplateArgument(
6072 refersToType(class(hasName("X")))))
6073 matches the specialization A&lt;X&gt;
6074</pre></td></tr>
6075
6076
Aaron Ballman672dde22016-01-22 23:15:00 +00006077<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 +00006078<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6079functionDecl that have at least one TemplateArgument matching the given
6080InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006081
6082Given
6083 template&lt;typename T&gt; class A {};
6084 template&lt;&gt; class A&lt;double&gt; {};
6085 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00006086
Haojian Wu99e39a72016-07-29 17:30:13 +00006087 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00006088 void func() { f&lt;int&gt;(); };
6089
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006090classTemplateSpecializationDecl(hasAnyTemplateArgument(
6091 refersToType(asString("int"))))
6092 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006093
6094functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6095 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006096</pre></td></tr>
6097
6098
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006099<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>const 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 +00006100<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6101matches the given matcher.
6102
6103The associated declaration is:
6104- for type nodes, the declaration of the underlying type
6105- for CallExpr, the declaration of the callee
6106- for MemberExpr, the declaration of the referenced member
6107- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006108- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006109
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006110For type nodes, hasDeclaration will generally match the declaration of the
6111sugared type. Given
6112 class X {};
6113 typedef X Y;
6114 Y y;
6115in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6116typedefDecl. A common use case is to match the underlying, desugared type.
6117This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6118 varDecl(hasType(hasUnqualifiedDesugaredType(
6119 recordType(hasDeclaration(decl())))))
6120In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006121
Manuel Klimeka37e1102016-12-01 15:45:06 +00006122Usable 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;,
6123 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;,
6124 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;,
6125 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;,
6126 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;,
6127 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;,
6128 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006129</pre></td></tr>
6130
6131
Aaron Ballman672dde22016-01-22 23:15:00 +00006132<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 +00006133<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6134functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006135
6136Given
6137 template&lt;typename T, typename U&gt; class A {};
6138 A&lt;bool, int&gt; b;
6139 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00006140
Fangrui Song55942ab2018-01-22 22:34:15 +00006141 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00006142 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006143classTemplateSpecializationDecl(hasTemplateArgument(
6144 1, refersToType(asString("int"))))
6145 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006146
6147functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6148 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006149</pre></td></tr>
6150
6151
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006152<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>const 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 +00006153<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
6154matches the given matcher.
6155
6156The associated declaration is:
6157- for type nodes, the declaration of the underlying type
6158- for CallExpr, the declaration of the callee
6159- for MemberExpr, the declaration of the referenced member
6160- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006161- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006162
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006163For type nodes, hasDeclaration will generally match the declaration of the
6164sugared type. Given
6165 class X {};
6166 typedef X Y;
6167 Y y;
6168in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6169typedefDecl. A common use case is to match the underlying, desugared type.
6170This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6171 varDecl(hasType(hasUnqualifiedDesugaredType(
6172 recordType(hasDeclaration(decl())))))
6173In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006174
Manuel Klimeka37e1102016-12-01 15:45:06 +00006175Usable 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;,
6176 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;,
6177 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;,
6178 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;,
6179 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;,
6180 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;,
6181 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006182</pre></td></tr>
6183
6184
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006185<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher&lt;T&gt; Matcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006186<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
6187
6188Generates results for each match.
6189
6190For example, in:
6191 class A { class B {}; class C {}; };
6192The matcher:
6193 cxxRecordDecl(hasName("::A"),
6194 findAll(cxxRecordDecl(isDefinition()).bind("m")))
6195will generate results for A, B and C.
6196
6197Usable as: Any Matcher
6198</pre></td></tr>
6199
6200
Aaron Ballman66eb58a2016-04-14 16:05:45 +00006201<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 +00006202<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6203matcher.
6204
6205Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6206 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6207 and U (matcher = typedefDecl(hasType(asString("int")))
6208 class X {};
6209 void y(X &amp;x) { x; X z; }
6210 typedef int U;
6211</pre></td></tr>
6212
6213
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006214<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>const 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 +00006215<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6216matches the given matcher.
6217
6218The associated declaration is:
6219- for type nodes, the declaration of the underlying type
6220- for CallExpr, the declaration of the callee
6221- for MemberExpr, the declaration of the referenced member
6222- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006223- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006224
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006225For type nodes, hasDeclaration will generally match the declaration of the
6226sugared type. Given
6227 class X {};
6228 typedef X Y;
6229 Y y;
6230in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6231typedefDecl. A common use case is to match the underlying, desugared type.
6232This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6233 varDecl(hasType(hasUnqualifiedDesugaredType(
6234 recordType(hasDeclaration(decl())))))
6235In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006236
Manuel Klimeka37e1102016-12-01 15:45:06 +00006237Usable 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;,
6238 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;,
6239 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;,
6240 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;,
6241 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;,
6242 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;,
6243 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6244</pre></td></tr>
6245
6246
6247<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>
6248<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
6249type of the matched node.
6250
6251For example, in:
6252 class A {};
6253 using B = A;
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006254The matcher type(hasUnqualifeidDesugaredType(recordType())) matches
Manuel Klimeka37e1102016-12-01 15:45:06 +00006255both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006256</pre></td></tr>
6257
6258
Aaron Ballman672dde22016-01-22 23:15:00 +00006259<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 +00006260<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
6261
6262Given
6263 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
6264unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
6265 matches sizeof(a) and alignof(c)
6266</pre></td></tr>
6267
6268
Aaron Ballman672dde22016-01-22 23:15:00 +00006269<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 +00006270<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
6271
6272Example matches true (matcher = hasUnaryOperand(
6273 cxxBoolLiteral(equals(true))))
6274 !true
6275</pre></td></tr>
6276
6277
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006278<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>const 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 +00006279<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
6280matches the given matcher.
6281
6282The associated declaration is:
6283- for type nodes, the declaration of the underlying type
6284- for CallExpr, the declaration of the callee
6285- for MemberExpr, the declaration of the referenced member
6286- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006287- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006288
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006289For type nodes, hasDeclaration will generally match the declaration of the
6290sugared type. Given
6291 class X {};
6292 typedef X Y;
6293 Y y;
6294in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6295typedefDecl. A common use case is to match the underlying, desugared type.
6296This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6297 varDecl(hasType(hasUnqualifiedDesugaredType(
6298 recordType(hasDeclaration(decl())))))
6299In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006300
Manuel Klimeka37e1102016-12-01 15:45:06 +00006301Usable 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;,
6302 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;,
6303 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;,
6304 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;,
6305 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;,
6306 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;,
6307 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006308</pre></td></tr>
6309
6310
Aaron Ballman672dde22016-01-22 23:15:00 +00006311<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 +00006312<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6313
6314Given
6315 namespace X { void b(); }
6316 using X::b;
6317usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6318 matches using X::b </pre></td></tr>
6319
6320
Aaron Ballman672dde22016-01-22 23:15:00 +00006321<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 +00006322<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
6323matched by the given matcher.
6324
6325Given
6326 namespace X { int a; void b(); }
6327 using X::a;
6328 using X::b;
6329usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6330 matches using X::b but not using X::a </pre></td></tr>
6331
6332
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006333<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>
6334<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 +00006335declaration's type.
6336
6337In case of a value declaration (for example a variable declaration),
6338this resolves one layer of indirection. For example, in the value
6339declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6340X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6341declaration of x.
6342
6343Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6344 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6345 class X {};
6346 void y(X &amp;x) { x; X z; }
6347
Aaron Ballman672dde22016-01-22 23:15:00 +00006348Usable 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 +00006349</pre></td></tr>
6350
6351
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006352<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>
6353<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 +00006354matcher.
6355
6356Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6357 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006358 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006359 class X {};
6360 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006361 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006362</pre></td></tr>
6363
6364
Aaron Ballman672dde22016-01-22 23:15:00 +00006365<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 +00006366<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6367that matches the given matcher.
6368
6369Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6370 bool y() { return true; }
6371 bool x = y();
6372</pre></td></tr>
6373
6374
Aaron Ballman672dde22016-01-22 23:15:00 +00006375<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 +00006376<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6377expression.
6378
6379Given
6380 void f(int b) {
6381 int a[b];
6382 }
6383variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6384 varDecl(hasName("b")))))))
6385 matches "int a[b]"
6386</pre></td></tr>
6387
6388
Aaron Ballman672dde22016-01-22 23:15:00 +00006389<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 +00006390<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6391definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006392
6393Given
6394 for (;;) {}
6395hasBody(compoundStmt())
6396 matches 'for (;;) {}'
6397with compoundStmt()
6398 matching '{}'
6399</pre></td></tr>
6400
6401
Aaron Ballman672dde22016-01-22 23:15:00 +00006402<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 +00006403<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 +00006404switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006405
6406Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6407 if (true) {}
6408</pre></td></tr>
6409
6410
Aaron Ballman672dde22016-01-22 23:15:00 +00006411<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 +00006412<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6413NestedNameSpecifier-matcher matches.
6414</pre></td></tr>
6415
6416
Aaron Ballman672dde22016-01-22 23:15:00 +00006417<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 +00006418<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6419QualType-matcher matches.
6420</pre></td></tr>
6421
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006422<!--END_TRAVERSAL_MATCHERS -->
6423</table>
6424
6425</div>
6426</body>
6427</html>
6428
6429