blob: b8d4ed557b1a9b65fdfb5f67a0ed81846a8b1938 [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 Leee6d362c2017-09-10 21:00:15 +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('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>
350<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
351
352Example matches Foo
353 @implementation Foo
354 @end
355</pre></td></tr>
356
357
Aaron Ballman672dde22016-01-22 23:15:00 +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('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 +0000359<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
360
361Example matches Foo
362 @interface Foo
363 @end
364</pre></td></tr>
365
366
Aaron Ballman9fd6ee62017-03-15 20:14:25 +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('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>
368<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
369
370Example matches _enabled
371 @implementation Foo {
372 BOOL _enabled;
373 }
374 @end
375</pre></td></tr>
376
377
378<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>
379<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
380
381Example matches both declaration and definition of -[Foo method]
382 @interface Foo
383 - (void)method;
384 @end
385
386 @implementation Foo
387 - (void)method {}
388 @end
389</pre></td></tr>
390
391
392<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>
393<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
394
395Example matches enabled
396 @interface Foo
397 @property BOOL enabled;
398 @end
399</pre></td></tr>
400
401
402<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>
403<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
404
405Example matches FooDelegate
406 @protocol FooDelegate
407 @end
408</pre></td></tr>
409
410
Aaron Ballman672dde22016-01-22 23:15:00 +0000411<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 +0000412<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
413
414Given
415 void f(int x);
416parmVarDecl()
417 matches int x.
418</pre></td></tr>
419
420
Aaron Ballman672dde22016-01-22 23:15:00 +0000421<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 +0000422<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
423
424Example matches X, Z, U, and S
425 class X;
426 template&lt;class T&gt; class Z {};
427 struct S {};
428 union U {};
429</pre></td></tr>
430
431
Aaron Ballman672dde22016-01-22 23:15:00 +0000432<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 +0000433<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
434
435Example:
436 staticAssertExpr()
437matches
438 static_assert(sizeof(S) == sizeof(int))
439in
440 struct S {
441 int x;
442 };
443 static_assert(sizeof(S) == sizeof(int));
444</pre></td></tr>
445
446
Aaron Ballman672dde22016-01-22 23:15:00 +0000447<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 +0000448<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
449
450Given
451 template &lt;typename T, int N&gt; struct C {};
452templateTypeParmDecl()
453 matches 'T', but not 'N'.
454</pre></td></tr>
455
456
Aaron Ballman672dde22016-01-22 23:15:00 +0000457<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 +0000458<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
459
460Given
461 int X;
462 namespace NS {
463 int Y;
464 } namespace NS
465decl(hasDeclContext(translationUnitDecl()))
466 matches "int X", but not "int Y".
467</pre></td></tr>
468
469
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000470<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>
471<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
472
473Given
474 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000475 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000476typeAliasDecl()
477 matches "using Y = int", but not "typedef int X"
478</pre></td></tr>
479
480
Eric Liu285f8042017-03-28 12:56:47 +0000481<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
482<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
483
484typeAliasTemplateDecl() matches
485 template &lt;typename T&gt;
486 using Y = X&lt;T&gt;;
487</pre></td></tr>
488
489
Aaron Ballman672dde22016-01-22 23:15:00 +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('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 +0000491<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
492
493Given
494 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000495 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000496typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000497 matches "typedef int X", but not "using Y = int"
498</pre></td></tr>
499
500
501<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>
502<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
503
504Given
505 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000506 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000507typedefNameDecl()
508 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000509</pre></td></tr>
510
511
Aaron Ballman672dde22016-01-22 23:15:00 +0000512<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 +0000513<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
514typename.
515
516Given
517 template &lt;typename T&gt;
518 struct Base { typedef T Foo; };
519
520 template&lt;typename T&gt;
521 struct S : private Base&lt;T&gt; {
522 using typename Base&lt;T&gt;::Foo;
523 };
524unresolvedUsingTypenameDecl()
525 matches using Base&lt;T&gt;::Foo </pre></td></tr>
526
527
Aaron Ballman672dde22016-01-22 23:15:00 +0000528<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 +0000529<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
530
531Given
532 template&lt;typename X&gt;
533 class C : private X {
534 using X::x;
535 };
536unresolvedUsingValueDecl()
537 matches using X::x </pre></td></tr>
538
539
Aaron Ballman672dde22016-01-22 23:15:00 +0000540<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 +0000541<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
542
543Given
544 namespace X { int x; }
545 using X::x;
546usingDecl()
547 matches using X::x </pre></td></tr>
548
549
Aaron Ballman672dde22016-01-22 23:15:00 +0000550<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 +0000551<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
552
553Given
554 namespace X { int x; }
555 using namespace X;
556usingDirectiveDecl()
557 matches using namespace X </pre></td></tr>
558
559
Aaron Ballman672dde22016-01-22 23:15:00 +0000560<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000561<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
562
563Example matches A, B, C and F
564 enum X { A, B, C };
565 void F();
566</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('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 +0000570<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
571
572Note: this does not match declarations of member variables, which are
573"field" declarations in Clang parlance.
574
575Example matches a
576 int a;
577</pre></td></tr>
578
579
Aaron Ballman672dde22016-01-22 23:15:00 +0000580<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 +0000581<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
582</pre></td></tr>
583
584
Aaron Ballman672dde22016-01-22 23:15:00 +0000585<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 +0000586<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
587
588Given
589 namespace ns {
590 struct A { static void f(); };
591 void A::f() {}
592 void g() { A::f(); }
593 }
594 ns::A a;
595nestedNameSpecifier()
596 matches "ns::" and both "A::"
597</pre></td></tr>
598
599
Aaron Ballman672dde22016-01-22 23:15:00 +0000600<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 +0000601<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
602</pre></td></tr>
603
604
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000605<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>
606<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
607
608Given
609 FOO: bar();
610 void *ptr = &amp;&amp;FOO;
611 goto *bar;
612addrLabelExpr()
613 matches '&amp;&amp;FOO'
614</pre></td></tr>
615
616
Aaron Ballman672dde22016-01-22 23:15:00 +0000617<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 +0000618<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
619
620Given
621 int i = a[1];
622arraySubscriptExpr()
623 matches "a[1]"
624</pre></td></tr>
625
626
Aaron Ballman672dde22016-01-22 23:15:00 +0000627<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 +0000628<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
629
630 int i = 100;
631 __asm("mov al, 2");
632asmStmt()
633 matches '__asm("mov al, 2")'
634</pre></td></tr>
635
636
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000637<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>
638<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
639Example matches __atomic_load_n(ptr, 1)
640 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
641</pre></td></tr>
642
643
644<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>
645<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
646
647Example matches a ?: b
648 (a ?: b) + 42;
649</pre></td></tr>
650
651
Aaron Ballman672dde22016-01-22 23:15:00 +0000652<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 +0000653<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
654
655Example matches a || b
656 !(a || b)
657</pre></td></tr>
658
659
Aaron Ballman672dde22016-01-22 23:15:00 +0000660<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 +0000661<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
662
663Given
664 while (true) { break; }
665breakStmt()
666 matches 'break'
667</pre></td></tr>
668
669
Aaron Ballman672dde22016-01-22 23:15:00 +0000670<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 +0000671<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
672
Artem Dergachevded92a92016-11-11 22:34:53 +0000673Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000674 int i = (int) 2.2f;
675</pre></td></tr>
676
677
Aaron Ballman672dde22016-01-22 23:15:00 +0000678<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 +0000679<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
680
681Example matches x.y() and y()
682 X x;
683 x.y();
684 y();
685</pre></td></tr>
686
687
Aaron Ballman672dde22016-01-22 23:15:00 +0000688<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 +0000689<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
690
691Given
692 switch(a) { case 42: break; default: break; }
693caseStmt()
694 matches 'case 42: break;'.
695</pre></td></tr>
696
697
Aaron Ballman672dde22016-01-22 23:15:00 +0000698<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 +0000699<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
700
701Example: castExpr() matches each of the following:
702 (int) 3;
703 const_cast&lt;Expr *&gt;(SubExpr);
704 char c = 0;
705but does not match
706 int i = (0);
707 int k = 0;
708</pre></td></tr>
709
710
Aaron Ballman672dde22016-01-22 23:15:00 +0000711<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 +0000712<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
713
714Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
715though.
716
717Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000718 char ch = 'a';
719 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000720</pre></td></tr>
721
722
Aaron Ballman672dde22016-01-22 23:15:00 +0000723<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000724<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
725
726Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000727 int array[4] = {1};
728 vector int myvec = (vector int)(1, 2);
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('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 +0000733<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
734
735Example matches '{}' and '{{}}'in 'for (;;) {{}}'
736 for (;;) {{}}
737</pre></td></tr>
738
739
Aaron Ballman672dde22016-01-22 23:15:00 +0000740<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 +0000741<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
742
743Example matches a ? b : c
744 (a ? b : c) + 42
745</pre></td></tr>
746
747
Aaron Ballman672dde22016-01-22 23:15:00 +0000748<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 +0000749<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
750
751Given
752 while (true) { continue; }
753continueStmt()
754 matches 'continue'
755</pre></td></tr>
756
757
Aaron Ballman672dde22016-01-22 23:15:00 +0000758<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 +0000759<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
760
761Example matches,
762 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
763</pre></td></tr>
764
765
Aaron Ballman672dde22016-01-22 23:15:00 +0000766<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 +0000767<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
768
769Example matches FunctionTakesString(GetStringByValue())
770 (matcher = cxxBindTemporaryExpr())
771 FunctionTakesString(GetStringByValue());
772 FunctionTakesStringByPointer(GetStringPointer());
773</pre></td></tr>
774
775
Aaron Ballman672dde22016-01-22 23:15:00 +0000776<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 +0000777<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
778
779Example matches true
780 true
781</pre></td></tr>
782
783
Aaron Ballman672dde22016-01-22 23:15:00 +0000784<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000785<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
786
787 try {} catch(int i) {}
788cxxCatchStmt()
789 matches 'catch(int i)'
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('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 +0000794<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
795
796Example: Matches const_cast&lt;int*&gt;(&amp;r) in
797 int n = 42;
798 const int &amp;r(n);
799 int* p = const_cast&lt;int*&gt;(&amp;r);
800</pre></td></tr>
801
802
Aaron Ballman672dde22016-01-22 23:15:00 +0000803<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 +0000804<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
805
806Example matches string(ptr, n) and ptr within arguments of f
807 (matcher = cxxConstructExpr())
808 void f(const string &amp;a, const string &amp;b);
809 char *ptr;
810 int n;
811 f(string(ptr, n), ptr);
812</pre></td></tr>
813
814
Aaron Ballman672dde22016-01-22 23:15:00 +0000815<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 +0000816<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
817
818Example matches the CXXDefaultArgExpr placeholder inserted for the
819 default value of the second parameter in the call expression f(42)
820 (matcher = cxxDefaultArgExpr())
821 void f(int x, int y = 0);
822 f(42);
823</pre></td></tr>
824
825
Aaron Ballman672dde22016-01-22 23:15:00 +0000826<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 +0000827<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
828
829Given
830 delete X;
831cxxDeleteExpr()
832 matches 'delete X'.
833</pre></td></tr>
834
835
Aaron Ballman672dde22016-01-22 23:15:00 +0000836<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 +0000837<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
838
839Example:
840 cxxDynamicCastExpr()
841matches
842 dynamic_cast&lt;D*&gt;(&amp;b);
843in
844 struct B { virtual ~B() {} }; struct D : B {};
845 B b;
846 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
847</pre></td></tr>
848
849
Aaron Ballman672dde22016-01-22 23:15:00 +0000850<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000851<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
852
853cxxForRangeStmt() matches 'for (auto a : i)'
854 int i[] = {1, 2, 3}; for (auto a : i);
855 for(int j = 0; j &lt; 5; ++j);
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('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 +0000860<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
861
862Example: Matches Foo(bar);
863 Foo f = bar;
864 Foo g = (Foo) bar;
865 Foo h = Foo(bar);
866</pre></td></tr>
867
868
Aaron Ballman672dde22016-01-22 23:15:00 +0000869<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000870<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
871
872Example matches x.y()
873 X x;
874 x.y();
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('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 +0000879<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
880
881Given
882 new X;
883cxxNewExpr()
884 matches 'new X'.
885</pre></td></tr>
886
887
Aaron Ballman672dde22016-01-22 23:15:00 +0000888<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 +0000889<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
890</pre></td></tr>
891
892
Aaron Ballman672dde22016-01-22 23:15:00 +0000893<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 +0000894<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
895
896Note that if an operator isn't overloaded, it won't match. Instead, use
897binaryOperator matcher.
898Currently it does not match operators such as new delete.
899FIXME: figure out why these do not match?
900
901Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
902 (matcher = cxxOperatorCallExpr())
903 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
904 ostream &amp;o; int b = 1, c = 1;
905 o &lt;&lt; b &lt;&lt; c;
906</pre></td></tr>
907
908
Aaron Ballman672dde22016-01-22 23:15:00 +0000909<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 +0000910<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
911
912Either the source expression or the destination type can be matched
913using has(), but hasDestinationType() is more specific and can be
914more readable.
915
916Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
917 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
918</pre></td></tr>
919
920
Aaron Ballman672dde22016-01-22 23:15:00 +0000921<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 +0000922<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
923
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000924See also: hasDestinationType
925See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000926
927Example:
928 cxxStaticCastExpr()
929matches
930 static_cast&lt;long&gt;(8)
931in
932 long eight(static_cast&lt;long&gt;(8));
933</pre></td></tr>
934
935
Jakub Kuderski64b6c782017-05-05 21:01:12 +0000936<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>
937<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
938
939Given
940 std::vector&lt;int&gt; a({ 1, 2, 3 });
941 std::vector&lt;int&gt; b = { 4, 5 };
942 int c[] = { 6, 7 };
943 std::pair&lt;int, int&gt; d = { 8, 9 };
944cxxStdInitializerListExpr()
945 matches "{ 1, 2, 3 }" and "{ 4, 5 }"
946</pre></td></tr>
947
948
Aaron Ballman672dde22016-01-22 23:15:00 +0000949<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 +0000950<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
951
952Example: Matches Foo(bar, bar)
953 Foo h = Foo(bar, bar);
954</pre></td></tr>
955
956
Aaron Ballman672dde22016-01-22 23:15:00 +0000957<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 +0000958<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
959
960Example matches the implicit this expression in "return i".
961 (matcher = cxxThisExpr())
962struct foo {
963 int i;
964 int f() { return i; }
965};
966</pre></td></tr>
967
968
Aaron Ballman672dde22016-01-22 23:15:00 +0000969<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000970<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
971
972 try { throw 5; } catch(int i) {}
973cxxThrowExpr()
974 matches 'throw 5'
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('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 +0000979<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
980
981 try {} catch(int i) {}
982cxxTryStmt()
983 matches 'try {}'
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('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 +0000988<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
989
990Example matches T(t) in return statement of f
991 (matcher = cxxUnresolvedConstructExpr())
992 template &lt;typename T&gt;
993 void f(const T&amp; t) { return T(t); }
994</pre></td></tr>
995
996
Aaron Ballman672dde22016-01-22 23:15:00 +0000997<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000998<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
999
1000Example matches x in if (x)
1001 bool x;
1002 if (x) {}
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('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 +00001007<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1008
1009Given
1010 int a;
1011declStmt()
1012 matches 'int a'.
1013</pre></td></tr>
1014
1015
Aaron Ballman672dde22016-01-22 23:15:00 +00001016<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 +00001017<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1018
1019Given
1020 switch(a) { case 42: break; default: break; }
1021defaultStmt()
1022 matches 'default: break;'.
1023</pre></td></tr>
1024
1025
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001026<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>
1027<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1028
1029Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1030 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1031</pre></td></tr>
1032
1033
Aaron Ballman672dde22016-01-22 23:15:00 +00001034<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 +00001035<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1036
1037Given
1038 do {} while (true);
1039doStmt()
1040 matches 'do {} while(true)'
1041</pre></td></tr>
1042
1043
Aaron Ballman672dde22016-01-22 23:15:00 +00001044<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 +00001045<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1046
1047Matches any cast expression written in user code, whether it be a
1048C-style cast, a functional-style cast, or a keyword cast.
1049
1050Does not match implicit conversions.
1051
1052Note: the name "explicitCast" is chosen to match Clang's terminology, as
1053Clang uses the term "cast" to apply to implicit conversions as well as to
1054actual cast expressions.
1055
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001056See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001057
1058Example: matches all five of the casts in
1059 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1060but does not match the implicit conversion in
1061 long ell = 42;
1062</pre></td></tr>
1063
1064
Aaron Ballman672dde22016-01-22 23:15:00 +00001065<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 +00001066<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1067
1068Example matches x()
1069 void f() { x(); }
1070</pre></td></tr>
1071
1072
Aaron Ballman672dde22016-01-22 23:15:00 +00001073<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001074<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1075of the sub-expression's evaluation.
1076
1077Example matches std::string()
1078 const std::string str = std::string();
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('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 +00001083<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10841.0, 1.0f, 1.0L and 1e10.
1085
1086Does not match implicit conversions such as
1087 float a = 10;
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('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 +00001092<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1093
1094Example matches 'for (;;) {}'
1095 for (;;) {}
1096 int i[] = {1, 2, 3}; for (auto a : i);
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('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 +00001101<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1102</pre></td></tr>
1103
1104
Aaron Ballman672dde22016-01-22 23:15:00 +00001105<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 +00001106<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1107
1108Given
1109 goto FOO;
1110 FOO: bar();
1111gotoStmt()
1112 matches 'goto FOO'
1113</pre></td></tr>
1114
1115
Aaron Ballman672dde22016-01-22 23:15:00 +00001116<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 +00001117<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1118
1119Example matches 'if (x) {}'
1120 if (x) {}
1121</pre></td></tr>
1122
1123
Aaron Ballman672dde22016-01-22 23:15:00 +00001124<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 +00001125<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1126
1127This matches many different places, including function call return value
1128eliding, as well as any type conversions.
1129</pre></td></tr>
1130
1131
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001132<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>
1133<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1134
1135Given
1136 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1137implicitValueInitExpr()
1138 matches "[0].y" (implicitly)
1139</pre></td></tr>
1140
1141
Aaron Ballman672dde22016-01-22 23:15:00 +00001142<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 +00001143<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1144
1145Given
1146 int a[] = { 1, 2 };
1147 struct B { int x, y; };
1148 B b = { 5, 6 };
1149initListExpr()
1150 matches "{ 1, 2 }" and "{ 5, 6 }"
1151</pre></td></tr>
1152
1153
Aaron Ballman672dde22016-01-22 23:15:00 +00001154<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 +00001155<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11561, 1L, 0x1 and 1U.
1157
1158Does not match character-encoded integers such as L'a'.
1159</pre></td></tr>
1160
1161
Aaron Ballman672dde22016-01-22 23:15:00 +00001162<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 +00001163<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1164
1165Given
1166 goto FOO;
1167 FOO: bar();
1168labelStmt()
1169 matches 'FOO:'
1170</pre></td></tr>
1171
1172
Aaron Ballman672dde22016-01-22 23:15:00 +00001173<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 +00001174<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1175
1176Example matches [&amp;](){return 5;}
1177 [&amp;](){return 5;}
1178</pre></td></tr>
1179
1180
Aaron Ballman672dde22016-01-22 23:15:00 +00001181<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 +00001182<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1183
1184Example: Given
Jakub Kuderski64b6c782017-05-05 21:01:12 +00001185 struct T {void func();};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001186 T f();
1187 void g(T);
1188materializeTemporaryExpr() matches 'f()' in these statements
1189 T u(f());
1190 g(f());
1191but does not match
1192 f();
1193 f().func();
1194</pre></td></tr>
1195
1196
Aaron Ballman672dde22016-01-22 23:15:00 +00001197<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 +00001198<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1199
1200Given
1201 class Y {
1202 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1203 int a; static int b;
1204 };
1205memberExpr()
1206 matches this-&gt;x, x, y.x, a, this-&gt;b
1207</pre></td></tr>
1208
1209
Aaron Ballman672dde22016-01-22 23:15:00 +00001210<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001211<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1212
1213 foo();;
1214nullStmt()
1215 matches the second ';'
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('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 +00001220<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1221
1222The innermost message send invokes the "alloc" class method on the
1223NSString class, while the outermost message send invokes the
1224"initWithString" instance method on the object returned from
1225NSString's "alloc". This matcher should match both message sends.
1226 [[NSString alloc] initWithString:@"Hello"]
1227</pre></td></tr>
1228
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001229
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001230<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>
1231<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1232to reference another expressions and can be met
1233in BinaryConditionalOperators, for example.
1234
1235Example matches 'a'
1236 (a ?: c) + 42;
1237</pre></td></tr>
1238
1239
Aaron Ballman672dde22016-01-22 23:15:00 +00001240<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001241<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1242
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001243Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001244 int foo() { return 1; }
1245 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001246</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001247
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001248
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001249<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>
1250<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1251ParenListExprs don't have a predefined type and are used for late parsing.
1252In the final AST, they can be met in template declarations.
1253
1254Given
1255 template&lt;typename T&gt; class X {
1256 void f() {
1257 X x(*this);
1258 int a = 0, b = 1; int i = (a, b);
1259 }
1260 };
1261parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1262has a predefined type and is a ParenExpr, not a ParenListExpr.
1263</pre></td></tr>
1264
1265
1266<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>
1267<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1268
1269Example: Matches __func__
1270 printf("%s", __func__);
1271</pre></td></tr>
1272
1273
Aaron Ballman672dde22016-01-22 23:15:00 +00001274<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001275<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1276
1277Given
1278 return 1;
1279returnStmt()
1280 matches 'return 1'
1281</pre></td></tr>
1282
1283
Aaron Ballman672dde22016-01-22 23:15:00 +00001284<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001285<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1286
1287Given
1288 { ++a; }
1289stmt()
1290 matches both the compound statement '{ ++a; }' and '++a'.
1291</pre></td></tr>
1292
1293
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001294<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>
1295<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1296
1297Example match: ({ int X = 4; X; })
1298 int C = ({ int X = 4; X; });
1299</pre></td></tr>
1300
1301
Aaron Ballman672dde22016-01-22 23:15:00 +00001302<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001303<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1304
1305Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001306 char *s = "abcd";
1307 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001308</pre></td></tr>
1309
1310
Aaron Ballman672dde22016-01-22 23:15:00 +00001311<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 +00001312<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1313
1314Given
1315 template &lt;int N&gt;
1316 struct A { static const int n = N; };
1317 struct B : public A&lt;42&gt; {};
1318substNonTypeTemplateParmExpr()
1319 matches "N" in the right-hand side of "static const int n = N;"
1320</pre></td></tr>
1321
1322
Aaron Ballman672dde22016-01-22 23:15:00 +00001323<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 +00001324<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1325
1326Given
1327 switch(a) { case 42: break; default: break; }
1328switchCase()
1329 matches 'case 42: break;' and 'default: break;'.
1330</pre></td></tr>
1331
1332
Aaron Ballman672dde22016-01-22 23:15:00 +00001333<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 +00001334<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1335
1336Given
1337 switch(a) { case 42: break; default: break; }
1338switchStmt()
1339 matches 'switch(a)'.
1340</pre></td></tr>
1341
1342
Aaron Ballman672dde22016-01-22 23:15:00 +00001343<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 +00001344<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1345
1346Given
1347 Foo x = bar;
1348 int y = sizeof(x) + alignof(x);
1349unaryExprOrTypeTraitExpr()
1350 matches sizeof(x) and alignof(x)
1351</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('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 +00001355<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1356
1357Example matches !a
1358 !a || b
1359</pre></td></tr>
1360
1361
Haojian Wu7751c922016-05-18 12:53:59 +00001362<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>
1363<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1364but could not be resolved to a specific declaration.
1365
1366Given
1367 template&lt;typename T&gt;
1368 T foo() { T a; return a; }
1369 template&lt;typename T&gt;
1370 void bar() {
1371 foo&lt;T&gt;();
1372 }
1373unresolvedLookupExpr()
1374 matches foo&lt;T&gt;() </pre></td></tr>
1375
1376
Aaron Ballman672dde22016-01-22 23:15:00 +00001377<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001378<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1379
1380Example match: "foo"_suffix
1381</pre></td></tr>
1382
1383
Aaron Ballman672dde22016-01-22 23:15:00 +00001384<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 +00001385<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1386
1387Given
1388 while (true) {}
1389whileStmt()
1390 matches 'while (true) {}'.
1391</pre></td></tr>
1392
1393
Aaron Ballman672dde22016-01-22 23:15:00 +00001394<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 +00001395<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1396
1397Given
1398 template &lt;typename T&gt; struct C {};
1399 C&lt;int&gt; c;
1400templateArgument()
1401 matches 'int' in C&lt;int&gt;.
1402</pre></td></tr>
1403
1404
Haojian Wub33b02e2016-07-29 15:45:11 +00001405<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>
1406<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1407
1408Given
1409 template &lt;typename T&gt; class X { };
1410 X&lt;int&gt; xi;
1411templateName()
1412 matches 'X' in X&lt;int&gt;.
1413</pre></td></tr>
1414
1415
Aaron Ballman672dde22016-01-22 23:15:00 +00001416<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 +00001417<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1418</pre></td></tr>
1419
1420
Aaron Ballman672dde22016-01-22 23:15:00 +00001421<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001422<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1423
1424Given
1425 int a[] = { 2, 3 };
1426 int b[4];
1427 void f() { int c[a[0]]; }
1428arrayType()
1429 matches "int a[]", "int b[4]" and "int c[a[0]]";
1430</pre></td></tr>
1431
1432
Aaron Ballman672dde22016-01-22 23:15:00 +00001433<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 +00001434<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1435
1436Given
1437 _Atomic(int) i;
1438atomicType()
1439 matches "_Atomic(int) i"
1440</pre></td></tr>
1441
1442
Aaron Ballman672dde22016-01-22 23:15:00 +00001443<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 +00001444<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1445
1446Given:
1447 auto n = 4;
1448 int v[] = { 2, 3 }
1449 for (auto i : v) { }
1450autoType()
1451 matches "auto n" and "auto i"
1452</pre></td></tr>
1453
1454
Aaron Ballman672dde22016-01-22 23:15:00 +00001455<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 +00001456<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1457"void (^)(int)".
1458
1459The pointee is always required to be a FunctionType.
1460</pre></td></tr>
1461
1462
Aaron Ballman672dde22016-01-22 23:15:00 +00001463<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 +00001464<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1465
1466Given
1467 struct A {};
1468 A a;
1469 int b;
1470 float c;
1471 bool d;
1472builtinType()
1473 matches "int b", "float c" and "bool d"
1474</pre></td></tr>
1475
1476
Aaron Ballman672dde22016-01-22 23:15:00 +00001477<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001478<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1479
1480Given
1481 _Complex float f;
1482complexType()
1483 matches "_Complex float f"
1484</pre></td></tr>
1485
1486
Aaron Ballman672dde22016-01-22 23:15:00 +00001487<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001488<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1489
1490Given
1491 void() {
1492 int a[2];
1493 int b[] = { 2, 3 };
1494 int c[b[0]];
1495 }
1496constantArrayType()
1497 matches "int a[2]"
1498</pre></td></tr>
1499
1500
Aaron Ballman672dde22016-01-22 23:15:00 +00001501<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 +00001502<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1503Example matches i[] in declaration of f.
1504 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1505Example matches i[1].
1506 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1507 void f(int i[]) {
1508 i[1] = 0;
1509 }
1510</pre></td></tr>
1511
1512
Aaron Ballman672dde22016-01-22 23:15:00 +00001513<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 +00001514<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1515
1516Given
1517 template&lt;typename T, int Size&gt;
1518 class array {
1519 T data[Size];
1520 };
1521dependentSizedArrayType
1522 matches "T data[Size]"
1523</pre></td></tr>
1524
1525
Aaron Ballman672dde22016-01-22 23:15:00 +00001526<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 +00001527<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1528qualified name.
1529
1530Given
1531 namespace N {
1532 namespace M {
1533 class D {};
1534 }
1535 }
1536 class C {};
1537
1538 class C c;
1539 N::M::D d;
1540
1541elaboratedType() matches the type of the variable declarations of both
1542c and d.
1543</pre></td></tr>
1544
1545
Haojian Wue775de82016-06-30 07:50:01 +00001546<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>
1547<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1548
1549Given
1550 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001551 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001552
1553 C c;
1554 S s;
1555
1556enumType() matches the type of the variable declarations of both c and
1557s.
1558</pre></td></tr>
1559
1560
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001561<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>
1562<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1563
1564Given
1565 int (*f)(int);
1566 void g();
1567functionProtoType()
1568 matches "int (*f)(int)" and the type of "g" in C++ mode.
1569 In C mode, "g" is not matched because it does not contain a prototype.
1570</pre></td></tr>
1571
1572
Aaron Ballman672dde22016-01-22 23:15:00 +00001573<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 +00001574<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1575
1576Given
1577 int (*f)(int);
1578 void g();
1579functionType()
1580 matches "int (*f)(int)" and the type of "g".
1581</pre></td></tr>
1582
1583
Aaron Ballman672dde22016-01-22 23:15:00 +00001584<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 +00001585<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1586
1587Given
1588 int a[] = { 2, 3 };
1589 int b[42];
1590 void f(int c[]) { int d[a[0]]; };
1591incompleteArrayType()
1592 matches "int a[]" and "int c[]"
1593</pre></td></tr>
1594
1595
Aaron Ballman672dde22016-01-22 23:15:00 +00001596<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 +00001597<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1598
1599Example matches S s, but not S&lt;T&gt; s.
1600 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1601 template &lt;typename T&gt; struct S {
1602 void f(S s);
1603 void g(S&lt;T&gt; s);
1604 };
1605</pre></td></tr>
1606
1607
Aaron Ballman672dde22016-01-22 23:15:00 +00001608<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 +00001609<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1610
1611Given:
1612 int *a;
1613 int &amp;b = *a;
1614 int &amp;&amp;c = 1;
1615 auto &amp;d = b;
1616 auto &amp;&amp;e = c;
1617 auto &amp;&amp;f = 2;
1618 int g = 5;
1619
1620lValueReferenceType() matches the types of b, d, and e. e is
1621matched since the type is deduced as int&amp; by reference collapsing rules.
1622</pre></td></tr>
1623
1624
Aaron Ballman672dde22016-01-22 23:15:00 +00001625<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 +00001626<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1627Given
1628 struct A { int i; }
1629 A::* ptr = A::i;
1630memberPointerType()
1631 matches "A::* ptr"
1632</pre></td></tr>
1633
1634
Aaron Ballman672dde22016-01-22 23:15:00 +00001635<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 +00001636<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1637a pointer type, despite being syntactically similar.
1638
1639Given
1640 int *a;
1641
1642 @interface Foo
1643 @end
1644 Foo *f;
1645pointerType()
1646 matches "Foo *f", but does not match "int *a".
1647</pre></td></tr>
1648
1649
Aaron Ballman672dde22016-01-22 23:15:00 +00001650<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 +00001651<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1652
1653Given
1654 int (*ptr_to_array)[4];
1655 int *array_of_ptrs[4];
1656
1657varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1658array_of_ptrs.
1659</pre></td></tr>
1660
1661
Aaron Ballman672dde22016-01-22 23:15:00 +00001662<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 +00001663<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1664types.
1665
1666Given
1667 int *a;
1668 int &amp;b = *a;
1669 int c = 5;
1670
1671 @interface Foo
1672 @end
1673 Foo *f;
1674pointerType()
1675 matches "int *a", but does not match "Foo *f".
1676</pre></td></tr>
1677
1678
Aaron Ballman672dde22016-01-22 23:15:00 +00001679<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001680<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1681
1682Given:
1683 int *a;
1684 int &amp;b = *a;
1685 int &amp;&amp;c = 1;
1686 auto &amp;d = b;
1687 auto &amp;&amp;e = c;
1688 auto &amp;&amp;f = 2;
1689 int g = 5;
1690
1691rValueReferenceType() matches the types of c and f. e is not
1692matched as it is deduced to int&amp; by reference collapsing rules.
1693</pre></td></tr>
1694
1695
Aaron Ballman672dde22016-01-22 23:15:00 +00001696<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 +00001697<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1698
1699Given
1700 class C {};
1701 struct S {};
1702
1703 C c;
1704 S s;
1705
1706recordType() matches the type of the variable declarations of both c
1707and s.
1708</pre></td></tr>
1709
1710
Aaron Ballman672dde22016-01-22 23:15:00 +00001711<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 +00001712<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1713
1714Given
1715 int *a;
1716 int &amp;b = *a;
1717 int &amp;&amp;c = 1;
1718 auto &amp;d = b;
1719 auto &amp;&amp;e = c;
1720 auto &amp;&amp;f = 2;
1721 int g = 5;
1722
1723referenceType() matches the types of b, c, d, e, and f.
1724</pre></td></tr>
1725
1726
Aaron Ballman672dde22016-01-22 23:15:00 +00001727<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 +00001728<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1729template type parameter.
1730
1731Given
1732 template &lt;typename T&gt;
1733 void F(T t) {
1734 int i = 1 + t;
1735 }
1736
1737substTemplateTypeParmType() matches the type of 't' but not '1'
1738</pre></td></tr>
1739
1740
Manuel Klimek696e5052017-08-02 13:04:44 +00001741<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>
1742<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1743
1744Given
1745 enum E {};
1746 class C {};
1747
1748 E e;
1749 C c;
1750
1751tagType() matches the type of the variable declarations of both e
1752and c.
1753</pre></td></tr>
1754
1755
Aaron Ballman672dde22016-01-22 23:15:00 +00001756<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001757<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1758
1759Given
1760 template &lt;typename T&gt;
1761 class C { };
1762
1763 template class C&lt;int&gt;; A
1764 C&lt;char&gt; var; B
1765
1766templateSpecializationType() matches the type of the explicit
1767instantiation in A and the type of the variable declaration in B.
1768</pre></td></tr>
1769
1770
Aaron Ballman672dde22016-01-22 23:15:00 +00001771<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001772<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1773
1774Example matches T, but not int.
1775 (matcher = templateTypeParmType())
1776 template &lt;typename T&gt; void f(int i);
1777</pre></td></tr>
1778
1779
Aaron Ballman672dde22016-01-22 23:15:00 +00001780<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 +00001781<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1782</pre></td></tr>
1783
1784
Aaron Ballman672dde22016-01-22 23:15:00 +00001785<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001786<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1787
1788Given
1789 typedef int X;
1790typedefType()
1791 matches "typedef int X"
1792</pre></td></tr>
1793
1794
Aaron Ballman672dde22016-01-22 23:15:00 +00001795<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 +00001796<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1797
1798Given:
1799 typedef __underlying_type(T) type;
1800unaryTransformType()
1801 matches "__underlying_type(T)"
1802</pre></td></tr>
1803
1804
Aaron Ballman672dde22016-01-22 23:15:00 +00001805<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 +00001806<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1807integer-constant-expression.
1808
1809Given
1810 void f() {
1811 int a[] = { 2, 3 }
1812 int b[42];
1813 int c[a[0]];
1814 }
1815variableArrayType()
1816 matches "int c[a[0]]"
1817</pre></td></tr>
1818
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001819<!--END_DECL_MATCHERS -->
1820</table>
1821
1822<!-- ======================================================================= -->
1823<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1824<!-- ======================================================================= -->
1825
1826<p>Narrowing matchers match certain attributes on the current node, thus
1827narrowing down the set of nodes of the current type to match on.</p>
1828
1829<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1830which allow users to create more powerful match expressions.</p>
1831
1832<table>
1833<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001834<!-- START_NARROWING_MATCHERS -->
1835
1836<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>
1837<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1838
1839Usable as: Any Matcher
1840</pre></td></tr>
1841
1842
1843<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>
1844<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1845
1846Usable as: Any Matcher
1847</pre></td></tr>
1848
1849
1850<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1851<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1852
1853Useful when another matcher requires a child matcher, but there's no
1854additional constraint. This will often be used with an explicit conversion
1855to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1856
1857Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1858"int* p" and "void f()" in
1859 int* p;
1860 void f();
1861
1862Usable as: Any Matcher
1863</pre></td></tr>
1864
1865
1866<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1867<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1868
1869Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1870 class X {};
1871 class Y {};
1872
1873Usable as: Any Matcher
1874</pre></td></tr>
1875
1876
Aaron Ballman672dde22016-01-22 23:15:00 +00001877<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 +00001878<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1879unary).
1880
1881Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1882 !(a || b)
1883</pre></td></tr>
1884
1885
Peter Wua9244b52017-06-08 22:00:58 +00001886<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
1887<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 +00001888
Peter Wua9244b52017-06-08 22:00:58 +00001889Given
1890 f('false, 3.14, 42);
1891characterLiteral(equals(0))
1892 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1893 match false
1894floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1895 match 3.14
1896integerLiteral(equals(42))
1897 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001898
Clement Courbet43bdba42017-07-11 15:45:22 +00001899Note that you cannot directly match a negative numeric literal because the
1900minus sign is not part of the literal: It is a unary operator whose operand
1901is the positive numeric literal. Instead, you must use a unaryOperator()
1902matcher to match the minus sign:
1903
1904unaryOperator(hasOperatorName("-"),
1905 hasUnaryOperand(integerLiteral(equals(13))))
1906
Peter Wua9244b52017-06-08 22:00:58 +00001907Usable 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 +00001908 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 +00001909</pre></td></tr>
1910
1911
Peter Wua9244b52017-06-08 22:00:58 +00001912<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>
1913<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1914
1915
1916<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>
1917<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1918
1919
1920<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>
1921<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1922
1923
Aaron Ballman672dde22016-01-22 23:15:00 +00001924<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 +00001925<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1926
1927Given
1928 try {
1929 ...
1930 } catch (int) {
1931 ...
1932 } catch (...) {
1933 ...
1934 }
1935endcode
1936cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1937</pre></td></tr>
1938
1939
Aaron Ballman672dde22016-01-22 23:15:00 +00001940<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 +00001941<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1942a specific number of arguments (including absent default arguments).
1943
1944Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1945 void f(int x, int y);
1946 f(0, 0);
1947</pre></td></tr>
1948
1949
Aaron Ballman672dde22016-01-22 23:15:00 +00001950<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 +00001951<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1952</pre></td></tr>
1953
1954
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001955<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>
1956<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1957zero initialization.
1958
1959Given
1960void foo() {
1961 struct point { double x; double y; };
1962 point pt[2] = { { 1.0, 2.0 } };
1963}
1964initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1965will match the implicit array filler for pt[1].
1966</pre></td></tr>
1967
1968
Aaron Ballman672dde22016-01-22 23:15:00 +00001969<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 +00001970<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1971
1972Given
1973 struct S {
1974 S(); #1
1975 S(const S &amp;); #2
1976 S(S &amp;&amp;); #3
1977 };
1978cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1979</pre></td></tr>
1980
1981
Aaron Ballman672dde22016-01-22 23:15:00 +00001982<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 +00001983<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1984
1985Given
1986 struct S {
1987 S(); #1
1988 S(const S &amp;); #2
1989 S(S &amp;&amp;); #3
1990 };
1991cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1992</pre></td></tr>
1993
1994
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00001995<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>
1996<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1997
1998Given
1999 struct S {
2000 S(); #1
2001 S(int) {} #2
2002 S(S &amp;&amp;) : S() {} #3
2003 };
2004 S::S() : S(0) {} #4
2005cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2006#1 or #2.
2007</pre></td></tr>
2008
2009
Aaron Ballman672dde22016-01-22 23:15:00 +00002010<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 +00002011<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2012the explicit keyword.
2013
2014Given
2015 struct S {
2016 S(int); #1
2017 explicit S(double); #2
2018 operator int(); #3
2019 explicit operator bool(); #4
2020 };
2021cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2022cxxConversionDecl(isExplicit()) will match #4, but not #3.
2023</pre></td></tr>
2024
2025
Aaron Ballman672dde22016-01-22 23:15:00 +00002026<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002027<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2028
2029Given
2030 struct S {
2031 S(); #1
2032 S(const S &amp;); #2
2033 S(S &amp;&amp;); #3
2034 };
2035cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2036</pre></td></tr>
2037
2038
Aaron Ballman672dde22016-01-22 23:15:00 +00002039<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 +00002040<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2041the explicit keyword.
2042
2043Given
2044 struct S {
2045 S(int); #1
2046 explicit S(double); #2
2047 operator int(); #3
2048 explicit operator bool(); #4
2049 };
2050cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2051cxxConversionDecl(isExplicit()) will match #4, but not #3.
2052</pre></td></tr>
2053
2054
Aaron Ballman672dde22016-01-22 23:15:00 +00002055<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 +00002056<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2057opposed to a member.
2058
2059Given
2060 struct B {};
2061 struct D : B {
2062 int I;
2063 D(int i) : I(i) {}
2064 };
2065 struct E : B {
2066 E() : B() {}
2067 };
2068cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2069 will match E(), but not match D(int).
2070</pre></td></tr>
2071
2072
Aaron Ballman672dde22016-01-22 23:15:00 +00002073<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 +00002074<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2075opposed to a base.
2076
2077Given
2078 struct B {};
2079 struct D : B {
2080 int I;
2081 D(int i) : I(i) {}
2082 };
2083 struct E : B {
2084 E() : B() {}
2085 };
2086cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2087 will match D(int), but not match E().
2088</pre></td></tr>
2089
2090
Aaron Ballman672dde22016-01-22 23:15:00 +00002091<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 +00002092<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2093code (as opposed to implicitly added by the compiler).
2094
2095Given
2096 struct Foo {
2097 Foo() { }
2098 Foo(int) : foo_("A") { }
2099 string foo_;
2100 };
2101cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2102 will match Foo(int), but not Foo()
2103</pre></td></tr>
2104
2105
Aaron Ballman672dde22016-01-22 23:15:00 +00002106<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 +00002107<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2108
2109Given
2110struct A {
2111 void foo() const;
2112 void bar();
2113};
2114
2115cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2116</pre></td></tr>
2117
2118
Aaron Ballman672dde22016-01-22 23:15:00 +00002119<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 +00002120<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2121operator.
2122
2123Given
2124struct A {
2125 A &amp;operator=(const A &amp;);
2126 A &amp;operator=(A &amp;&amp;);
2127};
2128
2129cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2130the second one.
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_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 +00002135<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2136
2137Given:
2138 class A final {};
2139
2140 struct B {
2141 virtual void f();
2142 };
2143
2144 struct C : B {
2145 void f() final;
2146 };
2147matches A and C::f, but not B, C, or B::f
2148</pre></td></tr>
2149
2150
Aaron Ballman672dde22016-01-22 23:15:00 +00002151<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 +00002152<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2153operator.
2154
2155Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002156struct A {
2157 A &amp;operator=(const A &amp;);
2158 A &amp;operator=(A &amp;&amp;);
2159};
2160
2161cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2162the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002163</pre></td></tr>
2164
2165
Aaron Ballman672dde22016-01-22 23:15:00 +00002166<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 +00002167<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2168
2169Given
2170 class A {
2171 public:
2172 virtual void x();
2173 };
2174 class B : public A {
2175 public:
2176 virtual void x();
2177 };
2178 matches B::x
2179</pre></td></tr>
2180
2181
Aaron Ballman672dde22016-01-22 23:15:00 +00002182<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 +00002183<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2184
2185Given
2186 class A {
2187 public:
2188 virtual void x() = 0;
2189 };
2190 matches A::x
2191</pre></td></tr>
2192
2193
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +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('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2195<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2196
2197Given
2198 struct S {
2199 S(); #1
2200 S(const S &amp;) = default; #2
2201 S(S &amp;&amp;) = delete; #3
2202 };
2203cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2204</pre></td></tr>
2205
2206
Aaron Ballman672dde22016-01-22 23:15:00 +00002207<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 +00002208<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2209
2210Given
2211 class A {
2212 public:
2213 virtual void x();
2214 };
2215 matches A::x
2216</pre></td></tr>
2217
Aaron Ballman672dde22016-01-22 23:15:00 +00002218
2219<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 +00002220<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2221
2222Given
2223 class A {
2224 public:
2225 virtual void x();
2226 };
2227 class B : public A {
2228 public:
2229 void x();
2230 };
2231 matches A::x but not B::x
2232</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002233
Aaron Ballman672dde22016-01-22 23:15:00 +00002234
2235<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 +00002236<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2237
2238Matches overloaded operator names specified in strings without the
2239"operator" prefix: e.g. "&lt;&lt;".
2240
2241Given:
2242 class A { int operator*(); };
2243 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2244 A a;
2245 a &lt;&lt; a; &lt;-- This matches
2246
2247cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2248specified line and
2249cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2250matches the declaration of A.
2251
Aaron Ballman672dde22016-01-22 23:15:00 +00002252Usable 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 +00002253</pre></td></tr>
2254
2255
Aaron Ballman672dde22016-01-22 23:15:00 +00002256<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 +00002257<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2258</pre></td></tr>
2259
2260
Aaron Ballman672dde22016-01-22 23:15:00 +00002261<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 +00002262<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2263static member variable template instantiations.
2264
2265Given
2266 template&lt;typename T&gt; void A(T t) { }
2267 template&lt;&gt; void A(int N) { }
2268functionDecl(isExplicitTemplateSpecialization())
2269 matches the specialization A&lt;int&gt;().
2270
Aaron Ballman672dde22016-01-22 23:15:00 +00002271Usable 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 +00002272</pre></td></tr>
2273
2274
Aaron Ballman672dde22016-01-22 23:15:00 +00002275<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 +00002276<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2277
2278Given:
2279 class A final {};
2280
2281 struct B {
2282 virtual void f();
2283 };
2284
2285 struct C : B {
2286 void f() final;
2287 };
2288matches A and C::f, but not B, C, or B::f
2289</pre></td></tr>
2290
2291
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002292<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>
2293<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2294
2295Given:
2296 auto x = []{};
2297
2298cxxRecordDecl(isLambda()) matches the implicit class declaration of
2299decltype(x)
2300</pre></td></tr>
2301
2302
Aaron Ballman672dde22016-01-22 23:15:00 +00002303<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 +00002304<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2305isSameOrDerivedFrom(hasName(...)).
2306</pre></td></tr>
2307
2308
Aaron Ballman672dde22016-01-22 23:15:00 +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('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002310<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2311member variable template instantiations.
2312
2313Given
2314 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2315or
2316 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2317cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2318 matches the template instantiation of X&lt;A&gt;.
2319
2320But given
2321 template &lt;typename T&gt; class X {}; class A {};
2322 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2323cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2324 does not match, as X&lt;A&gt; is an explicit template specialization.
2325
Aaron Ballman672dde22016-01-22 23:15:00 +00002326Usable 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 +00002327</pre></td></tr>
2328
2329
Aaron Ballman672dde22016-01-22 23:15:00 +00002330<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 +00002331<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2332a specific number of arguments (including absent default arguments).
2333
2334Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2335 void f(int x, int y);
2336 f(0, 0);
2337</pre></td></tr>
2338
2339
Etienne Bergeron75e52722016-05-13 19:36:55 +00002340<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>
2341<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2342
2343Example: matches the implicit cast around 0
2344(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2345 int *p = 0;
2346</pre></td></tr>
2347
2348
Aaron Ballman672dde22016-01-22 23:15:00 +00002349<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002350<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 +00002351
Peter Wua9244b52017-06-08 22:00:58 +00002352Given
2353 f('false, 3.14, 42);
2354characterLiteral(equals(0))
2355 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2356 match false
2357floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2358 match 3.14
2359integerLiteral(equals(42))
2360 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002361
Clement Courbet43bdba42017-07-11 15:45:22 +00002362Note that you cannot directly match a negative numeric literal because the
2363minus sign is not part of the literal: It is a unary operator whose operand
2364is the positive numeric literal. Instead, you must use a unaryOperator()
2365matcher to match the minus sign:
2366
2367unaryOperator(hasOperatorName("-"),
2368 hasUnaryOperand(integerLiteral(equals(13))))
2369
Peter Wua9244b52017-06-08 22:00:58 +00002370Usable 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 +00002371 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 +00002372</pre></td></tr>
2373
2374
Peter Wua9244b52017-06-08 22:00:58 +00002375<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>
2376<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2377
2378
2379<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>
2380<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2381
2382
2383<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>
2384<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2385
2386
Aaron Ballman672dde22016-01-22 23:15:00 +00002387<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 +00002388<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2389
2390Given
2391 template&lt;typename T&gt; struct C {};
2392 C&lt;int&gt; c;
2393classTemplateSpecializationDecl(templateArgumentCountIs(1))
2394 matches C&lt;int&gt;.
2395</pre></td></tr>
2396
2397
Aaron Ballman672dde22016-01-22 23:15:00 +00002398<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 +00002399<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2400child statements.
2401
2402Example: Given
2403 { for (;;) {} }
2404compoundStmt(statementCountIs(0)))
2405 matches '{}'
2406 but does not match the outer compound statement.
2407</pre></td></tr>
2408
2409
Aaron Ballman672dde22016-01-22 23:15:00 +00002410<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 +00002411<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002412
2413Given
2414 int a[42];
2415 int b[2 * 21];
2416 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002417 char *s = "abcd";
2418 wchar_t *ws = L"abcd";
2419 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002420constantArrayType(hasSize(42))
2421 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002422stringLiteral(hasSize(4))
2423 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002424</pre></td></tr>
2425
2426
Aaron Ballman672dde22016-01-22 23:15:00 +00002427<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 +00002428<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2429declarations.
2430
2431Example: Given
2432 int a, b;
2433 int c;
2434 int d = 2, e;
2435declCountIs(2)
2436 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2437</pre></td></tr>
2438
2439
Aaron Ballman672dde22016-01-22 23:15:00 +00002440<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 +00002441<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2442
2443Matches a node if it equals the node previously bound to ID.
2444
2445Given
2446 class X { int a; int b; };
2447cxxRecordDecl(
2448 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2449 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2450 matches the class X, as a and b have the same type.
2451
2452Note that when multiple matches are involved via forEach* matchers,
2453equalsBoundNodes acts as a filter.
2454For example:
2455compoundStmt(
2456 forEachDescendant(varDecl().bind("d")),
2457 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2458will trigger a match for each combination of variable declaration
2459and reference to that variable declaration within a compound statement.
2460</pre></td></tr>
2461
2462
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002463<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>
2464<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2465
2466Decl has pointer identity in the AST.
2467</pre></td></tr>
2468
2469
Aaron Ballman672dde22016-01-22 23:15:00 +00002470<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 +00002471<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2472
2473Given
2474 __attribute__((device)) void f() { ... }
2475decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2476f. If the matcher is use from clang-query, attr::Kind parameter should be
2477passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2478</pre></td></tr>
2479
2480
Aaron Ballman672dde22016-01-22 23:15:00 +00002481<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002482<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2483partially matching a given regex.
2484
2485Example matches Y but not X
2486 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2487 #include "ASTMatcher.h"
2488 class X {};
2489ASTMatcher.h:
2490 class Y {};
2491
Aaron Ballman672dde22016-01-22 23:15:00 +00002492Usable 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 +00002493</pre></td></tr>
2494
2495
Aaron Ballman672dde22016-01-22 23:15:00 +00002496<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 +00002497<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2498
2499Example matches X but not Y
2500 (matcher = cxxRecordDecl(isExpansionInMainFile())
2501 #include &lt;Y.h&gt;
2502 class X {};
2503Y.h:
2504 class Y {};
2505
Aaron Ballman672dde22016-01-22 23:15:00 +00002506Usable 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 +00002507</pre></td></tr>
2508
2509
Aaron Ballman672dde22016-01-22 23:15:00 +00002510<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 +00002511<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2512
2513Example matches Y but not X
2514 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2515 #include &lt;SystemHeader.h&gt;
2516 class X {};
2517SystemHeader.h:
2518 class Y {};
2519
Aaron Ballman672dde22016-01-22 23:15:00 +00002520Usable 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 +00002521</pre></td></tr>
2522
2523
Aaron Ballman672dde22016-01-22 23:15:00 +00002524<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002525<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2526by the compiler (eg. implicit defaultcopy constructors).
2527</pre></td></tr>
2528
2529
Aaron Ballman672dde22016-01-22 23:15:00 +00002530<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 +00002531<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2532
2533Given
2534 class C {
2535 public: int a;
2536 protected: int b;
2537 private: int c;
2538 };
2539fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002540 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002541</pre></td></tr>
2542
2543
Aaron Ballman672dde22016-01-22 23:15:00 +00002544<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 +00002545<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2546
2547Given
2548 class C {
2549 public: int a;
2550 protected: int b;
2551 private: int c;
2552 };
2553fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002554 matches 'int b;'
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('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002559<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2560
2561Given
2562 class C {
2563 public: int a;
2564 protected: int b;
2565 private: int c;
2566 };
2567fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002568 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002569</pre></td></tr>
2570
2571
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002572<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>
2573<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2574a specific number of designators.
2575
2576Example: Given
2577 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2578 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2579designatorCountIs(2)
2580 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2581 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2582</pre></td></tr>
2583
2584
Aaron Ballman5c574342016-07-06 18:25:16 +00002585<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 +00002586<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2587bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002588
2589Given
2590 class C {
2591 int a : 2;
2592 int b : 4;
2593 int c : 2;
2594 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002595fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002596 matches 'int a;' and 'int c;' but not 'int b;'.
2597</pre></td></tr>
2598
2599
2600<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>
2601<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2602
2603Given
2604 class C {
2605 int a : 2;
2606 int b;
2607 };
2608fieldDecl(isBitField())
2609 matches 'int a;' but not 'int b;'.
2610</pre></td></tr>
2611
2612
Aaron Ballman672dde22016-01-22 23:15:00 +00002613<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002614<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 +00002615
Peter Wua9244b52017-06-08 22:00:58 +00002616Given
2617 f('false, 3.14, 42);
2618characterLiteral(equals(0))
2619 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2620 match false
2621floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2622 match 3.14
2623integerLiteral(equals(42))
2624 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002625
Clement Courbet43bdba42017-07-11 15:45:22 +00002626Note that you cannot directly match a negative numeric literal because the
2627minus sign is not part of the literal: It is a unary operator whose operand
2628is the positive numeric literal. Instead, you must use a unaryOperator()
2629matcher to match the minus sign:
2630
2631unaryOperator(hasOperatorName("-"),
2632 hasUnaryOperand(integerLiteral(equals(13))))
2633
Peter Wua9244b52017-06-08 22:00:58 +00002634Usable 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 +00002635 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 +00002636</pre></td></tr>
2637
2638
Peter Wua9244b52017-06-08 22:00:58 +00002639<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>
2640<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2641
2642
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002643<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>
2644<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2645
2646Given:
2647 void f();
2648 void g() noexcept;
2649 void h() noexcept(true);
2650 void i() noexcept(false);
2651 void j() throw();
2652 void k() throw(int);
2653 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002654functionDecl(hasDynamicExceptionSpec()) and
2655 functionProtoType(hasDynamicExceptionSpec())
2656 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002657</pre></td></tr>
2658
2659
Aaron Ballman672dde22016-01-22 23:15:00 +00002660<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 +00002661<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2662
2663Matches overloaded operator names specified in strings without the
2664"operator" prefix: e.g. "&lt;&lt;".
2665
2666Given:
2667 class A { int operator*(); };
2668 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2669 A a;
2670 a &lt;&lt; a; &lt;-- This matches
2671
2672cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2673specified line and
2674cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2675matches the declaration of A.
2676
Aaron Ballman672dde22016-01-22 23:15:00 +00002677Usable 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 +00002678</pre></td></tr>
2679
2680
Aaron Ballman672dde22016-01-22 23:15:00 +00002681<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002682<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2683
2684Given:
2685 constexpr int foo = 42;
2686 constexpr int bar();
2687varDecl(isConstexpr())
2688 matches the declaration of foo.
2689functionDecl(isConstexpr())
2690 matches the declaration of bar.
2691</pre></td></tr>
2692
2693
Aaron Ballman672dde22016-01-22 23:15:00 +00002694<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 +00002695<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2696
2697Given:
2698 class A { ~A(); };
2699 class B { ~B() = default; };
2700functionDecl(isDefaulted())
2701 matches the declaration of ~B, but not ~A.
2702</pre></td></tr>
2703
2704
Aaron Ballman672dde22016-01-22 23:15:00 +00002705<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002706<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2707
2708Example matches A, va, fa
2709 class A {};
2710 class B; Doesn't match, as it has no body.
2711 int va;
2712 extern int vb; Doesn't match, as it doesn't define the variable.
2713 void fa() {}
2714 void fb(); Doesn't match, as it has no body.
2715
Aaron Ballman672dde22016-01-22 23:15:00 +00002716Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002717</pre></td></tr>
2718
2719
Aaron Ballman672dde22016-01-22 23:15:00 +00002720<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 +00002721<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2722
2723Given:
2724 void Func();
2725 void DeletedFunc() = delete;
2726functionDecl(isDeleted())
2727 matches the declaration of DeletedFunc, but not Func.
2728</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('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002732<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2733static member variable template instantiations.
2734
2735Given
2736 template&lt;typename T&gt; void A(T t) { }
2737 template&lt;&gt; void A(int N) { }
2738functionDecl(isExplicitTemplateSpecialization())
2739 matches the specialization A&lt;int&gt;().
2740
Aaron Ballman672dde22016-01-22 23:15:00 +00002741Usable 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 +00002742</pre></td></tr>
2743
Aaron Ballman672dde22016-01-22 23:15:00 +00002744<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 +00002745<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002746
2747Given:
2748 extern "C" void f() {}
2749 extern "C" { void g() {} }
2750 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002751 extern "C" int x = 1;
2752 extern "C" int y = 2;
2753 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002754functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002755 matches the declaration of f and g, but not the declaration of h.
2756varDecl(isExternC())
2757 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002758</pre></td></tr>
2759
Aaron Ballman672dde22016-01-22 23:15:00 +00002760<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 +00002761<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2762the inline keyword.
2763
2764Given
2765 inline void f();
2766 void g();
2767 namespace n {
2768 inline namespace m {}
2769 }
2770functionDecl(isInline()) will match ::f().
2771namespaceDecl(isInline()) will match n::m.
2772</pre></td></tr>
2773
2774
Aaron Ballman672dde22016-01-22 23:15:00 +00002775<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 +00002776<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2777
2778Given:
2779 void f();
2780 void g() noexcept;
2781 void h() throw();
2782 void i() throw(int);
2783 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002784functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2785 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002786</pre></td></tr>
2787
2788
Haojian Wub3d25462016-09-26 16:01:52 +00002789<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 +00002790<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2791class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002792
2793Given:
2794 static void f() {}
2795 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002796 extern int j;
2797 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002798functionDecl(isStaticStorageClass())
2799 matches the function declaration f.
2800varDecl(isStaticStorageClass())
2801 matches the variable declaration i.
2802</pre></td></tr>
2803
2804
Aaron Ballman672dde22016-01-22 23:15:00 +00002805<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002806<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2807member variable template instantiations.
2808
2809Given
2810 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2811or
2812 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2813cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2814 matches the template instantiation of X&lt;A&gt;.
2815
2816But given
2817 template &lt;typename T&gt; class X {}; class A {};
2818 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2819cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2820 does not match, as X&lt;A&gt; is an explicit template specialization.
2821
Aaron Ballman672dde22016-01-22 23:15:00 +00002822Usable 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 +00002823</pre></td></tr>
2824
2825
Aaron Ballman672dde22016-01-22 23:15:00 +00002826<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002827<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2828
2829Example matches f, but not g or h. The function i will not match, even when
2830compiled in C mode.
2831 void f(...);
2832 void g(int);
2833 template &lt;typename... Ts&gt; void h(Ts...);
2834 void i();
2835</pre></td></tr>
2836
2837
Aaron Ballman672dde22016-01-22 23:15:00 +00002838<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 +00002839<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2840specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002841
2842Given
2843 void f(int i) {}
2844 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002845 void h(int i, int j);
2846 void j(int i);
2847 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002848functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002849 matches void g(int i, int j) {}
2850functionProtoType(parameterCountIs(2))
2851 matches void h(int i, int j)
2852functionProtoType(parameterCountIs(3))
2853 matches void k(int x, int y, int z, ...);
2854</pre></td></tr>
2855
2856
Aaron Ballman230ad972016-06-07 17:34:45 +00002857<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>
2858<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2859
2860Given:
2861 void f();
2862 void g() noexcept;
2863 void h() noexcept(true);
2864 void i() noexcept(false);
2865 void j() throw();
2866 void k() throw(int);
2867 void l() throw(...);
2868functionDecl(hasDynamicExceptionSpec()) and
2869 functionProtoType(hasDynamicExceptionSpec())
2870 match the declarations of j, k, and l, but not f, g, h, or i.
2871</pre></td></tr>
2872
2873
2874<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>
2875<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2876
2877Given:
2878 void f();
2879 void g() noexcept;
2880 void h() throw();
2881 void i() throw(int);
2882 void j() noexcept(false);
2883functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2884 match the declarations of g, and h, but not f, i or j.
2885</pre></td></tr>
2886
2887
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002888<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>
2889<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2890specific parameter count.
2891
2892Given
2893 void f(int i) {}
2894 void g(int i, int j) {}
2895 void h(int i, int j);
2896 void j(int i);
2897 void k(int x, int y, int z, ...);
2898functionDecl(parameterCountIs(2))
2899 matches void g(int i, int j) {}
2900functionProtoType(parameterCountIs(2))
2901 matches void h(int i, int j)
2902functionProtoType(parameterCountIs(3))
2903 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002904</pre></td></tr>
2905
2906
Aaron Ballman672dde22016-01-22 23:15:00 +00002907<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002908<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 +00002909
Peter Wua9244b52017-06-08 22:00:58 +00002910Given
2911 f('false, 3.14, 42);
2912characterLiteral(equals(0))
2913 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2914 match false
2915floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2916 match 3.14
2917integerLiteral(equals(42))
2918 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002919
Clement Courbet43bdba42017-07-11 15:45:22 +00002920Note that you cannot directly match a negative numeric literal because the
2921minus sign is not part of the literal: It is a unary operator whose operand
2922is the positive numeric literal. Instead, you must use a unaryOperator()
2923matcher to match the minus sign:
2924
2925unaryOperator(hasOperatorName("-"),
2926 hasUnaryOperand(integerLiteral(equals(13))))
2927
Peter Wua9244b52017-06-08 22:00:58 +00002928Usable 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 +00002929 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 +00002930</pre></td></tr>
2931
2932
Peter Wua9244b52017-06-08 22:00:58 +00002933<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>
2934<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2935
2936
2937<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>
2938<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2939
2940
2941<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>
2942<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2943
2944
Aaron Ballman672dde22016-01-22 23:15:00 +00002945<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 +00002946<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2947to '.'.
2948
2949Member calls on the implicit this pointer match as called with '-&gt;'.
2950
2951Given
2952 class Y {
2953 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2954 int a;
2955 static int b;
2956 };
2957memberExpr(isArrow())
2958 matches this-&gt;x, x, y.x, a, this-&gt;b
2959</pre></td></tr>
2960
2961
Aaron Ballmana086b9f2016-08-17 13:10:42 +00002962<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>
2963<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2964
2965Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2966void f() {
2967 int x;
2968 static int y;
2969}
2970int z;
2971
2972Example matches f() because it has external formal linkage despite being
2973unique to the translation unit as though it has internal likage
2974(matcher = functionDecl(hasExternalFormalLinkage()))
2975
2976namespace {
2977void f() {}
2978}
2979</pre></td></tr>
2980
2981
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002982<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002983<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2984
2985Supports specifying enclosing namespaces or classes by prefixing the name
2986with '&lt;enclosing&gt;::'.
2987Does not match typedefs of an underlying type with the given name.
2988
2989Example matches X (Name == "X")
2990 class X;
2991
2992Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2993 namespace a { namespace b { class X; } }
2994</pre></td></tr>
2995
2996
Aaron Ballman672dde22016-01-22 23:15:00 +00002997<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002998<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2999a substring matched by the given RegExp.
3000
3001Supports specifying enclosing namespaces or classes by
3002prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3003of an underlying type with the given name.
3004
3005Example matches X (regexp == "::X")
3006 class X;
3007
3008Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3009 namespace foo { namespace bar { class X; } }
3010</pre></td></tr>
3011
3012
Aaron Ballman672dde22016-01-22 23:15:00 +00003013<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 +00003014<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3015
3016Given
3017 namespace n {
3018 namespace {} #1
3019 }
3020namespaceDecl(isAnonymous()) will match #1 but not ::n.
3021</pre></td></tr>
3022
3023
Aaron Ballman672dde22016-01-22 23:15:00 +00003024<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 +00003025<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3026the inline keyword.
3027
3028Given
3029 inline void f();
3030 void g();
3031 namespace n {
3032 inline namespace m {}
3033 }
3034functionDecl(isInline()) will match ::f().
3035namespaceDecl(isInline()) will match n::m.
3036</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_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 +00003040<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3041a specific number of arguments (including absent default arguments).
3042
3043Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3044 void f(int x, int y);
3045 f(0, 0);
3046</pre></td></tr>
3047
3048
Aaron Ballman672dde22016-01-22 23:15:00 +00003049<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 +00003050<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3051
3052objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3053message expression in
3054
3055 UIWebView *webView = ...;
3056 CGRect bodyFrame = webView.frame;
3057 bodyFrame.size.height = self.bodyContentHeight;
3058 webView.frame = bodyFrame;
3059 ^---- matches here
3060</pre></td></tr>
3061
3062
Aaron Ballman672dde22016-01-22 23:15:00 +00003063<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 +00003064<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3065
3066Matches only when the selector of the objCMessageExpr is NULL. This may
3067represent an error condition in the tree!
3068</pre></td></tr>
3069
3070
Aaron Ballman672dde22016-01-22 23:15:00 +00003071<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 +00003072<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3073
3074 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3075 matches the outer message expr in the code below, but NOT the message
3076 invocation for self.bodyView.
3077 [self.bodyView loadHTMLString:html baseURL:NULL];
3078</pre></td></tr>
3079
3080
Aaron Ballman672dde22016-01-22 23:15:00 +00003081<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 +00003082<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3083
3084 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3085 matches self.bodyView in the code below, but NOT the outer message
3086 invocation of "loadHTMLString:baseURL:".
3087 [self.bodyView loadHTMLString:html baseURL:NULL];
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_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 +00003092<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3093a substring matched by the given RegExp.
3094 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3095 invocation for self.bodyView.
3096 [self.bodyView loadHTMLString:html baseURL:NULL];
3097</pre></td></tr>
3098
3099
Aaron Ballman672dde22016-01-22 23:15:00 +00003100<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003101<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3102
3103 matcher = objCMessageExpr(numSelectorArgs(0));
3104 matches self.bodyView in the code below
3105
3106 matcher = objCMessageExpr(numSelectorArgs(2));
3107 matches the invocation of "loadHTMLString:baseURL:" but not that
3108 of self.bodyView
3109 [self.bodyView loadHTMLString:html baseURL:NULL];
3110</pre></td></tr>
3111
3112
Aaron Ballman672dde22016-01-22 23:15:00 +00003113<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 +00003114<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3115
3116Given
3117 class Y { public: void x(); };
3118 void z() { Y* y; y-&gt;x(); }
3119cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3120 matches y-&gt;x()
3121</pre></td></tr>
3122
3123
Aaron Ballman672dde22016-01-22 23:15:00 +00003124<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003125<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3126
3127Matches a node if it equals the node previously bound to ID.
3128
3129Given
3130 class X { int a; int b; };
3131cxxRecordDecl(
3132 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3133 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3134 matches the class X, as a and b have the same type.
3135
3136Note that when multiple matches are involved via forEach* matchers,
3137equalsBoundNodes acts as a filter.
3138For example:
3139compoundStmt(
3140 forEachDescendant(varDecl().bind("d")),
3141 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3142will trigger a match for each combination of variable declaration
3143and reference to that variable declaration within a compound statement.
3144</pre></td></tr>
3145
3146
Aaron Ballman672dde22016-01-22 23:15:00 +00003147<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003148<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3149the node, not hidden within a typedef.
3150
3151Given
3152 typedef const int const_int;
3153 const_int i;
3154 int *const j;
3155 int *volatile k;
3156 int m;
3157varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3158i is const-qualified but the qualifier is not local.
3159</pre></td></tr>
3160
3161
Aaron Ballman672dde22016-01-22 23:15:00 +00003162<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
Samuel Benzaquen30747f72015-12-22 21:06:36 +00003163<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3164
3165Given
3166 void a(char);
3167 void b(wchar_t);
3168 void c(double);
3169functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3170matches "a(char)", "b(wchar_t)", but not "c(double)".
3171</pre></td></tr>
3172
3173
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003174<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 +00003175<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3176the Objective-C object pointer type, which is different despite being
3177syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003178
3179Given
3180 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003181
3182 @interface Foo
3183 @end
3184 Foo *f;
3185
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003186 int j;
3187varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003188 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003189</pre></td></tr>
3190
3191
Aaron Ballman672dde22016-01-22 23:15:00 +00003192<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 +00003193<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3194include "top-level" const.
3195
3196Given
3197 void a(int);
3198 void b(int const);
3199 void c(const int);
3200 void d(const int*);
3201 void e(int const) {};
3202functionDecl(hasAnyParameter(hasType(isConstQualified())))
3203 matches "void b(int const)", "void c(const int)" and
3204 "void e(int const) {}". It does not match d as there
3205 is no top-level const on the parameter type "const int *".
3206</pre></td></tr>
3207
3208
Aaron Ballman672dde22016-01-22 23:15:00 +00003209<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003210<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3211
3212Given
3213 void a(int);
3214 void b(long);
3215 void c(double);
3216functionDecl(hasAnyParameter(hasType(isInteger())))
3217matches "a(int)", "b(long)", but not "c(double)".
3218</pre></td></tr>
3219
3220
Clement Courbet42517592016-07-12 06:36:00 +00003221<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>
3222<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3223
3224Given
3225 void a(int);
3226 void b(unsigned long);
3227 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003228functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003229matches "a(int)", but not "b(unsigned long)" and "c(double)".
3230</pre></td></tr>
3231
3232
3233<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>
3234<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3235
3236Given
3237 void a(int);
3238 void b(unsigned long);
3239 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003240functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003241matches "b(unsigned long)", but not "a(int)" and "c(double)".
3242</pre></td></tr>
3243
3244
Aaron Ballman672dde22016-01-22 23:15:00 +00003245<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003246<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3247include "top-level" volatile.
3248
3249Given
3250 void a(int);
3251 void b(int volatile);
3252 void c(volatile int);
3253 void d(volatile int*);
3254 void e(int volatile) {};
3255functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3256 matches "void b(int volatile)", "void c(volatile int)" and
3257 "void e(int volatile) {}". It does not match d as there
3258 is no top-level volatile on the parameter type "volatile int *".
3259</pre></td></tr>
3260
3261
Aaron Ballman672dde22016-01-22 23:15:00 +00003262<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 +00003263<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3264
3265Example matches C, but not S or U.
3266 struct S {};
3267 class C {};
3268 union U {};
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_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 +00003273<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3274
3275Example matches S, but not C or U.
3276 struct S {};
3277 class C {};
3278 union U {};
3279</pre></td></tr>
3280
3281
Aaron Ballman672dde22016-01-22 23:15:00 +00003282<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 +00003283<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3284
3285Example matches U, but not C or S.
3286 struct S {};
3287 class C {};
3288 union U {};
3289</pre></td></tr>
3290
3291
Aaron Ballman672dde22016-01-22 23:15:00 +00003292<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 +00003293<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3294
3295Matches a node if it equals the node previously bound to ID.
3296
3297Given
3298 class X { int a; int b; };
3299cxxRecordDecl(
3300 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3301 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3302 matches the class X, as a and b have the same type.
3303
3304Note that when multiple matches are involved via forEach* matchers,
3305equalsBoundNodes acts as a filter.
3306For example:
3307compoundStmt(
3308 forEachDescendant(varDecl().bind("d")),
3309 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3310will trigger a match for each combination of variable declaration
3311and reference to that variable declaration within a compound statement.
3312</pre></td></tr>
3313
3314
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003315<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>
3316<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3317
3318Stmt has pointer identity in the AST.
3319</pre></td></tr>
3320
3321
Aaron Ballman672dde22016-01-22 23:15:00 +00003322<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 +00003323<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3324partially matching a given regex.
3325
3326Example matches Y but not X
3327 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3328 #include "ASTMatcher.h"
3329 class X {};
3330ASTMatcher.h:
3331 class Y {};
3332
Aaron Ballman672dde22016-01-22 23:15:00 +00003333Usable 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 +00003334</pre></td></tr>
3335
3336
Aaron Ballman672dde22016-01-22 23:15:00 +00003337<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003338<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3339
3340Example matches X but not Y
3341 (matcher = cxxRecordDecl(isExpansionInMainFile())
3342 #include &lt;Y.h&gt;
3343 class X {};
3344Y.h:
3345 class Y {};
3346
Aaron Ballman672dde22016-01-22 23:15:00 +00003347Usable 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 +00003348</pre></td></tr>
3349
3350
Aaron Ballman672dde22016-01-22 23:15:00 +00003351<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 +00003352<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3353
3354Example matches Y but not X
3355 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3356 #include &lt;SystemHeader.h&gt;
3357 class X {};
3358SystemHeader.h:
3359 class Y {};
3360
Aaron Ballman672dde22016-01-22 23:15:00 +00003361Usable 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 +00003362</pre></td></tr>
3363
3364
Etienne Bergeron3588be72016-05-12 04:20:04 +00003365<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>
3366<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3367
3368Given
3369 int a[42];
3370 int b[2 * 21];
3371 int c[41], d[43];
3372 char *s = "abcd";
3373 wchar_t *ws = L"abcd";
3374 char *w = "a";
3375constantArrayType(hasSize(42))
3376 matches "int a[42]" and "int b[2 * 21]"
3377stringLiteral(hasSize(4))
3378 matches "abcd", L"abcd"
3379</pre></td></tr>
3380
3381
Aaron Ballman672dde22016-01-22 23:15:00 +00003382<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 +00003383<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3384
3385Example matches A, va, fa
3386 class A {};
3387 class B; Doesn't match, as it has no body.
3388 int va;
3389 extern int vb; Doesn't match, as it doesn't define the variable.
3390 void fa() {}
3391 void fb(); Doesn't match, as it has no body.
3392
Aaron Ballman672dde22016-01-22 23:15:00 +00003393Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003394</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_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 +00003398<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3399
3400Note that 'Value' is a string as the template argument's value is
3401an arbitrary precision integer. 'Value' must be euqal to the canonical
3402representation of that integral value in base 10.
3403
3404Given
3405 template&lt;int T&gt; struct A {};
3406 C&lt;42&gt; c;
3407classTemplateSpecializationDecl(
3408 hasAnyTemplateArgument(equalsIntegralValue("42")))
3409 matches the implicit instantiation of C in C&lt;42&gt;.
3410</pre></td></tr>
3411
3412
Aaron Ballman672dde22016-01-22 23:15:00 +00003413<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 +00003414<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3415
3416Given
3417 template&lt;int T&gt; struct A {};
3418 C&lt;42&gt; c;
3419classTemplateSpecializationDecl(
3420 hasAnyTemplateArgument(isIntegral()))
3421 matches the implicit instantiation of C in C&lt;42&gt;
3422 with isIntegral() matching 42.
3423</pre></td></tr>
3424
3425
Aaron Ballman672dde22016-01-22 23:15:00 +00003426<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003427<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3428
3429Given
3430 template&lt;typename T&gt; struct C {};
3431 C&lt;int&gt; c;
3432classTemplateSpecializationDecl(templateArgumentCountIs(1))
3433 matches C&lt;int&gt;.
3434</pre></td></tr>
3435
3436
Aaron Ballman672dde22016-01-22 23:15:00 +00003437<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 +00003438<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3439partially matching a given regex.
3440
3441Example matches Y but not X
3442 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3443 #include "ASTMatcher.h"
3444 class X {};
3445ASTMatcher.h:
3446 class Y {};
3447
Aaron Ballman672dde22016-01-22 23:15:00 +00003448Usable 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 +00003449</pre></td></tr>
3450
3451
Aaron Ballman672dde22016-01-22 23:15:00 +00003452<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 +00003453<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3454
3455Example matches X but not Y
3456 (matcher = cxxRecordDecl(isExpansionInMainFile())
3457 #include &lt;Y.h&gt;
3458 class X {};
3459Y.h:
3460 class Y {};
3461
Aaron Ballman672dde22016-01-22 23:15:00 +00003462Usable 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 +00003463</pre></td></tr>
3464
3465
Aaron Ballman672dde22016-01-22 23:15:00 +00003466<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 +00003467<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3468
3469Example matches Y but not X
3470 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3471 #include &lt;SystemHeader.h&gt;
3472 class X {};
3473SystemHeader.h:
3474 class Y {};
3475
Aaron Ballman672dde22016-01-22 23:15:00 +00003476Usable 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 +00003477</pre></td></tr>
3478
3479
Aaron Ballman672dde22016-01-22 23:15:00 +00003480<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 +00003481<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3482
3483Given
3484 struct S { bool func(); };
3485functionDecl(returns(booleanType()))
3486 matches "bool func();"
3487</pre></td></tr>
3488
3489
Aaron Ballman672dde22016-01-22 23:15:00 +00003490<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 +00003491<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3492
3493Matches a node if it equals the node previously bound to ID.
3494
3495Given
3496 class X { int a; int b; };
3497cxxRecordDecl(
3498 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3499 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3500 matches the class X, as a and b have the same type.
3501
3502Note that when multiple matches are involved via forEach* matchers,
3503equalsBoundNodes acts as a filter.
3504For example:
3505compoundStmt(
3506 forEachDescendant(varDecl().bind("d")),
3507 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3508will trigger a match for each combination of variable declaration
3509and reference to that variable declaration within a compound statement.
3510</pre></td></tr>
3511
3512
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003513<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>
3514<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3515
3516Type has pointer identity in the AST.
3517</pre></td></tr>
3518
3519
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003520<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>
3521<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3522
3523Given
3524 int i;
3525 float f;
3526realFloatingPointType()
3527 matches "float f" but not "int i"
3528</pre></td></tr>
3529
3530
Aaron Ballman672dde22016-01-22 23:15:00 +00003531<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 +00003532<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3533
3534Given
3535 struct S { void func(); };
3536functionDecl(returns(voidType()))
3537 matches "void func();"
3538</pre></td></tr>
3539
3540
Aaron Ballman672dde22016-01-22 23:15:00 +00003541<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 +00003542<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3543
3544Given
3545 int x;
3546 int s = sizeof(x) + alignof(x)
3547unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3548 matches sizeof(x)
3549</pre></td></tr>
3550
3551
Aaron Ballman672dde22016-01-22 23:15:00 +00003552<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 +00003553<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3554unary).
3555
3556Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3557 !(a || b)
3558</pre></td></tr>
3559
3560
Aaron Ballman672dde22016-01-22 23:15:00 +00003561<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 +00003562<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3563
3564Example matches x, but not y, z, or a.
3565(matcher = varDecl(hasAutomaticStorageDuration())
3566void f() {
3567 int x;
3568 static int y;
3569 thread_local int z;
3570}
3571int a;
3572</pre></td></tr>
3573
3574
Aaron Ballman672dde22016-01-22 23:15:00 +00003575<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003576<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3577
3578Example matches y and z (matcher = varDecl(hasGlobalStorage())
3579void f() {
3580 int x;
3581 static int y;
3582}
3583int z;
3584</pre></td></tr>
3585
3586
Aaron Ballman672dde22016-01-22 23:15:00 +00003587<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 +00003588<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3589non-static local variable.
3590
3591Example matches x (matcher = varDecl(hasLocalStorage())
3592void f() {
3593 int x;
3594 static int y;
3595}
3596int z;
3597</pre></td></tr>
3598
3599
Aaron Ballman672dde22016-01-22 23:15:00 +00003600<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 +00003601<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 +00003602It includes the variable declared at namespace scope and those declared
3603with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003604
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003605void f() {
3606 int x;
3607 static int y;
3608 thread_local int z;
3609}
3610int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003611static int b;
3612extern int c;
3613varDecl(hasStaticStorageDuration())
3614 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003615</pre></td></tr>
3616
3617
Aaron Ballman672dde22016-01-22 23:15:00 +00003618<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003619<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3620
3621Example matches z, but not x, z, or a.
3622(matcher = varDecl(hasThreadStorageDuration())
3623void f() {
3624 int x;
3625 static int y;
3626 thread_local int z;
3627}
3628int a;
3629</pre></td></tr>
3630
3631
Aaron Ballman672dde22016-01-22 23:15:00 +00003632<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 +00003633<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3634
3635Given:
3636 constexpr int foo = 42;
3637 constexpr int bar();
3638varDecl(isConstexpr())
3639 matches the declaration of foo.
3640functionDecl(isConstexpr())
3641 matches the declaration of bar.
3642</pre></td></tr>
3643
3644
Aaron Ballman672dde22016-01-22 23:15:00 +00003645<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 +00003646<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3647
3648Example matches A, va, fa
3649 class A {};
3650 class B; Doesn't match, as it has no body.
3651 int va;
3652 extern int vb; Doesn't match, as it doesn't define the variable.
3653 void fa() {}
3654 void fb(); Doesn't match, as it has no body.
3655
Aaron Ballman672dde22016-01-22 23:15:00 +00003656Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003657</pre></td></tr>
3658
3659
Aaron Ballman672dde22016-01-22 23:15:00 +00003660<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003661<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3662a C++ catch block, or an Objective-C statement.
3663
3664Example matches x (matcher = varDecl(isExceptionVariable())
3665void f(int y) {
3666 try {
3667 } catch (int x) {
3668 }
3669}
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_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 +00003674<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3675static member variable template instantiations.
3676
3677Given
3678 template&lt;typename T&gt; void A(T t) { }
3679 template&lt;&gt; void A(int N) { }
3680functionDecl(isExplicitTemplateSpecialization())
3681 matches the specialization A&lt;int&gt;().
3682
Aaron Ballman672dde22016-01-22 23:15:00 +00003683Usable 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 +00003684</pre></td></tr>
3685
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003686<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003687<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003688
3689Given:
3690 extern "C" void f() {}
3691 extern "C" { void g() {} }
3692 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003693 extern "C" int x = 1;
3694 extern "C" int y = 2;
3695 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003696functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003697 matches the declaration of f and g, but not the declaration of h.
3698varDecl(isExternC())
3699 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003700</pre></td></tr>
3701
Haojian Wub3d25462016-09-26 16:01:52 +00003702<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
Haojian Wu398a8ea2016-09-27 07:53:20 +00003703<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3704class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003705
3706Given:
3707 static void f() {}
3708 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003709 extern int j;
3710 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003711functionDecl(isStaticStorageClass())
3712 matches the function declaration f.
3713varDecl(isStaticStorageClass())
3714 matches the variable declaration i.
3715</pre></td></tr>
3716
3717
Aaron Ballman672dde22016-01-22 23:15:00 +00003718<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 +00003719<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3720member variable template instantiations.
3721
3722Given
3723 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3724or
3725 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3726cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3727 matches the template instantiation of X&lt;A&gt;.
3728
3729But given
3730 template &lt;typename T&gt; class X {}; class A {};
3731 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3732cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3733 does not match, as X&lt;A&gt; is an explicit template specialization.
3734
Aaron Ballman672dde22016-01-22 23:15:00 +00003735Usable 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 +00003736</pre></td></tr>
3737
3738
Aaron Ballman672dde22016-01-22 23:15:00 +00003739<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 +00003740<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3741template instantiations.
3742
3743Given
3744 template&lt;typename T&gt; void A(T t) { T i; }
3745 A(0);
3746 A(0U);
3747functionDecl(isInstantiated())
3748 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3749</pre></td></tr>
3750
3751
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003752<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>
3753<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3754GNU's __null, C++11's nullptr, or C's NULL macro.
3755
3756Given:
3757 void *v1 = NULL;
3758 void *v2 = nullptr;
3759 void *v3 = __null; GNU extension
3760 char *cp = (char *)0;
3761 int *ip = 0;
3762 int i = 0;
3763expr(nullPointerConstant())
3764 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3765 initializer for i.
3766</pre></td></tr>
3767
3768
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003769<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>
3770<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3771
3772This matcher is only provided as a performance optimization of hasName.
3773 hasAnyName(a, b, c)
3774 is equivalent to, but faster than
3775 anyOf(hasName(a), hasName(b), hasName(c))
3776</pre></td></tr>
3777
3778
Aaron Ballman672dde22016-01-22 23:15:00 +00003779<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 +00003780<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3781
3782Given
3783 int j;
3784 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3785 A(0);
3786 A(0U);
3787declStmt(isInTemplateInstantiation())
3788 matches 'int i;' and 'unsigned i'.
3789unless(stmt(isInTemplateInstantiation()))
3790 will NOT match j += 42; as it's shared between the template definition and
3791 instantiation.
3792</pre></td></tr>
3793
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003794<!--END_NARROWING_MATCHERS -->
3795</table>
3796
3797<!-- ======================================================================= -->
3798<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3799<!-- ======================================================================= -->
3800
3801<p>Traversal matchers specify the relationship to other nodes that are
3802reachable from the current node.</p>
3803
3804<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3805forEachDescendant) which work on all nodes and allow users to write more generic
3806match expressions.</p>
3807
3808<table>
3809<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003810<!-- START_TRAVERSAL_MATCHERS -->
3811
3812<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>
3813<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3814
3815Unlike anyOf, eachOf will generate a match result for each
3816matching submatcher.
3817
3818For example, in:
3819 class A { int a; int b; };
3820The matcher:
3821 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3822 has(fieldDecl(hasName("b")).bind("v"))))
3823will generate two results binding "v", the first of which binds
3824the field declaration of a, the second the field declaration of
3825b.
3826
3827Usable as: Any Matcher
3828</pre></td></tr>
3829
3830
3831<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3832<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3833provided matcher.
3834
3835Example matches X, A, B, C
3836 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3837 class X {}; Matches X, because X::X is a class of name X inside X.
3838 class A { class X {}; };
3839 class B { class C { class X {}; }; };
3840
3841DescendantT must be an AST base type.
3842
3843As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3844each result that matches instead of only on the first one.
3845
3846Note: Recursively combined ForEachDescendant can cause many matches:
3847 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3848 forEachDescendant(cxxRecordDecl())
3849 )))
3850will match 10 times (plus injected class name matches) on:
3851 class A { class B { class C { class D { class E {}; }; }; }; };
3852
3853Usable as: Any Matcher
3854</pre></td></tr>
3855
3856
3857<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3858<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3859provided matcher.
3860
3861Example matches X, Y
3862 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3863 class X {}; Matches X, because X::X is a class of name X inside X.
3864 class Y { class X {}; };
3865 class Z { class Y { class X {}; }; }; Does not match Z.
3866
3867ChildT must be an AST base type.
3868
3869As opposed to 'has', 'forEach' will cause a match for each result that
3870matches instead of only on the first one.
3871
3872Usable as: Any Matcher
3873</pre></td></tr>
3874
3875
3876<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3877<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3878matcher.
3879
3880Given
3881void f() { if (true) { int x = 42; } }
3882void g() { for (;;) { int x = 43; } }
3883expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3884
3885Usable as: Any Matcher
3886</pre></td></tr>
3887
3888
3889<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3890<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3891provided matcher.
3892
3893Example matches X, Y, Z
3894 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3895 class X {}; Matches X, because X::X is a class of name X inside X.
3896 class Y { class X {}; };
3897 class Z { class Y { class X {}; }; };
3898
3899DescendantT must be an AST base type.
3900
3901Usable as: Any Matcher
3902</pre></td></tr>
3903
3904
3905<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3906<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3907provided matcher.
3908
3909Example matches X, Y
3910 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3911 class X {}; Matches X, because X::X is a class of name X inside X.
3912 class Y { class X {}; };
3913 class Z { class Y { class X {}; }; }; Does not match Z.
3914
3915ChildT must be an AST base type.
3916
3917Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003918Note that has is direct matcher, so it also matches things like implicit
3919casts and paren casts. If you are matching with expr then you should
3920probably consider using ignoringParenImpCasts like:
3921has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003922</pre></td></tr>
3923
3924
3925<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3926<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3927matcher.
3928
3929Given
3930void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3931compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3932
3933Usable as: Any Matcher
3934</pre></td></tr>
3935
3936
Etienne Bergeron5500f952016-05-30 15:25:25 +00003937<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>
3938<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3939switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003940
3941Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3942 if (true) {}
3943</pre></td></tr>
3944
3945
3946<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>
3947<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3948(binary or ternary).
3949
3950Example matches b
3951 condition ? a : b
3952 condition ?: b
3953</pre></td></tr>
3954
3955
3956<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>
3957<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3958
3959Example 1 (conditional ternary operator): matches a
3960 condition ? a : b
3961
3962Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3963 condition ?: b
3964</pre></td></tr>
3965
3966
Manuel Klimeka37e1102016-12-01 15:45:06 +00003967<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3968<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 +00003969matches the given matcher.
3970
3971The associated declaration is:
3972- for type nodes, the declaration of the underlying type
3973- for CallExpr, the declaration of the callee
3974- for MemberExpr, the declaration of the referenced member
3975- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00003976- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003977
3978Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3979function. e.g. various subtypes of clang::Type and various expressions.
3980
Manuel Klimeka37e1102016-12-01 15:45:06 +00003981Usable 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;,
3982 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;,
3983 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;,
3984 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;,
3985 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;,
3986 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;,
3987 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003988</pre></td></tr>
3989
3990
Aaron Ballman672dde22016-01-22 23:15:00 +00003991<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 +00003992<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3993
3994Given
3995 int i[5];
3996 void f() { i[1] = 42; }
3997arraySubscriptExpression(hasBase(implicitCastExpr(
3998 hasSourceExpression(declRefExpr()))))
3999 matches i[1] with the declRefExpr() matching i
4000</pre></td></tr>
4001
4002
Aaron Ballman672dde22016-01-22 23:15:00 +00004003<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 +00004004<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4005
4006Given
4007 int i[5];
4008 void f() { i[1] = 42; }
4009arraySubscriptExpression(hasIndex(integerLiteral()))
4010 matches i[1] with the integerLiteral() matching 1
4011</pre></td></tr>
4012
4013
Aaron Ballman672dde22016-01-22 23:15:00 +00004014<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 +00004015<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4016
4017Example matches a (matcher = binaryOperator(hasLHS()))
4018 a || b
4019</pre></td></tr>
4020
4021
Aaron Ballman672dde22016-01-22 23:15:00 +00004022<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 +00004023<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4024
4025Example matches b (matcher = binaryOperator(hasRHS()))
4026 a || b
4027</pre></td></tr>
4028
4029
Aaron Ballman672dde22016-01-22 23:15:00 +00004030<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004031<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4032type.
4033
4034Given
4035 struct A {};
4036 A a[7];
4037 int b[7];
4038arrayType(hasElementType(builtinType()))
4039 matches "int b[7]"
4040
Aaron Ballman672dde22016-01-22 23:15:00 +00004041Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004042</pre></td></tr>
4043
4044
Aaron Ballman672dde22016-01-22 23:15:00 +00004045<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004046<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4047type.
4048
4049Given
4050 struct A {};
4051 A a[7];
4052 int b[7];
4053arrayType(hasElementType(builtinType()))
4054 matches "int b[7]"
4055
Aaron Ballman672dde22016-01-22 23:15:00 +00004056Usable 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 +00004057</pre></td></tr>
4058
4059
Aaron Ballman672dde22016-01-22 23:15:00 +00004060<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 +00004061<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4062
4063Given
4064 _Atomic(int) i;
4065 _Atomic(float) f;
4066atomicType(hasValueType(isInteger()))
4067 matches "_Atomic(int) i"
4068
Aaron Ballman672dde22016-01-22 23:15:00 +00004069Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004070</pre></td></tr>
4071
4072
Aaron Ballman672dde22016-01-22 23:15:00 +00004073<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 +00004074<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4075
4076Given
4077 _Atomic(int) i;
4078 _Atomic(float) f;
4079atomicType(hasValueType(isInteger()))
4080 matches "_Atomic(int) i"
4081
Aaron Ballman672dde22016-01-22 23:15:00 +00004082Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004083</pre></td></tr>
4084
4085
Aaron Ballman672dde22016-01-22 23:15:00 +00004086<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004087<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4088
4089Note: There is no TypeLoc for the deduced type and thus no
4090getDeducedLoc() matcher.
4091
4092Given
4093 auto a = 1;
4094 auto b = 2.0;
4095autoType(hasDeducedType(isInteger()))
4096 matches "auto a"
4097
Aaron Ballman672dde22016-01-22 23:15:00 +00004098Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004099</pre></td></tr>
4100
4101
Aaron Ballman672dde22016-01-22 23:15:00 +00004102<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004103<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4104binary operator matches.
4105</pre></td></tr>
4106
4107
Aaron Ballman672dde22016-01-22 23:15:00 +00004108<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 +00004109<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4110
4111Example matches a (matcher = binaryOperator(hasLHS()))
4112 a || b
4113</pre></td></tr>
4114
4115
Aaron Ballman672dde22016-01-22 23:15:00 +00004116<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 +00004117<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4118
4119Example matches b (matcher = binaryOperator(hasRHS()))
4120 a || b
4121</pre></td></tr>
4122
4123
Aaron Ballman672dde22016-01-22 23:15:00 +00004124<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 +00004125<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4126pointee matches a given matcher.
4127
4128Given
4129 int *a;
4130 int const *b;
4131 float const *f;
4132pointerType(pointee(isConstQualified(), isInteger()))
4133 matches "int const *b"
4134
Aaron Ballman672dde22016-01-22 23:15:00 +00004135Usable 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;,
4136 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 +00004137</pre></td></tr>
4138
4139
Aaron Ballman672dde22016-01-22 23:15:00 +00004140<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 +00004141<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4142pointee matches a given matcher.
4143
4144Given
4145 int *a;
4146 int const *b;
4147 float const *f;
4148pointerType(pointee(isConstQualified(), isInteger()))
4149 matches "int const *b"
4150
Aaron Ballman672dde22016-01-22 23:15:00 +00004151Usable 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;,
4152 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 +00004153</pre></td></tr>
4154
4155
Aaron Ballman672dde22016-01-22 23:15:00 +00004156<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 +00004157<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4158
4159Given
4160 void f(int i);
4161 int y;
4162 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004163callExpr(
4164 forEachArgumentWithParam(
4165 declRefExpr(to(varDecl(hasName("y")))),
4166 parmVarDecl(hasType(isInteger()))
4167))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004168 matches f(y);
4169with declRefExpr(...)
4170 matching int y
4171and parmVarDecl(...)
4172 matching int i
4173</pre></td></tr>
4174
4175
Aaron Ballman672dde22016-01-22 23:15:00 +00004176<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 +00004177<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4178expression.
4179
4180Given
4181 void x(int, int, int) { int y; x(1, y, 42); }
4182callExpr(hasAnyArgument(declRefExpr()))
4183 matches x(1, y, 42)
4184with hasAnyArgument(...)
4185 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004186</pre></td></tr>
4187
4188
Aaron Ballman672dde22016-01-22 23:15:00 +00004189<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 +00004190<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4191call expression.
4192
4193Example matches y in x(y)
4194 (matcher = callExpr(hasArgument(0, declRefExpr())))
4195 void x(int) { int y; x(y); }
4196</pre></td></tr>
4197
4198
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004199<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4200<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 +00004201matches the given matcher.
4202
4203The associated declaration is:
4204- for type nodes, the declaration of the underlying type
4205- for CallExpr, the declaration of the callee
4206- for MemberExpr, the declaration of the referenced member
4207- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004208- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004209
4210Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4211function. e.g. various subtypes of clang::Type and various expressions.
4212
Manuel Klimeka37e1102016-12-01 15:45:06 +00004213Usable 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;,
4214 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;,
4215 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;,
4216 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;,
4217 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;,
4218 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;,
4219 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004220</pre></td></tr>
4221
4222
Aaron Ballman672dde22016-01-22 23:15:00 +00004223<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 +00004224<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4225
4226Given
4227 class A { A() : i(42), j(42) {} int i; int j; };
4228cxxConstructorDecl(forEachConstructorInitializer(
4229 forField(decl().bind("x"))
4230))
4231 will trigger two matches, binding for 'i' and 'j' respectively.
4232</pre></td></tr>
4233
4234
Aaron Ballman672dde22016-01-22 23:15:00 +00004235<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004236<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4237
4238Given
4239 struct Foo {
4240 Foo() : foo_(1) { }
4241 int foo_;
4242 };
4243cxxRecordDecl(has(cxxConstructorDecl(
4244 hasAnyConstructorInitializer(anything())
4245)))
4246 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4247</pre></td></tr>
4248
4249
Aaron Ballman672dde22016-01-22 23:15:00 +00004250<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004251<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4252
4253Given
4254 struct Foo {
4255 Foo() : foo_(1) { }
4256 int foo_;
4257 };
4258cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4259 forField(hasName("foo_"))))))
4260 matches Foo
4261with forField matching foo_
4262</pre></td></tr>
4263
4264
Aaron Ballman672dde22016-01-22 23:15:00 +00004265<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004266<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4267
4268Given
4269 struct Foo {
4270 Foo() : foo_(1) { }
4271 int foo_;
4272 };
4273cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4274 withInitializer(integerLiteral(equals(1)))))))
4275 matches Foo
4276with withInitializer matching (1)
4277</pre></td></tr>
4278
4279
Aaron Ballman672dde22016-01-22 23:15:00 +00004280<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 +00004281<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4282definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004283
4284Given
4285 for (;;) {}
4286hasBody(compoundStmt())
4287 matches 'for (;;) {}'
4288with compoundStmt()
4289 matching '{}'
4290</pre></td></tr>
4291
4292
Aaron Ballman672dde22016-01-22 23:15:00 +00004293<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 +00004294<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4295
4296Example:
4297 forStmt(hasLoopVariable(anything()))
4298matches 'int x' in
4299 for (int x : a) { }
4300</pre></td></tr>
4301
4302
Aaron Ballman672dde22016-01-22 23:15:00 +00004303<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 +00004304<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4305
4306Example:
4307 forStmt(hasRangeInit(anything()))
4308matches 'a' in
4309 for (int x : a) { }
4310</pre></td></tr>
4311
4312
Aaron Ballman672dde22016-01-22 23:15:00 +00004313<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 +00004314<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4315
4316
Aaron Ballman672dde22016-01-22 23:15:00 +00004317<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004318<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4319
4320Example matches y.x()
4321 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4322 class Y { public: void x(); };
4323 void z() { Y y; y.x(); }",
4324
4325FIXME: Overload to allow directly matching types?
4326</pre></td></tr>
4327
4328
Aaron Ballman672dde22016-01-22 23:15:00 +00004329<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004330<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4331</pre></td></tr>
4332
4333
Aaron Ballman672dde22016-01-22 23:15:00 +00004334<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004335<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4336matcher, or is a pointer to a type that matches the InnerMatcher.
4337</pre></td></tr>
4338
4339
Clement Courbet6ecaec82016-07-05 07:49:31 +00004340<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 +00004341<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 +00004342produce multiple matches.
4343
4344Given
4345 class A { virtual void f(); };
4346 class B : public A { void f(); };
4347 class C : public B { void f(); };
4348cxxMethodDecl(ofClass(hasName("C")),
4349 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4350 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4351 that B::f is not overridden by C::f).
4352
4353The check can produce multiple matches in case of multiple inheritance, e.g.
4354 class A1 { virtual void f(); };
4355 class A2 { virtual void f(); };
4356 class C : public A1, public A2 { void f(); };
4357cxxMethodDecl(ofClass(hasName("C")),
4358 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4359 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4360 once with "b" binding "A2::f" and "d" binding "C::f".
4361</pre></td></tr>
4362
4363
Aaron Ballman672dde22016-01-22 23:15:00 +00004364<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 +00004365<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4366belongs to.
4367
4368FIXME: Generalize this for other kinds of declarations.
4369FIXME: What other kind of declarations would we need to generalize
4370this to?
4371
4372Example matches A() in the last line
4373 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4374 ofClass(hasName("A"))))))
4375 class A {
4376 public:
4377 A();
4378 };
4379 A a = A();
4380</pre></td></tr>
4381
4382
Manuel Klimeka37e1102016-12-01 15:45:06 +00004383<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4384<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 +00004385matches the given matcher.
4386
4387The associated declaration is:
4388- for type nodes, the declaration of the underlying type
4389- for CallExpr, the declaration of the callee
4390- for MemberExpr, the declaration of the referenced member
4391- for CXXConstructExpr, the declaration of the constructor
4392- for CXXNewExpr, the declaration of the operator new
4393
4394Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4395function. e.g. various subtypes of clang::Type and various expressions.
4396
Manuel Klimeka37e1102016-12-01 15:45:06 +00004397Usable 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;,
4398 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;,
4399 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;,
4400 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;,
4401 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;,
4402 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;,
4403 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004404</pre></td></tr>
4405
4406
Aaron Ballman672dde22016-01-22 23:15:00 +00004407<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 +00004408<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4409
4410Given:
4411 class A { void func(); };
4412 class B { void member(); };
4413
4414cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4415A but not B.
4416</pre></td></tr>
4417
4418
Aaron Ballman672dde22016-01-22 23:15:00 +00004419<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004420<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4421a class matching Base.
4422
4423Note that a class is not considered to be derived from itself.
4424
4425Example matches Y, Z, C (Base == hasName("X"))
4426 class X;
4427 class Y : public X {}; directly derived
4428 class Z : public Y {}; indirectly derived
4429 typedef X A;
4430 typedef A B;
4431 class C : public B {}; derived from a typedef of X
4432
4433In the following example, Bar matches isDerivedFrom(hasName("X")):
4434 class Foo;
4435 typedef Foo X;
4436 class Bar : public Foo {}; derived from a type that X is a typedef of
4437</pre></td></tr>
4438
4439
Aaron Ballman672dde22016-01-22 23:15:00 +00004440<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004441<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4442match Base.
4443</pre></td></tr>
4444
4445
Aaron Ballman672dde22016-01-22 23:15:00 +00004446<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 +00004447<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4448given matcher.
4449
4450Example matches y.x() (matcher = callExpr(callee(
4451 cxxMethodDecl(hasName("x")))))
4452 class Y { public: void x(); };
4453 void z() { Y y; y.x(); }
4454</pre></td></tr>
4455
4456
Aaron Ballman672dde22016-01-22 23:15:00 +00004457<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 +00004458<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4459
4460Given
4461 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4462 void f() { f(); }
4463callExpr(callee(expr()))
4464 matches this-&gt;x(), x(), y.x(), f()
4465with callee(...)
4466 matching this-&gt;x, x, y.x, f respectively
4467
Aaron Ballman672dde22016-01-22 23:15:00 +00004468Note: 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 +00004469because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004470internal::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 +00004471implemented in terms of implicit casts.
4472</pre></td></tr>
4473
4474
Aaron Ballman672dde22016-01-22 23:15:00 +00004475<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 +00004476<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4477
4478Given
4479 void f(int i);
4480 int y;
4481 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004482callExpr(
4483 forEachArgumentWithParam(
4484 declRefExpr(to(varDecl(hasName("y")))),
4485 parmVarDecl(hasType(isInteger()))
4486))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004487 matches f(y);
4488with declRefExpr(...)
4489 matching int y
4490and parmVarDecl(...)
4491 matching int i
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_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 +00004496<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4497expression.
4498
4499Given
4500 void x(int, int, int) { int y; x(1, y, 42); }
4501callExpr(hasAnyArgument(declRefExpr()))
4502 matches x(1, y, 42)
4503with hasAnyArgument(...)
4504 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004505</pre></td></tr>
4506
4507
Aaron Ballman672dde22016-01-22 23:15:00 +00004508<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 +00004509<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4510call expression.
4511
4512Example matches y in x(y)
4513 (matcher = callExpr(hasArgument(0, declRefExpr())))
4514 void x(int) { int y; x(y); }
4515</pre></td></tr>
4516
4517
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004518<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4519<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 +00004520matches the given matcher.
4521
4522The associated declaration is:
4523- for type nodes, the declaration of the underlying type
4524- for CallExpr, the declaration of the callee
4525- for MemberExpr, the declaration of the referenced member
4526- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004527- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004528
4529Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4530function. e.g. various subtypes of clang::Type and various expressions.
4531
Manuel Klimeka37e1102016-12-01 15:45:06 +00004532Usable 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;,
4533 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;,
4534 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;,
4535 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;,
4536 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;,
4537 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;,
4538 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004539</pre></td></tr>
4540
4541
Aaron Ballman672dde22016-01-22 23:15:00 +00004542<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 +00004543<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4544extension, matches the constant given in the statement.
4545
4546Given
4547 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4548caseStmt(hasCaseConstant(integerLiteral()))
4549 matches "case 1:"
4550</pre></td></tr>
4551
4552
Aaron Ballman672dde22016-01-22 23:15:00 +00004553<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004554<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004555
4556
Aaron Ballman672dde22016-01-22 23:15:00 +00004557<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 +00004558<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4559functionDecl that have at least one TemplateArgument matching the given
4560InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004561
4562Given
4563 template&lt;typename T&gt; class A {};
4564 template&lt;&gt; class A&lt;double&gt; {};
4565 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004566
Haojian Wu99e39a72016-07-29 17:30:13 +00004567 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004568 void func() { f&lt;int&gt;(); };
4569
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004570classTemplateSpecializationDecl(hasAnyTemplateArgument(
4571 refersToType(asString("int"))))
4572 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004573
4574functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4575 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004576</pre></td></tr>
4577
4578
Manuel Klimek696e5052017-08-02 13:04:44 +00004579<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>
4580<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4581
4582Given
4583 tempalate&lt;typename T&gt; class A {};
4584 typedef A&lt;int&gt; B;
4585classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4586 matches 'B' with classTemplateDecl() matching the class template
4587 declaration of 'A'.
4588</pre></td></tr>
4589
4590
Aaron Ballman672dde22016-01-22 23:15:00 +00004591<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004592<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4593functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004594
4595Given
4596 template&lt;typename T, typename U&gt; class A {};
4597 A&lt;bool, int&gt; b;
4598 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004599
Haojian Wu99e39a72016-07-29 17:30:13 +00004600 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004601 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004602classTemplateSpecializationDecl(hasTemplateArgument(
4603 1, refersToType(asString("int"))))
4604 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004605
4606functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4607 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004608</pre></td></tr>
4609
4610
Aaron Ballman672dde22016-01-22 23:15:00 +00004611<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004612<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4613type.
4614
4615Given
4616 struct A {};
4617 A a[7];
4618 int b[7];
4619arrayType(hasElementType(builtinType()))
4620 matches "int b[7]"
4621
Aaron Ballman672dde22016-01-22 23:15:00 +00004622Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004623</pre></td></tr>
4624
4625
Aaron Ballman672dde22016-01-22 23:15:00 +00004626<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004627<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4628type.
4629
4630Given
4631 struct A {};
4632 A a[7];
4633 int b[7];
4634arrayType(hasElementType(builtinType()))
4635 matches "int b[7]"
4636
Aaron Ballman672dde22016-01-22 23:15:00 +00004637Usable 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 +00004638</pre></td></tr>
4639
4640
Aaron Ballman672dde22016-01-22 23:15:00 +00004641<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004642<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 +00004643a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004644
4645Given
4646 { {}; 1+2; }
4647hasAnySubstatement(compoundStmt())
4648 matches '{ {}; 1+2; }'
4649with compoundStmt()
4650 matching '{}'
4651</pre></td></tr>
4652
4653
Aaron Ballman672dde22016-01-22 23:15:00 +00004654<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 +00004655<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4656</pre></td></tr>
4657
4658
Manuel Klimeka37e1102016-12-01 15:45:06 +00004659<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4660<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 +00004661matches the given matcher.
4662
4663The associated declaration is:
4664- for type nodes, the declaration of the underlying type
4665- for CallExpr, the declaration of the callee
4666- for MemberExpr, the declaration of the referenced member
4667- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004668- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004669
4670Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4671function. e.g. various subtypes of clang::Type and various expressions.
4672
Manuel Klimeka37e1102016-12-01 15:45:06 +00004673Usable 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;,
4674 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;,
4675 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;,
4676 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;,
4677 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;,
4678 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;,
4679 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004680</pre></td></tr>
4681
4682
Aaron Ballman672dde22016-01-22 23:15:00 +00004683<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 +00004684<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4685specific using shadow declaration.
4686
4687Given
4688 namespace a { void f() {} }
4689 using a::f;
4690 void g() {
4691 f(); Matches this ..
4692 a::f(); .. but not this.
4693 }
4694declRefExpr(throughUsingDecl(anything()))
4695 matches f()
4696</pre></td></tr>
4697
4698
Aaron Ballman672dde22016-01-22 23:15:00 +00004699<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 +00004700<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4701specified matcher.
4702
4703Example matches x in if(x)
4704 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4705 bool x;
4706 if (x) {}
4707</pre></td></tr>
4708
4709
Aaron Ballman672dde22016-01-22 23:15:00 +00004710<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 +00004711<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4712
4713Note that this does not work for global declarations because the AST
4714breaks up multiple-declaration DeclStmt's into multiple single-declaration
4715DeclStmt's.
4716Example: Given non-global declarations
4717 int a, b = 0;
4718 int c;
4719 int d = 2, e;
4720declStmt(containsDeclaration(
4721 0, varDecl(hasInitializer(anything()))))
4722 matches only 'int d = 2, e;', and
4723declStmt(containsDeclaration(1, varDecl()))
4724 matches 'int a, b = 0' as well as 'int d = 2, e;'
4725 but 'int c;' is not matched.
4726</pre></td></tr>
4727
4728
Aaron Ballman672dde22016-01-22 23:15:00 +00004729<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 +00004730<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4731
4732Given
4733 int a, b;
4734 int c;
4735declStmt(hasSingleDecl(anything()))
4736 matches 'int c;' but not 'int a, b;'.
4737</pre></td></tr>
4738
4739
Aaron Ballman672dde22016-01-22 23:15:00 +00004740<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004741<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4742the inner matcher.
4743
4744Given
4745 int x;
4746declaratorDecl(hasTypeLoc(loc(asString("int"))))
4747 matches int x
4748</pre></td></tr>
4749
4750
Aaron Ballman672dde22016-01-22 23:15:00 +00004751<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004752<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4753Decl, matches InnerMatcher.
4754
4755Given
4756 namespace N {
4757 namespace M {
4758 class D {};
4759 }
4760 }
4761
4762cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4763declaration of class D.
4764</pre></td></tr>
4765
4766
Aaron Ballman672dde22016-01-22 23:15:00 +00004767<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 +00004768<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4769definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004770
4771Given
4772 for (;;) {}
4773hasBody(compoundStmt())
4774 matches 'for (;;) {}'
4775with compoundStmt()
4776 matching '{}'
4777</pre></td></tr>
4778
4779
Aaron Ballman672dde22016-01-22 23:15:00 +00004780<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 +00004781<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 +00004782switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004783
4784Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4785 if (true) {}
4786</pre></td></tr>
4787
4788
Aaron Ballman672dde22016-01-22 23:15:00 +00004789<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 +00004790<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4791matches InnerMatcher if the qualifier exists.
4792
4793Given
4794 namespace N {
4795 namespace M {
4796 class D {};
4797 }
4798 }
4799 N::M::D d;
4800
4801elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4802matches the type of the variable declaration of d.
4803</pre></td></tr>
4804
4805
Aaron Ballman672dde22016-01-22 23:15:00 +00004806<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 +00004807<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4808
4809Given
4810 namespace N {
4811 namespace M {
4812 class D {};
4813 }
4814 }
4815 N::M::D d;
4816
4817elaboratedType(namesType(recordType(
4818hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4819declaration of d.
4820</pre></td></tr>
4821
4822
Manuel Klimeka37e1102016-12-01 15:45:06 +00004823<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4824<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 +00004825matches the given matcher.
4826
4827The associated declaration is:
4828- for type nodes, the declaration of the underlying type
4829- for CallExpr, the declaration of the callee
4830- for MemberExpr, the declaration of the referenced member
4831- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004832- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004833
4834Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4835function. e.g. various subtypes of clang::Type and various expressions.
4836
Manuel Klimeka37e1102016-12-01 15:45:06 +00004837Usable 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;,
4838 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;,
4839 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;,
4840 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;,
4841 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;,
4842 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;,
4843 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004844</pre></td></tr>
4845
4846
Aaron Ballman672dde22016-01-22 23:15:00 +00004847<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 +00004848<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4849
4850(Note: Clang's AST refers to other conversions as "casts" too, and calls
4851actual casts "explicit" casts.)
4852</pre></td></tr>
4853
4854
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004855<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>
4856<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 +00004857declaration's type.
4858
4859In case of a value declaration (for example a variable declaration),
4860this resolves one layer of indirection. For example, in the value
4861declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4862X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4863declaration of x.
4864
4865Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4866 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4867 class X {};
4868 void y(X &amp;x) { x; X z; }
4869
Aaron Ballman672dde22016-01-22 23:15:00 +00004870Usable 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 +00004871</pre></td></tr>
4872
4873
Aaron Ballman672dde22016-01-22 23:15:00 +00004874<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 +00004875<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4876matcher.
4877
4878Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4879 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004880 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004881 class X {};
4882 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004883 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004884</pre></td></tr>
4885
4886
Aaron Ballman672dde22016-01-22 23:15:00 +00004887<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('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 +00004888<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4889are stripped off.
4890
4891Parentheses and explicit casts are not discarded.
4892Given
4893 int arr[5];
4894 int a = 0;
4895 char b = 0;
4896 const int c = a;
4897 int *d = arr;
4898 long e = (long) 0l;
4899The matchers
4900 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4901 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4902would match the declarations for a, b, c, and d, but not e.
4903While
4904 varDecl(hasInitializer(integerLiteral()))
4905 varDecl(hasInitializer(declRefExpr()))
4906only match the declarations for b, c, and d.
4907</pre></td></tr>
4908
4909
Cong Liu8a02efb2016-06-24 09:38:03 +00004910<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>
4911<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4912nodes are stripped off.
4913
4914Parentheses and explicit casts are not discarded.
4915Given
4916 class C {};
4917 C a = C();
4918 C b;
4919 C c = b;
4920The matchers
4921 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4922would match the declarations for a, b, and c.
4923While
4924 varDecl(hasInitializer(cxxConstructExpr()))
4925only match the declarations for b and c.
4926</pre></td></tr>
4927
4928
Aaron Ballman672dde22016-01-22 23:15:00 +00004929<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 +00004930<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4931casts are stripped off.
4932
4933Implicit and non-C Style casts are also discarded.
4934Given
4935 int a = 0;
4936 char b = (0);
4937 void* c = reinterpret_cast&lt;char*&gt;(0);
4938 char d = char(0);
4939The matcher
4940 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4941would match the declarations for a, b, c, and d.
4942while
4943 varDecl(hasInitializer(integerLiteral()))
4944only match the declaration for a.
4945</pre></td></tr>
4946
4947
Aaron Ballman672dde22016-01-22 23:15:00 +00004948<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 +00004949<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4950parentheses are stripped off.
4951
4952Explicit casts are not discarded.
4953Given
4954 int arr[5];
4955 int a = 0;
4956 char b = (0);
4957 const int c = a;
4958 int *d = (arr);
4959 long e = ((long) 0l);
4960The matchers
4961 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4962 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4963would match the declarations for a, b, c, and d, but not e.
4964while
4965 varDecl(hasInitializer(integerLiteral()))
4966 varDecl(hasInitializer(declRefExpr()))
4967would only match the declaration for a.
4968</pre></td></tr>
4969
4970
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00004971<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>
4972<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4973
4974Given
4975 class C {
4976 int a = 2;
4977 int b = 3;
4978 int c;
4979 };
4980fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4981 matches 'int a;' but not 'int b;'.
4982fieldDecl(hasInClassInitializer(anything()))
4983 matches 'int a;' and 'int b;' but not 'int c;'.
4984</pre></td></tr>
4985
4986
Aaron Ballman672dde22016-01-22 23:15:00 +00004987<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004988<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4989definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004990
4991Given
4992 for (;;) {}
4993hasBody(compoundStmt())
4994 matches 'for (;;) {}'
4995with compoundStmt()
4996 matching '{}'
4997</pre></td></tr>
4998
4999
Aaron Ballman672dde22016-01-22 23:15:00 +00005000<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 +00005001<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 +00005002switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005003
5004Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5005 if (true) {}
5006</pre></td></tr>
5007
5008
Aaron Ballman672dde22016-01-22 23:15:00 +00005009<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 +00005010<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5011
5012Example:
5013 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5014matches '++x' in
5015 for (x; x &lt; N; ++x) { }
5016</pre></td></tr>
5017
5018
Aaron Ballman672dde22016-01-22 23:15:00 +00005019<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 +00005020<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5021
5022Example:
5023 forStmt(hasLoopInit(declStmt()))
5024matches 'int x = 0' in
5025 for (int x = 0; x &lt; N; ++x) { }
5026</pre></td></tr>
5027
5028
Aaron Ballman672dde22016-01-22 23:15:00 +00005029<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 +00005030<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5031
5032Does not match the 'this' parameter of a method.
5033
5034Given
5035 class X { void f(int x, int y, int z) {} };
5036cxxMethodDecl(hasAnyParameter(hasName("y")))
5037 matches f(int x, int y, int z) {}
5038with hasAnyParameter(...)
5039 matching int y
5040</pre></td></tr>
5041
5042
Haojian Wud898b092016-07-29 13:57:27 +00005043<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>
5044<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5045functionDecl that have at least one TemplateArgument matching the given
5046InnerMatcher.
5047
5048Given
5049 template&lt;typename T&gt; class A {};
5050 template&lt;&gt; class A&lt;double&gt; {};
5051 A&lt;int&gt; a;
5052
Haojian Wu99e39a72016-07-29 17:30:13 +00005053 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005054 void func() { f&lt;int&gt;(); };
5055
5056classTemplateSpecializationDecl(hasAnyTemplateArgument(
5057 refersToType(asString("int"))))
5058 matches the specialization A&lt;int&gt;
5059
5060functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5061 matches the specialization f&lt;int&gt;
5062</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_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 +00005066<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5067definition that has a given body.
5068
5069Given
5070 for (;;) {}
5071hasBody(compoundStmt())
5072 matches 'for (;;) {}'
5073with compoundStmt()
5074 matching '{}'
5075</pre></td></tr>
5076
5077
Aaron Ballman672dde22016-01-22 23:15:00 +00005078<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005079<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5080
5081Given
5082 class X { void f(int x) {} };
5083cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5084 matches f(int x) {}
5085with hasParameter(...)
5086 matching int x
5087</pre></td></tr>
5088
5089
Haojian Wud898b092016-07-29 13:57:27 +00005090<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>
5091<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5092functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5093
5094Given
5095 template&lt;typename T, typename U&gt; class A {};
5096 A&lt;bool, int&gt; b;
5097 A&lt;int, bool&gt; c;
5098
Haojian Wu99e39a72016-07-29 17:30:13 +00005099 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005100 void func() { f&lt;int&gt;(); };
5101classTemplateSpecializationDecl(hasTemplateArgument(
5102 1, refersToType(asString("int"))))
5103 matches the specialization A&lt;bool, int&gt;
5104
5105functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5106 matches the specialization f&lt;int&gt;
5107</pre></td></tr>
5108
5109
Aaron Ballman672dde22016-01-22 23:15:00 +00005110<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 +00005111<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5112
5113Given:
5114 class X { int f() { return 1; } };
5115cxxMethodDecl(returns(asString("int")))
5116 matches int f() { return 1; }
5117</pre></td></tr>
5118
5119
Aaron Ballman672dde22016-01-22 23:15:00 +00005120<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 +00005121<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 +00005122switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005123
5124Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5125 if (true) {}
5126</pre></td></tr>
5127
5128
Aaron Ballman672dde22016-01-22 23:15:00 +00005129<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 +00005130<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5131
5132Given
5133 if (A* a = GetAPointer()) {}
5134hasConditionVariableStatement(...)
5135 matches 'A* a = GetAPointer()'.
5136</pre></td></tr>
5137
5138
Aaron Ballman672dde22016-01-22 23:15:00 +00005139<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 +00005140<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5141
5142Examples matches the if statement
5143 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5144 if (false) false; else true;
5145</pre></td></tr>
5146
5147
Aaron Ballman672dde22016-01-22 23:15:00 +00005148<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 +00005149<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5150
5151Examples matches the if statement
5152 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5153 if (false) true; else false;
5154</pre></td></tr>
5155
5156
Aaron Ballman672dde22016-01-22 23:15:00 +00005157<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 +00005158<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5159matcher.
5160
5161FIXME: Unit test this matcher
5162</pre></td></tr>
5163
5164
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005165<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>
5166<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5167(if expression have it).
5168</pre></td></tr>
5169
5170
Manuel Klimeka37e1102016-12-01 15:45:06 +00005171<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005172<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5173matches the given matcher.
5174
5175The associated declaration is:
5176- for type nodes, the declaration of the underlying type
5177- for CallExpr, the declaration of the callee
5178- for MemberExpr, the declaration of the referenced member
5179- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005180- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005181
5182Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5183function. e.g. various subtypes of clang::Type and various expressions.
5184
Manuel Klimeka37e1102016-12-01 15:45:06 +00005185Usable 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;,
5186 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;,
5187 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;,
5188 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;,
5189 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;,
5190 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;,
5191 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5192</pre></td></tr>
5193
5194
5195<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5196<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5197matches the given matcher.
5198
5199The associated declaration is:
5200- for type nodes, the declaration of the underlying type
5201- for CallExpr, the declaration of the callee
5202- for MemberExpr, the declaration of the referenced member
5203- for CXXConstructExpr, the declaration of the constructor
5204- for CXXNewExpr, the declaration of the operator new
5205
5206Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5207function. e.g. various subtypes of clang::Type and various expressions.
5208
5209Usable 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;,
5210 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;,
5211 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;,
5212 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;,
5213 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;,
5214 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;,
5215 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005216</pre></td></tr>
5217
5218
Aaron Ballman672dde22016-01-22 23:15:00 +00005219<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005220<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5221matches the given matcher.
5222
5223The associated declaration is:
5224- for type nodes, the declaration of the underlying type
5225- for CallExpr, the declaration of the callee
5226- for MemberExpr, the declaration of the referenced member
5227- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005228- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005229
5230Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5231function. e.g. various subtypes of clang::Type and various expressions.
5232
Manuel Klimeka37e1102016-12-01 15:45:06 +00005233Usable 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;,
5234 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;,
5235 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;,
5236 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;,
5237 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;,
5238 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;,
5239 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005240</pre></td></tr>
5241
5242
Aaron Ballman672dde22016-01-22 23:15:00 +00005243<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 +00005244<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5245matched by a given matcher.
5246
5247Given
5248 struct X { int m; };
5249 void f(X x) { x.m; m; }
5250memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5251 matches "x.m" and "m"
5252with hasObjectExpression(...)
5253 matching "x" and the implicit object expression of "m" which has type X*.
5254</pre></td></tr>
5255
5256
Aaron Ballman672dde22016-01-22 23:15:00 +00005257<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 +00005258<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5259given matcher.
5260
5261Given
5262 struct { int first, second; } first, second;
5263 int i(second.first);
5264 int j(first.second);
5265memberExpr(member(hasName("first")))
5266 matches second.first
5267 but not first.second (because the member name there is "second").
5268</pre></td></tr>
5269
5270
Aaron Ballman672dde22016-01-22 23:15:00 +00005271<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 +00005272<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5273pointee matches a given matcher.
5274
5275Given
5276 int *a;
5277 int const *b;
5278 float const *f;
5279pointerType(pointee(isConstQualified(), isInteger()))
5280 matches "int const *b"
5281
Aaron Ballman672dde22016-01-22 23:15:00 +00005282Usable 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;,
5283 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 +00005284</pre></td></tr>
5285
5286
Aaron Ballman672dde22016-01-22 23:15:00 +00005287<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 +00005288<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5289pointee matches a given matcher.
5290
5291Given
5292 int *a;
5293 int const *b;
5294 float const *f;
5295pointerType(pointee(isConstQualified(), isInteger()))
5296 matches "int const *b"
5297
Aaron Ballman672dde22016-01-22 23:15:00 +00005298Usable 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;,
5299 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 +00005300</pre></td></tr>
5301
5302
Martin Bohme8cef2c22016-08-09 15:07:52 +00005303<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>
5304<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5305matcher.
5306
5307Given
5308 namespace N { template&lt;class T&gt; void f(T t); }
5309 template &lt;class T&gt; void g() { using N::f; f(T()); }
5310unresolvedLookupExpr(hasAnyDeclaration(
5311 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5312 matches the use of f in g() .
5313</pre></td></tr>
5314
5315
Aaron Ballman672dde22016-01-22 23:15:00 +00005316<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 +00005317<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5318
5319Given
5320 struct A { struct B { struct C {}; }; };
5321 A::B::C c;
5322nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5323 matches "A::"
5324</pre></td></tr>
5325
5326
Aaron Ballman672dde22016-01-22 23:15:00 +00005327<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 +00005328<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5329given TypeLoc.
5330
5331Given
5332 struct A { struct B { struct C {}; }; };
5333 A::B::C c;
5334nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5335 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5336 matches "A::"
5337</pre></td></tr>
5338
5339
Aaron Ballman672dde22016-01-22 23:15:00 +00005340<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 +00005341<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5342
5343Given
5344 struct A { struct B { struct C {}; }; };
5345 A::B::C c;
5346nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5347 matches "A::"
5348</pre></td></tr>
5349
5350
Aaron Ballman672dde22016-01-22 23:15:00 +00005351<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 +00005352<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5353given namespace matcher.
5354
5355Given
5356 namespace ns { struct A {}; }
5357 ns::A a;
5358nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5359 matches "ns::"
5360</pre></td></tr>
5361
5362
Aaron Ballman672dde22016-01-22 23:15:00 +00005363<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 +00005364<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5365given QualType matcher without qualifiers.
5366
5367Given
5368 struct A { struct B { struct C {}; }; };
5369 A::B::C c;
5370nestedNameSpecifier(specifiesType(
5371 hasDeclaration(cxxRecordDecl(hasName("A")))
5372))
5373 matches "A::"
5374</pre></td></tr>
5375
5376
Aaron Ballman672dde22016-01-22 23:15:00 +00005377<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 +00005378<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5379call expression.
5380
5381Example matches y in x(y)
5382 (matcher = callExpr(hasArgument(0, declRefExpr())))
5383 void x(int) { int y; x(y); }
5384</pre></td></tr>
5385
5386
Aaron Ballman672dde22016-01-22 23:15:00 +00005387<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005388<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5389
5390Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005391matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005392matches the [webView ...] message invocation.
5393 NSString *webViewJavaScript = ...
5394 UIWebView *webView = ...
5395 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5396</pre></td></tr>
5397
5398
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005399<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>
5400<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5401
5402
Martin Bohme8cef2c22016-08-09 15:07:52 +00005403<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>
5404<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5405overloads matches the given matcher.
5406
5407Given
5408 template &lt;typename T&gt; void foo(T);
5409 template &lt;typename T&gt; void bar(T);
5410 template &lt;typename T&gt; void baz(T t) {
5411 foo(t);
5412 bar(t);
5413 }
5414unresolvedLookupExpr(hasAnyDeclaration(
5415 functionTemplateDecl(hasName("foo"))))
5416 matches foo in foo(t); but not bar in bar(t);
5417</pre></td></tr>
5418
5419
Aaron Ballman672dde22016-01-22 23:15:00 +00005420<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 +00005421<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5422
5423Given
5424 int (*ptr_to_array)[4];
5425 int (*ptr_to_func)(int);
5426
5427varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5428ptr_to_func but not ptr_to_array.
5429
Aaron Ballman672dde22016-01-22 23:15:00 +00005430Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005431</pre></td></tr>
5432
5433
Aaron Ballman672dde22016-01-22 23:15:00 +00005434<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 +00005435<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5436pointee matches a given matcher.
5437
5438Given
5439 int *a;
5440 int const *b;
5441 float const *f;
5442pointerType(pointee(isConstQualified(), isInteger()))
5443 matches "int const *b"
5444
Aaron Ballman672dde22016-01-22 23:15:00 +00005445Usable 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;,
5446 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 +00005447</pre></td></tr>
5448
5449
Aaron Ballman672dde22016-01-22 23:15:00 +00005450<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 +00005451<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5452pointee matches a given matcher.
5453
5454Given
5455 int *a;
5456 int const *b;
5457 float const *f;
5458pointerType(pointee(isConstQualified(), isInteger()))
5459 matches "int const *b"
5460
Aaron Ballman672dde22016-01-22 23:15:00 +00005461Usable 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;,
5462 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 +00005463</pre></td></tr>
5464
5465
Aaron Ballman672dde22016-01-22 23:15:00 +00005466<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 +00005467<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5468
5469Given:
5470 typedef int &amp;int_ref;
5471 int a;
5472 int_ref b = a;
5473
5474varDecl(hasType(qualType(referenceType()))))) will not match the
5475declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5476</pre></td></tr>
5477
5478
Aaron Ballman672dde22016-01-22 23:15:00 +00005479<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005480<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5481matches the given matcher.
5482
5483The associated declaration is:
5484- for type nodes, the declaration of the underlying type
5485- for CallExpr, the declaration of the callee
5486- for MemberExpr, the declaration of the referenced member
5487- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005488- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005489
5490Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5491function. e.g. various subtypes of clang::Type and various expressions.
5492
Manuel Klimeka37e1102016-12-01 15:45:06 +00005493Usable 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;,
5494 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;,
5495 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;,
5496 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;,
5497 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;,
5498 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;,
5499 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005500</pre></td></tr>
5501
5502
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005503<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>
5504<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5505
5506Given
5507 void (*fp)(void);
5508The matcher
5509 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5510would match the declaration for fp.
5511</pre></td></tr>
5512
5513
Aaron Ballman672dde22016-01-22 23:15:00 +00005514<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 +00005515<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5516</pre></td></tr>
5517
5518
Aaron Ballman672dde22016-01-22 23:15:00 +00005519<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 +00005520<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5521matches the specified matcher.
5522
5523Example matches y-&gt;x()
5524 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5525 cxxRecordDecl(hasName("Y")))))))
5526 class Y { public: void x(); };
5527 void z() { Y *y; y-&gt;x(); }
5528</pre></td></tr>
5529
5530
Aaron Ballman672dde22016-01-22 23:15:00 +00005531<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 +00005532<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5533</pre></td></tr>
5534
5535
Aaron Ballman672dde22016-01-22 23:15:00 +00005536<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005537<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5538type matches the specified matcher.
5539
5540Example matches X &amp;x and const X &amp;y
5541 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5542 class X {
5543 void a(X b) {
5544 X &amp;x = b;
5545 const X &amp;y = b;
5546 }
5547 };
5548</pre></td></tr>
5549
5550
Aaron Ballman672dde22016-01-22 23:15:00 +00005551<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005552<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5553matches the given matcher.
5554
5555The associated declaration is:
5556- for type nodes, the declaration of the underlying type
5557- for CallExpr, the declaration of the callee
5558- for MemberExpr, the declaration of the referenced member
5559- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005560- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005561
5562Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5563function. e.g. various subtypes of clang::Type and various expressions.
5564
Manuel Klimeka37e1102016-12-01 15:45:06 +00005565Usable 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;,
5566 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;,
5567 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;,
5568 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;,
5569 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;,
5570 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;,
5571 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005572</pre></td></tr>
5573
5574
Aaron Ballman672dde22016-01-22 23:15:00 +00005575<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 +00005576<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5577pointee matches a given matcher.
5578
5579Given
5580 int *a;
5581 int const *b;
5582 float const *f;
5583pointerType(pointee(isConstQualified(), isInteger()))
5584 matches "int const *b"
5585
Aaron Ballman672dde22016-01-22 23:15:00 +00005586Usable 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;,
5587 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 +00005588</pre></td></tr>
5589
5590
Aaron Ballman672dde22016-01-22 23:15:00 +00005591<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 +00005592<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5593pointee matches a given matcher.
5594
5595Given
5596 int *a;
5597 int const *b;
5598 float const *f;
5599pointerType(pointee(isConstQualified(), isInteger()))
5600 matches "int const *b"
5601
Aaron Ballman672dde22016-01-22 23:15:00 +00005602Usable 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;,
5603 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 +00005604</pre></td></tr>
5605
5606
Alexander Kornienko976921d2016-03-22 11:03:03 +00005607<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>
5608<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5609
5610Given
5611 return a + b;
5612hasReturnValue(binaryOperator())
5613 matches 'return a + b'
5614with binaryOperator()
5615 matching 'a + b'
5616</pre></td></tr>
5617
5618
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005619<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>
5620<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5621a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5622
5623Given
5624 { {}; 1+2; }
5625hasAnySubstatement(compoundStmt())
5626 matches '{ {}; 1+2; }'
5627with compoundStmt()
5628 matching '{}'
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_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005633<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5634alignof.
5635</pre></td></tr>
5636
5637
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00005638<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 +00005639<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 +00005640
5641Given:
5642F&amp; operator=(const F&amp; o) {
5643 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5644 return *this;
5645}
5646returnStmt(forFunction(hasName("operator=")))
5647 matches 'return *this'
5648 but does match 'return &gt; 0'
5649</pre></td></tr>
5650
5651
Aaron Ballman672dde22016-01-22 23:15:00 +00005652<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005653<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5654sizeof.
5655</pre></td></tr>
5656
5657
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005658<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>
5659<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5660type that matches the provided matcher.
5661
5662Given
5663 template &lt;typename T&gt;
5664 double F(T t);
5665 int i;
5666 double j = F(i);
5667
5668substTemplateTypeParmType(hasReplacementType(type())) matches int
5669</pre></td></tr>
5670
5671
Aaron Ballman672dde22016-01-22 23:15:00 +00005672<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 +00005673<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5674statement. This matcher may produce multiple matches.
5675
5676Given
5677 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5678switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5679 matches four times, with "c" binding each of "case 1:", "case 2:",
5680"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5681"switch (1)", "switch (2)" and "switch (2)".
5682</pre></td></tr>
5683
5684
Etienne Bergeron5500f952016-05-30 15:25:25 +00005685<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>
5686<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5687switch statement or conditional operator.
5688
5689Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5690 if (true) {}
5691</pre></td></tr>
5692
5693
Aaron Ballman672dde22016-01-22 23:15:00 +00005694<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005695<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5696matches the given matcher.
5697
5698The associated declaration is:
5699- for type nodes, the declaration of the underlying type
5700- for CallExpr, the declaration of the callee
5701- for MemberExpr, the declaration of the referenced member
5702- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005703- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005704
5705Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5706function. e.g. various subtypes of clang::Type and various expressions.
5707
Manuel Klimeka37e1102016-12-01 15:45:06 +00005708Usable 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;,
5709 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;,
5710 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;,
5711 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;,
5712 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;,
5713 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;,
5714 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005715</pre></td></tr>
5716
5717
Aaron Ballman672dde22016-01-22 23:15:00 +00005718<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 +00005719<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5720
5721Given
5722 template&lt;typename T&gt; struct A {};
5723 struct B { B* next; };
5724 A&lt;&amp;B::next&gt; a;
5725templateSpecializationType(hasAnyTemplateArgument(
5726 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5727 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5728 B::next
5729</pre></td></tr>
5730
5731
Aaron Ballman672dde22016-01-22 23:15:00 +00005732<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('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 +00005733<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5734declaration.
5735
5736Given
5737 template&lt;typename T&gt; struct A {};
5738 struct B { B* next; };
5739 A&lt;&amp;B::next&gt; a;
5740classTemplateSpecializationDecl(hasAnyTemplateArgument(
5741 refersToDeclaration(fieldDecl(hasName("next"))))
5742 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5743 B::next
5744</pre></td></tr>
5745
5746
Aaron Ballman672dde22016-01-22 23:15:00 +00005747<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 +00005748<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5749
5750Given
5751 template&lt;int T&gt; struct A {};
5752 C&lt;42&gt; c;
5753classTemplateSpecializationDecl(
5754 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5755 matches the implicit instantiation of C in C&lt;42&gt;.
5756</pre></td></tr>
5757
5758
Haojian Wub33b02e2016-07-29 15:45:11 +00005759<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>
5760<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5761
5762Given
5763 template&lt;template &lt;typename&gt; class S&gt; class X {};
5764 template&lt;typename T&gt; class Y {};"
5765 X&lt;Y&gt; xi;
5766classTemplateSpecializationDecl(hasAnyTemplateArgument(
5767 refersToTemplate(templateName())))
5768 matches the specialization X&lt;Y&gt;
5769</pre></td></tr>
5770
5771
Aaron Ballman672dde22016-01-22 23:15:00 +00005772<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 +00005773<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5774
5775Given
5776 struct X {};
5777 template&lt;typename T&gt; struct A {};
5778 A&lt;X&gt; a;
5779classTemplateSpecializationDecl(hasAnyTemplateArgument(
5780 refersToType(class(hasName("X")))))
5781 matches the specialization A&lt;X&gt;
5782</pre></td></tr>
5783
5784
Aaron Ballman672dde22016-01-22 23:15:00 +00005785<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 +00005786<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5787functionDecl that have at least one TemplateArgument matching the given
5788InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005789
5790Given
5791 template&lt;typename T&gt; class A {};
5792 template&lt;&gt; class A&lt;double&gt; {};
5793 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005794
Haojian Wu99e39a72016-07-29 17:30:13 +00005795 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005796 void func() { f&lt;int&gt;(); };
5797
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005798classTemplateSpecializationDecl(hasAnyTemplateArgument(
5799 refersToType(asString("int"))))
5800 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005801
5802functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5803 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005804</pre></td></tr>
5805
5806
Aaron Ballman672dde22016-01-22 23:15:00 +00005807<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005808<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5809matches the given matcher.
5810
5811The associated declaration is:
5812- for type nodes, the declaration of the underlying type
5813- for CallExpr, the declaration of the callee
5814- for MemberExpr, the declaration of the referenced member
5815- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005816- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005817
5818Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5819function. e.g. various subtypes of clang::Type and various expressions.
5820
Manuel Klimeka37e1102016-12-01 15:45:06 +00005821Usable 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;,
5822 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;,
5823 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;,
5824 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;,
5825 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;,
5826 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;,
5827 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005828</pre></td></tr>
5829
5830
Aaron Ballman672dde22016-01-22 23:15:00 +00005831<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 +00005832<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5833functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005834
5835Given
5836 template&lt;typename T, typename U&gt; class A {};
5837 A&lt;bool, int&gt; b;
5838 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005839
Haojian Wu99e39a72016-07-29 17:30:13 +00005840 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005841 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005842classTemplateSpecializationDecl(hasTemplateArgument(
5843 1, refersToType(asString("int"))))
5844 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005845
5846functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5847 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005848</pre></td></tr>
5849
5850
Aaron Ballman672dde22016-01-22 23:15:00 +00005851<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005852<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5853matches the given matcher.
5854
5855The associated declaration is:
5856- for type nodes, the declaration of the underlying type
5857- for CallExpr, the declaration of the callee
5858- for MemberExpr, the declaration of the referenced member
5859- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005860- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005861
5862Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5863function. e.g. various subtypes of clang::Type and various expressions.
5864
Manuel Klimeka37e1102016-12-01 15:45:06 +00005865Usable 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;,
5866 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;,
5867 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;,
5868 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;,
5869 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;,
5870 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;,
5871 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005872</pre></td></tr>
5873
5874
5875<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt; Matcher</td></tr>
5876<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5877
5878Generates results for each match.
5879
5880For example, in:
5881 class A { class B {}; class C {}; };
5882The matcher:
5883 cxxRecordDecl(hasName("::A"),
5884 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5885will generate results for A, B and C.
5886
5887Usable as: Any Matcher
5888</pre></td></tr>
5889
5890
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005891<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 +00005892<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5893matcher.
5894
5895Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5896 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5897 and U (matcher = typedefDecl(hasType(asString("int")))
5898 class X {};
5899 void y(X &amp;x) { x; X z; }
5900 typedef int U;
5901</pre></td></tr>
5902
5903
Aaron Ballman672dde22016-01-22 23:15:00 +00005904<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005905<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5906matches the given matcher.
5907
5908The associated declaration is:
5909- for type nodes, the declaration of the underlying type
5910- for CallExpr, the declaration of the callee
5911- for MemberExpr, the declaration of the referenced member
5912- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005913- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005914
5915Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5916function. e.g. various subtypes of clang::Type and various expressions.
5917
Manuel Klimeka37e1102016-12-01 15:45:06 +00005918Usable 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;,
5919 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;,
5920 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;,
5921 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;,
5922 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;,
5923 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;,
5924 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5925</pre></td></tr>
5926
5927
5928<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>
5929<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5930type of the matched node.
5931
5932For example, in:
5933 class A {};
5934 using B = A;
5935The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5936both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005937</pre></td></tr>
5938
5939
Aaron Ballman672dde22016-01-22 23:15:00 +00005940<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 +00005941<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5942
5943Given
5944 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5945unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5946 matches sizeof(a) and alignof(c)
5947</pre></td></tr>
5948
5949
Aaron Ballman672dde22016-01-22 23:15:00 +00005950<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 +00005951<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5952
5953Example matches true (matcher = hasUnaryOperand(
5954 cxxBoolLiteral(equals(true))))
5955 !true
5956</pre></td></tr>
5957
5958
Aaron Ballman672dde22016-01-22 23:15:00 +00005959<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005960<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5961matches the given matcher.
5962
5963The associated declaration is:
5964- for type nodes, the declaration of the underlying type
5965- for CallExpr, the declaration of the callee
5966- for MemberExpr, the declaration of the referenced member
5967- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005968- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005969
5970Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5971function. e.g. various subtypes of clang::Type and various expressions.
5972
Manuel Klimeka37e1102016-12-01 15:45:06 +00005973Usable 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;,
5974 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;,
5975 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;,
5976 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;,
5977 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;,
5978 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;,
5979 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005980</pre></td></tr>
5981
5982
Aaron Ballman672dde22016-01-22 23:15:00 +00005983<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 +00005984<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5985
5986Given
5987 namespace X { void b(); }
5988 using X::b;
5989usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5990 matches using X::b </pre></td></tr>
5991
5992
Aaron Ballman672dde22016-01-22 23:15:00 +00005993<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 +00005994<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5995matched by the given matcher.
5996
5997Given
5998 namespace X { int a; void b(); }
5999 using X::a;
6000 using X::b;
6001usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6002 matches using X::b but not using X::a </pre></td></tr>
6003
6004
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006005<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>
6006<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 +00006007declaration's type.
6008
6009In case of a value declaration (for example a variable declaration),
6010this resolves one layer of indirection. For example, in the value
6011declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6012X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6013declaration of x.
6014
6015Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6016 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6017 class X {};
6018 void y(X &amp;x) { x; X z; }
6019
Aaron Ballman672dde22016-01-22 23:15:00 +00006020Usable 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 +00006021</pre></td></tr>
6022
6023
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006024<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>
6025<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 +00006026matcher.
6027
6028Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6029 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006030 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006031 class X {};
6032 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006033 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006034</pre></td></tr>
6035
6036
Aaron Ballman672dde22016-01-22 23:15:00 +00006037<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 +00006038<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6039that matches the given matcher.
6040
6041Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6042 bool y() { return true; }
6043 bool x = y();
6044</pre></td></tr>
6045
6046
Aaron Ballman672dde22016-01-22 23:15:00 +00006047<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 +00006048<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6049expression.
6050
6051Given
6052 void f(int b) {
6053 int a[b];
6054 }
6055variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6056 varDecl(hasName("b")))))))
6057 matches "int a[b]"
6058</pre></td></tr>
6059
6060
Aaron Ballman672dde22016-01-22 23:15:00 +00006061<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 +00006062<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6063definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006064
6065Given
6066 for (;;) {}
6067hasBody(compoundStmt())
6068 matches 'for (;;) {}'
6069with compoundStmt()
6070 matching '{}'
6071</pre></td></tr>
6072
6073
Aaron Ballman672dde22016-01-22 23:15:00 +00006074<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 +00006075<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 +00006076switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006077
6078Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6079 if (true) {}
6080</pre></td></tr>
6081
6082
Aaron Ballman672dde22016-01-22 23:15:00 +00006083<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 +00006084<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6085NestedNameSpecifier-matcher matches.
6086</pre></td></tr>
6087
6088
Aaron Ballman672dde22016-01-22 23:15:00 +00006089<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 +00006090<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6091QualType-matcher matches.
6092</pre></td></tr>
6093
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006094<!--END_TRAVERSAL_MATCHERS -->
6095</table>
6096
6097</div>
6098</body>
6099</html>
6100
6101