blob: abc2834c4cb7ed35175a88eb67eba90ca630d02c [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
Aaron Ballman672dde22016-01-22 23:15:00 +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('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002753<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2754
2755Given:
2756 constexpr int foo = 42;
2757 constexpr int bar();
2758varDecl(isConstexpr())
2759 matches the declaration of foo.
2760functionDecl(isConstexpr())
2761 matches the declaration of bar.
2762</pre></td></tr>
2763
2764
Aaron Ballman672dde22016-01-22 23:15:00 +00002765<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 +00002766<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2767
2768Given:
2769 class A { ~A(); };
2770 class B { ~B() = default; };
2771functionDecl(isDefaulted())
2772 matches the declaration of ~B, but not ~A.
2773</pre></td></tr>
2774
2775
Dave Leebe398682017-11-14 14:17:26 +00002776<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>
2777<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002778
2779Example matches A, va, fa
2780 class A {};
2781 class B; Doesn't match, as it has no body.
2782 int va;
2783 extern int vb; Doesn't match, as it doesn't define the variable.
2784 void fa() {}
2785 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00002786 @interface X
2787 - (void)ma; Doesn't match, interface is declaration.
2788 @end
2789 @implementation X
2790 - (void)ma {}
2791 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002792
Dave Leebe398682017-11-14 14:17:26 +00002793Usable 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;,
2794 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002795</pre></td></tr>
2796
2797
Aaron Ballman672dde22016-01-22 23:15:00 +00002798<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 +00002799<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2800
2801Given:
2802 void Func();
2803 void DeletedFunc() = delete;
2804functionDecl(isDeleted())
2805 matches the declaration of DeletedFunc, but not Func.
2806</pre></td></tr>
2807
2808
Aaron Ballman672dde22016-01-22 23:15:00 +00002809<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 +00002810<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2811static member variable template instantiations.
2812
2813Given
2814 template&lt;typename T&gt; void A(T t) { }
2815 template&lt;&gt; void A(int N) { }
2816functionDecl(isExplicitTemplateSpecialization())
2817 matches the specialization A&lt;int&gt;().
2818
Aaron Ballman672dde22016-01-22 23:15:00 +00002819Usable 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 +00002820</pre></td></tr>
2821
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002822
Aaron Ballman672dde22016-01-22 23:15:00 +00002823<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 +00002824<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002825
2826Given:
2827 extern "C" void f() {}
2828 extern "C" { void g() {} }
2829 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002830 extern "C" int x = 1;
2831 extern "C" int y = 2;
2832 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002833functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002834 matches the declaration of f and g, but not the declaration of h.
2835varDecl(isExternC())
2836 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002837</pre></td></tr>
2838
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002839
Aaron Ballman672dde22016-01-22 23:15:00 +00002840<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 +00002841<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2842the inline keyword.
2843
2844Given
2845 inline void f();
2846 void g();
2847 namespace n {
2848 inline namespace m {}
2849 }
2850functionDecl(isInline()) will match ::f().
2851namespaceDecl(isInline()) will match n::m.
2852</pre></td></tr>
2853
2854
Roman Lebedev6c3871b2018-01-17 19:40:55 +00002855<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>
2856<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
2857
2858Given
2859 void nope();
2860 [[noreturn]] void a();
2861 __attribute__((noreturn)) void b();
2862 struct c { [[noreturn]] c(); };
2863functionDecl(isNoReturn())
2864 matches all of those except
2865 void nope();
2866</pre></td></tr>
2867
2868
Aaron Ballman672dde22016-01-22 23:15:00 +00002869<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 +00002870<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2871
2872Given:
2873 void f();
2874 void g() noexcept;
2875 void h() throw();
2876 void i() throw(int);
2877 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002878functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2879 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002880</pre></td></tr>
2881
2882
Haojian Wub3d25462016-09-26 16:01:52 +00002883<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 +00002884<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2885class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002886
2887Given:
2888 static void f() {}
2889 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002890 extern int j;
2891 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002892functionDecl(isStaticStorageClass())
2893 matches the function declaration f.
2894varDecl(isStaticStorageClass())
2895 matches the variable declaration i.
2896</pre></td></tr>
2897
2898
Aaron Ballman672dde22016-01-22 23:15:00 +00002899<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002900<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2901member variable template instantiations.
2902
2903Given
2904 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2905or
2906 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2907cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2908 matches the template instantiation of X&lt;A&gt;.
2909
2910But given
2911 template &lt;typename T&gt; class X {}; class A {};
2912 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2913cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2914 does not match, as X&lt;A&gt; is an explicit template specialization.
2915
Aaron Ballman672dde22016-01-22 23:15:00 +00002916Usable 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 +00002917</pre></td></tr>
2918
2919
Aaron Ballman672dde22016-01-22 23:15:00 +00002920<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 +00002921<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2922
2923Example matches f, but not g or h. The function i will not match, even when
2924compiled in C mode.
2925 void f(...);
2926 void g(int);
2927 template &lt;typename... Ts&gt; void h(Ts...);
2928 void i();
2929</pre></td></tr>
2930
2931
Aaron Ballman672dde22016-01-22 23:15:00 +00002932<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 +00002933<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2934specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002935
2936Given
2937 void f(int i) {}
2938 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002939 void h(int i, int j);
2940 void j(int i);
2941 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002942functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00002943 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002944functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00002945 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002946functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00002947 matches k
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002948</pre></td></tr>
2949
2950
Aaron Ballman230ad972016-06-07 17:34:45 +00002951<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>
2952<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2953
2954Given:
2955 void f();
2956 void g() noexcept;
2957 void h() noexcept(true);
2958 void i() noexcept(false);
2959 void j() throw();
2960 void k() throw(int);
2961 void l() throw(...);
2962functionDecl(hasDynamicExceptionSpec()) and
2963 functionProtoType(hasDynamicExceptionSpec())
2964 match the declarations of j, k, and l, but not f, g, h, or i.
2965</pre></td></tr>
2966
2967
2968<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>
2969<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2970
2971Given:
2972 void f();
2973 void g() noexcept;
2974 void h() throw();
2975 void i() throw(int);
2976 void j() noexcept(false);
2977functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2978 match the declarations of g, and h, but not f, i or j.
2979</pre></td></tr>
2980
2981
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002982<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>
2983<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2984specific parameter count.
2985
2986Given
2987 void f(int i) {}
2988 void g(int i, int j) {}
2989 void h(int i, int j);
2990 void j(int i);
2991 void k(int x, int y, int z, ...);
2992functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00002993 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002994functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00002995 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002996functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00002997 matches k
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002998</pre></td></tr>
2999
3000
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003001<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>
3002<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3003
3004
3005<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 +00003006<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 +00003007
Peter Wua9244b52017-06-08 22:00:58 +00003008Given
3009 f('false, 3.14, 42);
3010characterLiteral(equals(0))
3011 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3012 match false
3013floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3014 match 3.14
3015integerLiteral(equals(42))
3016 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003017
Clement Courbet43bdba42017-07-11 15:45:22 +00003018Note that you cannot directly match a negative numeric literal because the
3019minus sign is not part of the literal: It is a unary operator whose operand
3020is the positive numeric literal. Instead, you must use a unaryOperator()
3021matcher to match the minus sign:
3022
3023unaryOperator(hasOperatorName("-"),
3024 hasUnaryOperand(integerLiteral(equals(13))))
3025
Peter Wua9244b52017-06-08 22:00:58 +00003026Usable 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 +00003027 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 +00003028</pre></td></tr>
3029
3030
Peter Wua9244b52017-06-08 22:00:58 +00003031<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>
3032<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3033
3034
3035<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>
3036<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3037
3038
Aaron Ballman672dde22016-01-22 23:15:00 +00003039<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 +00003040<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3041to '.'.
3042
3043Member calls on the implicit this pointer match as called with '-&gt;'.
3044
3045Given
3046 class Y {
3047 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3048 int a;
3049 static int b;
3050 };
3051memberExpr(isArrow())
3052 matches this-&gt;x, x, y.x, a, this-&gt;b
3053</pre></td></tr>
3054
3055
Aaron Ballmana086b9f2016-08-17 13:10:42 +00003056<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>
3057<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3058
3059Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3060void f() {
3061 int x;
3062 static int y;
3063}
3064int z;
3065
3066Example matches f() because it has external formal linkage despite being
3067unique to the translation unit as though it has internal likage
3068(matcher = functionDecl(hasExternalFormalLinkage()))
3069
3070namespace {
3071void f() {}
3072}
3073</pre></td></tr>
3074
3075
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003076<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 +00003077<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3078
3079Supports specifying enclosing namespaces or classes by prefixing the name
3080with '&lt;enclosing&gt;::'.
3081Does not match typedefs of an underlying type with the given name.
3082
3083Example matches X (Name == "X")
3084 class X;
3085
3086Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3087 namespace a { namespace b { class X; } }
3088</pre></td></tr>
3089
3090
Aaron Ballman672dde22016-01-22 23:15:00 +00003091<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 +00003092<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3093a substring matched by the given RegExp.
3094
3095Supports specifying enclosing namespaces or classes by
3096prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3097of an underlying type with the given name.
3098
3099Example matches X (regexp == "::X")
3100 class X;
3101
3102Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3103 namespace foo { namespace bar { class X; } }
3104</pre></td></tr>
3105
3106
Aaron Ballman672dde22016-01-22 23:15:00 +00003107<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003108<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3109
3110Given
3111 namespace n {
3112 namespace {} #1
3113 }
3114namespaceDecl(isAnonymous()) will match #1 but not ::n.
3115</pre></td></tr>
3116
3117
Aaron Ballman672dde22016-01-22 23:15:00 +00003118<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 +00003119<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3120the inline keyword.
3121
3122Given
3123 inline void f();
3124 void g();
3125 namespace n {
3126 inline namespace m {}
3127 }
3128functionDecl(isInline()) will match ::f().
3129namespaceDecl(isInline()) will match n::m.
3130</pre></td></tr>
3131
3132
Aaron Ballman672dde22016-01-22 23:15:00 +00003133<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 +00003134<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3135a specific number of arguments (including absent default arguments).
3136
3137Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3138 void f(int x, int y);
3139 f(0, 0);
3140</pre></td></tr>
3141
3142
Aaron Ballman672dde22016-01-22 23:15:00 +00003143<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 +00003144<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3145
3146objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3147message expression in
3148
3149 UIWebView *webView = ...;
3150 CGRect bodyFrame = webView.frame;
3151 bodyFrame.size.height = self.bodyContentHeight;
3152 webView.frame = bodyFrame;
3153 ^---- matches here
3154</pre></td></tr>
3155
3156
Aaron Ballman672dde22016-01-22 23:15:00 +00003157<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003158<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3159
3160Matches only when the selector of the objCMessageExpr is NULL. This may
3161represent an error condition in the tree!
3162</pre></td></tr>
3163
3164
Aaron Ballman672dde22016-01-22 23:15:00 +00003165<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003166<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3167
3168 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3169 matches the outer message expr in the code below, but NOT the message
3170 invocation for self.bodyView.
3171 [self.bodyView loadHTMLString:html baseURL:NULL];
3172</pre></td></tr>
3173
3174
Aaron Ballman672dde22016-01-22 23:15:00 +00003175<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 +00003176<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3177
3178 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3179 matches self.bodyView in the code below, but NOT the outer message
3180 invocation of "loadHTMLString:baseURL:".
3181 [self.bodyView loadHTMLString:html baseURL:NULL];
3182</pre></td></tr>
3183
3184
Aaron Ballman672dde22016-01-22 23:15:00 +00003185<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 +00003186<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3187a substring matched by the given RegExp.
3188 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3189 invocation for self.bodyView.
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('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003195<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3196
3197 matcher = objCMessageExpr(numSelectorArgs(0));
3198 matches self.bodyView in the code below
3199
3200 matcher = objCMessageExpr(numSelectorArgs(2));
3201 matches the invocation of "loadHTMLString:baseURL:" but not that
3202 of self.bodyView
3203 [self.bodyView loadHTMLString:html baseURL:NULL];
3204</pre></td></tr>
3205
3206
Dave Leebe398682017-11-14 14:17:26 +00003207<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>
3208<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3209
3210Example matches A, va, fa
3211 class A {};
3212 class B; Doesn't match, as it has no body.
3213 int va;
3214 extern int vb; Doesn't match, as it doesn't define the variable.
3215 void fa() {}
3216 void fb(); Doesn't match, as it has no body.
3217 @interface X
3218 - (void)ma; Doesn't match, interface is declaration.
3219 @end
3220 @implementation X
3221 - (void)ma {}
3222 @end
3223
3224Usable 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;,
3225 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3226</pre></td></tr>
3227
3228
Aaron Ballman5f8980a2017-11-21 19:22:34 +00003229<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>
3230<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3231
3232Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3233void x(int val) {}
3234void y(int val = 0) {}
3235</pre></td></tr>
3236
3237
Aaron Ballman672dde22016-01-22 23:15:00 +00003238<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 +00003239<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3240
3241Given
3242 class Y { public: void x(); };
3243 void z() { Y* y; y-&gt;x(); }
3244cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3245 matches y-&gt;x()
3246</pre></td></tr>
3247
3248
Aaron Ballman672dde22016-01-22 23:15:00 +00003249<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 +00003250<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3251
3252Matches a node if it equals the node previously bound to ID.
3253
3254Given
3255 class X { int a; int b; };
3256cxxRecordDecl(
3257 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3258 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3259 matches the class X, as a and b have the same type.
3260
3261Note that when multiple matches are involved via forEach* matchers,
3262equalsBoundNodes acts as a filter.
3263For example:
3264compoundStmt(
3265 forEachDescendant(varDecl().bind("d")),
3266 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3267will trigger a match for each combination of variable declaration
3268and reference to that variable declaration within a compound statement.
3269</pre></td></tr>
3270
3271
Aaron Ballman672dde22016-01-22 23:15:00 +00003272<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 +00003273<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3274the node, not hidden within a typedef.
3275
3276Given
3277 typedef const int const_int;
3278 const_int i;
3279 int *const j;
3280 int *volatile k;
3281 int m;
3282varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3283i is const-qualified but the qualifier is not local.
3284</pre></td></tr>
3285
3286
Aaron Ballman672dde22016-01-22 23:15:00 +00003287<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 +00003288<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3289
3290Given
3291 void a(char);
3292 void b(wchar_t);
3293 void c(double);
3294functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3295matches "a(char)", "b(wchar_t)", but not "c(double)".
3296</pre></td></tr>
3297
3298
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003299<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 +00003300<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3301the Objective-C object pointer type, which is different despite being
3302syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003303
3304Given
3305 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003306
3307 @interface Foo
3308 @end
3309 Foo *f;
3310
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003311 int j;
3312varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003313 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003314</pre></td></tr>
3315
3316
Aaron Ballman672dde22016-01-22 23:15:00 +00003317<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 +00003318<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3319include "top-level" const.
3320
3321Given
3322 void a(int);
3323 void b(int const);
3324 void c(const int);
3325 void d(const int*);
3326 void e(int const) {};
3327functionDecl(hasAnyParameter(hasType(isConstQualified())))
3328 matches "void b(int const)", "void c(const int)" and
3329 "void e(int const) {}". It does not match d as there
3330 is no top-level const on the parameter type "const int *".
3331</pre></td></tr>
3332
3333
Aaron Ballman672dde22016-01-22 23:15:00 +00003334<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 +00003335<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3336
3337Given
3338 void a(int);
3339 void b(long);
3340 void c(double);
3341functionDecl(hasAnyParameter(hasType(isInteger())))
3342matches "a(int)", "b(long)", but not "c(double)".
3343</pre></td></tr>
3344
3345
Clement Courbet42517592016-07-12 06:36:00 +00003346<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>
3347<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3348
3349Given
3350 void a(int);
3351 void b(unsigned long);
3352 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003353functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003354matches "a(int)", but not "b(unsigned long)" and "c(double)".
3355</pre></td></tr>
3356
3357
3358<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>
3359<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3360
3361Given
3362 void a(int);
3363 void b(unsigned long);
3364 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003365functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003366matches "b(unsigned long)", but not "a(int)" and "c(double)".
3367</pre></td></tr>
3368
3369
Aaron Ballman672dde22016-01-22 23:15:00 +00003370<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003371<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3372include "top-level" volatile.
3373
3374Given
3375 void a(int);
3376 void b(int volatile);
3377 void c(volatile int);
3378 void d(volatile int*);
3379 void e(int volatile) {};
3380functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3381 matches "void b(int volatile)", "void c(volatile int)" and
3382 "void e(int volatile) {}". It does not match d as there
3383 is no top-level volatile on the parameter type "volatile int *".
3384</pre></td></tr>
3385
3386
Aaron Ballman672dde22016-01-22 23:15:00 +00003387<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 +00003388<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3389
3390Example matches C, but not S or U.
3391 struct S {};
3392 class C {};
3393 union U {};
3394</pre></td></tr>
3395
3396
Aaron Ballman672dde22016-01-22 23:15:00 +00003397<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 +00003398<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3399
3400Example matches S, but not C or U.
3401 struct S {};
3402 class C {};
3403 union U {};
3404</pre></td></tr>
3405
3406
Aaron Ballman672dde22016-01-22 23:15:00 +00003407<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 +00003408<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3409
3410Example matches U, but not C or S.
3411 struct S {};
3412 class C {};
3413 union U {};
3414</pre></td></tr>
3415
3416
Aaron Ballman672dde22016-01-22 23:15:00 +00003417<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 +00003418<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3419
3420Matches a node if it equals the node previously bound to ID.
3421
3422Given
3423 class X { int a; int b; };
3424cxxRecordDecl(
3425 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3426 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3427 matches the class X, as a and b have the same type.
3428
3429Note that when multiple matches are involved via forEach* matchers,
3430equalsBoundNodes acts as a filter.
3431For example:
3432compoundStmt(
3433 forEachDescendant(varDecl().bind("d")),
3434 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3435will trigger a match for each combination of variable declaration
3436and reference to that variable declaration within a compound statement.
3437</pre></td></tr>
3438
3439
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003440<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>
3441<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3442
3443Stmt has pointer identity in the AST.
3444</pre></td></tr>
3445
3446
Aaron Ballman672dde22016-01-22 23:15:00 +00003447<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 +00003448<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3449partially matching a given regex.
3450
3451Example matches Y but not X
3452 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3453 #include "ASTMatcher.h"
3454 class X {};
3455ASTMatcher.h:
3456 class Y {};
3457
Aaron Ballman672dde22016-01-22 23:15:00 +00003458Usable 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 +00003459</pre></td></tr>
3460
3461
Aaron Ballman672dde22016-01-22 23:15:00 +00003462<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 +00003463<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3464
3465Example matches X but not Y
3466 (matcher = cxxRecordDecl(isExpansionInMainFile())
3467 #include &lt;Y.h&gt;
3468 class X {};
3469Y.h:
3470 class Y {};
3471
Aaron Ballman672dde22016-01-22 23:15:00 +00003472Usable 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 +00003473</pre></td></tr>
3474
3475
Aaron Ballman672dde22016-01-22 23:15:00 +00003476<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 +00003477<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3478
3479Example matches Y but not X
3480 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3481 #include &lt;SystemHeader.h&gt;
3482 class X {};
3483SystemHeader.h:
3484 class Y {};
3485
Aaron Ballman672dde22016-01-22 23:15:00 +00003486Usable 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 +00003487</pre></td></tr>
3488
3489
Etienne Bergeron3588be72016-05-12 04:20:04 +00003490<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>
3491<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3492
3493Given
3494 int a[42];
3495 int b[2 * 21];
3496 int c[41], d[43];
3497 char *s = "abcd";
3498 wchar_t *ws = L"abcd";
3499 char *w = "a";
3500constantArrayType(hasSize(42))
3501 matches "int a[42]" and "int b[2 * 21]"
3502stringLiteral(hasSize(4))
3503 matches "abcd", L"abcd"
3504</pre></td></tr>
3505
3506
Aaron Ballman672dde22016-01-22 23:15:00 +00003507<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 +00003508<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3509
3510Example matches A, va, fa
3511 class A {};
3512 class B; Doesn't match, as it has no body.
3513 int va;
3514 extern int vb; Doesn't match, as it doesn't define the variable.
3515 void fa() {}
3516 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003517 @interface X
3518 - (void)ma; Doesn't match, interface is declaration.
3519 @end
3520 @implementation X
3521 - (void)ma {}
3522 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003523
Dave Leebe398682017-11-14 14:17:26 +00003524Usable 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;,
3525 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003526</pre></td></tr>
3527
3528
Aaron Ballman672dde22016-01-22 23:15:00 +00003529<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003530<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3531
3532Note that 'Value' is a string as the template argument's value is
3533an arbitrary precision integer. 'Value' must be euqal to the canonical
3534representation of that integral value in base 10.
3535
3536Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003537 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003538 C&lt;42&gt; c;
3539classTemplateSpecializationDecl(
3540 hasAnyTemplateArgument(equalsIntegralValue("42")))
3541 matches the implicit instantiation of C in C&lt;42&gt;.
3542</pre></td></tr>
3543
3544
Aaron Ballman672dde22016-01-22 23:15:00 +00003545<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 +00003546<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3547
3548Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003549 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003550 C&lt;42&gt; c;
3551classTemplateSpecializationDecl(
3552 hasAnyTemplateArgument(isIntegral()))
3553 matches the implicit instantiation of C in C&lt;42&gt;
3554 with isIntegral() matching 42.
3555</pre></td></tr>
3556
3557
Aaron Ballman672dde22016-01-22 23:15:00 +00003558<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 +00003559<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3560
3561Given
3562 template&lt;typename T&gt; struct C {};
3563 C&lt;int&gt; c;
3564classTemplateSpecializationDecl(templateArgumentCountIs(1))
3565 matches C&lt;int&gt;.
3566</pre></td></tr>
3567
3568
Aaron Ballman672dde22016-01-22 23:15:00 +00003569<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 +00003570<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3571partially matching a given regex.
3572
3573Example matches Y but not X
3574 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3575 #include "ASTMatcher.h"
3576 class X {};
3577ASTMatcher.h:
3578 class Y {};
3579
Aaron Ballman672dde22016-01-22 23:15:00 +00003580Usable 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 +00003581</pre></td></tr>
3582
3583
Aaron Ballman672dde22016-01-22 23:15:00 +00003584<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 +00003585<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3586
3587Example matches X but not Y
3588 (matcher = cxxRecordDecl(isExpansionInMainFile())
3589 #include &lt;Y.h&gt;
3590 class X {};
3591Y.h:
3592 class Y {};
3593
Aaron Ballman672dde22016-01-22 23:15:00 +00003594Usable 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 +00003595</pre></td></tr>
3596
3597
Aaron Ballman672dde22016-01-22 23:15:00 +00003598<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 +00003599<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3600
3601Example matches Y but not X
3602 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3603 #include &lt;SystemHeader.h&gt;
3604 class X {};
3605SystemHeader.h:
3606 class Y {};
3607
Aaron Ballman672dde22016-01-22 23:15:00 +00003608Usable 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 +00003609</pre></td></tr>
3610
3611
Aaron Ballman672dde22016-01-22 23:15:00 +00003612<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
Samuel Benzaquen30747f72015-12-22 21:06:36 +00003613<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3614
3615Given
3616 struct S { bool func(); };
3617functionDecl(returns(booleanType()))
3618 matches "bool func();"
3619</pre></td></tr>
3620
3621
Aaron Ballman672dde22016-01-22 23:15:00 +00003622<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 +00003623<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3624
3625Matches a node if it equals the node previously bound to ID.
3626
3627Given
3628 class X { int a; int b; };
3629cxxRecordDecl(
3630 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3631 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3632 matches the class X, as a and b have the same type.
3633
3634Note that when multiple matches are involved via forEach* matchers,
3635equalsBoundNodes acts as a filter.
3636For example:
3637compoundStmt(
3638 forEachDescendant(varDecl().bind("d")),
3639 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3640will trigger a match for each combination of variable declaration
3641and reference to that variable declaration within a compound statement.
3642</pre></td></tr>
3643
3644
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003645<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>
3646<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3647
3648Type has pointer identity in the AST.
3649</pre></td></tr>
3650
3651
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003652<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>
3653<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3654
3655Given
3656 int i;
3657 float f;
3658realFloatingPointType()
3659 matches "float f" but not "int i"
3660</pre></td></tr>
3661
3662
Aaron Ballman672dde22016-01-22 23:15:00 +00003663<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 +00003664<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3665
3666Given
3667 struct S { void func(); };
3668functionDecl(returns(voidType()))
3669 matches "void func();"
3670</pre></td></tr>
3671
3672
Aaron Ballman672dde22016-01-22 23:15:00 +00003673<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 +00003674<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3675
3676Given
3677 int x;
3678 int s = sizeof(x) + alignof(x)
3679unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3680 matches sizeof(x)
3681</pre></td></tr>
3682
3683
Aaron Ballman672dde22016-01-22 23:15:00 +00003684<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 +00003685<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3686unary).
3687
3688Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3689 !(a || b)
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_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 +00003694<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3695
3696Example matches x, but not y, z, or a.
3697(matcher = varDecl(hasAutomaticStorageDuration())
3698void f() {
3699 int x;
3700 static int y;
3701 thread_local int z;
3702}
3703int a;
3704</pre></td></tr>
3705
3706
Aaron Ballman672dde22016-01-22 23:15:00 +00003707<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 +00003708<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3709
3710Example matches y and z (matcher = varDecl(hasGlobalStorage())
3711void f() {
3712 int x;
3713 static int y;
3714}
3715int z;
3716</pre></td></tr>
3717
3718
Aaron Ballman672dde22016-01-22 23:15:00 +00003719<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 +00003720<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3721non-static local variable.
3722
3723Example matches x (matcher = varDecl(hasLocalStorage())
3724void f() {
3725 int x;
3726 static int y;
3727}
3728int z;
3729</pre></td></tr>
3730
3731
Aaron Ballman672dde22016-01-22 23:15:00 +00003732<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 +00003733<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 +00003734It includes the variable declared at namespace scope and those declared
3735with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003736
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003737void f() {
3738 int x;
3739 static int y;
3740 thread_local int z;
3741}
3742int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003743static int b;
3744extern int c;
3745varDecl(hasStaticStorageDuration())
3746 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003747</pre></td></tr>
3748
3749
Aaron Ballman672dde22016-01-22 23:15:00 +00003750<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 +00003751<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3752
3753Example matches z, but not x, z, or a.
3754(matcher = varDecl(hasThreadStorageDuration())
3755void f() {
3756 int x;
3757 static int y;
3758 thread_local int z;
3759}
3760int a;
3761</pre></td></tr>
3762
3763
Aaron Ballman672dde22016-01-22 23:15:00 +00003764<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 +00003765<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3766
3767Given:
3768 constexpr int foo = 42;
3769 constexpr int bar();
3770varDecl(isConstexpr())
3771 matches the declaration of foo.
3772functionDecl(isConstexpr())
3773 matches the declaration of bar.
3774</pre></td></tr>
3775
3776
Aaron Ballman672dde22016-01-22 23:15:00 +00003777<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 +00003778<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3779
3780Example matches A, va, fa
3781 class A {};
3782 class B; Doesn't match, as it has no body.
3783 int va;
3784 extern int vb; Doesn't match, as it doesn't define the variable.
3785 void fa() {}
3786 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003787 @interface X
3788 - (void)ma; Doesn't match, interface is declaration.
3789 @end
3790 @implementation X
3791 - (void)ma {}
3792 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003793
Dave Leebe398682017-11-14 14:17:26 +00003794Usable 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;,
3795 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003796</pre></td></tr>
3797
3798
Aaron Ballman672dde22016-01-22 23:15:00 +00003799<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 +00003800<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3801a C++ catch block, or an Objective-C statement.
3802
3803Example matches x (matcher = varDecl(isExceptionVariable())
3804void f(int y) {
3805 try {
3806 } catch (int x) {
3807 }
3808}
3809</pre></td></tr>
3810
3811
Aaron Ballman672dde22016-01-22 23:15:00 +00003812<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 +00003813<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3814static member variable template instantiations.
3815
3816Given
3817 template&lt;typename T&gt; void A(T t) { }
3818 template&lt;&gt; void A(int N) { }
3819functionDecl(isExplicitTemplateSpecialization())
3820 matches the specialization A&lt;int&gt;().
3821
Aaron Ballman672dde22016-01-22 23:15:00 +00003822Usable 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 +00003823</pre></td></tr>
3824
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003825
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003826<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 +00003827<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003828
3829Given:
3830 extern "C" void f() {}
3831 extern "C" { void g() {} }
3832 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003833 extern "C" int x = 1;
3834 extern "C" int y = 2;
3835 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003836functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003837 matches the declaration of f and g, but not the declaration of h.
3838varDecl(isExternC())
3839 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003840</pre></td></tr>
3841
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003842
Haojian Wub3d25462016-09-26 16:01:52 +00003843<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 +00003844<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3845class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003846
3847Given:
3848 static void f() {}
3849 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003850 extern int j;
3851 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003852functionDecl(isStaticStorageClass())
3853 matches the function declaration f.
3854varDecl(isStaticStorageClass())
3855 matches the variable declaration i.
3856</pre></td></tr>
3857
3858
Aaron Ballman672dde22016-01-22 23:15:00 +00003859<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 +00003860<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3861member variable template instantiations.
3862
3863Given
3864 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3865or
3866 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3867cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3868 matches the template instantiation of X&lt;A&gt;.
3869
3870But given
3871 template &lt;typename T&gt; class X {}; class A {};
3872 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3873cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3874 does not match, as X&lt;A&gt; is an explicit template specialization.
3875
Aaron Ballman672dde22016-01-22 23:15:00 +00003876Usable 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 +00003877</pre></td></tr>
3878
3879
Aaron Ballman672dde22016-01-22 23:15:00 +00003880<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 +00003881<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3882template instantiations.
3883
3884Given
3885 template&lt;typename T&gt; void A(T t) { T i; }
3886 A(0);
3887 A(0U);
3888functionDecl(isInstantiated())
3889 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3890</pre></td></tr>
3891
3892
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003893<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>
3894<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3895GNU's __null, C++11's nullptr, or C's NULL macro.
3896
3897Given:
3898 void *v1 = NULL;
3899 void *v2 = nullptr;
3900 void *v3 = __null; GNU extension
3901 char *cp = (char *)0;
3902 int *ip = 0;
3903 int i = 0;
3904expr(nullPointerConstant())
3905 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3906 initializer for i.
3907</pre></td></tr>
3908
3909
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003910<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>
3911<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3912
3913This matcher is only provided as a performance optimization of hasName.
3914 hasAnyName(a, b, c)
3915 is equivalent to, but faster than
3916 anyOf(hasName(a), hasName(b), hasName(c))
3917</pre></td></tr>
3918
3919
Aaron Ballman672dde22016-01-22 23:15:00 +00003920<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 +00003921<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3922
3923Given
3924 int j;
3925 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3926 A(0);
3927 A(0U);
3928declStmt(isInTemplateInstantiation())
3929 matches 'int i;' and 'unsigned i'.
3930unless(stmt(isInTemplateInstantiation()))
3931 will NOT match j += 42; as it's shared between the template definition and
3932 instantiation.
3933</pre></td></tr>
3934
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003935<!--END_NARROWING_MATCHERS -->
3936</table>
3937
3938<!-- ======================================================================= -->
3939<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3940<!-- ======================================================================= -->
3941
3942<p>Traversal matchers specify the relationship to other nodes that are
3943reachable from the current node.</p>
3944
3945<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3946forEachDescendant) which work on all nodes and allow users to write more generic
3947match expressions.</p>
3948
3949<table>
3950<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003951<!-- START_TRAVERSAL_MATCHERS -->
3952
3953<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>
3954<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3955
3956Unlike anyOf, eachOf will generate a match result for each
3957matching submatcher.
3958
3959For example, in:
3960 class A { int a; int b; };
3961The matcher:
3962 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3963 has(fieldDecl(hasName("b")).bind("v"))))
3964will generate two results binding "v", the first of which binds
3965the field declaration of a, the second the field declaration of
3966b.
3967
3968Usable as: Any Matcher
3969</pre></td></tr>
3970
3971
3972<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3973<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3974provided matcher.
3975
Fangrui Song55942ab2018-01-22 22:34:15 +00003976Example matches X, A, A::X, B, B::C, B::C::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003977 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
Fangrui Song55942ab2018-01-22 22:34:15 +00003978 class X {};
3979 class A { class X {}; }; Matches A, because A::X is a class of name
3980 X inside A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003981 class B { class C { class X {}; }; };
3982
3983DescendantT must be an AST base type.
3984
3985As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3986each result that matches instead of only on the first one.
3987
3988Note: Recursively combined ForEachDescendant can cause many matches:
3989 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3990 forEachDescendant(cxxRecordDecl())
3991 )))
3992will match 10 times (plus injected class name matches) on:
3993 class A { class B { class C { class D { class E {}; }; }; }; };
3994
3995Usable as: Any Matcher
3996</pre></td></tr>
3997
3998
3999<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4000<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4001provided matcher.
4002
Fangrui Song55942ab2018-01-22 22:34:15 +00004003Example matches X, Y, Y::X, Z::Y, Z::Y::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004004 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
Fangrui Song55942ab2018-01-22 22:34:15 +00004005 class X {};
4006 class Y { class X {}; }; Matches Y, because Y::X is a class of name X
4007 inside Y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004008 class Z { class Y { class X {}; }; }; Does not match Z.
4009
4010ChildT must be an AST base type.
4011
4012As opposed to 'has', 'forEach' will cause a match for each result that
4013matches instead of only on the first one.
4014
4015Usable as: Any Matcher
4016</pre></td></tr>
4017
4018
4019<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4020<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4021matcher.
4022
4023Given
4024void f() { if (true) { int x = 42; } }
4025void g() { for (;;) { int x = 43; } }
4026expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4027
4028Usable as: Any Matcher
4029</pre></td></tr>
4030
4031
4032<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4033<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4034provided matcher.
4035
4036Example matches X, Y, Z
4037 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4038 class X {}; Matches X, because X::X is a class of name X inside X.
4039 class Y { class X {}; };
4040 class Z { class Y { class X {}; }; };
4041
4042DescendantT must be an AST base type.
4043
4044Usable as: Any Matcher
4045</pre></td></tr>
4046
4047
4048<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4049<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4050provided matcher.
4051
4052Example matches X, Y
4053 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4054 class X {}; Matches X, because X::X is a class of name X inside X.
4055 class Y { class X {}; };
4056 class Z { class Y { class X {}; }; }; Does not match Z.
4057
4058ChildT must be an AST base type.
4059
4060Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00004061Note that has is direct matcher, so it also matches things like implicit
4062casts and paren casts. If you are matching with expr then you should
4063probably consider using ignoringParenImpCasts like:
4064has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004065</pre></td></tr>
4066
4067
4068<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4069<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4070matcher.
4071
4072Given
4073void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4074compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4075
4076Usable as: Any Matcher
4077</pre></td></tr>
4078
4079
Etienne Bergeron5500f952016-05-30 15:25:25 +00004080<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>
4081<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4082switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004083
4084Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4085 if (true) {}
4086</pre></td></tr>
4087
4088
4089<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>
4090<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4091(binary or ternary).
4092
4093Example matches b
4094 condition ? a : b
4095 condition ?: b
4096</pre></td></tr>
4097
4098
4099<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>
4100<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4101
4102Example 1 (conditional ternary operator): matches a
4103 condition ? a : b
4104
4105Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4106 condition ?: b
4107</pre></td></tr>
4108
4109
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004110<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 +00004111<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 +00004112matches the given matcher.
4113
4114The associated declaration is:
4115- for type nodes, the declaration of the underlying type
4116- for CallExpr, the declaration of the callee
4117- for MemberExpr, the declaration of the referenced member
4118- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004119- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004120
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004121For type nodes, hasDeclaration will generally match the declaration of the
4122sugared type. Given
4123 class X {};
4124 typedef X Y;
4125 Y y;
4126in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4127typedefDecl. A common use case is to match the underlying, desugared type.
4128This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4129 varDecl(hasType(hasUnqualifiedDesugaredType(
4130 recordType(hasDeclaration(decl())))))
4131In this matcher, the decl will match the CXXRecordDecl of class X.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004132
Manuel Klimeka37e1102016-12-01 15:45:06 +00004133Usable 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;,
4134 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;,
4135 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;,
4136 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;,
4137 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;,
4138 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;,
4139 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004140</pre></td></tr>
4141
4142
Aaron Ballman672dde22016-01-22 23:15:00 +00004143<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 +00004144<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4145
4146Given
4147 int i[5];
4148 void f() { i[1] = 42; }
4149arraySubscriptExpression(hasBase(implicitCastExpr(
4150 hasSourceExpression(declRefExpr()))))
4151 matches i[1] with the declRefExpr() matching i
4152</pre></td></tr>
4153
4154
Aaron Ballman672dde22016-01-22 23:15:00 +00004155<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 +00004156<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4157
4158Given
4159 int i[5];
4160 void f() { i[1] = 42; }
4161arraySubscriptExpression(hasIndex(integerLiteral()))
4162 matches i[1] with the integerLiteral() matching 1
4163</pre></td></tr>
4164
4165
Aaron Ballman672dde22016-01-22 23:15:00 +00004166<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004167<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4168
4169Example matches a (matcher = binaryOperator(hasLHS()))
4170 a || b
4171</pre></td></tr>
4172
4173
Aaron Ballman672dde22016-01-22 23:15:00 +00004174<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004175<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4176
4177Example matches b (matcher = binaryOperator(hasRHS()))
4178 a || b
4179</pre></td></tr>
4180
4181
Aaron Ballman672dde22016-01-22 23:15:00 +00004182<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 +00004183<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4184type.
4185
4186Given
4187 struct A {};
4188 A a[7];
4189 int b[7];
4190arrayType(hasElementType(builtinType()))
4191 matches "int b[7]"
4192
Aaron Ballman672dde22016-01-22 23:15:00 +00004193Usable 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 +00004194</pre></td></tr>
4195
4196
Aaron Ballman672dde22016-01-22 23:15:00 +00004197<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 +00004198<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4199type.
4200
4201Given
4202 struct A {};
4203 A a[7];
4204 int b[7];
4205arrayType(hasElementType(builtinType()))
4206 matches "int b[7]"
4207
Aaron Ballman672dde22016-01-22 23:15:00 +00004208Usable 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 +00004209</pre></td></tr>
4210
4211
Aaron Ballman672dde22016-01-22 23:15:00 +00004212<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 +00004213<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4214
4215Given
4216 _Atomic(int) i;
4217 _Atomic(float) f;
4218atomicType(hasValueType(isInteger()))
4219 matches "_Atomic(int) i"
4220
Aaron Ballman672dde22016-01-22 23:15:00 +00004221Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004222</pre></td></tr>
4223
4224
Aaron Ballman672dde22016-01-22 23:15:00 +00004225<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 +00004226<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4227
4228Given
4229 _Atomic(int) i;
4230 _Atomic(float) f;
4231atomicType(hasValueType(isInteger()))
4232 matches "_Atomic(int) i"
4233
Aaron Ballman672dde22016-01-22 23:15:00 +00004234Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004235</pre></td></tr>
4236
4237
Aaron Ballman672dde22016-01-22 23:15:00 +00004238<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 +00004239<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4240
4241Note: There is no TypeLoc for the deduced type and thus no
4242getDeducedLoc() matcher.
4243
4244Given
4245 auto a = 1;
4246 auto b = 2.0;
4247autoType(hasDeducedType(isInteger()))
4248 matches "auto a"
4249
Aaron Ballman672dde22016-01-22 23:15:00 +00004250Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004251</pre></td></tr>
4252
4253
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004254<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 +00004255<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4256binary operator matches.
4257</pre></td></tr>
4258
4259
Aaron Ballman672dde22016-01-22 23:15:00 +00004260<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 +00004261<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4262
4263Example matches a (matcher = binaryOperator(hasLHS()))
4264 a || b
4265</pre></td></tr>
4266
4267
Aaron Ballman672dde22016-01-22 23:15:00 +00004268<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 +00004269<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4270
4271Example matches b (matcher = binaryOperator(hasRHS()))
4272 a || b
4273</pre></td></tr>
4274
4275
Aaron Ballman672dde22016-01-22 23:15:00 +00004276<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 +00004277<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4278pointee matches a given matcher.
4279
4280Given
4281 int *a;
4282 int const *b;
4283 float const *f;
4284pointerType(pointee(isConstQualified(), isInteger()))
4285 matches "int const *b"
4286
Aaron Ballman672dde22016-01-22 23:15:00 +00004287Usable 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;,
4288 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 +00004289</pre></td></tr>
4290
4291
Aaron Ballman672dde22016-01-22 23:15:00 +00004292<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 +00004293<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4294pointee matches a given matcher.
4295
4296Given
4297 int *a;
4298 int const *b;
4299 float const *f;
4300pointerType(pointee(isConstQualified(), isInteger()))
4301 matches "int const *b"
4302
Aaron Ballman672dde22016-01-22 23:15:00 +00004303Usable 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;,
4304 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 +00004305</pre></td></tr>
4306
4307
Aaron Ballman672dde22016-01-22 23:15:00 +00004308<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 +00004309<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4310
4311Given
4312 void f(int i);
4313 int y;
4314 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004315callExpr(
4316 forEachArgumentWithParam(
4317 declRefExpr(to(varDecl(hasName("y")))),
4318 parmVarDecl(hasType(isInteger()))
4319))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004320 matches f(y);
4321with declRefExpr(...)
4322 matching int y
4323and parmVarDecl(...)
4324 matching int i
4325</pre></td></tr>
4326
4327
Aaron Ballman672dde22016-01-22 23:15:00 +00004328<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 +00004329<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4330expression.
4331
4332Given
4333 void x(int, int, int) { int y; x(1, y, 42); }
4334callExpr(hasAnyArgument(declRefExpr()))
4335 matches x(1, y, 42)
4336with hasAnyArgument(...)
4337 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004338</pre></td></tr>
4339
4340
Aaron Ballman672dde22016-01-22 23:15:00 +00004341<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004342<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4343call expression.
4344
4345Example matches y in x(y)
4346 (matcher = callExpr(hasArgument(0, declRefExpr())))
4347 void x(int) { int y; x(y); }
4348</pre></td></tr>
4349
4350
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004351<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 +00004352<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 +00004353matches the given matcher.
4354
4355The associated declaration is:
4356- for type nodes, the declaration of the underlying type
4357- for CallExpr, the declaration of the callee
4358- for MemberExpr, the declaration of the referenced member
4359- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004360- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004361
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004362For type nodes, hasDeclaration will generally match the declaration of the
4363sugared type. Given
4364 class X {};
4365 typedef X Y;
4366 Y y;
4367in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4368typedefDecl. A common use case is to match the underlying, desugared type.
4369This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4370 varDecl(hasType(hasUnqualifiedDesugaredType(
4371 recordType(hasDeclaration(decl())))))
4372In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004373
Manuel Klimeka37e1102016-12-01 15:45:06 +00004374Usable 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;,
4375 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;,
4376 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;,
4377 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;,
4378 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;,
4379 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;,
4380 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004381</pre></td></tr>
4382
4383
Aaron Ballman672dde22016-01-22 23:15:00 +00004384<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 +00004385<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4386
4387Given
4388 class A { A() : i(42), j(42) {} int i; int j; };
4389cxxConstructorDecl(forEachConstructorInitializer(
4390 forField(decl().bind("x"))
4391))
4392 will trigger two matches, binding for 'i' and 'j' respectively.
4393</pre></td></tr>
4394
4395
Aaron Ballman672dde22016-01-22 23:15:00 +00004396<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 +00004397<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4398
4399Given
4400 struct Foo {
4401 Foo() : foo_(1) { }
4402 int foo_;
4403 };
4404cxxRecordDecl(has(cxxConstructorDecl(
4405 hasAnyConstructorInitializer(anything())
4406)))
4407 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4408</pre></td></tr>
4409
4410
Aaron Ballman672dde22016-01-22 23:15:00 +00004411<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 +00004412<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4413
4414Given
4415 struct Foo {
4416 Foo() : foo_(1) { }
4417 int foo_;
4418 };
4419cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4420 forField(hasName("foo_"))))))
4421 matches Foo
4422with forField matching foo_
4423</pre></td></tr>
4424
4425
Aaron Ballman672dde22016-01-22 23:15:00 +00004426<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 +00004427<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4428
4429Given
4430 struct Foo {
4431 Foo() : foo_(1) { }
4432 int foo_;
4433 };
4434cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4435 withInitializer(integerLiteral(equals(1)))))))
4436 matches Foo
4437with withInitializer matching (1)
4438</pre></td></tr>
4439
4440
Aaron Ballman672dde22016-01-22 23:15:00 +00004441<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 +00004442<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4443definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004444
4445Given
4446 for (;;) {}
4447hasBody(compoundStmt())
4448 matches 'for (;;) {}'
4449with compoundStmt()
4450 matching '{}'
4451</pre></td></tr>
4452
4453
Aaron Ballman672dde22016-01-22 23:15:00 +00004454<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 +00004455<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4456
4457Example:
4458 forStmt(hasLoopVariable(anything()))
4459matches 'int x' in
4460 for (int x : a) { }
4461</pre></td></tr>
4462
4463
Aaron Ballman672dde22016-01-22 23:15:00 +00004464<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 +00004465<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4466
4467Example:
4468 forStmt(hasRangeInit(anything()))
4469matches 'a' in
4470 for (int x : a) { }
4471</pre></td></tr>
4472
4473
Aaron Ballman672dde22016-01-22 23:15:00 +00004474<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 +00004475<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4476
4477
Aaron Ballman672dde22016-01-22 23:15:00 +00004478<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004479<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4480
4481Example matches y.x()
4482 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4483 class Y { public: void x(); };
Fangrui Song55942ab2018-01-22 22:34:15 +00004484 void z() { Y y; y.x(); }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004485
4486FIXME: Overload to allow directly matching types?
4487</pre></td></tr>
4488
4489
Aaron Ballman672dde22016-01-22 23:15:00 +00004490<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004491<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4492</pre></td></tr>
4493
4494
Aaron Ballman672dde22016-01-22 23:15:00 +00004495<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 +00004496<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4497matcher, or is a pointer to a type that matches the InnerMatcher.
4498</pre></td></tr>
4499
4500
Clement Courbet6ecaec82016-07-05 07:49:31 +00004501<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 +00004502<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 +00004503produce multiple matches.
4504
4505Given
4506 class A { virtual void f(); };
4507 class B : public A { void f(); };
4508 class C : public B { void f(); };
4509cxxMethodDecl(ofClass(hasName("C")),
4510 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4511 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4512 that B::f is not overridden by C::f).
4513
4514The check can produce multiple matches in case of multiple inheritance, e.g.
4515 class A1 { virtual void f(); };
4516 class A2 { virtual void f(); };
4517 class C : public A1, public A2 { void f(); };
4518cxxMethodDecl(ofClass(hasName("C")),
4519 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4520 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4521 once with "b" binding "A2::f" and "d" binding "C::f".
4522</pre></td></tr>
4523
4524
Aaron Ballman672dde22016-01-22 23:15:00 +00004525<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 +00004526<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4527belongs to.
4528
4529FIXME: Generalize this for other kinds of declarations.
4530FIXME: What other kind of declarations would we need to generalize
4531this to?
4532
4533Example matches A() in the last line
4534 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4535 ofClass(hasName("A"))))))
4536 class A {
4537 public:
4538 A();
4539 };
4540 A a = A();
4541</pre></td></tr>
4542
4543
Adam Baloghda488a62017-11-23 12:43:20 +00004544<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>
4545<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
4546
4547Given:
4548 MyClass *p1 = new MyClass[10];
4549cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
4550 matches the expression 'new MyClass[10]'.
4551</pre></td></tr>
4552
4553
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004554<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 +00004555<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 +00004556matches the given matcher.
4557
4558The associated declaration is:
4559- for type nodes, the declaration of the underlying type
4560- for CallExpr, the declaration of the callee
4561- for MemberExpr, the declaration of the referenced member
4562- for CXXConstructExpr, the declaration of the constructor
4563- for CXXNewExpr, the declaration of the operator new
4564
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004565For type nodes, hasDeclaration will generally match the declaration of the
4566sugared type. Given
4567 class X {};
4568 typedef X Y;
4569 Y y;
4570in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4571typedefDecl. A common use case is to match the underlying, desugared type.
4572This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4573 varDecl(hasType(hasUnqualifiedDesugaredType(
4574 recordType(hasDeclaration(decl())))))
4575In this matcher, the decl will match the CXXRecordDecl of class X.
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004576
Manuel Klimeka37e1102016-12-01 15:45:06 +00004577Usable 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;,
4578 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;,
4579 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;,
4580 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;,
4581 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;,
4582 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;,
4583 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004584</pre></td></tr>
4585
4586
Aaron Ballman672dde22016-01-22 23:15:00 +00004587<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 +00004588<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4589
4590Given:
4591 class A { void func(); };
4592 class B { void member(); };
4593
4594cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4595A but not B.
4596</pre></td></tr>
4597
4598
Aaron Ballman672dde22016-01-22 23:15:00 +00004599<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004600<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4601a class matching Base.
4602
4603Note that a class is not considered to be derived from itself.
4604
4605Example matches Y, Z, C (Base == hasName("X"))
4606 class X;
4607 class Y : public X {}; directly derived
4608 class Z : public Y {}; indirectly derived
4609 typedef X A;
4610 typedef A B;
4611 class C : public B {}; derived from a typedef of X
4612
4613In the following example, Bar matches isDerivedFrom(hasName("X")):
4614 class Foo;
4615 typedef Foo X;
4616 class Bar : public Foo {}; derived from a type that X is a typedef of
4617</pre></td></tr>
4618
4619
Aaron Ballman672dde22016-01-22 23:15:00 +00004620<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 +00004621<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4622match Base.
4623</pre></td></tr>
4624
4625
Aaron Ballman672dde22016-01-22 23:15:00 +00004626<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004627<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4628given matcher.
4629
4630Example matches y.x() (matcher = callExpr(callee(
4631 cxxMethodDecl(hasName("x")))))
4632 class Y { public: void x(); };
4633 void z() { Y y; y.x(); }
4634</pre></td></tr>
4635
4636
Aaron Ballman672dde22016-01-22 23:15:00 +00004637<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 +00004638<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4639
4640Given
4641 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4642 void f() { f(); }
4643callExpr(callee(expr()))
4644 matches this-&gt;x(), x(), y.x(), f()
4645with callee(...)
4646 matching this-&gt;x, x, y.x, f respectively
4647
Aaron Ballman672dde22016-01-22 23:15:00 +00004648Note: 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 +00004649because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004650internal::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 +00004651implemented in terms of implicit casts.
4652</pre></td></tr>
4653
4654
Aaron Ballman672dde22016-01-22 23:15:00 +00004655<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004656<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4657
4658Given
4659 void f(int i);
4660 int y;
4661 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004662callExpr(
4663 forEachArgumentWithParam(
4664 declRefExpr(to(varDecl(hasName("y")))),
4665 parmVarDecl(hasType(isInteger()))
4666))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004667 matches f(y);
4668with declRefExpr(...)
4669 matching int y
4670and parmVarDecl(...)
4671 matching int i
4672</pre></td></tr>
4673
4674
Aaron Ballman672dde22016-01-22 23:15:00 +00004675<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 +00004676<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4677expression.
4678
4679Given
4680 void x(int, int, int) { int y; x(1, y, 42); }
4681callExpr(hasAnyArgument(declRefExpr()))
4682 matches x(1, y, 42)
4683with hasAnyArgument(...)
4684 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004685</pre></td></tr>
4686
4687
Aaron Ballman672dde22016-01-22 23:15:00 +00004688<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 +00004689<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4690call expression.
4691
4692Example matches y in x(y)
4693 (matcher = callExpr(hasArgument(0, declRefExpr())))
4694 void x(int) { int y; x(y); }
4695</pre></td></tr>
4696
4697
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004698<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 +00004699<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 +00004700matches the given matcher.
4701
4702The associated declaration is:
4703- for type nodes, the declaration of the underlying type
4704- for CallExpr, the declaration of the callee
4705- for MemberExpr, the declaration of the referenced member
4706- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004707- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004708
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004709For type nodes, hasDeclaration will generally match the declaration of the
4710sugared type. Given
4711 class X {};
4712 typedef X Y;
4713 Y y;
4714in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4715typedefDecl. A common use case is to match the underlying, desugared type.
4716This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4717 varDecl(hasType(hasUnqualifiedDesugaredType(
4718 recordType(hasDeclaration(decl())))))
4719In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004720
Manuel Klimeka37e1102016-12-01 15:45:06 +00004721Usable 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;,
4722 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;,
4723 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;,
4724 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;,
4725 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;,
4726 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;,
4727 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004728</pre></td></tr>
4729
4730
Aaron Ballman672dde22016-01-22 23:15:00 +00004731<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 +00004732<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4733extension, matches the constant given in the statement.
4734
4735Given
4736 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4737caseStmt(hasCaseConstant(integerLiteral()))
4738 matches "case 1:"
4739</pre></td></tr>
4740
4741
Aaron Ballman672dde22016-01-22 23:15:00 +00004742<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004743<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
4744or opaque value's source expression matches the given matcher.
4745
4746Example 1: matches "a string"
4747(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
4748class URL { URL(string); };
4749URL url = "a string";
4750
4751Example 2: matches 'b' (matcher =
4752opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
4753int a = b ?: 1;
4754</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004755
4756
Aaron Ballman672dde22016-01-22 23:15:00 +00004757<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 +00004758<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4759functionDecl that have at least one TemplateArgument matching the given
4760InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004761
4762Given
4763 template&lt;typename T&gt; class A {};
4764 template&lt;&gt; class A&lt;double&gt; {};
4765 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004766
Haojian Wu99e39a72016-07-29 17:30:13 +00004767 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004768 void func() { f&lt;int&gt;(); };
4769
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004770classTemplateSpecializationDecl(hasAnyTemplateArgument(
4771 refersToType(asString("int"))))
4772 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004773
4774functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4775 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004776</pre></td></tr>
4777
4778
Manuel Klimek696e5052017-08-02 13:04:44 +00004779<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>
4780<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4781
4782Given
4783 tempalate&lt;typename T&gt; class A {};
4784 typedef A&lt;int&gt; B;
4785classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4786 matches 'B' with classTemplateDecl() matching the class template
4787 declaration of 'A'.
4788</pre></td></tr>
4789
4790
Aaron Ballman672dde22016-01-22 23:15:00 +00004791<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004792<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4793functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004794
4795Given
4796 template&lt;typename T, typename U&gt; class A {};
4797 A&lt;bool, int&gt; b;
4798 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004799
Fangrui Song55942ab2018-01-22 22:34:15 +00004800 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00004801 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004802classTemplateSpecializationDecl(hasTemplateArgument(
4803 1, refersToType(asString("int"))))
4804 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004805
4806functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4807 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004808</pre></td></tr>
4809
4810
Aaron Ballman672dde22016-01-22 23:15:00 +00004811<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004812<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4813type.
4814
4815Given
4816 struct A {};
4817 A a[7];
4818 int b[7];
4819arrayType(hasElementType(builtinType()))
4820 matches "int b[7]"
4821
Aaron Ballman672dde22016-01-22 23:15:00 +00004822Usable 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 +00004823</pre></td></tr>
4824
4825
Aaron Ballman672dde22016-01-22 23:15:00 +00004826<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004827<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4828type.
4829
4830Given
4831 struct A {};
4832 A a[7];
4833 int b[7];
4834arrayType(hasElementType(builtinType()))
4835 matches "int b[7]"
4836
Aaron Ballman672dde22016-01-22 23:15:00 +00004837Usable 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 +00004838</pre></td></tr>
4839
4840
Aaron Ballman672dde22016-01-22 23:15:00 +00004841<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 +00004842<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 +00004843a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004844
4845Given
4846 { {}; 1+2; }
4847hasAnySubstatement(compoundStmt())
4848 matches '{ {}; 1+2; }'
4849with compoundStmt()
4850 matching '{}'
4851</pre></td></tr>
4852
4853
Aaron Ballman672dde22016-01-22 23:15:00 +00004854<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 +00004855<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4856</pre></td></tr>
4857
4858
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004859<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 +00004860<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 +00004861matches the given matcher.
4862
4863The associated declaration is:
4864- for type nodes, the declaration of the underlying type
4865- for CallExpr, the declaration of the callee
4866- for MemberExpr, the declaration of the referenced member
4867- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004868- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004869
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004870For type nodes, hasDeclaration will generally match the declaration of the
4871sugared type. Given
4872 class X {};
4873 typedef X Y;
4874 Y y;
4875in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4876typedefDecl. A common use case is to match the underlying, desugared type.
4877This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4878 varDecl(hasType(hasUnqualifiedDesugaredType(
4879 recordType(hasDeclaration(decl())))))
4880In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004881
Manuel Klimeka37e1102016-12-01 15:45:06 +00004882Usable 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;,
4883 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;,
4884 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;,
4885 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;,
4886 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;,
4887 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;,
4888 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004889</pre></td></tr>
4890
4891
Aaron Ballman672dde22016-01-22 23:15:00 +00004892<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 +00004893<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4894specific using shadow declaration.
4895
4896Given
4897 namespace a { void f() {} }
4898 using a::f;
4899 void g() {
4900 f(); Matches this ..
4901 a::f(); .. but not this.
4902 }
4903declRefExpr(throughUsingDecl(anything()))
4904 matches f()
4905</pre></td></tr>
4906
4907
Aaron Ballman672dde22016-01-22 23:15:00 +00004908<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 +00004909<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4910specified matcher.
4911
4912Example matches x in if(x)
4913 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4914 bool x;
4915 if (x) {}
4916</pre></td></tr>
4917
4918
Aaron Ballman672dde22016-01-22 23:15:00 +00004919<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 +00004920<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4921
4922Note that this does not work for global declarations because the AST
4923breaks up multiple-declaration DeclStmt's into multiple single-declaration
4924DeclStmt's.
4925Example: Given non-global declarations
4926 int a, b = 0;
4927 int c;
4928 int d = 2, e;
4929declStmt(containsDeclaration(
4930 0, varDecl(hasInitializer(anything()))))
4931 matches only 'int d = 2, e;', and
4932declStmt(containsDeclaration(1, varDecl()))
4933 matches 'int a, b = 0' as well as 'int d = 2, e;'
4934 but 'int c;' is not matched.
4935</pre></td></tr>
4936
4937
Aaron Ballman672dde22016-01-22 23:15:00 +00004938<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 +00004939<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4940
4941Given
4942 int a, b;
4943 int c;
4944declStmt(hasSingleDecl(anything()))
4945 matches 'int c;' but not 'int a, b;'.
4946</pre></td></tr>
4947
4948
Aaron Ballman672dde22016-01-22 23:15:00 +00004949<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 +00004950<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4951the inner matcher.
4952
4953Given
4954 int x;
4955declaratorDecl(hasTypeLoc(loc(asString("int"))))
4956 matches int x
4957</pre></td></tr>
4958
4959
Aaron Ballman672dde22016-01-22 23:15:00 +00004960<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 +00004961<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4962Decl, matches InnerMatcher.
4963
4964Given
4965 namespace N {
4966 namespace M {
4967 class D {};
4968 }
4969 }
4970
4971cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4972declaration of class D.
4973</pre></td></tr>
4974
4975
Aaron Ballman672dde22016-01-22 23:15:00 +00004976<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 +00004977<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4978definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004979
4980Given
4981 for (;;) {}
4982hasBody(compoundStmt())
4983 matches 'for (;;) {}'
4984with compoundStmt()
4985 matching '{}'
4986</pre></td></tr>
4987
4988
Aaron Ballman672dde22016-01-22 23:15:00 +00004989<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 +00004990<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 +00004991switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004992
4993Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4994 if (true) {}
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_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 +00004999<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5000matches InnerMatcher if the qualifier exists.
5001
5002Given
5003 namespace N {
5004 namespace M {
5005 class D {};
5006 }
5007 }
5008 N::M::D d;
5009
5010elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5011matches the type of the variable declaration of d.
5012</pre></td></tr>
5013
5014
Aaron Ballman672dde22016-01-22 23:15:00 +00005015<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 +00005016<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5017
5018Given
5019 namespace N {
5020 namespace M {
5021 class D {};
5022 }
5023 }
5024 N::M::D d;
5025
5026elaboratedType(namesType(recordType(
5027hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5028declaration of d.
5029</pre></td></tr>
5030
5031
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005032<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 +00005033<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 +00005034matches the given matcher.
5035
5036The associated declaration is:
5037- for type nodes, the declaration of the underlying type
5038- for CallExpr, the declaration of the callee
5039- for MemberExpr, the declaration of the referenced member
5040- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005041- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005042
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005043For type nodes, hasDeclaration will generally match the declaration of the
5044sugared type. Given
5045 class X {};
5046 typedef X Y;
5047 Y y;
5048in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5049typedefDecl. A common use case is to match the underlying, desugared type.
5050This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5051 varDecl(hasType(hasUnqualifiedDesugaredType(
5052 recordType(hasDeclaration(decl())))))
5053In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005054
Manuel Klimeka37e1102016-12-01 15:45:06 +00005055Usable 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;,
5056 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;,
5057 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;,
5058 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;,
5059 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;,
5060 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;,
5061 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005062</pre></td></tr>
5063
5064
Aaron Ballman672dde22016-01-22 23:15:00 +00005065<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 +00005066<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5067
5068(Note: Clang's AST refers to other conversions as "casts" too, and calls
5069actual casts "explicit" casts.)
5070</pre></td></tr>
5071
5072
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005073<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>
5074<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 +00005075declaration's type.
5076
5077In case of a value declaration (for example a variable declaration),
5078this resolves one layer of indirection. For example, in the value
5079declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5080X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5081declaration of x.
5082
5083Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5084 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5085 class X {};
5086 void y(X &amp;x) { x; X z; }
5087
Aaron Ballman672dde22016-01-22 23:15:00 +00005088Usable 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 +00005089</pre></td></tr>
5090
5091
Aaron Ballman672dde22016-01-22 23:15:00 +00005092<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 +00005093<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5094matcher.
5095
5096Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5097 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005098 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005099 class X {};
5100 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005101 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005102</pre></td></tr>
5103
5104
Aaron Ballman672dde22016-01-22 23:15:00 +00005105<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005106<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5107are stripped off.
5108
5109Parentheses and explicit casts are not discarded.
5110Given
5111 int arr[5];
5112 int a = 0;
5113 char b = 0;
5114 const int c = a;
5115 int *d = arr;
5116 long e = (long) 0l;
5117The matchers
5118 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5119 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5120would match the declarations for a, b, c, and d, but not e.
5121While
5122 varDecl(hasInitializer(integerLiteral()))
5123 varDecl(hasInitializer(declRefExpr()))
5124only match the declarations for b, c, and d.
5125</pre></td></tr>
5126
5127
Cong Liu8a02efb2016-06-24 09:38:03 +00005128<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>
5129<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5130nodes are stripped off.
5131
5132Parentheses and explicit casts are not discarded.
5133Given
5134 class C {};
5135 C a = C();
5136 C b;
5137 C c = b;
5138The matchers
5139 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5140would match the declarations for a, b, and c.
5141While
5142 varDecl(hasInitializer(cxxConstructExpr()))
5143only match the declarations for b and c.
5144</pre></td></tr>
5145
5146
Aaron Ballman672dde22016-01-22 23:15:00 +00005147<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 +00005148<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5149casts are stripped off.
5150
5151Implicit and non-C Style casts are also discarded.
5152Given
5153 int a = 0;
5154 char b = (0);
5155 void* c = reinterpret_cast&lt;char*&gt;(0);
5156 char d = char(0);
5157The matcher
5158 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5159would match the declarations for a, b, c, and d.
5160while
5161 varDecl(hasInitializer(integerLiteral()))
5162only match the declaration for a.
5163</pre></td></tr>
5164
5165
Aaron Ballman672dde22016-01-22 23:15:00 +00005166<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 +00005167<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5168parentheses are stripped off.
5169
5170Explicit casts are not discarded.
5171Given
5172 int arr[5];
5173 int a = 0;
5174 char b = (0);
5175 const int c = a;
5176 int *d = (arr);
5177 long e = ((long) 0l);
5178The matchers
5179 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5180 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5181would match the declarations for a, b, c, and d, but not e.
5182while
5183 varDecl(hasInitializer(integerLiteral()))
5184 varDecl(hasInitializer(declRefExpr()))
5185would only match the declaration for a.
5186</pre></td></tr>
5187
5188
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00005189<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>
5190<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5191
5192Given
5193 class C {
5194 int a = 2;
5195 int b = 3;
5196 int c;
5197 };
5198fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5199 matches 'int a;' but not 'int b;'.
5200fieldDecl(hasInClassInitializer(anything()))
5201 matches 'int a;' and 'int b;' but not 'int c;'.
5202</pre></td></tr>
5203
5204
Aaron Ballman672dde22016-01-22 23:15:00 +00005205<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 +00005206<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5207definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005208
5209Given
5210 for (;;) {}
5211hasBody(compoundStmt())
5212 matches 'for (;;) {}'
5213with compoundStmt()
5214 matching '{}'
5215</pre></td></tr>
5216
5217
Aaron Ballman672dde22016-01-22 23:15:00 +00005218<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 +00005219<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 +00005220switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005221
5222Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5223 if (true) {}
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('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 +00005228<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5229
5230Example:
5231 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5232matches '++x' in
5233 for (x; x &lt; N; ++x) { }
5234</pre></td></tr>
5235
5236
Aaron Ballman672dde22016-01-22 23:15:00 +00005237<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 +00005238<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5239
5240Example:
5241 forStmt(hasLoopInit(declStmt()))
5242matches 'int x = 0' in
5243 for (int x = 0; x &lt; N; ++x) { }
5244</pre></td></tr>
5245
5246
Aaron Ballman672dde22016-01-22 23:15:00 +00005247<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 +00005248<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5249
5250Does not match the 'this' parameter of a method.
5251
5252Given
5253 class X { void f(int x, int y, int z) {} };
5254cxxMethodDecl(hasAnyParameter(hasName("y")))
5255 matches f(int x, int y, int z) {}
5256with hasAnyParameter(...)
5257 matching int y
5258</pre></td></tr>
5259
5260
Haojian Wud898b092016-07-29 13:57:27 +00005261<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>
5262<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5263functionDecl that have at least one TemplateArgument matching the given
5264InnerMatcher.
5265
5266Given
5267 template&lt;typename T&gt; class A {};
5268 template&lt;&gt; class A&lt;double&gt; {};
5269 A&lt;int&gt; a;
5270
Haojian Wu99e39a72016-07-29 17:30:13 +00005271 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005272 void func() { f&lt;int&gt;(); };
5273
5274classTemplateSpecializationDecl(hasAnyTemplateArgument(
5275 refersToType(asString("int"))))
5276 matches the specialization A&lt;int&gt;
5277
5278functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5279 matches the specialization f&lt;int&gt;
5280</pre></td></tr>
5281
5282
Aaron Ballman672dde22016-01-22 23:15:00 +00005283<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 +00005284<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5285definition that has a given body.
5286
5287Given
5288 for (;;) {}
5289hasBody(compoundStmt())
5290 matches 'for (;;) {}'
5291with compoundStmt()
5292 matching '{}'
5293</pre></td></tr>
5294
5295
Aaron Ballman672dde22016-01-22 23:15:00 +00005296<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 +00005297<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5298
5299Given
5300 class X { void f(int x) {} };
5301cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5302 matches f(int x) {}
5303with hasParameter(...)
5304 matching int x
5305</pre></td></tr>
5306
5307
Haojian Wud898b092016-07-29 13:57:27 +00005308<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>
5309<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5310functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5311
5312Given
5313 template&lt;typename T, typename U&gt; class A {};
5314 A&lt;bool, int&gt; b;
5315 A&lt;int, bool&gt; c;
5316
Fangrui Song55942ab2018-01-22 22:34:15 +00005317 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005318 void func() { f&lt;int&gt;(); };
5319classTemplateSpecializationDecl(hasTemplateArgument(
5320 1, refersToType(asString("int"))))
5321 matches the specialization A&lt;bool, int&gt;
5322
5323functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5324 matches the specialization f&lt;int&gt;
5325</pre></td></tr>
5326
5327
Aaron Ballman672dde22016-01-22 23:15:00 +00005328<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 +00005329<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5330
5331Given:
5332 class X { int f() { return 1; } };
5333cxxMethodDecl(returns(asString("int")))
5334 matches int f() { return 1; }
5335</pre></td></tr>
5336
5337
Aaron Ballman672dde22016-01-22 23:15:00 +00005338<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 +00005339<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 +00005340switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005341
5342Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5343 if (true) {}
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('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 +00005348<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5349
5350Given
5351 if (A* a = GetAPointer()) {}
5352hasConditionVariableStatement(...)
5353 matches 'A* a = GetAPointer()'.
5354</pre></td></tr>
5355
5356
Aaron Ballman672dde22016-01-22 23:15:00 +00005357<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 +00005358<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5359
5360Examples matches the if statement
5361 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5362 if (false) false; else true;
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('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 +00005367<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5368
5369Examples matches the if statement
5370 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5371 if (false) true; else false;
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_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 +00005376<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5377matcher.
5378
5379FIXME: Unit test this matcher
5380</pre></td></tr>
5381
5382
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005383<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>
5384<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5385(if expression have it).
5386</pre></td></tr>
5387
5388
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005389<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 +00005390<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5391matches the given matcher.
5392
5393The associated declaration is:
5394- for type nodes, the declaration of the underlying type
5395- for CallExpr, the declaration of the callee
5396- for MemberExpr, the declaration of the referenced member
5397- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005398- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005399
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005400For type nodes, hasDeclaration will generally match the declaration of the
5401sugared type. Given
5402 class X {};
5403 typedef X Y;
5404 Y y;
5405in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5406typedefDecl. A common use case is to match the underlying, desugared type.
5407This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5408 varDecl(hasType(hasUnqualifiedDesugaredType(
5409 recordType(hasDeclaration(decl())))))
5410In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005411
Manuel Klimeka37e1102016-12-01 15:45:06 +00005412Usable 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;,
5413 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;,
5414 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;,
5415 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;,
5416 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;,
5417 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;,
5418 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5419</pre></td></tr>
5420
5421
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005422<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 +00005423<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5424matches the given matcher.
5425
5426The associated declaration is:
5427- for type nodes, the declaration of the underlying type
5428- for CallExpr, the declaration of the callee
5429- for MemberExpr, the declaration of the referenced member
5430- for CXXConstructExpr, the declaration of the constructor
5431- for CXXNewExpr, the declaration of the operator new
5432
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005433For type nodes, hasDeclaration will generally match the declaration of the
5434sugared type. Given
5435 class X {};
5436 typedef X Y;
5437 Y y;
5438in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5439typedefDecl. A common use case is to match the underlying, desugared type.
5440This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5441 varDecl(hasType(hasUnqualifiedDesugaredType(
5442 recordType(hasDeclaration(decl())))))
5443In this matcher, the decl will match the CXXRecordDecl of class X.
Manuel Klimeka37e1102016-12-01 15:45:06 +00005444
5445Usable 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;,
5446 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;,
5447 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;,
5448 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;,
5449 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;,
5450 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;,
5451 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005452</pre></td></tr>
5453
5454
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005455<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 +00005456<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5457matches the given matcher.
5458
5459The associated declaration is:
5460- for type nodes, the declaration of the underlying type
5461- for CallExpr, the declaration of the callee
5462- for MemberExpr, the declaration of the referenced member
5463- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005464- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005465
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005466For type nodes, hasDeclaration will generally match the declaration of the
5467sugared type. Given
5468 class X {};
5469 typedef X Y;
5470 Y y;
5471in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5472typedefDecl. A common use case is to match the underlying, desugared type.
5473This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5474 varDecl(hasType(hasUnqualifiedDesugaredType(
5475 recordType(hasDeclaration(decl())))))
5476In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005477
Manuel Klimeka37e1102016-12-01 15:45:06 +00005478Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5479 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5480 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5481 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5482 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5483 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5484 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005485</pre></td></tr>
5486
5487
Aaron Ballman672dde22016-01-22 23:15:00 +00005488<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 +00005489<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5490matched by a given matcher.
5491
5492Given
5493 struct X { int m; };
5494 void f(X x) { x.m; m; }
5495memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5496 matches "x.m" and "m"
5497with hasObjectExpression(...)
5498 matching "x" and the implicit object expression of "m" which has type X*.
5499</pre></td></tr>
5500
5501
Aaron Ballman672dde22016-01-22 23:15:00 +00005502<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 +00005503<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5504given matcher.
5505
5506Given
5507 struct { int first, second; } first, second;
5508 int i(second.first);
5509 int j(first.second);
5510memberExpr(member(hasName("first")))
5511 matches second.first
5512 but not first.second (because the member name there is "second").
5513</pre></td></tr>
5514
5515
Aaron Ballman672dde22016-01-22 23:15:00 +00005516<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005517<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5518pointee matches a given matcher.
5519
5520Given
5521 int *a;
5522 int const *b;
5523 float const *f;
5524pointerType(pointee(isConstQualified(), isInteger()))
5525 matches "int const *b"
5526
Aaron Ballman672dde22016-01-22 23:15:00 +00005527Usable 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;,
5528 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 +00005529</pre></td></tr>
5530
5531
Aaron Ballman672dde22016-01-22 23:15:00 +00005532<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 +00005533<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5534pointee matches a given matcher.
5535
5536Given
5537 int *a;
5538 int const *b;
5539 float const *f;
5540pointerType(pointee(isConstQualified(), isInteger()))
5541 matches "int const *b"
5542
Aaron Ballman672dde22016-01-22 23:15:00 +00005543Usable 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;,
5544 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 +00005545</pre></td></tr>
5546
5547
Martin Bohme8cef2c22016-08-09 15:07:52 +00005548<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>
5549<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5550matcher.
5551
5552Given
5553 namespace N { template&lt;class T&gt; void f(T t); }
5554 template &lt;class T&gt; void g() { using N::f; f(T()); }
5555unresolvedLookupExpr(hasAnyDeclaration(
5556 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5557 matches the use of f in g() .
5558</pre></td></tr>
5559
5560
Aaron Ballman672dde22016-01-22 23:15:00 +00005561<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 +00005562<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5563
5564Given
5565 struct A { struct B { struct C {}; }; };
5566 A::B::C c;
5567nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5568 matches "A::"
5569</pre></td></tr>
5570
5571
Aaron Ballman672dde22016-01-22 23:15:00 +00005572<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 +00005573<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5574given TypeLoc.
5575
5576Given
5577 struct A { struct B { struct C {}; }; };
5578 A::B::C c;
5579nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5580 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5581 matches "A::"
5582</pre></td></tr>
5583
5584
Aaron Ballman672dde22016-01-22 23:15:00 +00005585<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 +00005586<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5587
5588Given
5589 struct A { struct B { struct C {}; }; };
5590 A::B::C c;
5591nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5592 matches "A::"
5593</pre></td></tr>
5594
5595
Aaron Ballman672dde22016-01-22 23:15:00 +00005596<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 +00005597<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5598given namespace matcher.
5599
5600Given
5601 namespace ns { struct A {}; }
5602 ns::A a;
5603nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5604 matches "ns::"
5605</pre></td></tr>
5606
5607
Aaron Ballman672dde22016-01-22 23:15:00 +00005608<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 +00005609<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5610given QualType matcher without qualifiers.
5611
5612Given
5613 struct A { struct B { struct C {}; }; };
5614 A::B::C c;
5615nestedNameSpecifier(specifiesType(
5616 hasDeclaration(cxxRecordDecl(hasName("A")))
5617))
5618 matches "A::"
5619</pre></td></tr>
5620
5621
Aaron Ballman672dde22016-01-22 23:15:00 +00005622<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 +00005623<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5624call expression.
5625
5626Example matches y in x(y)
5627 (matcher = callExpr(hasArgument(0, declRefExpr())))
5628 void x(int) { int y; x(y); }
5629</pre></td></tr>
5630
5631
Aaron Ballman672dde22016-01-22 23:15:00 +00005632<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 +00005633<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5634
5635Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005636matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005637matches the [webView ...] message invocation.
5638 NSString *webViewJavaScript = ...
5639 UIWebView *webView = ...
5640 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5641</pre></td></tr>
5642
5643
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005644<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 +00005645<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
5646or opaque value's source expression matches the given matcher.
5647
5648Example 1: matches "a string"
5649(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5650class URL { URL(string); };
5651URL url = "a string";
5652
5653Example 2: matches 'b' (matcher =
5654opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5655int a = b ?: 1;
5656</pre></td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005657
5658
Martin Bohme8cef2c22016-08-09 15:07:52 +00005659<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>
5660<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5661overloads matches the given matcher.
5662
5663Given
5664 template &lt;typename T&gt; void foo(T);
5665 template &lt;typename T&gt; void bar(T);
5666 template &lt;typename T&gt; void baz(T t) {
5667 foo(t);
5668 bar(t);
5669 }
5670unresolvedLookupExpr(hasAnyDeclaration(
5671 functionTemplateDecl(hasName("foo"))))
5672 matches foo in foo(t); but not bar in bar(t);
5673</pre></td></tr>
5674
5675
Aaron Ballman672dde22016-01-22 23:15:00 +00005676<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005677<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5678
5679Given
5680 int (*ptr_to_array)[4];
5681 int (*ptr_to_func)(int);
5682
5683varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5684ptr_to_func but not ptr_to_array.
5685
Aaron Ballman672dde22016-01-22 23:15:00 +00005686Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005687</pre></td></tr>
5688
5689
Aaron Ballman672dde22016-01-22 23:15:00 +00005690<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005691<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5692pointee matches a given matcher.
5693
5694Given
5695 int *a;
5696 int const *b;
5697 float const *f;
5698pointerType(pointee(isConstQualified(), isInteger()))
5699 matches "int const *b"
5700
Aaron Ballman672dde22016-01-22 23:15:00 +00005701Usable 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;,
5702 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 +00005703</pre></td></tr>
5704
5705
Aaron Ballman672dde22016-01-22 23:15:00 +00005706<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 +00005707<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5708pointee matches a given matcher.
5709
5710Given
5711 int *a;
5712 int const *b;
5713 float const *f;
5714pointerType(pointee(isConstQualified(), isInteger()))
5715 matches "int const *b"
5716
Aaron Ballman672dde22016-01-22 23:15:00 +00005717Usable 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;,
5718 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 +00005719</pre></td></tr>
5720
5721
Aaron Ballman672dde22016-01-22 23:15:00 +00005722<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 +00005723<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5724
5725Given:
5726 typedef int &amp;int_ref;
5727 int a;
5728 int_ref b = a;
5729
5730varDecl(hasType(qualType(referenceType()))))) will not match the
5731declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5732</pre></td></tr>
5733
5734
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005735<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 +00005736<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5737matches the given matcher.
5738
5739The associated declaration is:
5740- for type nodes, the declaration of the underlying type
5741- for CallExpr, the declaration of the callee
5742- for MemberExpr, the declaration of the referenced member
5743- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005744- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005745
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005746For type nodes, hasDeclaration will generally match the declaration of the
5747sugared type. Given
5748 class X {};
5749 typedef X Y;
5750 Y y;
5751in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5752typedefDecl. A common use case is to match the underlying, desugared type.
5753This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5754 varDecl(hasType(hasUnqualifiedDesugaredType(
5755 recordType(hasDeclaration(decl())))))
5756In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005757
Manuel Klimeka37e1102016-12-01 15:45:06 +00005758Usable 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;,
5759 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;,
5760 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;,
5761 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;,
5762 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;,
5763 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;,
5764 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005765</pre></td></tr>
5766
5767
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005768<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>
5769<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5770
5771Given
5772 void (*fp)(void);
5773The matcher
5774 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5775would match the declaration for fp.
5776</pre></td></tr>
5777
5778
Aaron Ballman672dde22016-01-22 23:15:00 +00005779<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 +00005780<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5781</pre></td></tr>
5782
5783
Aaron Ballman672dde22016-01-22 23:15:00 +00005784<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 +00005785<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5786matches the specified matcher.
5787
5788Example matches y-&gt;x()
5789 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5790 cxxRecordDecl(hasName("Y")))))))
5791 class Y { public: void x(); };
5792 void z() { Y *y; y-&gt;x(); }
5793</pre></td></tr>
5794
5795
Aaron Ballman672dde22016-01-22 23:15:00 +00005796<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 +00005797<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5798</pre></td></tr>
5799
5800
Aaron Ballman672dde22016-01-22 23:15:00 +00005801<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 +00005802<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5803type matches the specified matcher.
5804
5805Example matches X &amp;x and const X &amp;y
5806 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5807 class X {
5808 void a(X b) {
5809 X &amp;x = b;
5810 const X &amp;y = b;
5811 }
5812 };
5813</pre></td></tr>
5814
5815
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005816<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 +00005817<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5818matches the given matcher.
5819
5820The associated declaration is:
5821- for type nodes, the declaration of the underlying type
5822- for CallExpr, the declaration of the callee
5823- for MemberExpr, the declaration of the referenced member
5824- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005825- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005826
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005827For type nodes, hasDeclaration will generally match the declaration of the
5828sugared type. Given
5829 class X {};
5830 typedef X Y;
5831 Y y;
5832in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5833typedefDecl. A common use case is to match the underlying, desugared type.
5834This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5835 varDecl(hasType(hasUnqualifiedDesugaredType(
5836 recordType(hasDeclaration(decl())))))
5837In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005838
Manuel Klimeka37e1102016-12-01 15:45:06 +00005839Usable 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;,
5840 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;,
5841 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;,
5842 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;,
5843 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;,
5844 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;,
5845 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005846</pre></td></tr>
5847
5848
Aaron Ballman672dde22016-01-22 23:15:00 +00005849<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 +00005850<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5851pointee matches a given matcher.
5852
5853Given
5854 int *a;
5855 int const *b;
5856 float const *f;
5857pointerType(pointee(isConstQualified(), isInteger()))
5858 matches "int const *b"
5859
Aaron Ballman672dde22016-01-22 23:15:00 +00005860Usable 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;,
5861 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 +00005862</pre></td></tr>
5863
5864
Aaron Ballman672dde22016-01-22 23:15:00 +00005865<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 +00005866<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5867pointee matches a given matcher.
5868
5869Given
5870 int *a;
5871 int const *b;
5872 float const *f;
5873pointerType(pointee(isConstQualified(), isInteger()))
5874 matches "int const *b"
5875
Aaron Ballman672dde22016-01-22 23:15:00 +00005876Usable 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;,
5877 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 +00005878</pre></td></tr>
5879
5880
Alexander Kornienko976921d2016-03-22 11:03:03 +00005881<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>
5882<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5883
5884Given
5885 return a + b;
5886hasReturnValue(binaryOperator())
5887 matches 'return a + b'
5888with binaryOperator()
5889 matching 'a + b'
5890</pre></td></tr>
5891
5892
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005893<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>
5894<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5895a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5896
5897Given
5898 { {}; 1+2; }
5899hasAnySubstatement(compoundStmt())
5900 matches '{ {}; 1+2; }'
5901with compoundStmt()
5902 matching '{}'
5903</pre></td></tr>
5904
5905
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005906<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 +00005907<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5908alignof.
5909</pre></td></tr>
5910
5911
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005912<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 +00005913<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 +00005914
5915Given:
5916F&amp; operator=(const F&amp; o) {
5917 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5918 return *this;
5919}
5920returnStmt(forFunction(hasName("operator=")))
5921 matches 'return *this'
5922 but does match 'return &gt; 0'
5923</pre></td></tr>
5924
5925
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005926<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 +00005927<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5928sizeof.
5929</pre></td></tr>
5930
5931
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005932<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>
5933<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5934type that matches the provided matcher.
5935
5936Given
5937 template &lt;typename T&gt;
5938 double F(T t);
5939 int i;
5940 double j = F(i);
5941
5942substTemplateTypeParmType(hasReplacementType(type())) matches int
5943</pre></td></tr>
5944
5945
Aaron Ballman672dde22016-01-22 23:15:00 +00005946<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 +00005947<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5948statement. This matcher may produce multiple matches.
5949
5950Given
5951 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5952switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5953 matches four times, with "c" binding each of "case 1:", "case 2:",
5954"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5955"switch (1)", "switch (2)" and "switch (2)".
5956</pre></td></tr>
5957
5958
Etienne Bergeron5500f952016-05-30 15:25:25 +00005959<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>
5960<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5961switch statement or conditional operator.
5962
5963Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5964 if (true) {}
5965</pre></td></tr>
5966
5967
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005968<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 +00005969<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5970matches the given matcher.
5971
5972The associated declaration is:
5973- for type nodes, the declaration of the underlying type
5974- for CallExpr, the declaration of the callee
5975- for MemberExpr, the declaration of the referenced member
5976- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005977- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005978
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005979For type nodes, hasDeclaration will generally match the declaration of the
5980sugared type. Given
5981 class X {};
5982 typedef X Y;
5983 Y y;
5984in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5985typedefDecl. A common use case is to match the underlying, desugared type.
5986This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5987 varDecl(hasType(hasUnqualifiedDesugaredType(
5988 recordType(hasDeclaration(decl())))))
5989In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005990
Manuel Klimeka37e1102016-12-01 15:45:06 +00005991Usable 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;,
5992 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;,
5993 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;,
5994 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;,
5995 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;,
5996 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;,
5997 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005998</pre></td></tr>
5999
6000
Aaron Ballman672dde22016-01-22 23:15:00 +00006001<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 +00006002<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6003
6004Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006005 struct B { int next; };
6006 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006007 A&lt;&amp;B::next&gt; a;
6008templateSpecializationType(hasAnyTemplateArgument(
6009 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6010 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6011 B::next
6012</pre></td></tr>
6013
6014
Aaron Ballman672dde22016-01-22 23:15:00 +00006015<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 +00006016<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6017declaration.
6018
6019Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006020 struct B { int next; };
6021 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006022 A&lt;&amp;B::next&gt; a;
6023classTemplateSpecializationDecl(hasAnyTemplateArgument(
Fangrui Song55942ab2018-01-22 22:34:15 +00006024 refersToDeclaration(fieldDecl(hasName("next")))))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006025 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6026 B::next
6027</pre></td></tr>
6028
6029
Aaron Ballman672dde22016-01-22 23:15:00 +00006030<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 +00006031<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6032
6033Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006034 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006035 C&lt;42&gt; c;
6036classTemplateSpecializationDecl(
6037 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6038 matches the implicit instantiation of C in C&lt;42&gt;.
6039</pre></td></tr>
6040
6041
Haojian Wub33b02e2016-07-29 15:45:11 +00006042<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>
6043<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6044
6045Given
6046 template&lt;template &lt;typename&gt; class S&gt; class X {};
6047 template&lt;typename T&gt; class Y {};"
6048 X&lt;Y&gt; xi;
6049classTemplateSpecializationDecl(hasAnyTemplateArgument(
6050 refersToTemplate(templateName())))
6051 matches the specialization X&lt;Y&gt;
6052</pre></td></tr>
6053
6054
Aaron Ballman672dde22016-01-22 23:15:00 +00006055<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 +00006056<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6057
6058Given
6059 struct X {};
6060 template&lt;typename T&gt; struct A {};
6061 A&lt;X&gt; a;
6062classTemplateSpecializationDecl(hasAnyTemplateArgument(
6063 refersToType(class(hasName("X")))))
6064 matches the specialization A&lt;X&gt;
6065</pre></td></tr>
6066
6067
Aaron Ballman672dde22016-01-22 23:15:00 +00006068<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 +00006069<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6070functionDecl that have at least one TemplateArgument matching the given
6071InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006072
6073Given
6074 template&lt;typename T&gt; class A {};
6075 template&lt;&gt; class A&lt;double&gt; {};
6076 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00006077
Haojian Wu99e39a72016-07-29 17:30:13 +00006078 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00006079 void func() { f&lt;int&gt;(); };
6080
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006081classTemplateSpecializationDecl(hasAnyTemplateArgument(
6082 refersToType(asString("int"))))
6083 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006084
6085functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6086 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006087</pre></td></tr>
6088
6089
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006090<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 +00006091<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6092matches the given matcher.
6093
6094The associated declaration is:
6095- for type nodes, the declaration of the underlying type
6096- for CallExpr, the declaration of the callee
6097- for MemberExpr, the declaration of the referenced member
6098- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006099- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006100
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006101For type nodes, hasDeclaration will generally match the declaration of the
6102sugared type. Given
6103 class X {};
6104 typedef X Y;
6105 Y y;
6106in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6107typedefDecl. A common use case is to match the underlying, desugared type.
6108This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6109 varDecl(hasType(hasUnqualifiedDesugaredType(
6110 recordType(hasDeclaration(decl())))))
6111In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006112
Manuel Klimeka37e1102016-12-01 15:45:06 +00006113Usable 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;,
6114 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;,
6115 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;,
6116 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;,
6117 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;,
6118 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;,
6119 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006120</pre></td></tr>
6121
6122
Aaron Ballman672dde22016-01-22 23:15:00 +00006123<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 +00006124<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6125functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006126
6127Given
6128 template&lt;typename T, typename U&gt; class A {};
6129 A&lt;bool, int&gt; b;
6130 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00006131
Fangrui Song55942ab2018-01-22 22:34:15 +00006132 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00006133 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006134classTemplateSpecializationDecl(hasTemplateArgument(
6135 1, refersToType(asString("int"))))
6136 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006137
6138functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6139 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006140</pre></td></tr>
6141
6142
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006143<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 +00006144<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
6145matches the given matcher.
6146
6147The associated declaration is:
6148- for type nodes, the declaration of the underlying type
6149- for CallExpr, the declaration of the callee
6150- for MemberExpr, the declaration of the referenced member
6151- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006152- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006153
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006154For type nodes, hasDeclaration will generally match the declaration of the
6155sugared type. Given
6156 class X {};
6157 typedef X Y;
6158 Y y;
6159in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6160typedefDecl. A common use case is to match the underlying, desugared type.
6161This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6162 varDecl(hasType(hasUnqualifiedDesugaredType(
6163 recordType(hasDeclaration(decl())))))
6164In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006165
Manuel Klimeka37e1102016-12-01 15:45:06 +00006166Usable 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;,
6167 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;,
6168 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;,
6169 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;,
6170 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;,
6171 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;,
6172 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006173</pre></td></tr>
6174
6175
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006176<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 +00006177<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
6178
6179Generates results for each match.
6180
6181For example, in:
6182 class A { class B {}; class C {}; };
6183The matcher:
6184 cxxRecordDecl(hasName("::A"),
6185 findAll(cxxRecordDecl(isDefinition()).bind("m")))
6186will generate results for A, B and C.
6187
6188Usable as: Any Matcher
6189</pre></td></tr>
6190
6191
Aaron Ballman66eb58a2016-04-14 16:05:45 +00006192<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 +00006193<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6194matcher.
6195
6196Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6197 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6198 and U (matcher = typedefDecl(hasType(asString("int")))
6199 class X {};
6200 void y(X &amp;x) { x; X z; }
6201 typedef int U;
6202</pre></td></tr>
6203
6204
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006205<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 +00006206<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6207matches the given matcher.
6208
6209The associated declaration is:
6210- for type nodes, the declaration of the underlying type
6211- for CallExpr, the declaration of the callee
6212- for MemberExpr, the declaration of the referenced member
6213- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006214- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006215
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006216For type nodes, hasDeclaration will generally match the declaration of the
6217sugared type. Given
6218 class X {};
6219 typedef X Y;
6220 Y y;
6221in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6222typedefDecl. A common use case is to match the underlying, desugared type.
6223This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6224 varDecl(hasType(hasUnqualifiedDesugaredType(
6225 recordType(hasDeclaration(decl())))))
6226In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006227
Manuel Klimeka37e1102016-12-01 15:45:06 +00006228Usable 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;,
6229 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;,
6230 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;,
6231 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;,
6232 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;,
6233 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;,
6234 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6235</pre></td></tr>
6236
6237
6238<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>
6239<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
6240type of the matched node.
6241
6242For example, in:
6243 class A {};
6244 using B = A;
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006245The matcher type(hasUnqualifeidDesugaredType(recordType())) matches
Manuel Klimeka37e1102016-12-01 15:45:06 +00006246both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006247</pre></td></tr>
6248
6249
Aaron Ballman672dde22016-01-22 23:15:00 +00006250<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 +00006251<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
6252
6253Given
6254 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
6255unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
6256 matches sizeof(a) and alignof(c)
6257</pre></td></tr>
6258
6259
Aaron Ballman672dde22016-01-22 23:15:00 +00006260<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 +00006261<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
6262
6263Example matches true (matcher = hasUnaryOperand(
6264 cxxBoolLiteral(equals(true))))
6265 !true
6266</pre></td></tr>
6267
6268
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006269<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 +00006270<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
6271matches the given matcher.
6272
6273The associated declaration is:
6274- for type nodes, the declaration of the underlying type
6275- for CallExpr, the declaration of the callee
6276- for MemberExpr, the declaration of the referenced member
6277- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006278- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006279
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006280For type nodes, hasDeclaration will generally match the declaration of the
6281sugared type. Given
6282 class X {};
6283 typedef X Y;
6284 Y y;
6285in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6286typedefDecl. A common use case is to match the underlying, desugared type.
6287This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6288 varDecl(hasType(hasUnqualifiedDesugaredType(
6289 recordType(hasDeclaration(decl())))))
6290In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006291
Manuel Klimeka37e1102016-12-01 15:45:06 +00006292Usable 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;,
6293 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;,
6294 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;,
6295 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;,
6296 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;,
6297 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;,
6298 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006299</pre></td></tr>
6300
6301
Aaron Ballman672dde22016-01-22 23:15:00 +00006302<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 +00006303<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6304
6305Given
6306 namespace X { void b(); }
6307 using X::b;
6308usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6309 matches using X::b </pre></td></tr>
6310
6311
Aaron Ballman672dde22016-01-22 23:15:00 +00006312<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 +00006313<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
6314matched by the given matcher.
6315
6316Given
6317 namespace X { int a; void b(); }
6318 using X::a;
6319 using X::b;
6320usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6321 matches using X::b but not using X::a </pre></td></tr>
6322
6323
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006324<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>
6325<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 +00006326declaration's type.
6327
6328In case of a value declaration (for example a variable declaration),
6329this resolves one layer of indirection. For example, in the value
6330declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6331X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6332declaration of x.
6333
6334Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6335 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6336 class X {};
6337 void y(X &amp;x) { x; X z; }
6338
Aaron Ballman672dde22016-01-22 23:15:00 +00006339Usable 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 +00006340</pre></td></tr>
6341
6342
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006343<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>
6344<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 +00006345matcher.
6346
6347Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6348 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006349 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006350 class X {};
6351 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006352 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006353</pre></td></tr>
6354
6355
Aaron Ballman672dde22016-01-22 23:15:00 +00006356<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 +00006357<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6358that matches the given matcher.
6359
6360Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6361 bool y() { return true; }
6362 bool x = y();
6363</pre></td></tr>
6364
6365
Aaron Ballman672dde22016-01-22 23:15:00 +00006366<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 +00006367<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6368expression.
6369
6370Given
6371 void f(int b) {
6372 int a[b];
6373 }
6374variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6375 varDecl(hasName("b")))))))
6376 matches "int a[b]"
6377</pre></td></tr>
6378
6379
Aaron Ballman672dde22016-01-22 23:15:00 +00006380<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 +00006381<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6382definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006383
6384Given
6385 for (;;) {}
6386hasBody(compoundStmt())
6387 matches 'for (;;) {}'
6388with compoundStmt()
6389 matching '{}'
6390</pre></td></tr>
6391
6392
Aaron Ballman672dde22016-01-22 23:15:00 +00006393<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 +00006394<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 +00006395switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006396
6397Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6398 if (true) {}
6399</pre></td></tr>
6400
6401
Aaron Ballman672dde22016-01-22 23:15:00 +00006402<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 +00006403<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6404NestedNameSpecifier-matcher matches.
6405</pre></td></tr>
6406
6407
Aaron Ballman672dde22016-01-22 23:15:00 +00006408<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 +00006409<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6410QualType-matcher matches.
6411</pre></td></tr>
6412
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006413<!--END_TRAVERSAL_MATCHERS -->
6414</table>
6415
6416</div>
6417</body>
6418</html>
6419
6420