blob: 11006bb9ac759044c2ac9f859a37d51d3a3789c5 [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
2744
Aaron Ballman672dde22016-01-22 23:15:00 +00002745<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002746<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2747
2748Given:
2749 extern "C" void f() {}
2750 extern "C" { void g() {} }
2751 void h() {}
2752functionDecl(isExternC())
2753 matches the declaration of f and g, but not the declaration h
2754</pre></td></tr>
2755
2756
Aaron Ballman672dde22016-01-22 23:15:00 +00002757<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 +00002758<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2759the inline keyword.
2760
2761Given
2762 inline void f();
2763 void g();
2764 namespace n {
2765 inline namespace m {}
2766 }
2767functionDecl(isInline()) will match ::f().
2768namespaceDecl(isInline()) will match n::m.
2769</pre></td></tr>
2770
2771
Aaron Ballman672dde22016-01-22 23:15:00 +00002772<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 +00002773<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2774
2775Given:
2776 void f();
2777 void g() noexcept;
2778 void h() throw();
2779 void i() throw(int);
2780 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002781functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2782 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002783</pre></td></tr>
2784
2785
Haojian Wub3d25462016-09-26 16:01:52 +00002786<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 +00002787<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2788class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002789
2790Given:
2791 static void f() {}
2792 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002793 extern int j;
2794 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002795functionDecl(isStaticStorageClass())
2796 matches the function declaration f.
2797varDecl(isStaticStorageClass())
2798 matches the variable declaration i.
2799</pre></td></tr>
2800
2801
Aaron Ballman672dde22016-01-22 23:15:00 +00002802<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 +00002803<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2804member variable template instantiations.
2805
2806Given
2807 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2808or
2809 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2810cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2811 matches the template instantiation of X&lt;A&gt;.
2812
2813But given
2814 template &lt;typename T&gt; class X {}; class A {};
2815 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2816cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2817 does not match, as X&lt;A&gt; is an explicit template specialization.
2818
Aaron Ballman672dde22016-01-22 23:15:00 +00002819Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002820</pre></td></tr>
2821
2822
Aaron Ballman672dde22016-01-22 23:15:00 +00002823<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002824<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2825
2826Example matches f, but not g or h. The function i will not match, even when
2827compiled in C mode.
2828 void f(...);
2829 void g(int);
2830 template &lt;typename... Ts&gt; void h(Ts...);
2831 void i();
2832</pre></td></tr>
2833
2834
Aaron Ballman672dde22016-01-22 23:15:00 +00002835<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 +00002836<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2837specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002838
2839Given
2840 void f(int i) {}
2841 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002842 void h(int i, int j);
2843 void j(int i);
2844 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002845functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002846 matches void g(int i, int j) {}
2847functionProtoType(parameterCountIs(2))
2848 matches void h(int i, int j)
2849functionProtoType(parameterCountIs(3))
2850 matches void k(int x, int y, int z, ...);
2851</pre></td></tr>
2852
2853
Aaron Ballman230ad972016-06-07 17:34:45 +00002854<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>
2855<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2856
2857Given:
2858 void f();
2859 void g() noexcept;
2860 void h() noexcept(true);
2861 void i() noexcept(false);
2862 void j() throw();
2863 void k() throw(int);
2864 void l() throw(...);
2865functionDecl(hasDynamicExceptionSpec()) and
2866 functionProtoType(hasDynamicExceptionSpec())
2867 match the declarations of j, k, and l, but not f, g, h, or i.
2868</pre></td></tr>
2869
2870
2871<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>
2872<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2873
2874Given:
2875 void f();
2876 void g() noexcept;
2877 void h() throw();
2878 void i() throw(int);
2879 void j() noexcept(false);
2880functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2881 match the declarations of g, and h, but not f, i or j.
2882</pre></td></tr>
2883
2884
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002885<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>
2886<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2887specific parameter count.
2888
2889Given
2890 void f(int i) {}
2891 void g(int i, int j) {}
2892 void h(int i, int j);
2893 void j(int i);
2894 void k(int x, int y, int z, ...);
2895functionDecl(parameterCountIs(2))
2896 matches void g(int i, int j) {}
2897functionProtoType(parameterCountIs(2))
2898 matches void h(int i, int j)
2899functionProtoType(parameterCountIs(3))
2900 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002901</pre></td></tr>
2902
2903
Aaron Ballman672dde22016-01-22 23:15:00 +00002904<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 +00002905<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 +00002906
Peter Wua9244b52017-06-08 22:00:58 +00002907Given
2908 f('false, 3.14, 42);
2909characterLiteral(equals(0))
2910 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2911 match false
2912floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2913 match 3.14
2914integerLiteral(equals(42))
2915 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002916
Clement Courbet43bdba42017-07-11 15:45:22 +00002917Note that you cannot directly match a negative numeric literal because the
2918minus sign is not part of the literal: It is a unary operator whose operand
2919is the positive numeric literal. Instead, you must use a unaryOperator()
2920matcher to match the minus sign:
2921
2922unaryOperator(hasOperatorName("-"),
2923 hasUnaryOperand(integerLiteral(equals(13))))
2924
Peter Wua9244b52017-06-08 22:00:58 +00002925Usable 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 +00002926 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 +00002927</pre></td></tr>
2928
2929
Peter Wua9244b52017-06-08 22:00:58 +00002930<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>
2931<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2932
2933
2934<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>
2935<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2936
2937
2938<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>
2939<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2940
2941
Aaron Ballman672dde22016-01-22 23:15:00 +00002942<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 +00002943<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2944to '.'.
2945
2946Member calls on the implicit this pointer match as called with '-&gt;'.
2947
2948Given
2949 class Y {
2950 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2951 int a;
2952 static int b;
2953 };
2954memberExpr(isArrow())
2955 matches this-&gt;x, x, y.x, a, this-&gt;b
2956</pre></td></tr>
2957
2958
Aaron Ballmana086b9f2016-08-17 13:10:42 +00002959<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>
2960<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2961
2962Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2963void f() {
2964 int x;
2965 static int y;
2966}
2967int z;
2968
2969Example matches f() because it has external formal linkage despite being
2970unique to the translation unit as though it has internal likage
2971(matcher = functionDecl(hasExternalFormalLinkage()))
2972
2973namespace {
2974void f() {}
2975}
2976</pre></td></tr>
2977
2978
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002979<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 +00002980<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2981
2982Supports specifying enclosing namespaces or classes by prefixing the name
2983with '&lt;enclosing&gt;::'.
2984Does not match typedefs of an underlying type with the given name.
2985
2986Example matches X (Name == "X")
2987 class X;
2988
2989Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2990 namespace a { namespace b { class X; } }
2991</pre></td></tr>
2992
2993
Aaron Ballman672dde22016-01-22 23:15:00 +00002994<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 +00002995<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2996a substring matched by the given RegExp.
2997
2998Supports specifying enclosing namespaces or classes by
2999prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3000of an underlying type with the given name.
3001
3002Example matches X (regexp == "::X")
3003 class X;
3004
3005Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3006 namespace foo { namespace bar { class X; } }
3007</pre></td></tr>
3008
3009
Aaron Ballman672dde22016-01-22 23:15:00 +00003010<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 +00003011<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3012
3013Given
3014 namespace n {
3015 namespace {} #1
3016 }
3017namespaceDecl(isAnonymous()) will match #1 but not ::n.
3018</pre></td></tr>
3019
3020
Aaron Ballman672dde22016-01-22 23:15:00 +00003021<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 +00003022<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3023the inline keyword.
3024
3025Given
3026 inline void f();
3027 void g();
3028 namespace n {
3029 inline namespace m {}
3030 }
3031functionDecl(isInline()) will match ::f().
3032namespaceDecl(isInline()) will match n::m.
3033</pre></td></tr>
3034
3035
Aaron Ballman672dde22016-01-22 23:15:00 +00003036<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003037<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3038a specific number of arguments (including absent default arguments).
3039
3040Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3041 void f(int x, int y);
3042 f(0, 0);
3043</pre></td></tr>
3044
3045
Aaron Ballman672dde22016-01-22 23:15:00 +00003046<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 +00003047<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3048
3049objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3050message expression in
3051
3052 UIWebView *webView = ...;
3053 CGRect bodyFrame = webView.frame;
3054 bodyFrame.size.height = self.bodyContentHeight;
3055 webView.frame = bodyFrame;
3056 ^---- matches here
3057</pre></td></tr>
3058
3059
Aaron Ballman672dde22016-01-22 23:15:00 +00003060<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 +00003061<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3062
3063Matches only when the selector of the objCMessageExpr is NULL. This may
3064represent an error condition in the tree!
3065</pre></td></tr>
3066
3067
Aaron Ballman672dde22016-01-22 23:15:00 +00003068<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 +00003069<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3070
3071 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3072 matches the outer message expr in the code below, but NOT the message
3073 invocation for self.bodyView.
3074 [self.bodyView loadHTMLString:html baseURL:NULL];
3075</pre></td></tr>
3076
3077
Aaron Ballman672dde22016-01-22 23:15:00 +00003078<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 +00003079<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3080
3081 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3082 matches self.bodyView in the code below, but NOT the outer message
3083 invocation of "loadHTMLString:baseURL:".
3084 [self.bodyView loadHTMLString:html baseURL:NULL];
3085</pre></td></tr>
3086
3087
Aaron Ballman672dde22016-01-22 23:15:00 +00003088<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003089<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3090a substring matched by the given RegExp.
3091 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3092 invocation for self.bodyView.
3093 [self.bodyView loadHTMLString:html baseURL:NULL];
3094</pre></td></tr>
3095
3096
Aaron Ballman672dde22016-01-22 23:15:00 +00003097<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003098<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3099
3100 matcher = objCMessageExpr(numSelectorArgs(0));
3101 matches self.bodyView in the code below
3102
3103 matcher = objCMessageExpr(numSelectorArgs(2));
3104 matches the invocation of "loadHTMLString:baseURL:" but not that
3105 of self.bodyView
3106 [self.bodyView loadHTMLString:html baseURL:NULL];
3107</pre></td></tr>
3108
3109
Aaron Ballman672dde22016-01-22 23:15:00 +00003110<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 +00003111<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3112
3113Given
3114 class Y { public: void x(); };
3115 void z() { Y* y; y-&gt;x(); }
3116cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3117 matches y-&gt;x()
3118</pre></td></tr>
3119
3120
Aaron Ballman672dde22016-01-22 23:15:00 +00003121<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 +00003122<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3123
3124Matches a node if it equals the node previously bound to ID.
3125
3126Given
3127 class X { int a; int b; };
3128cxxRecordDecl(
3129 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3130 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3131 matches the class X, as a and b have the same type.
3132
3133Note that when multiple matches are involved via forEach* matchers,
3134equalsBoundNodes acts as a filter.
3135For example:
3136compoundStmt(
3137 forEachDescendant(varDecl().bind("d")),
3138 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3139will trigger a match for each combination of variable declaration
3140and reference to that variable declaration within a compound statement.
3141</pre></td></tr>
3142
3143
Aaron Ballman672dde22016-01-22 23:15:00 +00003144<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 +00003145<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3146the node, not hidden within a typedef.
3147
3148Given
3149 typedef const int const_int;
3150 const_int i;
3151 int *const j;
3152 int *volatile k;
3153 int m;
3154varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3155i is const-qualified but the qualifier is not local.
3156</pre></td></tr>
3157
3158
Aaron Ballman672dde22016-01-22 23:15:00 +00003159<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 +00003160<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3161
3162Given
3163 void a(char);
3164 void b(wchar_t);
3165 void c(double);
3166functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3167matches "a(char)", "b(wchar_t)", but not "c(double)".
3168</pre></td></tr>
3169
3170
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003171<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 +00003172<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3173the Objective-C object pointer type, which is different despite being
3174syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003175
3176Given
3177 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003178
3179 @interface Foo
3180 @end
3181 Foo *f;
3182
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003183 int j;
3184varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003185 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003186</pre></td></tr>
3187
3188
Aaron Ballman672dde22016-01-22 23:15:00 +00003189<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 +00003190<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3191include "top-level" const.
3192
3193Given
3194 void a(int);
3195 void b(int const);
3196 void c(const int);
3197 void d(const int*);
3198 void e(int const) {};
3199functionDecl(hasAnyParameter(hasType(isConstQualified())))
3200 matches "void b(int const)", "void c(const int)" and
3201 "void e(int const) {}". It does not match d as there
3202 is no top-level const on the parameter type "const int *".
3203</pre></td></tr>
3204
3205
Aaron Ballman672dde22016-01-22 23:15:00 +00003206<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 +00003207<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3208
3209Given
3210 void a(int);
3211 void b(long);
3212 void c(double);
3213functionDecl(hasAnyParameter(hasType(isInteger())))
3214matches "a(int)", "b(long)", but not "c(double)".
3215</pre></td></tr>
3216
3217
Clement Courbet42517592016-07-12 06:36:00 +00003218<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
3219<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3220
3221Given
3222 void a(int);
3223 void b(unsigned long);
3224 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003225functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003226matches "a(int)", but not "b(unsigned long)" and "c(double)".
3227</pre></td></tr>
3228
3229
3230<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>
3231<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3232
3233Given
3234 void a(int);
3235 void b(unsigned long);
3236 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003237functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003238matches "b(unsigned long)", but not "a(int)" and "c(double)".
3239</pre></td></tr>
3240
3241
Aaron Ballman672dde22016-01-22 23:15:00 +00003242<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 +00003243<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3244include "top-level" volatile.
3245
3246Given
3247 void a(int);
3248 void b(int volatile);
3249 void c(volatile int);
3250 void d(volatile int*);
3251 void e(int volatile) {};
3252functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3253 matches "void b(int volatile)", "void c(volatile int)" and
3254 "void e(int volatile) {}". It does not match d as there
3255 is no top-level volatile on the parameter type "volatile int *".
3256</pre></td></tr>
3257
3258
Aaron Ballman672dde22016-01-22 23:15:00 +00003259<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 +00003260<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3261
3262Example matches C, but not S or U.
3263 struct S {};
3264 class C {};
3265 union U {};
3266</pre></td></tr>
3267
3268
Aaron Ballman672dde22016-01-22 23:15:00 +00003269<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 +00003270<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3271
3272Example matches S, but not C or U.
3273 struct S {};
3274 class C {};
3275 union U {};
3276</pre></td></tr>
3277
3278
Aaron Ballman672dde22016-01-22 23:15:00 +00003279<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 +00003280<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3281
3282Example matches U, but not C or S.
3283 struct S {};
3284 class C {};
3285 union U {};
3286</pre></td></tr>
3287
3288
Aaron Ballman672dde22016-01-22 23:15:00 +00003289<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 +00003290<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3291
3292Matches a node if it equals the node previously bound to ID.
3293
3294Given
3295 class X { int a; int b; };
3296cxxRecordDecl(
3297 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3298 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3299 matches the class X, as a and b have the same type.
3300
3301Note that when multiple matches are involved via forEach* matchers,
3302equalsBoundNodes acts as a filter.
3303For example:
3304compoundStmt(
3305 forEachDescendant(varDecl().bind("d")),
3306 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3307will trigger a match for each combination of variable declaration
3308and reference to that variable declaration within a compound statement.
3309</pre></td></tr>
3310
3311
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003312<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>
3313<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3314
3315Stmt has pointer identity in the AST.
3316</pre></td></tr>
3317
3318
Aaron Ballman672dde22016-01-22 23:15:00 +00003319<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 +00003320<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3321partially matching a given regex.
3322
3323Example matches Y but not X
3324 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3325 #include "ASTMatcher.h"
3326 class X {};
3327ASTMatcher.h:
3328 class Y {};
3329
Aaron Ballman672dde22016-01-22 23:15:00 +00003330Usable 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 +00003331</pre></td></tr>
3332
3333
Aaron Ballman672dde22016-01-22 23:15:00 +00003334<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003335<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3336
3337Example matches X but not Y
3338 (matcher = cxxRecordDecl(isExpansionInMainFile())
3339 #include &lt;Y.h&gt;
3340 class X {};
3341Y.h:
3342 class Y {};
3343
Aaron Ballman672dde22016-01-22 23:15:00 +00003344Usable 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 +00003345</pre></td></tr>
3346
3347
Aaron Ballman672dde22016-01-22 23:15:00 +00003348<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 +00003349<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3350
3351Example matches Y but not X
3352 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3353 #include &lt;SystemHeader.h&gt;
3354 class X {};
3355SystemHeader.h:
3356 class Y {};
3357
Aaron Ballman672dde22016-01-22 23:15:00 +00003358Usable 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 +00003359</pre></td></tr>
3360
3361
Etienne Bergeron3588be72016-05-12 04:20:04 +00003362<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>
3363<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3364
3365Given
3366 int a[42];
3367 int b[2 * 21];
3368 int c[41], d[43];
3369 char *s = "abcd";
3370 wchar_t *ws = L"abcd";
3371 char *w = "a";
3372constantArrayType(hasSize(42))
3373 matches "int a[42]" and "int b[2 * 21]"
3374stringLiteral(hasSize(4))
3375 matches "abcd", L"abcd"
3376</pre></td></tr>
3377
3378
Aaron Ballman672dde22016-01-22 23:15:00 +00003379<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003380<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3381
3382Example matches A, va, fa
3383 class A {};
3384 class B; Doesn't match, as it has no body.
3385 int va;
3386 extern int vb; Doesn't match, as it doesn't define the variable.
3387 void fa() {}
3388 void fb(); Doesn't match, as it has no body.
3389
Aaron Ballman672dde22016-01-22 23:15:00 +00003390Usable 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 +00003391</pre></td></tr>
3392
3393
Aaron Ballman672dde22016-01-22 23:15:00 +00003394<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 +00003395<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3396
3397Note that 'Value' is a string as the template argument's value is
3398an arbitrary precision integer. 'Value' must be euqal to the canonical
3399representation of that integral value in base 10.
3400
3401Given
3402 template&lt;int T&gt; struct A {};
3403 C&lt;42&gt; c;
3404classTemplateSpecializationDecl(
3405 hasAnyTemplateArgument(equalsIntegralValue("42")))
3406 matches the implicit instantiation of C in C&lt;42&gt;.
3407</pre></td></tr>
3408
3409
Aaron Ballman672dde22016-01-22 23:15:00 +00003410<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003411<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3412
3413Given
3414 template&lt;int T&gt; struct A {};
3415 C&lt;42&gt; c;
3416classTemplateSpecializationDecl(
3417 hasAnyTemplateArgument(isIntegral()))
3418 matches the implicit instantiation of C in C&lt;42&gt;
3419 with isIntegral() matching 42.
3420</pre></td></tr>
3421
3422
Aaron Ballman672dde22016-01-22 23:15:00 +00003423<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 +00003424<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3425
3426Given
3427 template&lt;typename T&gt; struct C {};
3428 C&lt;int&gt; c;
3429classTemplateSpecializationDecl(templateArgumentCountIs(1))
3430 matches C&lt;int&gt;.
3431</pre></td></tr>
3432
3433
Aaron Ballman672dde22016-01-22 23:15:00 +00003434<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 +00003435<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3436partially matching a given regex.
3437
3438Example matches Y but not X
3439 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3440 #include "ASTMatcher.h"
3441 class X {};
3442ASTMatcher.h:
3443 class Y {};
3444
Aaron Ballman672dde22016-01-22 23:15:00 +00003445Usable 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 +00003446</pre></td></tr>
3447
3448
Aaron Ballman672dde22016-01-22 23:15:00 +00003449<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 +00003450<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3451
3452Example matches X but not Y
3453 (matcher = cxxRecordDecl(isExpansionInMainFile())
3454 #include &lt;Y.h&gt;
3455 class X {};
3456Y.h:
3457 class Y {};
3458
Aaron Ballman672dde22016-01-22 23:15:00 +00003459Usable 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 +00003460</pre></td></tr>
3461
3462
Aaron Ballman672dde22016-01-22 23:15:00 +00003463<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003464<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3465
3466Example matches Y but not X
3467 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3468 #include &lt;SystemHeader.h&gt;
3469 class X {};
3470SystemHeader.h:
3471 class Y {};
3472
Aaron Ballman672dde22016-01-22 23:15:00 +00003473Usable 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 +00003474</pre></td></tr>
3475
3476
Aaron Ballman672dde22016-01-22 23:15:00 +00003477<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 +00003478<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3479
3480Given
3481 struct S { bool func(); };
3482functionDecl(returns(booleanType()))
3483 matches "bool func();"
3484</pre></td></tr>
3485
3486
Aaron Ballman672dde22016-01-22 23:15:00 +00003487<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 +00003488<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3489
3490Matches a node if it equals the node previously bound to ID.
3491
3492Given
3493 class X { int a; int b; };
3494cxxRecordDecl(
3495 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3496 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3497 matches the class X, as a and b have the same type.
3498
3499Note that when multiple matches are involved via forEach* matchers,
3500equalsBoundNodes acts as a filter.
3501For example:
3502compoundStmt(
3503 forEachDescendant(varDecl().bind("d")),
3504 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3505will trigger a match for each combination of variable declaration
3506and reference to that variable declaration within a compound statement.
3507</pre></td></tr>
3508
3509
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003510<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>
3511<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3512
3513Type has pointer identity in the AST.
3514</pre></td></tr>
3515
3516
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003517<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>
3518<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3519
3520Given
3521 int i;
3522 float f;
3523realFloatingPointType()
3524 matches "float f" but not "int i"
3525</pre></td></tr>
3526
3527
Aaron Ballman672dde22016-01-22 23:15:00 +00003528<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 +00003529<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3530
3531Given
3532 struct S { void func(); };
3533functionDecl(returns(voidType()))
3534 matches "void func();"
3535</pre></td></tr>
3536
3537
Aaron Ballman672dde22016-01-22 23:15:00 +00003538<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003539<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3540
3541Given
3542 int x;
3543 int s = sizeof(x) + alignof(x)
3544unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3545 matches sizeof(x)
3546</pre></td></tr>
3547
3548
Aaron Ballman672dde22016-01-22 23:15:00 +00003549<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003550<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3551unary).
3552
3553Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3554 !(a || b)
3555</pre></td></tr>
3556
3557
Aaron Ballman672dde22016-01-22 23:15:00 +00003558<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003559<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3560
3561Example matches x, but not y, z, or a.
3562(matcher = varDecl(hasAutomaticStorageDuration())
3563void f() {
3564 int x;
3565 static int y;
3566 thread_local int z;
3567}
3568int a;
3569</pre></td></tr>
3570
3571
Aaron Ballman672dde22016-01-22 23:15:00 +00003572<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 +00003573<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3574
3575Example matches y and z (matcher = varDecl(hasGlobalStorage())
3576void f() {
3577 int x;
3578 static int y;
3579}
3580int z;
3581</pre></td></tr>
3582
3583
Aaron Ballman672dde22016-01-22 23:15:00 +00003584<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003585<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3586non-static local variable.
3587
3588Example matches x (matcher = varDecl(hasLocalStorage())
3589void f() {
3590 int x;
3591 static int y;
3592}
3593int z;
3594</pre></td></tr>
3595
3596
Aaron Ballman672dde22016-01-22 23:15:00 +00003597<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 +00003598<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 +00003599It includes the variable declared at namespace scope and those declared
3600with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003601
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003602void f() {
3603 int x;
3604 static int y;
3605 thread_local int z;
3606}
3607int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003608static int b;
3609extern int c;
3610varDecl(hasStaticStorageDuration())
3611 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003612</pre></td></tr>
3613
3614
Aaron Ballman672dde22016-01-22 23:15:00 +00003615<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 +00003616<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3617
3618Example matches z, but not x, z, or a.
3619(matcher = varDecl(hasThreadStorageDuration())
3620void f() {
3621 int x;
3622 static int y;
3623 thread_local int z;
3624}
3625int a;
3626</pre></td></tr>
3627
3628
Aaron Ballman672dde22016-01-22 23:15:00 +00003629<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 +00003630<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3631
3632Given:
3633 constexpr int foo = 42;
3634 constexpr int bar();
3635varDecl(isConstexpr())
3636 matches the declaration of foo.
3637functionDecl(isConstexpr())
3638 matches the declaration of bar.
3639</pre></td></tr>
3640
3641
Aaron Ballman672dde22016-01-22 23:15:00 +00003642<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 +00003643<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3644
3645Example matches A, va, fa
3646 class A {};
3647 class B; Doesn't match, as it has no body.
3648 int va;
3649 extern int vb; Doesn't match, as it doesn't define the variable.
3650 void fa() {}
3651 void fb(); Doesn't match, as it has no body.
3652
Aaron Ballman672dde22016-01-22 23:15:00 +00003653Usable 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 +00003654</pre></td></tr>
3655
3656
Aaron Ballman672dde22016-01-22 23:15:00 +00003657<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 +00003658<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3659a C++ catch block, or an Objective-C statement.
3660
3661Example matches x (matcher = varDecl(isExceptionVariable())
3662void f(int y) {
3663 try {
3664 } catch (int x) {
3665 }
3666}
3667</pre></td></tr>
3668
3669
Aaron Ballman672dde22016-01-22 23:15:00 +00003670<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 +00003671<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3672static member variable template instantiations.
3673
3674Given
3675 template&lt;typename T&gt; void A(T t) { }
3676 template&lt;&gt; void A(int N) { }
3677functionDecl(isExplicitTemplateSpecialization())
3678 matches the specialization A&lt;int&gt;().
3679
Aaron Ballman672dde22016-01-22 23:15:00 +00003680Usable 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 +00003681</pre></td></tr>
3682
3683
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003684<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>
3685<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations.
3686
3687Given:
3688 extern "C" void f() {}
3689 extern "C" { void g() {} }
3690 void h() {}
3691functionDecl(isExternC())
3692 matches the declaration of f and g, but not the declaration h
3693</pre></td></tr>
3694
3695
Haojian Wub3d25462016-09-26 16:01:52 +00003696<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 +00003697<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3698class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003699
3700Given:
3701 static void f() {}
3702 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003703 extern int j;
3704 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003705functionDecl(isStaticStorageClass())
3706 matches the function declaration f.
3707varDecl(isStaticStorageClass())
3708 matches the variable declaration i.
3709</pre></td></tr>
3710
3711
Aaron Ballman672dde22016-01-22 23:15:00 +00003712<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 +00003713<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3714member variable template instantiations.
3715
3716Given
3717 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3718or
3719 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3720cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3721 matches the template instantiation of X&lt;A&gt;.
3722
3723But given
3724 template &lt;typename T&gt; class X {}; class A {};
3725 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3726cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3727 does not match, as X&lt;A&gt; is an explicit template specialization.
3728
Aaron Ballman672dde22016-01-22 23:15:00 +00003729Usable 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 +00003730</pre></td></tr>
3731
3732
Aaron Ballman672dde22016-01-22 23:15:00 +00003733<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 +00003734<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3735template instantiations.
3736
3737Given
3738 template&lt;typename T&gt; void A(T t) { T i; }
3739 A(0);
3740 A(0U);
3741functionDecl(isInstantiated())
3742 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3743</pre></td></tr>
3744
3745
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003746<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>
3747<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3748GNU's __null, C++11's nullptr, or C's NULL macro.
3749
3750Given:
3751 void *v1 = NULL;
3752 void *v2 = nullptr;
3753 void *v3 = __null; GNU extension
3754 char *cp = (char *)0;
3755 int *ip = 0;
3756 int i = 0;
3757expr(nullPointerConstant())
3758 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3759 initializer for i.
3760</pre></td></tr>
3761
3762
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003763<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>
3764<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3765
3766This matcher is only provided as a performance optimization of hasName.
3767 hasAnyName(a, b, c)
3768 is equivalent to, but faster than
3769 anyOf(hasName(a), hasName(b), hasName(c))
3770</pre></td></tr>
3771
3772
Aaron Ballman672dde22016-01-22 23:15:00 +00003773<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 +00003774<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3775
3776Given
3777 int j;
3778 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3779 A(0);
3780 A(0U);
3781declStmt(isInTemplateInstantiation())
3782 matches 'int i;' and 'unsigned i'.
3783unless(stmt(isInTemplateInstantiation()))
3784 will NOT match j += 42; as it's shared between the template definition and
3785 instantiation.
3786</pre></td></tr>
3787
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003788<!--END_NARROWING_MATCHERS -->
3789</table>
3790
3791<!-- ======================================================================= -->
3792<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3793<!-- ======================================================================= -->
3794
3795<p>Traversal matchers specify the relationship to other nodes that are
3796reachable from the current node.</p>
3797
3798<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3799forEachDescendant) which work on all nodes and allow users to write more generic
3800match expressions.</p>
3801
3802<table>
3803<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003804<!-- START_TRAVERSAL_MATCHERS -->
3805
3806<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>
3807<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3808
3809Unlike anyOf, eachOf will generate a match result for each
3810matching submatcher.
3811
3812For example, in:
3813 class A { int a; int b; };
3814The matcher:
3815 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3816 has(fieldDecl(hasName("b")).bind("v"))))
3817will generate two results binding "v", the first of which binds
3818the field declaration of a, the second the field declaration of
3819b.
3820
3821Usable as: Any Matcher
3822</pre></td></tr>
3823
3824
3825<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3826<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3827provided matcher.
3828
3829Example matches X, A, B, C
3830 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3831 class X {}; Matches X, because X::X is a class of name X inside X.
3832 class A { class X {}; };
3833 class B { class C { class X {}; }; };
3834
3835DescendantT must be an AST base type.
3836
3837As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3838each result that matches instead of only on the first one.
3839
3840Note: Recursively combined ForEachDescendant can cause many matches:
3841 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3842 forEachDescendant(cxxRecordDecl())
3843 )))
3844will match 10 times (plus injected class name matches) on:
3845 class A { class B { class C { class D { class E {}; }; }; }; };
3846
3847Usable as: Any Matcher
3848</pre></td></tr>
3849
3850
3851<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3852<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3853provided matcher.
3854
3855Example matches X, Y
3856 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3857 class X {}; Matches X, because X::X is a class of name X inside X.
3858 class Y { class X {}; };
3859 class Z { class Y { class X {}; }; }; Does not match Z.
3860
3861ChildT must be an AST base type.
3862
3863As opposed to 'has', 'forEach' will cause a match for each result that
3864matches instead of only on the first one.
3865
3866Usable as: Any Matcher
3867</pre></td></tr>
3868
3869
3870<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3871<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3872matcher.
3873
3874Given
3875void f() { if (true) { int x = 42; } }
3876void g() { for (;;) { int x = 43; } }
3877expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3878
3879Usable as: Any Matcher
3880</pre></td></tr>
3881
3882
3883<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3884<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3885provided matcher.
3886
3887Example matches X, Y, Z
3888 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3889 class X {}; Matches X, because X::X is a class of name X inside X.
3890 class Y { class X {}; };
3891 class Z { class Y { class X {}; }; };
3892
3893DescendantT must be an AST base type.
3894
3895Usable as: Any Matcher
3896</pre></td></tr>
3897
3898
3899<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3900<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3901provided matcher.
3902
3903Example matches X, Y
3904 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3905 class X {}; Matches X, because X::X is a class of name X inside X.
3906 class Y { class X {}; };
3907 class Z { class Y { class X {}; }; }; Does not match Z.
3908
3909ChildT must be an AST base type.
3910
3911Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00003912Note that has is direct matcher, so it also matches things like implicit
3913casts and paren casts. If you are matching with expr then you should
3914probably consider using ignoringParenImpCasts like:
3915has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003916</pre></td></tr>
3917
3918
3919<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3920<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3921matcher.
3922
3923Given
3924void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3925compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3926
3927Usable as: Any Matcher
3928</pre></td></tr>
3929
3930
Etienne Bergeron5500f952016-05-30 15:25:25 +00003931<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>
3932<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3933switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003934
3935Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3936 if (true) {}
3937</pre></td></tr>
3938
3939
3940<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>
3941<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3942(binary or ternary).
3943
3944Example matches b
3945 condition ? a : b
3946 condition ?: b
3947</pre></td></tr>
3948
3949
3950<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>
3951<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3952
3953Example 1 (conditional ternary operator): matches a
3954 condition ? a : b
3955
3956Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3957 condition ?: b
3958</pre></td></tr>
3959
3960
Manuel Klimeka37e1102016-12-01 15:45:06 +00003961<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>
3962<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 +00003963matches the given matcher.
3964
3965The associated declaration is:
3966- for type nodes, the declaration of the underlying type
3967- for CallExpr, the declaration of the callee
3968- for MemberExpr, the declaration of the referenced member
3969- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00003970- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003971
3972Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3973function. e.g. various subtypes of clang::Type and various expressions.
3974
Manuel Klimeka37e1102016-12-01 15:45:06 +00003975Usable 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;,
3976 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;,
3977 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;,
3978 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;,
3979 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;,
3980 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;,
3981 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00003982</pre></td></tr>
3983
3984
Aaron Ballman672dde22016-01-22 23:15:00 +00003985<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 +00003986<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3987
3988Given
3989 int i[5];
3990 void f() { i[1] = 42; }
3991arraySubscriptExpression(hasBase(implicitCastExpr(
3992 hasSourceExpression(declRefExpr()))))
3993 matches i[1] with the declRefExpr() matching i
3994</pre></td></tr>
3995
3996
Aaron Ballman672dde22016-01-22 23:15:00 +00003997<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 +00003998<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3999
4000Given
4001 int i[5];
4002 void f() { i[1] = 42; }
4003arraySubscriptExpression(hasIndex(integerLiteral()))
4004 matches i[1] with the integerLiteral() matching 1
4005</pre></td></tr>
4006
4007
Aaron Ballman672dde22016-01-22 23:15:00 +00004008<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 +00004009<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4010
4011Example matches a (matcher = binaryOperator(hasLHS()))
4012 a || b
4013</pre></td></tr>
4014
4015
Aaron Ballman672dde22016-01-22 23:15:00 +00004016<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 +00004017<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4018
4019Example matches b (matcher = binaryOperator(hasRHS()))
4020 a || b
4021</pre></td></tr>
4022
4023
Aaron Ballman672dde22016-01-22 23:15:00 +00004024<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 +00004025<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4026type.
4027
4028Given
4029 struct A {};
4030 A a[7];
4031 int b[7];
4032arrayType(hasElementType(builtinType()))
4033 matches "int b[7]"
4034
Aaron Ballman672dde22016-01-22 23:15:00 +00004035Usable 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 +00004036</pre></td></tr>
4037
4038
Aaron Ballman672dde22016-01-22 23:15:00 +00004039<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 +00004040<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4041type.
4042
4043Given
4044 struct A {};
4045 A a[7];
4046 int b[7];
4047arrayType(hasElementType(builtinType()))
4048 matches "int b[7]"
4049
Aaron Ballman672dde22016-01-22 23:15:00 +00004050Usable 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 +00004051</pre></td></tr>
4052
4053
Aaron Ballman672dde22016-01-22 23:15:00 +00004054<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 +00004055<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4056
4057Given
4058 _Atomic(int) i;
4059 _Atomic(float) f;
4060atomicType(hasValueType(isInteger()))
4061 matches "_Atomic(int) i"
4062
Aaron Ballman672dde22016-01-22 23:15:00 +00004063Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004064</pre></td></tr>
4065
4066
Aaron Ballman672dde22016-01-22 23:15:00 +00004067<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 +00004068<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4069
4070Given
4071 _Atomic(int) i;
4072 _Atomic(float) f;
4073atomicType(hasValueType(isInteger()))
4074 matches "_Atomic(int) i"
4075
Aaron Ballman672dde22016-01-22 23:15:00 +00004076Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004077</pre></td></tr>
4078
4079
Aaron Ballman672dde22016-01-22 23:15:00 +00004080<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 +00004081<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4082
4083Note: There is no TypeLoc for the deduced type and thus no
4084getDeducedLoc() matcher.
4085
4086Given
4087 auto a = 1;
4088 auto b = 2.0;
4089autoType(hasDeducedType(isInteger()))
4090 matches "auto a"
4091
Aaron Ballman672dde22016-01-22 23:15:00 +00004092Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004093</pre></td></tr>
4094
4095
Aaron Ballman672dde22016-01-22 23:15:00 +00004096<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 +00004097<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4098binary operator matches.
4099</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('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 +00004103<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4104
4105Example matches a (matcher = binaryOperator(hasLHS()))
4106 a || b
4107</pre></td></tr>
4108
4109
Aaron Ballman672dde22016-01-22 23:15:00 +00004110<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004111<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4112
4113Example matches b (matcher = binaryOperator(hasRHS()))
4114 a || b
4115</pre></td></tr>
4116
4117
Aaron Ballman672dde22016-01-22 23:15:00 +00004118<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 +00004119<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4120pointee matches a given matcher.
4121
4122Given
4123 int *a;
4124 int const *b;
4125 float const *f;
4126pointerType(pointee(isConstQualified(), isInteger()))
4127 matches "int const *b"
4128
Aaron Ballman672dde22016-01-22 23:15:00 +00004129Usable 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;,
4130 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 +00004131</pre></td></tr>
4132
4133
Aaron Ballman672dde22016-01-22 23:15:00 +00004134<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 +00004135<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4136pointee matches a given matcher.
4137
4138Given
4139 int *a;
4140 int const *b;
4141 float const *f;
4142pointerType(pointee(isConstQualified(), isInteger()))
4143 matches "int const *b"
4144
Aaron Ballman672dde22016-01-22 23:15:00 +00004145Usable 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;,
4146 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 +00004147</pre></td></tr>
4148
4149
Aaron Ballman672dde22016-01-22 23:15:00 +00004150<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 +00004151<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4152
4153Given
4154 void f(int i);
4155 int y;
4156 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004157callExpr(
4158 forEachArgumentWithParam(
4159 declRefExpr(to(varDecl(hasName("y")))),
4160 parmVarDecl(hasType(isInteger()))
4161))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004162 matches f(y);
4163with declRefExpr(...)
4164 matching int y
4165and parmVarDecl(...)
4166 matching int i
4167</pre></td></tr>
4168
4169
Aaron Ballman672dde22016-01-22 23:15:00 +00004170<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 +00004171<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4172expression.
4173
4174Given
4175 void x(int, int, int) { int y; x(1, y, 42); }
4176callExpr(hasAnyArgument(declRefExpr()))
4177 matches x(1, y, 42)
4178with hasAnyArgument(...)
4179 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004180</pre></td></tr>
4181
4182
Aaron Ballman672dde22016-01-22 23:15:00 +00004183<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004184<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4185call expression.
4186
4187Example matches y in x(y)
4188 (matcher = callExpr(hasArgument(0, declRefExpr())))
4189 void x(int) { int y; x(y); }
4190</pre></td></tr>
4191
4192
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004193<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>
4194<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 +00004195matches the given matcher.
4196
4197The associated declaration is:
4198- for type nodes, the declaration of the underlying type
4199- for CallExpr, the declaration of the callee
4200- for MemberExpr, the declaration of the referenced member
4201- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004202- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004203
4204Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4205function. e.g. various subtypes of clang::Type and various expressions.
4206
Manuel Klimeka37e1102016-12-01 15:45:06 +00004207Usable 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;,
4208 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;,
4209 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;,
4210 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;,
4211 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;,
4212 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;,
4213 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004214</pre></td></tr>
4215
4216
Aaron Ballman672dde22016-01-22 23:15:00 +00004217<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 +00004218<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4219
4220Given
4221 class A { A() : i(42), j(42) {} int i; int j; };
4222cxxConstructorDecl(forEachConstructorInitializer(
4223 forField(decl().bind("x"))
4224))
4225 will trigger two matches, binding for 'i' and 'j' respectively.
4226</pre></td></tr>
4227
4228
Aaron Ballman672dde22016-01-22 23:15:00 +00004229<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 +00004230<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4231
4232Given
4233 struct Foo {
4234 Foo() : foo_(1) { }
4235 int foo_;
4236 };
4237cxxRecordDecl(has(cxxConstructorDecl(
4238 hasAnyConstructorInitializer(anything())
4239)))
4240 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4241</pre></td></tr>
4242
4243
Aaron Ballman672dde22016-01-22 23:15:00 +00004244<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 +00004245<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4246
4247Given
4248 struct Foo {
4249 Foo() : foo_(1) { }
4250 int foo_;
4251 };
4252cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4253 forField(hasName("foo_"))))))
4254 matches Foo
4255with forField matching foo_
4256</pre></td></tr>
4257
4258
Aaron Ballman672dde22016-01-22 23:15:00 +00004259<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 +00004260<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4261
4262Given
4263 struct Foo {
4264 Foo() : foo_(1) { }
4265 int foo_;
4266 };
4267cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4268 withInitializer(integerLiteral(equals(1)))))))
4269 matches Foo
4270with withInitializer matching (1)
4271</pre></td></tr>
4272
4273
Aaron Ballman672dde22016-01-22 23:15:00 +00004274<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 +00004275<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4276definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004277
4278Given
4279 for (;;) {}
4280hasBody(compoundStmt())
4281 matches 'for (;;) {}'
4282with compoundStmt()
4283 matching '{}'
4284</pre></td></tr>
4285
4286
Aaron Ballman672dde22016-01-22 23:15:00 +00004287<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004288<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4289
4290Example:
4291 forStmt(hasLoopVariable(anything()))
4292matches 'int x' in
4293 for (int x : a) { }
4294</pre></td></tr>
4295
4296
Aaron Ballman672dde22016-01-22 23:15:00 +00004297<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 +00004298<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4299
4300Example:
4301 forStmt(hasRangeInit(anything()))
4302matches 'a' in
4303 for (int x : a) { }
4304</pre></td></tr>
4305
4306
Aaron Ballman672dde22016-01-22 23:15:00 +00004307<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 +00004308<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4309
4310
Aaron Ballman672dde22016-01-22 23:15:00 +00004311<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 +00004312<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4313
4314Example matches y.x()
4315 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4316 class Y { public: void x(); };
4317 void z() { Y y; y.x(); }",
4318
4319FIXME: Overload to allow directly matching types?
4320</pre></td></tr>
4321
4322
Aaron Ballman672dde22016-01-22 23:15:00 +00004323<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 +00004324<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4325</pre></td></tr>
4326
4327
Aaron Ballman672dde22016-01-22 23:15:00 +00004328<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004329<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4330matcher, or is a pointer to a type that matches the InnerMatcher.
4331</pre></td></tr>
4332
4333
Clement Courbet6ecaec82016-07-05 07:49:31 +00004334<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('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 +00004335<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 +00004336produce multiple matches.
4337
4338Given
4339 class A { virtual void f(); };
4340 class B : public A { void f(); };
4341 class C : public B { void f(); };
4342cxxMethodDecl(ofClass(hasName("C")),
4343 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4344 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4345 that B::f is not overridden by C::f).
4346
4347The check can produce multiple matches in case of multiple inheritance, e.g.
4348 class A1 { virtual void f(); };
4349 class A2 { virtual void f(); };
4350 class C : public A1, public A2 { void f(); };
4351cxxMethodDecl(ofClass(hasName("C")),
4352 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4353 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4354 once with "b" binding "A2::f" and "d" binding "C::f".
4355</pre></td></tr>
4356
4357
Aaron Ballman672dde22016-01-22 23:15:00 +00004358<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 +00004359<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4360belongs to.
4361
4362FIXME: Generalize this for other kinds of declarations.
4363FIXME: What other kind of declarations would we need to generalize
4364this to?
4365
4366Example matches A() in the last line
4367 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4368 ofClass(hasName("A"))))))
4369 class A {
4370 public:
4371 A();
4372 };
4373 A a = A();
4374</pre></td></tr>
4375
4376
Manuel Klimeka37e1102016-12-01 15:45:06 +00004377<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>
4378<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 +00004379matches the given matcher.
4380
4381The associated declaration is:
4382- for type nodes, the declaration of the underlying type
4383- for CallExpr, the declaration of the callee
4384- for MemberExpr, the declaration of the referenced member
4385- for CXXConstructExpr, the declaration of the constructor
4386- for CXXNewExpr, the declaration of the operator new
4387
4388Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4389function. e.g. various subtypes of clang::Type and various expressions.
4390
Manuel Klimeka37e1102016-12-01 15:45:06 +00004391Usable 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;,
4392 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;,
4393 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;,
4394 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;,
4395 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;,
4396 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;,
4397 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004398</pre></td></tr>
4399
4400
Aaron Ballman672dde22016-01-22 23:15:00 +00004401<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 +00004402<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4403
4404Given:
4405 class A { void func(); };
4406 class B { void member(); };
4407
4408cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4409A but not B.
4410</pre></td></tr>
4411
4412
Aaron Ballman672dde22016-01-22 23:15:00 +00004413<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 +00004414<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4415a class matching Base.
4416
4417Note that a class is not considered to be derived from itself.
4418
4419Example matches Y, Z, C (Base == hasName("X"))
4420 class X;
4421 class Y : public X {}; directly derived
4422 class Z : public Y {}; indirectly derived
4423 typedef X A;
4424 typedef A B;
4425 class C : public B {}; derived from a typedef of X
4426
4427In the following example, Bar matches isDerivedFrom(hasName("X")):
4428 class Foo;
4429 typedef Foo X;
4430 class Bar : public Foo {}; derived from a type that X is a typedef of
4431</pre></td></tr>
4432
4433
Aaron Ballman672dde22016-01-22 23:15:00 +00004434<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 +00004435<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4436match Base.
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_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 +00004441<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4442given matcher.
4443
4444Example matches y.x() (matcher = callExpr(callee(
4445 cxxMethodDecl(hasName("x")))))
4446 class Y { public: void x(); };
4447 void z() { Y y; y.x(); }
4448</pre></td></tr>
4449
4450
Aaron Ballman672dde22016-01-22 23:15:00 +00004451<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 +00004452<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4453
4454Given
4455 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4456 void f() { f(); }
4457callExpr(callee(expr()))
4458 matches this-&gt;x(), x(), y.x(), f()
4459with callee(...)
4460 matching this-&gt;x, x, y.x, f respectively
4461
Aaron Ballman672dde22016-01-22 23:15:00 +00004462Note: 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 +00004463because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004464internal::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 +00004465implemented in terms of implicit casts.
4466</pre></td></tr>
4467
4468
Aaron Ballman672dde22016-01-22 23:15:00 +00004469<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 +00004470<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4471
4472Given
4473 void f(int i);
4474 int y;
4475 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004476callExpr(
4477 forEachArgumentWithParam(
4478 declRefExpr(to(varDecl(hasName("y")))),
4479 parmVarDecl(hasType(isInteger()))
4480))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004481 matches f(y);
4482with declRefExpr(...)
4483 matching int y
4484and parmVarDecl(...)
4485 matching int i
4486</pre></td></tr>
4487
4488
Aaron Ballman672dde22016-01-22 23:15:00 +00004489<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 +00004490<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4491expression.
4492
4493Given
4494 void x(int, int, int) { int y; x(1, y, 42); }
4495callExpr(hasAnyArgument(declRefExpr()))
4496 matches x(1, y, 42)
4497with hasAnyArgument(...)
4498 matching y
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004499</pre></td></tr>
4500
4501
Aaron Ballman672dde22016-01-22 23:15:00 +00004502<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 +00004503<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4504call expression.
4505
4506Example matches y in x(y)
4507 (matcher = callExpr(hasArgument(0, declRefExpr())))
4508 void x(int) { int y; x(y); }
4509</pre></td></tr>
4510
4511
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004512<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>
4513<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 +00004514matches the given matcher.
4515
4516The associated declaration is:
4517- for type nodes, the declaration of the underlying type
4518- for CallExpr, the declaration of the callee
4519- for MemberExpr, the declaration of the referenced member
4520- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004521- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004522
4523Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4524function. e.g. various subtypes of clang::Type and various expressions.
4525
Manuel Klimeka37e1102016-12-01 15:45:06 +00004526Usable 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;,
4527 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;,
4528 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;,
4529 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;,
4530 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;,
4531 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;,
4532 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004533</pre></td></tr>
4534
4535
Aaron Ballman672dde22016-01-22 23:15:00 +00004536<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 +00004537<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4538extension, matches the constant given in the statement.
4539
4540Given
4541 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4542caseStmt(hasCaseConstant(integerLiteral()))
4543 matches "case 1:"
4544</pre></td></tr>
4545
4546
Aaron Ballman672dde22016-01-22 23:15:00 +00004547<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 +00004548<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004549
4550
Aaron Ballman672dde22016-01-22 23:15:00 +00004551<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 +00004552<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4553functionDecl that have at least one TemplateArgument matching the given
4554InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004555
4556Given
4557 template&lt;typename T&gt; class A {};
4558 template&lt;&gt; class A&lt;double&gt; {};
4559 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004560
Haojian Wu99e39a72016-07-29 17:30:13 +00004561 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004562 void func() { f&lt;int&gt;(); };
4563
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004564classTemplateSpecializationDecl(hasAnyTemplateArgument(
4565 refersToType(asString("int"))))
4566 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004567
4568functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4569 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004570</pre></td></tr>
4571
4572
Manuel Klimek696e5052017-08-02 13:04:44 +00004573<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>
4574<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4575
4576Given
4577 tempalate&lt;typename T&gt; class A {};
4578 typedef A&lt;int&gt; B;
4579classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4580 matches 'B' with classTemplateDecl() matching the class template
4581 declaration of 'A'.
4582</pre></td></tr>
4583
4584
Aaron Ballman672dde22016-01-22 23:15:00 +00004585<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 +00004586<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4587functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004588
4589Given
4590 template&lt;typename T, typename U&gt; class A {};
4591 A&lt;bool, int&gt; b;
4592 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004593
Haojian Wu99e39a72016-07-29 17:30:13 +00004594 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004595 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004596classTemplateSpecializationDecl(hasTemplateArgument(
4597 1, refersToType(asString("int"))))
4598 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004599
4600functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4601 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004602</pre></td></tr>
4603
4604
Aaron Ballman672dde22016-01-22 23:15:00 +00004605<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 +00004606<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4607type.
4608
4609Given
4610 struct A {};
4611 A a[7];
4612 int b[7];
4613arrayType(hasElementType(builtinType()))
4614 matches "int b[7]"
4615
Aaron Ballman672dde22016-01-22 23:15:00 +00004616Usable 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 +00004617</pre></td></tr>
4618
4619
Aaron Ballman672dde22016-01-22 23:15:00 +00004620<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004621<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4622type.
4623
4624Given
4625 struct A {};
4626 A a[7];
4627 int b[7];
4628arrayType(hasElementType(builtinType()))
4629 matches "int b[7]"
4630
Aaron Ballman672dde22016-01-22 23:15:00 +00004631Usable 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 +00004632</pre></td></tr>
4633
4634
Aaron Ballman672dde22016-01-22 23:15:00 +00004635<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004636<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 +00004637a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004638
4639Given
4640 { {}; 1+2; }
4641hasAnySubstatement(compoundStmt())
4642 matches '{ {}; 1+2; }'
4643with compoundStmt()
4644 matching '{}'
4645</pre></td></tr>
4646
4647
Aaron Ballman672dde22016-01-22 23:15:00 +00004648<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 +00004649<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4650</pre></td></tr>
4651
4652
Manuel Klimeka37e1102016-12-01 15:45:06 +00004653<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>
4654<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 +00004655matches the given matcher.
4656
4657The associated declaration is:
4658- for type nodes, the declaration of the underlying type
4659- for CallExpr, the declaration of the callee
4660- for MemberExpr, the declaration of the referenced member
4661- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004662- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004663
4664Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4665function. e.g. various subtypes of clang::Type and various expressions.
4666
Manuel Klimeka37e1102016-12-01 15:45:06 +00004667Usable 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;,
4668 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;,
4669 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;,
4670 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;,
4671 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;,
4672 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;,
4673 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004674</pre></td></tr>
4675
4676
Aaron Ballman672dde22016-01-22 23:15:00 +00004677<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 +00004678<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4679specific using shadow declaration.
4680
4681Given
4682 namespace a { void f() {} }
4683 using a::f;
4684 void g() {
4685 f(); Matches this ..
4686 a::f(); .. but not this.
4687 }
4688declRefExpr(throughUsingDecl(anything()))
4689 matches f()
4690</pre></td></tr>
4691
4692
Aaron Ballman672dde22016-01-22 23:15:00 +00004693<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 +00004694<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4695specified matcher.
4696
4697Example matches x in if(x)
4698 (matcher = declRefExpr(to(varDecl(hasName("x")))))
4699 bool x;
4700 if (x) {}
4701</pre></td></tr>
4702
4703
Aaron Ballman672dde22016-01-22 23:15:00 +00004704<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 +00004705<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4706
4707Note that this does not work for global declarations because the AST
4708breaks up multiple-declaration DeclStmt's into multiple single-declaration
4709DeclStmt's.
4710Example: Given non-global declarations
4711 int a, b = 0;
4712 int c;
4713 int d = 2, e;
4714declStmt(containsDeclaration(
4715 0, varDecl(hasInitializer(anything()))))
4716 matches only 'int d = 2, e;', and
4717declStmt(containsDeclaration(1, varDecl()))
4718 matches 'int a, b = 0' as well as 'int d = 2, e;'
4719 but 'int c;' is not matched.
4720</pre></td></tr>
4721
4722
Aaron Ballman672dde22016-01-22 23:15:00 +00004723<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 +00004724<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4725
4726Given
4727 int a, b;
4728 int c;
4729declStmt(hasSingleDecl(anything()))
4730 matches 'int c;' but not 'int a, b;'.
4731</pre></td></tr>
4732
4733
Aaron Ballman672dde22016-01-22 23:15:00 +00004734<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 +00004735<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4736the inner matcher.
4737
4738Given
4739 int x;
4740declaratorDecl(hasTypeLoc(loc(asString("int"))))
4741 matches int x
4742</pre></td></tr>
4743
4744
Aaron Ballman672dde22016-01-22 23:15:00 +00004745<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 +00004746<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4747Decl, matches InnerMatcher.
4748
4749Given
4750 namespace N {
4751 namespace M {
4752 class D {};
4753 }
4754 }
4755
4756cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4757declaration of class D.
4758</pre></td></tr>
4759
4760
Aaron Ballman672dde22016-01-22 23:15:00 +00004761<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 +00004762<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4763definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004764
4765Given
4766 for (;;) {}
4767hasBody(compoundStmt())
4768 matches 'for (;;) {}'
4769with compoundStmt()
4770 matching '{}'
4771</pre></td></tr>
4772
4773
Aaron Ballman672dde22016-01-22 23:15:00 +00004774<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004775<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 +00004776switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004777
4778Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4779 if (true) {}
4780</pre></td></tr>
4781
4782
Aaron Ballman672dde22016-01-22 23:15:00 +00004783<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 +00004784<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4785matches InnerMatcher if the qualifier exists.
4786
4787Given
4788 namespace N {
4789 namespace M {
4790 class D {};
4791 }
4792 }
4793 N::M::D d;
4794
4795elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4796matches the type of the variable declaration of d.
4797</pre></td></tr>
4798
4799
Aaron Ballman672dde22016-01-22 23:15:00 +00004800<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004801<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4802
4803Given
4804 namespace N {
4805 namespace M {
4806 class D {};
4807 }
4808 }
4809 N::M::D d;
4810
4811elaboratedType(namesType(recordType(
4812hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4813declaration of d.
4814</pre></td></tr>
4815
4816
Manuel Klimeka37e1102016-12-01 15:45:06 +00004817<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>
4818<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 +00004819matches the given matcher.
4820
4821The associated declaration is:
4822- for type nodes, the declaration of the underlying type
4823- for CallExpr, the declaration of the callee
4824- for MemberExpr, the declaration of the referenced member
4825- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004826- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004827
4828Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4829function. e.g. various subtypes of clang::Type and various expressions.
4830
Manuel Klimeka37e1102016-12-01 15:45:06 +00004831Usable 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;,
4832 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;,
4833 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;,
4834 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;,
4835 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;,
4836 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;,
4837 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004838</pre></td></tr>
4839
4840
Aaron Ballman672dde22016-01-22 23:15:00 +00004841<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004842<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4843
4844(Note: Clang's AST refers to other conversions as "casts" too, and calls
4845actual casts "explicit" casts.)
4846</pre></td></tr>
4847
4848
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004849<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>
4850<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 +00004851declaration's type.
4852
4853In case of a value declaration (for example a variable declaration),
4854this resolves one layer of indirection. For example, in the value
4855declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4856X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4857declaration of x.
4858
4859Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4860 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4861 class X {};
4862 void y(X &amp;x) { x; X z; }
4863
Aaron Ballman672dde22016-01-22 23:15:00 +00004864Usable 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 +00004865</pre></td></tr>
4866
4867
Aaron Ballman672dde22016-01-22 23:15:00 +00004868<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('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 +00004869<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4870matcher.
4871
4872Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4873 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004874 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004875 class X {};
4876 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004877 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004878</pre></td></tr>
4879
4880
Aaron Ballman672dde22016-01-22 23:15:00 +00004881<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 +00004882<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4883are stripped off.
4884
4885Parentheses and explicit casts are not discarded.
4886Given
4887 int arr[5];
4888 int a = 0;
4889 char b = 0;
4890 const int c = a;
4891 int *d = arr;
4892 long e = (long) 0l;
4893The matchers
4894 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4895 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4896would match the declarations for a, b, c, and d, but not e.
4897While
4898 varDecl(hasInitializer(integerLiteral()))
4899 varDecl(hasInitializer(declRefExpr()))
4900only match the declarations for b, c, and d.
4901</pre></td></tr>
4902
4903
Cong Liu8a02efb2016-06-24 09:38:03 +00004904<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>
4905<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4906nodes are stripped off.
4907
4908Parentheses and explicit casts are not discarded.
4909Given
4910 class C {};
4911 C a = C();
4912 C b;
4913 C c = b;
4914The matchers
4915 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4916would match the declarations for a, b, and c.
4917While
4918 varDecl(hasInitializer(cxxConstructExpr()))
4919only match the declarations for b and c.
4920</pre></td></tr>
4921
4922
Aaron Ballman672dde22016-01-22 23:15:00 +00004923<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 +00004924<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4925casts are stripped off.
4926
4927Implicit and non-C Style casts are also discarded.
4928Given
4929 int a = 0;
4930 char b = (0);
4931 void* c = reinterpret_cast&lt;char*&gt;(0);
4932 char d = char(0);
4933The matcher
4934 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4935would match the declarations for a, b, c, and d.
4936while
4937 varDecl(hasInitializer(integerLiteral()))
4938only match the declaration for a.
4939</pre></td></tr>
4940
4941
Aaron Ballman672dde22016-01-22 23:15:00 +00004942<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 +00004943<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4944parentheses are stripped off.
4945
4946Explicit casts are not discarded.
4947Given
4948 int arr[5];
4949 int a = 0;
4950 char b = (0);
4951 const int c = a;
4952 int *d = (arr);
4953 long e = ((long) 0l);
4954The matchers
4955 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4956 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4957would match the declarations for a, b, c, and d, but not e.
4958while
4959 varDecl(hasInitializer(integerLiteral()))
4960 varDecl(hasInitializer(declRefExpr()))
4961would only match the declaration for a.
4962</pre></td></tr>
4963
4964
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00004965<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>
4966<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4967
4968Given
4969 class C {
4970 int a = 2;
4971 int b = 3;
4972 int c;
4973 };
4974fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4975 matches 'int a;' but not 'int b;'.
4976fieldDecl(hasInClassInitializer(anything()))
4977 matches 'int a;' and 'int b;' but not 'int c;'.
4978</pre></td></tr>
4979
4980
Aaron Ballman672dde22016-01-22 23:15:00 +00004981<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 +00004982<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4983definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004984
4985Given
4986 for (;;) {}
4987hasBody(compoundStmt())
4988 matches 'for (;;) {}'
4989with compoundStmt()
4990 matching '{}'
4991</pre></td></tr>
4992
4993
Aaron Ballman672dde22016-01-22 23:15:00 +00004994<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('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 +00004995<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 +00004996switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004997
4998Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4999 if (true) {}
5000</pre></td></tr>
5001
5002
Aaron Ballman672dde22016-01-22 23:15:00 +00005003<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 +00005004<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5005
5006Example:
5007 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5008matches '++x' in
5009 for (x; x &lt; N; ++x) { }
5010</pre></td></tr>
5011
5012
Aaron Ballman672dde22016-01-22 23:15:00 +00005013<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 +00005014<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5015
5016Example:
5017 forStmt(hasLoopInit(declStmt()))
5018matches 'int x = 0' in
5019 for (int x = 0; x &lt; N; ++x) { }
5020</pre></td></tr>
5021
5022
Aaron Ballman672dde22016-01-22 23:15:00 +00005023<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('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 +00005024<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5025
5026Does not match the 'this' parameter of a method.
5027
5028Given
5029 class X { void f(int x, int y, int z) {} };
5030cxxMethodDecl(hasAnyParameter(hasName("y")))
5031 matches f(int x, int y, int z) {}
5032with hasAnyParameter(...)
5033 matching int y
5034</pre></td></tr>
5035
5036
Haojian Wud898b092016-07-29 13:57:27 +00005037<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>
5038<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5039functionDecl that have at least one TemplateArgument matching the given
5040InnerMatcher.
5041
5042Given
5043 template&lt;typename T&gt; class A {};
5044 template&lt;&gt; class A&lt;double&gt; {};
5045 A&lt;int&gt; a;
5046
Haojian Wu99e39a72016-07-29 17:30:13 +00005047 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005048 void func() { f&lt;int&gt;(); };
5049
5050classTemplateSpecializationDecl(hasAnyTemplateArgument(
5051 refersToType(asString("int"))))
5052 matches the specialization A&lt;int&gt;
5053
5054functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5055 matches the specialization f&lt;int&gt;
5056</pre></td></tr>
5057
5058
Aaron Ballman672dde22016-01-22 23:15:00 +00005059<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 +00005060<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5061definition that has a given body.
5062
5063Given
5064 for (;;) {}
5065hasBody(compoundStmt())
5066 matches 'for (;;) {}'
5067with compoundStmt()
5068 matching '{}'
5069</pre></td></tr>
5070
5071
Aaron Ballman672dde22016-01-22 23:15:00 +00005072<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 +00005073<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5074
5075Given
5076 class X { void f(int x) {} };
5077cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5078 matches f(int x) {}
5079with hasParameter(...)
5080 matching int x
5081</pre></td></tr>
5082
5083
Haojian Wud898b092016-07-29 13:57:27 +00005084<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>
5085<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5086functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5087
5088Given
5089 template&lt;typename T, typename U&gt; class A {};
5090 A&lt;bool, int&gt; b;
5091 A&lt;int, bool&gt; c;
5092
Haojian Wu99e39a72016-07-29 17:30:13 +00005093 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005094 void func() { f&lt;int&gt;(); };
5095classTemplateSpecializationDecl(hasTemplateArgument(
5096 1, refersToType(asString("int"))))
5097 matches the specialization A&lt;bool, int&gt;
5098
5099functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5100 matches the specialization f&lt;int&gt;
5101</pre></td></tr>
5102
5103
Aaron Ballman672dde22016-01-22 23:15:00 +00005104<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 +00005105<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5106
5107Given:
5108 class X { int f() { return 1; } };
5109cxxMethodDecl(returns(asString("int")))
5110 matches int f() { return 1; }
5111</pre></td></tr>
5112
5113
Aaron Ballman672dde22016-01-22 23:15:00 +00005114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('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 +00005115<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 +00005116switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005117
5118Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5119 if (true) {}
5120</pre></td></tr>
5121
5122
Aaron Ballman672dde22016-01-22 23:15:00 +00005123<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 +00005124<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5125
5126Given
5127 if (A* a = GetAPointer()) {}
5128hasConditionVariableStatement(...)
5129 matches 'A* a = GetAPointer()'.
5130</pre></td></tr>
5131
5132
Aaron Ballman672dde22016-01-22 23:15:00 +00005133<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('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 +00005134<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5135
5136Examples matches the if statement
5137 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5138 if (false) false; else true;
5139</pre></td></tr>
5140
5141
Aaron Ballman672dde22016-01-22 23:15:00 +00005142<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005143<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5144
5145Examples matches the if statement
5146 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5147 if (false) true; else false;
5148</pre></td></tr>
5149
5150
Aaron Ballman672dde22016-01-22 23:15:00 +00005151<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 +00005152<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5153matcher.
5154
5155FIXME: Unit test this matcher
5156</pre></td></tr>
5157
5158
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005159<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>
5160<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5161(if expression have it).
5162</pre></td></tr>
5163
5164
Manuel Klimeka37e1102016-12-01 15:45:06 +00005165<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 +00005166<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5167matches the given matcher.
5168
5169The associated declaration is:
5170- for type nodes, the declaration of the underlying type
5171- for CallExpr, the declaration of the callee
5172- for MemberExpr, the declaration of the referenced member
5173- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005174- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005175
5176Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5177function. e.g. various subtypes of clang::Type and various expressions.
5178
Manuel Klimeka37e1102016-12-01 15:45:06 +00005179Usable 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;,
5180 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;,
5181 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;,
5182 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;,
5183 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;,
5184 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;,
5185 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5186</pre></td></tr>
5187
5188
5189<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>
5190<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5191matches the given matcher.
5192
5193The associated declaration is:
5194- for type nodes, the declaration of the underlying type
5195- for CallExpr, the declaration of the callee
5196- for MemberExpr, the declaration of the referenced member
5197- for CXXConstructExpr, the declaration of the constructor
5198- for CXXNewExpr, the declaration of the operator new
5199
5200Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5201function. e.g. various subtypes of clang::Type and various expressions.
5202
5203Usable 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;,
5204 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;,
5205 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;,
5206 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;,
5207 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;,
5208 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;,
5209 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005210</pre></td></tr>
5211
5212
Aaron Ballman672dde22016-01-22 23:15:00 +00005213<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 +00005214<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5215matches the given matcher.
5216
5217The associated declaration is:
5218- for type nodes, the declaration of the underlying type
5219- for CallExpr, the declaration of the callee
5220- for MemberExpr, the declaration of the referenced member
5221- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005222- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005223
5224Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5225function. e.g. various subtypes of clang::Type and various expressions.
5226
Manuel Klimeka37e1102016-12-01 15:45:06 +00005227Usable 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;,
5228 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;,
5229 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;,
5230 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;,
5231 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;,
5232 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;,
5233 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005234</pre></td></tr>
5235
5236
Aaron Ballman672dde22016-01-22 23:15:00 +00005237<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005238<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5239matched by a given matcher.
5240
5241Given
5242 struct X { int m; };
5243 void f(X x) { x.m; m; }
5244memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5245 matches "x.m" and "m"
5246with hasObjectExpression(...)
5247 matching "x" and the implicit object expression of "m" which has type X*.
5248</pre></td></tr>
5249
5250
Aaron Ballman672dde22016-01-22 23:15:00 +00005251<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 +00005252<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5253given matcher.
5254
5255Given
5256 struct { int first, second; } first, second;
5257 int i(second.first);
5258 int j(first.second);
5259memberExpr(member(hasName("first")))
5260 matches second.first
5261 but not first.second (because the member name there is "second").
5262</pre></td></tr>
5263
5264
Aaron Ballman672dde22016-01-22 23:15:00 +00005265<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 +00005266<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5267pointee matches a given matcher.
5268
5269Given
5270 int *a;
5271 int const *b;
5272 float const *f;
5273pointerType(pointee(isConstQualified(), isInteger()))
5274 matches "int const *b"
5275
Aaron Ballman672dde22016-01-22 23:15:00 +00005276Usable 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;,
5277 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 +00005278</pre></td></tr>
5279
5280
Aaron Ballman672dde22016-01-22 23:15:00 +00005281<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 +00005282<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5283pointee matches a given matcher.
5284
5285Given
5286 int *a;
5287 int const *b;
5288 float const *f;
5289pointerType(pointee(isConstQualified(), isInteger()))
5290 matches "int const *b"
5291
Aaron Ballman672dde22016-01-22 23:15:00 +00005292Usable 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;,
5293 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 +00005294</pre></td></tr>
5295
5296
Martin Bohme8cef2c22016-08-09 15:07:52 +00005297<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>
5298<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5299matcher.
5300
5301Given
5302 namespace N { template&lt;class T&gt; void f(T t); }
5303 template &lt;class T&gt; void g() { using N::f; f(T()); }
5304unresolvedLookupExpr(hasAnyDeclaration(
5305 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5306 matches the use of f in g() .
5307</pre></td></tr>
5308
5309
Aaron Ballman672dde22016-01-22 23:15:00 +00005310<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 +00005311<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5312
5313Given
5314 struct A { struct B { struct C {}; }; };
5315 A::B::C c;
5316nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5317 matches "A::"
5318</pre></td></tr>
5319
5320
Aaron Ballman672dde22016-01-22 23:15:00 +00005321<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005322<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5323given TypeLoc.
5324
5325Given
5326 struct A { struct B { struct C {}; }; };
5327 A::B::C c;
5328nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5329 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5330 matches "A::"
5331</pre></td></tr>
5332
5333
Aaron Ballman672dde22016-01-22 23:15:00 +00005334<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 +00005335<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5336
5337Given
5338 struct A { struct B { struct C {}; }; };
5339 A::B::C c;
5340nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5341 matches "A::"
5342</pre></td></tr>
5343
5344
Aaron Ballman672dde22016-01-22 23:15:00 +00005345<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005346<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5347given namespace matcher.
5348
5349Given
5350 namespace ns { struct A {}; }
5351 ns::A a;
5352nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5353 matches "ns::"
5354</pre></td></tr>
5355
5356
Aaron Ballman672dde22016-01-22 23:15:00 +00005357<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005358<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5359given QualType matcher without qualifiers.
5360
5361Given
5362 struct A { struct B { struct C {}; }; };
5363 A::B::C c;
5364nestedNameSpecifier(specifiesType(
5365 hasDeclaration(cxxRecordDecl(hasName("A")))
5366))
5367 matches "A::"
5368</pre></td></tr>
5369
5370
Aaron Ballman672dde22016-01-22 23:15:00 +00005371<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 +00005372<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5373call expression.
5374
5375Example matches y in x(y)
5376 (matcher = callExpr(hasArgument(0, declRefExpr())))
5377 void x(int) { int y; x(y); }
5378</pre></td></tr>
5379
5380
Aaron Ballman672dde22016-01-22 23:15:00 +00005381<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 +00005382<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5383
5384Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005385matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005386matches the [webView ...] message invocation.
5387 NSString *webViewJavaScript = ...
5388 UIWebView *webView = ...
5389 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5390</pre></td></tr>
5391
5392
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005393<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>
5394<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5395
5396
Martin Bohme8cef2c22016-08-09 15:07:52 +00005397<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>
5398<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5399overloads matches the given matcher.
5400
5401Given
5402 template &lt;typename T&gt; void foo(T);
5403 template &lt;typename T&gt; void bar(T);
5404 template &lt;typename T&gt; void baz(T t) {
5405 foo(t);
5406 bar(t);
5407 }
5408unresolvedLookupExpr(hasAnyDeclaration(
5409 functionTemplateDecl(hasName("foo"))))
5410 matches foo in foo(t); but not bar in bar(t);
5411</pre></td></tr>
5412
5413
Aaron Ballman672dde22016-01-22 23:15:00 +00005414<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 +00005415<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5416
5417Given
5418 int (*ptr_to_array)[4];
5419 int (*ptr_to_func)(int);
5420
5421varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5422ptr_to_func but not ptr_to_array.
5423
Aaron Ballman672dde22016-01-22 23:15:00 +00005424Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005425</pre></td></tr>
5426
5427
Aaron Ballman672dde22016-01-22 23:15:00 +00005428<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 +00005429<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5430pointee matches a given matcher.
5431
5432Given
5433 int *a;
5434 int const *b;
5435 float const *f;
5436pointerType(pointee(isConstQualified(), isInteger()))
5437 matches "int const *b"
5438
Aaron Ballman672dde22016-01-22 23:15:00 +00005439Usable 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;,
5440 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 +00005441</pre></td></tr>
5442
5443
Aaron Ballman672dde22016-01-22 23:15:00 +00005444<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 +00005445<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5446pointee matches a given matcher.
5447
5448Given
5449 int *a;
5450 int const *b;
5451 float const *f;
5452pointerType(pointee(isConstQualified(), isInteger()))
5453 matches "int const *b"
5454
Aaron Ballman672dde22016-01-22 23:15:00 +00005455Usable 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;,
5456 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 +00005457</pre></td></tr>
5458
5459
Aaron Ballman672dde22016-01-22 23:15:00 +00005460<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 +00005461<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5462
5463Given:
5464 typedef int &amp;int_ref;
5465 int a;
5466 int_ref b = a;
5467
5468varDecl(hasType(qualType(referenceType()))))) will not match the
5469declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5470</pre></td></tr>
5471
5472
Aaron Ballman672dde22016-01-22 23:15:00 +00005473<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 +00005474<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5475matches the given matcher.
5476
5477The associated declaration is:
5478- for type nodes, the declaration of the underlying type
5479- for CallExpr, the declaration of the callee
5480- for MemberExpr, the declaration of the referenced member
5481- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005482- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005483
5484Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5485function. e.g. various subtypes of clang::Type and various expressions.
5486
Manuel Klimeka37e1102016-12-01 15:45:06 +00005487Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5488 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5489 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5490 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5491 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5492 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5493 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005494</pre></td></tr>
5495
5496
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00005497<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>
5498<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5499
5500Given
5501 void (*fp)(void);
5502The matcher
5503 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5504would match the declaration for fp.
5505</pre></td></tr>
5506
5507
Aaron Ballman672dde22016-01-22 23:15:00 +00005508<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 +00005509<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5510</pre></td></tr>
5511
5512
Aaron Ballman672dde22016-01-22 23:15:00 +00005513<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 +00005514<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5515matches the specified matcher.
5516
5517Example matches y-&gt;x()
5518 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5519 cxxRecordDecl(hasName("Y")))))))
5520 class Y { public: void x(); };
5521 void z() { Y *y; y-&gt;x(); }
5522</pre></td></tr>
5523
5524
Aaron Ballman672dde22016-01-22 23:15:00 +00005525<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005526<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5527</pre></td></tr>
5528
5529
Aaron Ballman672dde22016-01-22 23:15:00 +00005530<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 +00005531<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5532type matches the specified matcher.
5533
5534Example matches X &amp;x and const X &amp;y
5535 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5536 class X {
5537 void a(X b) {
5538 X &amp;x = b;
5539 const X &amp;y = b;
5540 }
5541 };
5542</pre></td></tr>
5543
5544
Aaron Ballman672dde22016-01-22 23:15:00 +00005545<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 +00005546<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5547matches the given matcher.
5548
5549The associated declaration is:
5550- for type nodes, the declaration of the underlying type
5551- for CallExpr, the declaration of the callee
5552- for MemberExpr, the declaration of the referenced member
5553- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005554- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005555
5556Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5557function. e.g. various subtypes of clang::Type and various expressions.
5558
Manuel Klimeka37e1102016-12-01 15:45:06 +00005559Usable 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;,
5560 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;,
5561 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;,
5562 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;,
5563 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;,
5564 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;,
5565 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005566</pre></td></tr>
5567
5568
Aaron Ballman672dde22016-01-22 23:15:00 +00005569<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 +00005570<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5571pointee matches a given matcher.
5572
5573Given
5574 int *a;
5575 int const *b;
5576 float const *f;
5577pointerType(pointee(isConstQualified(), isInteger()))
5578 matches "int const *b"
5579
Aaron Ballman672dde22016-01-22 23:15:00 +00005580Usable 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;,
5581 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 +00005582</pre></td></tr>
5583
5584
Aaron Ballman672dde22016-01-22 23:15:00 +00005585<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005586<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5587pointee matches a given matcher.
5588
5589Given
5590 int *a;
5591 int const *b;
5592 float const *f;
5593pointerType(pointee(isConstQualified(), isInteger()))
5594 matches "int const *b"
5595
Aaron Ballman672dde22016-01-22 23:15:00 +00005596Usable 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;,
5597 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 +00005598</pre></td></tr>
5599
5600
Alexander Kornienko976921d2016-03-22 11:03:03 +00005601<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>
5602<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5603
5604Given
5605 return a + b;
5606hasReturnValue(binaryOperator())
5607 matches 'return a + b'
5608with binaryOperator()
5609 matching 'a + b'
5610</pre></td></tr>
5611
5612
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005613<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>
5614<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5615a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5616
5617Given
5618 { {}; 1+2; }
5619hasAnySubstatement(compoundStmt())
5620 matches '{ {}; 1+2; }'
5621with compoundStmt()
5622 matching '{}'
5623</pre></td></tr>
5624
5625
Aaron Ballman672dde22016-01-22 23:15:00 +00005626<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 +00005627<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5628alignof.
5629</pre></td></tr>
5630
5631
Gabor Horvath1b3f8db2016-05-04 11:59:39 +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('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 +00005633<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 +00005634
5635Given:
5636F&amp; operator=(const F&amp; o) {
5637 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5638 return *this;
5639}
5640returnStmt(forFunction(hasName("operator=")))
5641 matches 'return *this'
5642 but does match 'return &gt; 0'
5643</pre></td></tr>
5644
5645
Aaron Ballman672dde22016-01-22 23:15:00 +00005646<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 +00005647<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5648sizeof.
5649</pre></td></tr>
5650
5651
Malcolm Parsons77f039b2016-12-08 11:46:22 +00005652<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>
5653<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5654type that matches the provided matcher.
5655
5656Given
5657 template &lt;typename T&gt;
5658 double F(T t);
5659 int i;
5660 double j = F(i);
5661
5662substTemplateTypeParmType(hasReplacementType(type())) matches int
5663</pre></td></tr>
5664
5665
Aaron Ballman672dde22016-01-22 23:15:00 +00005666<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 +00005667<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5668statement. This matcher may produce multiple matches.
5669
5670Given
5671 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5672switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5673 matches four times, with "c" binding each of "case 1:", "case 2:",
5674"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5675"switch (1)", "switch (2)" and "switch (2)".
5676</pre></td></tr>
5677
5678
Etienne Bergeron5500f952016-05-30 15:25:25 +00005679<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>
5680<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5681switch statement or conditional operator.
5682
5683Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5684 if (true) {}
5685</pre></td></tr>
5686
5687
Aaron Ballman672dde22016-01-22 23:15:00 +00005688<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 +00005689<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5690matches the given matcher.
5691
5692The associated declaration is:
5693- for type nodes, the declaration of the underlying type
5694- for CallExpr, the declaration of the callee
5695- for MemberExpr, the declaration of the referenced member
5696- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005697- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005698
5699Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5700function. e.g. various subtypes of clang::Type and various expressions.
5701
Manuel Klimeka37e1102016-12-01 15:45:06 +00005702Usable 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;,
5703 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;,
5704 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;,
5705 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;,
5706 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;,
5707 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;,
5708 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005709</pre></td></tr>
5710
5711
Aaron Ballman672dde22016-01-22 23:15:00 +00005712<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 +00005713<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5714
5715Given
5716 template&lt;typename T&gt; struct A {};
5717 struct B { B* next; };
5718 A&lt;&amp;B::next&gt; a;
5719templateSpecializationType(hasAnyTemplateArgument(
5720 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5721 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5722 B::next
5723</pre></td></tr>
5724
5725
Aaron Ballman672dde22016-01-22 23:15:00 +00005726<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 +00005727<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5728declaration.
5729
5730Given
5731 template&lt;typename T&gt; struct A {};
5732 struct B { B* next; };
5733 A&lt;&amp;B::next&gt; a;
5734classTemplateSpecializationDecl(hasAnyTemplateArgument(
5735 refersToDeclaration(fieldDecl(hasName("next"))))
5736 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5737 B::next
5738</pre></td></tr>
5739
5740
Aaron Ballman672dde22016-01-22 23:15:00 +00005741<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 +00005742<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5743
5744Given
5745 template&lt;int T&gt; struct A {};
5746 C&lt;42&gt; c;
5747classTemplateSpecializationDecl(
5748 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5749 matches the implicit instantiation of C in C&lt;42&gt;.
5750</pre></td></tr>
5751
5752
Haojian Wub33b02e2016-07-29 15:45:11 +00005753<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>
5754<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5755
5756Given
5757 template&lt;template &lt;typename&gt; class S&gt; class X {};
5758 template&lt;typename T&gt; class Y {};"
5759 X&lt;Y&gt; xi;
5760classTemplateSpecializationDecl(hasAnyTemplateArgument(
5761 refersToTemplate(templateName())))
5762 matches the specialization X&lt;Y&gt;
5763</pre></td></tr>
5764
5765
Aaron Ballman672dde22016-01-22 23:15:00 +00005766<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 +00005767<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5768
5769Given
5770 struct X {};
5771 template&lt;typename T&gt; struct A {};
5772 A&lt;X&gt; a;
5773classTemplateSpecializationDecl(hasAnyTemplateArgument(
5774 refersToType(class(hasName("X")))))
5775 matches the specialization A&lt;X&gt;
5776</pre></td></tr>
5777
5778
Aaron Ballman672dde22016-01-22 23:15:00 +00005779<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005780<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5781functionDecl that have at least one TemplateArgument matching the given
5782InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005783
5784Given
5785 template&lt;typename T&gt; class A {};
5786 template&lt;&gt; class A&lt;double&gt; {};
5787 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005788
Haojian Wu99e39a72016-07-29 17:30:13 +00005789 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005790 void func() { f&lt;int&gt;(); };
5791
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005792classTemplateSpecializationDecl(hasAnyTemplateArgument(
5793 refersToType(asString("int"))))
5794 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005795
5796functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5797 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005798</pre></td></tr>
5799
5800
Aaron Ballman672dde22016-01-22 23:15:00 +00005801<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005802<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5803matches the given matcher.
5804
5805The associated declaration is:
5806- for type nodes, the declaration of the underlying type
5807- for CallExpr, the declaration of the callee
5808- for MemberExpr, the declaration of the referenced member
5809- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005810- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005811
5812Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5813function. e.g. various subtypes of clang::Type and various expressions.
5814
Manuel Klimeka37e1102016-12-01 15:45:06 +00005815Usable 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;,
5816 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;,
5817 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;,
5818 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;,
5819 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;,
5820 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;,
5821 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005822</pre></td></tr>
5823
5824
Aaron Ballman672dde22016-01-22 23:15:00 +00005825<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 +00005826<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5827functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005828
5829Given
5830 template&lt;typename T, typename U&gt; class A {};
5831 A&lt;bool, int&gt; b;
5832 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005833
Haojian Wu99e39a72016-07-29 17:30:13 +00005834 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005835 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005836classTemplateSpecializationDecl(hasTemplateArgument(
5837 1, refersToType(asString("int"))))
5838 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005839
5840functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5841 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005842</pre></td></tr>
5843
5844
Aaron Ballman672dde22016-01-22 23:15:00 +00005845<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 +00005846<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5847matches the given matcher.
5848
5849The associated declaration is:
5850- for type nodes, the declaration of the underlying type
5851- for CallExpr, the declaration of the callee
5852- for MemberExpr, the declaration of the referenced member
5853- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005854- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005855
5856Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5857function. e.g. various subtypes of clang::Type and various expressions.
5858
Manuel Klimeka37e1102016-12-01 15:45:06 +00005859Usable 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;,
5860 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;,
5861 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;,
5862 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;,
5863 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;,
5864 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;,
5865 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005866</pre></td></tr>
5867
5868
5869<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>
5870<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5871
5872Generates results for each match.
5873
5874For example, in:
5875 class A { class B {}; class C {}; };
5876The matcher:
5877 cxxRecordDecl(hasName("::A"),
5878 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5879will generate results for A, B and C.
5880
5881Usable as: Any Matcher
5882</pre></td></tr>
5883
5884
Aaron Ballman66eb58a2016-04-14 16:05:45 +00005885<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 +00005886<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5887matcher.
5888
5889Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5890 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5891 and U (matcher = typedefDecl(hasType(asString("int")))
5892 class X {};
5893 void y(X &amp;x) { x; X z; }
5894 typedef int U;
5895</pre></td></tr>
5896
5897
Aaron Ballman672dde22016-01-22 23:15:00 +00005898<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005899<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5900matches the given matcher.
5901
5902The associated declaration is:
5903- for type nodes, the declaration of the underlying type
5904- for CallExpr, the declaration of the callee
5905- for MemberExpr, the declaration of the referenced member
5906- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005907- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005908
5909Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5910function. e.g. various subtypes of clang::Type and various expressions.
5911
Manuel Klimeka37e1102016-12-01 15:45:06 +00005912Usable 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;,
5913 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;,
5914 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;,
5915 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;,
5916 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;,
5917 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;,
5918 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5919</pre></td></tr>
5920
5921
5922<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>
5923<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5924type of the matched node.
5925
5926For example, in:
5927 class A {};
5928 using B = A;
5929The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5930both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005931</pre></td></tr>
5932
5933
Aaron Ballman672dde22016-01-22 23:15:00 +00005934<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 +00005935<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5936
5937Given
5938 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5939unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5940 matches sizeof(a) and alignof(c)
5941</pre></td></tr>
5942
5943
Aaron Ballman672dde22016-01-22 23:15:00 +00005944<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005945<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5946
5947Example matches true (matcher = hasUnaryOperand(
5948 cxxBoolLiteral(equals(true))))
5949 !true
5950</pre></td></tr>
5951
5952
Aaron Ballman672dde22016-01-22 23:15:00 +00005953<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 +00005954<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5955matches the given matcher.
5956
5957The associated declaration is:
5958- for type nodes, the declaration of the underlying type
5959- for CallExpr, the declaration of the callee
5960- for MemberExpr, the declaration of the referenced member
5961- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005962- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005963
5964Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5965function. e.g. various subtypes of clang::Type and various expressions.
5966
Manuel Klimeka37e1102016-12-01 15:45:06 +00005967Usable 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;,
5968 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;,
5969 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;,
5970 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;,
5971 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;,
5972 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;,
5973 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005974</pre></td></tr>
5975
5976
Aaron Ballman672dde22016-01-22 23:15:00 +00005977<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 +00005978<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5979
5980Given
5981 namespace X { void b(); }
5982 using X::b;
5983usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5984 matches using X::b </pre></td></tr>
5985
5986
Aaron Ballman672dde22016-01-22 23:15:00 +00005987<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 +00005988<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5989matched by the given matcher.
5990
5991Given
5992 namespace X { int a; void b(); }
5993 using X::a;
5994 using X::b;
5995usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5996 matches using X::b but not using X::a </pre></td></tr>
5997
5998
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005999<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>
6000<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 +00006001declaration's type.
6002
6003In case of a value declaration (for example a variable declaration),
6004this resolves one layer of indirection. For example, in the value
6005declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6006X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6007declaration of x.
6008
6009Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6010 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6011 class X {};
6012 void y(X &amp;x) { x; X z; }
6013
Aaron Ballman672dde22016-01-22 23:15:00 +00006014Usable 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 +00006015</pre></td></tr>
6016
6017
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006018<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>
6019<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 +00006020matcher.
6021
6022Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6023 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006024 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006025 class X {};
6026 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006027 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006028</pre></td></tr>
6029
6030
Aaron Ballman672dde22016-01-22 23:15:00 +00006031<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 +00006032<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6033that matches the given matcher.
6034
6035Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6036 bool y() { return true; }
6037 bool x = y();
6038</pre></td></tr>
6039
6040
Aaron Ballman672dde22016-01-22 23:15:00 +00006041<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 +00006042<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6043expression.
6044
6045Given
6046 void f(int b) {
6047 int a[b];
6048 }
6049variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6050 varDecl(hasName("b")))))))
6051 matches "int a[b]"
6052</pre></td></tr>
6053
6054
Aaron Ballman672dde22016-01-22 23:15:00 +00006055<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00006056<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6057definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006058
6059Given
6060 for (;;) {}
6061hasBody(compoundStmt())
6062 matches 'for (;;) {}'
6063with compoundStmt()
6064 matching '{}'
6065</pre></td></tr>
6066
6067
Aaron Ballman672dde22016-01-22 23:15:00 +00006068<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00006069<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 +00006070switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006071
6072Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6073 if (true) {}
6074</pre></td></tr>
6075
6076
Aaron Ballman672dde22016-01-22 23:15:00 +00006077<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 +00006078<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6079NestedNameSpecifier-matcher matches.
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_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 +00006084<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6085QualType-matcher matches.
6086</pre></td></tr>
6087
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006088<!--END_TRAVERSAL_MATCHERS -->
6089</table>
6090
6091</div>
6092</body>
6093</html>
6094
6095