blob: cf32a5ce4a0f21810fcc764c43fd4c3c2c028fec [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
George Karpenkovb4c0cbd2018-05-16 22:47:03 +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('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
128<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
129
130Example matches the declaration of the nameless block printing an input
131integer.
132
133 myFunc(^(int p) {
134 printf("%d", p);
135 })
136</pre></td></tr>
137
138
Aaron Ballman672dde22016-01-22 23:15:00 +0000139<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 +0000140<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
141
142Example matches Z
143 template&lt;class T&gt; class Z {};
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('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 +0000148<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
149
150Given
151 template&lt;typename T&gt; class A {};
152 template&lt;&gt; class A&lt;double&gt; {};
153 A&lt;int&gt; a;
154classTemplateSpecializationDecl()
155 matches the specializations A&lt;int&gt; and A&lt;double&gt;
156</pre></td></tr>
157
158
Aaron Ballman672dde22016-01-22 23:15:00 +0000159<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 +0000160<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
161
162Example matches Foo::Foo() and Foo::Foo(int)
163 class Foo {
164 public:
165 Foo();
166 Foo(int);
167 int DoSomething();
168 };
169</pre></td></tr>
170
171
Aaron Ballman672dde22016-01-22 23:15:00 +0000172<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 +0000173<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
174
175Example matches the operator.
176 class X { operator int() const; };
177</pre></td></tr>
178
179
Aaron Ballman672dde22016-01-22 23:15:00 +0000180<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 +0000181<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
182
183Example matches Foo::~Foo()
184 class Foo {
185 public:
186 virtual ~Foo();
187 };
188</pre></td></tr>
189
190
Aaron Ballman672dde22016-01-22 23:15:00 +0000191<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 +0000192<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
193
194Example matches y
195 class X { void y(); };
196</pre></td></tr>
197
198
Aaron Ballman672dde22016-01-22 23:15:00 +0000199<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 +0000200<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
201
202Example matches X, Z
203 class X;
204 template&lt;class T&gt; class Z {};
205</pre></td></tr>
206
207
Aaron Ballman672dde22016-01-22 23:15:00 +0000208<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 +0000209<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
210
211Examples matches X, C, and the friend declaration inside C;
212 void X();
213 class C {
214 friend X;
215 };
216</pre></td></tr>
217
218
Aaron Ballman672dde22016-01-22 23:15:00 +0000219<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 +0000220<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
221and non-type template parameter declarations).
222
223Given
224 class X { int y; };
225declaratorDecl()
226 matches int y.
227</pre></td></tr>
228
229
Aaron Ballman672dde22016-01-22 23:15:00 +0000230<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 +0000231<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
232
233Example matches A, B, C
234 enum X {
235 A, B, C
236 };
237</pre></td></tr>
238
239
Aaron Ballman672dde22016-01-22 23:15:00 +0000240<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 +0000241<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
242
243Example matches X
244 enum X {
245 A, B, C
246 };
247</pre></td></tr>
248
249
Aaron Ballman672dde22016-01-22 23:15:00 +0000250<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 +0000251<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
252
253Given
254 class X { int m; };
255fieldDecl()
256 matches 'm'.
257</pre></td></tr>
258
259
Aaron Ballman672dde22016-01-22 23:15:00 +0000260<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 +0000261<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
262
263Given
264 class X { friend void foo(); };
265friendDecl()
266 matches 'friend void foo()'.
267</pre></td></tr>
268
269
Aaron Ballman672dde22016-01-22 23:15:00 +0000270<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 +0000271<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
272
273Example matches f
274 void f();
275</pre></td></tr>
276
277
Aaron Ballman672dde22016-01-22 23:15:00 +0000278<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 +0000279<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
280
281Example matches f
282 template&lt;class T&gt; void f(T t) {}
283</pre></td></tr>
284
285
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000286<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>
287<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
288
289Given
290 goto FOO;
291 FOO: bar();
292labelDecl()
293 matches 'FOO:'
294</pre></td></tr>
295
296
Aaron Ballman672dde22016-01-22 23:15:00 +0000297<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 +0000298<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
299
300Given
301 extern "C" {}
302linkageSpecDecl()
303 matches "extern "C" {}"
304</pre></td></tr>
305
306
Aaron Ballman672dde22016-01-22 23:15:00 +0000307<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 +0000308<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
309
310Example matches X, S, the anonymous union type, i, and U;
311 typedef int X;
312 struct S {
313 union {
314 int i;
315 } U;
316 };
317</pre></td></tr>
318
319
Aaron Ballman672dde22016-01-22 23:15:00 +0000320<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 +0000321<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
322
323Given
324 namespace test {}
325 namespace alias = ::test;
326namespaceAliasDecl()
327 matches "namespace alias" but not "namespace test"
328</pre></td></tr>
329
330
Aaron Ballman672dde22016-01-22 23:15:00 +0000331<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 +0000332<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
333
334Given
335 namespace {}
336 namespace test {}
337namespaceDecl()
338 matches "namespace {}" and "namespace test {}"
339</pre></td></tr>
340
341
Aaron Ballman672dde22016-01-22 23:15:00 +0000342<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 +0000343<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
344
345Given
346 template &lt;typename T, int N&gt; struct C {};
347nonTypeTemplateParmDecl()
348 matches 'N', but not 'T'.
349</pre></td></tr>
350
351
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000352<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>
353<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
354
355Example matches Foo (Additions)
356 @interface Foo (Additions)
357 @end
358</pre></td></tr>
359
360
Dave Lee55540a02017-10-26 15:53:37 +0000361<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
362<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
363
364Example matches Foo (Additions)
365 @implementation Foo (Additions)
366 @end
367</pre></td></tr>
368
369
Dave Leee6d362c2017-09-10 21:00:15 +0000370<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>
371<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
372
373Example matches Foo
374 @implementation Foo
375 @end
376</pre></td></tr>
377
378
Aaron Ballman672dde22016-01-22 23:15:00 +0000379<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 +0000380<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
381
382Example matches Foo
383 @interface Foo
384 @end
385</pre></td></tr>
386
387
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000388<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>
389<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
390
391Example matches _enabled
392 @implementation Foo {
393 BOOL _enabled;
394 }
395 @end
396</pre></td></tr>
397
398
399<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>
400<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
401
402Example matches both declaration and definition of -[Foo method]
403 @interface Foo
404 - (void)method;
405 @end
406
407 @implementation Foo
408 - (void)method {}
409 @end
410</pre></td></tr>
411
412
413<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>
414<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
415
416Example matches enabled
417 @interface Foo
418 @property BOOL enabled;
419 @end
420</pre></td></tr>
421
422
423<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>
424<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
425
426Example matches FooDelegate
427 @protocol FooDelegate
428 @end
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('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 +0000433<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
434
435Given
436 void f(int x);
437parmVarDecl()
438 matches int x.
439</pre></td></tr>
440
441
Aaron Ballman672dde22016-01-22 23:15:00 +0000442<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 +0000443<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
444
445Example matches X, Z, U, and S
446 class X;
447 template&lt;class T&gt; class Z {};
448 struct S {};
449 union U {};
450</pre></td></tr>
451
452
Aaron Ballman672dde22016-01-22 23:15:00 +0000453<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 +0000454<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
455
456Example:
457 staticAssertExpr()
458matches
459 static_assert(sizeof(S) == sizeof(int))
460in
461 struct S {
462 int x;
463 };
464 static_assert(sizeof(S) == sizeof(int));
465</pre></td></tr>
466
467
Aaron Ballman672dde22016-01-22 23:15:00 +0000468<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 +0000469<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
470
471Given
472 template &lt;typename T, int N&gt; struct C {};
473templateTypeParmDecl()
474 matches 'T', but not 'N'.
475</pre></td></tr>
476
477
Aaron Ballman672dde22016-01-22 23:15:00 +0000478<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 +0000479<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
480
481Given
482 int X;
483 namespace NS {
484 int Y;
485 } namespace NS
486decl(hasDeclContext(translationUnitDecl()))
487 matches "int X", but not "int Y".
488</pre></td></tr>
489
490
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000491<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>
492<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
493
494Given
495 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000496 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000497typeAliasDecl()
498 matches "using Y = int", but not "typedef int X"
499</pre></td></tr>
500
501
Eric Liu285f8042017-03-28 12:56:47 +0000502<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>
503<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
504
505typeAliasTemplateDecl() matches
506 template &lt;typename T&gt;
507 using Y = X&lt;T&gt;;
508</pre></td></tr>
509
510
Aaron Ballman672dde22016-01-22 23:15:00 +0000511<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 +0000512<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
513
514Given
515 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000516 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000517typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000518 matches "typedef int X", but not "using Y = int"
519</pre></td></tr>
520
521
522<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>
523<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
524
525Given
526 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000527 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000528typedefNameDecl()
529 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000530</pre></td></tr>
531
532
Aaron Ballman672dde22016-01-22 23:15:00 +0000533<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 +0000534<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
535typename.
536
537Given
538 template &lt;typename T&gt;
539 struct Base { typedef T Foo; };
540
541 template&lt;typename T&gt;
542 struct S : private Base&lt;T&gt; {
543 using typename Base&lt;T&gt;::Foo;
544 };
545unresolvedUsingTypenameDecl()
546 matches using Base&lt;T&gt;::Foo </pre></td></tr>
547
548
Aaron Ballman672dde22016-01-22 23:15:00 +0000549<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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 +0000550<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
551
552Given
553 template&lt;typename X&gt;
554 class C : private X {
555 using X::x;
556 };
557unresolvedUsingValueDecl()
558 matches using X::x </pre></td></tr>
559
560
Aaron Ballman672dde22016-01-22 23:15:00 +0000561<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 +0000562<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
563
564Given
565 namespace X { int x; }
566 using X::x;
567usingDecl()
568 matches using X::x </pre></td></tr>
569
570
Aaron Ballman672dde22016-01-22 23:15:00 +0000571<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +0000572<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
573
574Given
575 namespace X { int x; }
576 using namespace X;
577usingDirectiveDecl()
578 matches using namespace X </pre></td></tr>
579
580
Aaron Ballman672dde22016-01-22 23:15:00 +0000581<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 +0000582<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
583
584Example matches A, B, C and F
585 enum X { A, B, C };
586 void F();
587</pre></td></tr>
588
589
Aaron Ballman672dde22016-01-22 23:15:00 +0000590<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 +0000591<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
592
593Note: this does not match declarations of member variables, which are
594"field" declarations in Clang parlance.
595
596Example matches a
597 int a;
598</pre></td></tr>
599
600
Aaron Ballman672dde22016-01-22 23:15:00 +0000601<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 +0000602<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
603</pre></td></tr>
604
605
Aaron Ballman672dde22016-01-22 23:15:00 +0000606<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 +0000607<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
608
609Given
610 namespace ns {
611 struct A { static void f(); };
612 void A::f() {}
613 void g() { A::f(); }
614 }
615 ns::A a;
616nestedNameSpecifier()
617 matches "ns::" and both "A::"
618</pre></td></tr>
619
620
Aaron Ballman672dde22016-01-22 23:15:00 +0000621<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 +0000622<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
623</pre></td></tr>
624
625
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000626<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
627<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
628
629Given
630 FOO: bar();
631 void *ptr = &amp;&amp;FOO;
632 goto *bar;
633addrLabelExpr()
634 matches '&amp;&amp;FOO'
635</pre></td></tr>
636
637
Aaron Ballman672dde22016-01-22 23:15:00 +0000638<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 +0000639<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
640
641Given
642 int i = a[1];
643arraySubscriptExpr()
644 matches "a[1]"
645</pre></td></tr>
646
647
Aaron Ballman672dde22016-01-22 23:15:00 +0000648<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 +0000649<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
650
651 int i = 100;
652 __asm("mov al, 2");
653asmStmt()
654 matches '__asm("mov al, 2")'
655</pre></td></tr>
656
657
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000658<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>
659<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
660Example matches __atomic_load_n(ptr, 1)
661 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
662</pre></td></tr>
663
664
George Karpenkovba02bc52018-07-06 21:36:04 +0000665<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
666<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
667
668Given
669 @autoreleasepool {
670 int x = 0;
671 }
672autoreleasePoolStmt(stmt()) matches the declaration of "x"
673inside the autorelease pool.
674</pre></td></tr>
675
676
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000677<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>
678<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
679
680Example matches a ?: b
681 (a ?: b) + 42;
682</pre></td></tr>
683
684
Aaron Ballman672dde22016-01-22 23:15:00 +0000685<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 +0000686<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
687
688Example matches a || b
689 !(a || b)
690</pre></td></tr>
691
692
Aaron Ballman672dde22016-01-22 23:15:00 +0000693<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 +0000694<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
695
696Given
697 while (true) { break; }
698breakStmt()
699 matches 'break'
700</pre></td></tr>
701
702
Aaron Ballman672dde22016-01-22 23:15:00 +0000703<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 +0000704<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
705
Artem Dergachevded92a92016-11-11 22:34:53 +0000706Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000707 int i = (int) 2.2f;
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('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 +0000712<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
713
714Example matches x.y() and y()
715 X x;
716 x.y();
717 y();
718</pre></td></tr>
719
720
Aaron Ballman672dde22016-01-22 23:15:00 +0000721<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 +0000722<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
723
724Given
725 switch(a) { case 42: break; default: break; }
726caseStmt()
Fangrui Song55942ab2018-01-22 22:34:15 +0000727 matches 'case 42:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000728</pre></td></tr>
729
730
Aaron Ballman672dde22016-01-22 23:15:00 +0000731<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000732<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
733
734Example: castExpr() matches each of the following:
735 (int) 3;
736 const_cast&lt;Expr *&gt;(SubExpr);
737 char c = 0;
738but does not match
739 int i = (0);
740 int k = 0;
741</pre></td></tr>
742
743
Aaron Ballman672dde22016-01-22 23:15:00 +0000744<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 +0000745<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
746
747Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
748though.
749
750Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000751 char ch = 'a';
752 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000753</pre></td></tr>
754
755
Aaron Ballman672dde22016-01-22 23:15:00 +0000756<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 +0000757<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
758
759Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000760 int array[4] = {1};
761 vector int myvec = (vector int)(1, 2);
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000762</pre></td></tr>
763
764
Aaron Ballman672dde22016-01-22 23:15:00 +0000765<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 +0000766<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
767
Fangrui Song55942ab2018-01-22 22:34:15 +0000768Example matches '{}' and '{{}}' in 'for (;;) {{}}'
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000769 for (;;) {{}}
770</pre></td></tr>
771
772
Aaron Ballman672dde22016-01-22 23:15:00 +0000773<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 +0000774<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
775
776Example matches a ? b : c
777 (a ? b : c) + 42
778</pre></td></tr>
779
780
Aaron Ballman672dde22016-01-22 23:15:00 +0000781<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 +0000782<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
783
784Given
785 while (true) { continue; }
786continueStmt()
787 matches 'continue'
788</pre></td></tr>
789
790
Aaron Ballman672dde22016-01-22 23:15:00 +0000791<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 +0000792<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
793
794Example matches,
795 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
796</pre></td></tr>
797
798
Aaron Ballman672dde22016-01-22 23:15:00 +0000799<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 +0000800<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
801
802Example matches FunctionTakesString(GetStringByValue())
803 (matcher = cxxBindTemporaryExpr())
804 FunctionTakesString(GetStringByValue());
805 FunctionTakesStringByPointer(GetStringPointer());
806</pre></td></tr>
807
808
Aaron Ballman672dde22016-01-22 23:15:00 +0000809<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 +0000810<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
811
812Example matches true
813 true
814</pre></td></tr>
815
816
Aaron Ballman672dde22016-01-22 23:15:00 +0000817<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000818<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
819
820 try {} catch(int i) {}
821cxxCatchStmt()
822 matches 'catch(int i)'
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('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 +0000827<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
828
829Example: Matches const_cast&lt;int*&gt;(&amp;r) in
830 int n = 42;
831 const int &amp;r(n);
832 int* p = const_cast&lt;int*&gt;(&amp;r);
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('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 +0000837<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
838
839Example matches string(ptr, n) and ptr within arguments of f
840 (matcher = cxxConstructExpr())
841 void f(const string &amp;a, const string &amp;b);
842 char *ptr;
843 int n;
844 f(string(ptr, n), ptr);
845</pre></td></tr>
846
847
Aaron Ballman672dde22016-01-22 23:15:00 +0000848<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 +0000849<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
850
851Example matches the CXXDefaultArgExpr placeholder inserted for the
852 default value of the second parameter in the call expression f(42)
853 (matcher = cxxDefaultArgExpr())
854 void f(int x, int y = 0);
855 f(42);
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('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 +0000860<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
861
862Given
863 delete X;
864cxxDeleteExpr()
865 matches 'delete X'.
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('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 +0000870<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
871
872Example:
873 cxxDynamicCastExpr()
874matches
875 dynamic_cast&lt;D*&gt;(&amp;b);
876in
877 struct B { virtual ~B() {} }; struct D : B {};
878 B b;
879 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
880</pre></td></tr>
881
882
Aaron Ballman672dde22016-01-22 23:15:00 +0000883<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 +0000884<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
885
886cxxForRangeStmt() matches 'for (auto a : i)'
887 int i[] = {1, 2, 3}; for (auto a : i);
888 for(int j = 0; j &lt; 5; ++j);
889</pre></td></tr>
890
891
Aaron Ballman672dde22016-01-22 23:15:00 +0000892<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 +0000893<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
894
895Example: Matches Foo(bar);
896 Foo f = bar;
897 Foo g = (Foo) bar;
898 Foo h = Foo(bar);
899</pre></td></tr>
900
901
Aaron Ballman672dde22016-01-22 23:15:00 +0000902<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +0000903<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
904
905Example matches x.y()
906 X x;
907 x.y();
908</pre></td></tr>
909
910
Aaron Ballman672dde22016-01-22 23:15:00 +0000911<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 +0000912<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
913
914Given
915 new X;
916cxxNewExpr()
917 matches 'new X'.
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('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 +0000922<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
923</pre></td></tr>
924
925
Aaron Ballman672dde22016-01-22 23:15:00 +0000926<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 +0000927<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
928
929Note that if an operator isn't overloaded, it won't match. Instead, use
930binaryOperator matcher.
931Currently it does not match operators such as new delete.
932FIXME: figure out why these do not match?
933
934Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
935 (matcher = cxxOperatorCallExpr())
936 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
937 ostream &amp;o; int b = 1, c = 1;
938 o &lt;&lt; b &lt;&lt; c;
939</pre></td></tr>
940
941
Aaron Ballman672dde22016-01-22 23:15:00 +0000942<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 +0000943<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
944
945Either the source expression or the destination type can be matched
946using has(), but hasDestinationType() is more specific and can be
947more readable.
948
949Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
950 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
951</pre></td></tr>
952
953
Aaron Ballman672dde22016-01-22 23:15:00 +0000954<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 +0000955<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
956
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000957See also: hasDestinationType
958See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000959
960Example:
961 cxxStaticCastExpr()
962matches
963 static_cast&lt;long&gt;(8)
964in
965 long eight(static_cast&lt;long&gt;(8));
966</pre></td></tr>
967
968
Jakub Kuderski64b6c782017-05-05 21:01:12 +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('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>
970<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
971
972Given
973 std::vector&lt;int&gt; a({ 1, 2, 3 });
974 std::vector&lt;int&gt; b = { 4, 5 };
975 int c[] = { 6, 7 };
976 std::pair&lt;int, int&gt; d = { 8, 9 };
977cxxStdInitializerListExpr()
978 matches "{ 1, 2, 3 }" and "{ 4, 5 }"
979</pre></td></tr>
980
981
Aaron Ballman672dde22016-01-22 23:15:00 +0000982<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 +0000983<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
984
985Example: Matches Foo(bar, bar)
986 Foo h = Foo(bar, bar);
987</pre></td></tr>
988
989
Aaron Ballman672dde22016-01-22 23:15:00 +0000990<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 +0000991<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
992
993Example matches the implicit this expression in "return i".
994 (matcher = cxxThisExpr())
995struct foo {
996 int i;
997 int f() { return i; }
998};
999</pre></td></tr>
1000
1001
Aaron Ballman672dde22016-01-22 23:15:00 +00001002<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 +00001003<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1004
1005 try { throw 5; } catch(int i) {}
1006cxxThrowExpr()
1007 matches 'throw 5'
1008</pre></td></tr>
1009
1010
Aaron Ballman672dde22016-01-22 23:15:00 +00001011<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 +00001012<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1013
1014 try {} catch(int i) {}
1015cxxTryStmt()
1016 matches 'try {}'
1017</pre></td></tr>
1018
1019
Aaron Ballman672dde22016-01-22 23:15:00 +00001020<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 +00001021<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1022
1023Example matches T(t) in return statement of f
1024 (matcher = cxxUnresolvedConstructExpr())
1025 template &lt;typename T&gt;
1026 void f(const T&amp; t) { return T(t); }
1027</pre></td></tr>
1028
1029
Aaron Ballman672dde22016-01-22 23:15:00 +00001030<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 +00001031<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1032
1033Example matches x in if (x)
1034 bool x;
1035 if (x) {}
1036</pre></td></tr>
1037
1038
Aaron Ballman672dde22016-01-22 23:15:00 +00001039<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 +00001040<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1041
1042Given
1043 int a;
1044declStmt()
1045 matches 'int a'.
1046</pre></td></tr>
1047
1048
Aaron Ballman672dde22016-01-22 23:15:00 +00001049<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 +00001050<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1051
1052Given
1053 switch(a) { case 42: break; default: break; }
1054defaultStmt()
Fangrui Song55942ab2018-01-22 22:34:15 +00001055 matches 'default:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001056</pre></td></tr>
1057
1058
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001059<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>
1060<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1061
1062Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1063 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1064</pre></td></tr>
1065
1066
Aaron Ballman672dde22016-01-22 23:15:00 +00001067<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 +00001068<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1069
1070Given
1071 do {} while (true);
1072doStmt()
1073 matches 'do {} while(true)'
1074</pre></td></tr>
1075
1076
Aaron Ballman672dde22016-01-22 23:15:00 +00001077<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 +00001078<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1079
1080Matches any cast expression written in user code, whether it be a
1081C-style cast, a functional-style cast, or a keyword cast.
1082
1083Does not match implicit conversions.
1084
1085Note: the name "explicitCast" is chosen to match Clang's terminology, as
1086Clang uses the term "cast" to apply to implicit conversions as well as to
1087actual cast expressions.
1088
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001089See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001090
1091Example: matches all five of the casts in
1092 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1093but does not match the implicit conversion in
1094 long ell = 42;
1095</pre></td></tr>
1096
1097
Aaron Ballman672dde22016-01-22 23:15:00 +00001098<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 +00001099<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1100
1101Example matches x()
1102 void f() { x(); }
1103</pre></td></tr>
1104
1105
Aaron Ballman672dde22016-01-22 23:15:00 +00001106<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 +00001107<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1108of the sub-expression's evaluation.
1109
1110Example matches std::string()
1111 const std::string str = std::string();
1112</pre></td></tr>
1113
1114
Aaron Ballman672dde22016-01-22 23:15:00 +00001115<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001116<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
11171.0, 1.0f, 1.0L and 1e10.
1118
1119Does not match implicit conversions such as
1120 float a = 10;
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('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 +00001125<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1126
1127Example matches 'for (;;) {}'
1128 for (;;) {}
1129 int i[] = {1, 2, 3}; for (auto a : i);
1130</pre></td></tr>
1131
1132
Aaron Ballman672dde22016-01-22 23:15:00 +00001133<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001134<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1135</pre></td></tr>
1136
1137
Aaron Ballman672dde22016-01-22 23:15:00 +00001138<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 +00001139<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1140
1141Given
1142 goto FOO;
1143 FOO: bar();
1144gotoStmt()
1145 matches 'goto FOO'
1146</pre></td></tr>
1147
1148
Aaron Ballman672dde22016-01-22 23:15:00 +00001149<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 +00001150<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1151
1152Example matches 'if (x) {}'
1153 if (x) {}
1154</pre></td></tr>
1155
1156
Aaron Ballman672dde22016-01-22 23:15:00 +00001157<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 +00001158<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1159
1160This matches many different places, including function call return value
1161eliding, as well as any type conversions.
1162</pre></td></tr>
1163
1164
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001165<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>
1166<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1167
1168Given
1169 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1170implicitValueInitExpr()
1171 matches "[0].y" (implicitly)
1172</pre></td></tr>
1173
1174
Aaron Ballman672dde22016-01-22 23:15:00 +00001175<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 +00001176<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1177
1178Given
1179 int a[] = { 1, 2 };
1180 struct B { int x, y; };
1181 B b = { 5, 6 };
1182initListExpr()
1183 matches "{ 1, 2 }" and "{ 5, 6 }"
1184</pre></td></tr>
1185
1186
Aaron Ballman672dde22016-01-22 23:15:00 +00001187<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 +00001188<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11891, 1L, 0x1 and 1U.
1190
1191Does not match character-encoded integers such as L'a'.
1192</pre></td></tr>
1193
1194
Aaron Ballman672dde22016-01-22 23:15:00 +00001195<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 +00001196<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1197
1198Given
1199 goto FOO;
1200 FOO: bar();
1201labelStmt()
1202 matches 'FOO:'
1203</pre></td></tr>
1204
1205
Aaron Ballman672dde22016-01-22 23:15:00 +00001206<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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 +00001207<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1208
1209Example matches [&amp;](){return 5;}
1210 [&amp;](){return 5;}
1211</pre></td></tr>
1212
1213
Aaron Ballman672dde22016-01-22 23:15:00 +00001214<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 +00001215<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1216
1217Example: Given
Jakub Kuderski64b6c782017-05-05 21:01:12 +00001218 struct T {void func();};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001219 T f();
1220 void g(T);
1221materializeTemporaryExpr() matches 'f()' in these statements
1222 T u(f());
1223 g(f());
Fangrui Song55942ab2018-01-22 22:34:15 +00001224 f().func();
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001225but does not match
1226 f();
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001227</pre></td></tr>
1228
1229
Aaron Ballman672dde22016-01-22 23:15:00 +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('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 +00001231<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1232
1233Given
1234 class Y {
1235 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1236 int a; static int b;
1237 };
1238memberExpr()
1239 matches this-&gt;x, x, y.x, a, this-&gt;b
1240</pre></td></tr>
1241
1242
Aaron Ballman672dde22016-01-22 23:15:00 +00001243<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 +00001244<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1245
1246 foo();;
1247nullStmt()
1248 matches the second ';'
1249</pre></td></tr>
1250
1251
Dave Lee0934fdc2017-11-11 22:46:15 +00001252<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1253<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1254
1255Example matches @catch
1256 @try {}
1257 @catch (...) {}
1258</pre></td></tr>
1259
1260
1261<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1262<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1263
1264Example matches @finally
1265 @try {}
1266 @finally {}
1267</pre></td></tr>
1268
1269
George Karpenkov079275b2018-07-27 17:26:11 +00001270<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
1271<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1272
1273Example: matches "a" in "init" method:
1274@implementation A {
1275 NSString *a;
1276}
1277- (void) init {
1278 a = @"hello";
1279}
1280}
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('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 +00001285<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1286
1287The innermost message send invokes the "alloc" class method on the
1288NSString class, while the outermost message send invokes the
1289"initWithString" instance method on the object returned from
1290NSString's "alloc". This matcher should match both message sends.
1291 [[NSString alloc] initWithString:@"Hello"]
1292</pre></td></tr>
1293
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001294
Dave Lee0934fdc2017-11-11 22:46:15 +00001295<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001296<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
Dave Lee0934fdc2017-11-11 22:46:15 +00001297
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001298Example matches @throw obj;
Dave Lee0934fdc2017-11-11 22:46:15 +00001299</pre></td></tr>
1300
1301
1302<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
1303<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1304
1305Example matches @try
1306 @try {}
1307 @catch (...) {}
1308</pre></td></tr>
1309
1310
Aaron Ballmana35b8fc2016-03-09 17:11:51 +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('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>
1312<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1313to reference another expressions and can be met
1314in BinaryConditionalOperators, for example.
1315
1316Example matches 'a'
1317 (a ?: c) + 42;
1318</pre></td></tr>
1319
1320
Aaron Ballman672dde22016-01-22 23:15:00 +00001321<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 +00001322<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1323
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001324Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001325 int foo() { return 1; }
1326 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001327</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001328
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001329
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001330<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>
1331<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1332ParenListExprs don't have a predefined type and are used for late parsing.
1333In the final AST, they can be met in template declarations.
1334
1335Given
1336 template&lt;typename T&gt; class X {
1337 void f() {
1338 X x(*this);
1339 int a = 0, b = 1; int i = (a, b);
1340 }
1341 };
1342parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1343has a predefined type and is a ParenExpr, not a ParenListExpr.
1344</pre></td></tr>
1345
1346
1347<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>
1348<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1349
1350Example: Matches __func__
1351 printf("%s", __func__);
1352</pre></td></tr>
1353
1354
Aaron Ballman672dde22016-01-22 23:15:00 +00001355<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 +00001356<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1357
1358Given
1359 return 1;
1360returnStmt()
1361 matches 'return 1'
1362</pre></td></tr>
1363
1364
Aaron Ballman672dde22016-01-22 23:15:00 +00001365<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 +00001366<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1367
1368Given
1369 { ++a; }
1370stmt()
1371 matches both the compound statement '{ ++a; }' and '++a'.
1372</pre></td></tr>
1373
1374
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001375<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1376<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1377
1378Example match: ({ int X = 4; X; })
1379 int C = ({ int X = 4; X; });
1380</pre></td></tr>
1381
1382
Aaron Ballman672dde22016-01-22 23:15:00 +00001383<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 +00001384<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1385
1386Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001387 char *s = "abcd";
1388 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001389</pre></td></tr>
1390
1391
Aaron Ballman672dde22016-01-22 23:15:00 +00001392<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 +00001393<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1394
1395Given
1396 template &lt;int N&gt;
1397 struct A { static const int n = N; };
1398 struct B : public A&lt;42&gt; {};
1399substNonTypeTemplateParmExpr()
1400 matches "N" in the right-hand side of "static const int n = N;"
1401</pre></td></tr>
1402
1403
Aaron Ballman672dde22016-01-22 23:15:00 +00001404<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 +00001405<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1406
1407Given
1408 switch(a) { case 42: break; default: break; }
1409switchCase()
Fangrui Song55942ab2018-01-22 22:34:15 +00001410 matches 'case 42:' and 'default:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001411</pre></td></tr>
1412
1413
Aaron Ballman672dde22016-01-22 23:15:00 +00001414<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 +00001415<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1416
1417Given
1418 switch(a) { case 42: break; default: break; }
1419switchStmt()
1420 matches 'switch(a)'.
1421</pre></td></tr>
1422
1423
Aaron Ballman672dde22016-01-22 23:15:00 +00001424<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001425<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1426
1427Given
1428 Foo x = bar;
1429 int y = sizeof(x) + alignof(x);
1430unaryExprOrTypeTraitExpr()
1431 matches sizeof(x) and alignof(x)
1432</pre></td></tr>
1433
1434
Aaron Ballman672dde22016-01-22 23:15:00 +00001435<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 +00001436<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1437
1438Example matches !a
1439 !a || b
1440</pre></td></tr>
1441
1442
Haojian Wu7751c922016-05-18 12:53:59 +00001443<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>
1444<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1445but could not be resolved to a specific declaration.
1446
1447Given
1448 template&lt;typename T&gt;
1449 T foo() { T a; return a; }
1450 template&lt;typename T&gt;
1451 void bar() {
1452 foo&lt;T&gt;();
1453 }
1454unresolvedLookupExpr()
1455 matches foo&lt;T&gt;() </pre></td></tr>
1456
1457
Aaron Ballman672dde22016-01-22 23:15:00 +00001458<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 +00001459<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1460
1461Example match: "foo"_suffix
1462</pre></td></tr>
1463
1464
Aaron Ballman672dde22016-01-22 23:15:00 +00001465<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 +00001466<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1467
1468Given
1469 while (true) {}
1470whileStmt()
1471 matches 'while (true) {}'.
1472</pre></td></tr>
1473
1474
Aaron Ballman672dde22016-01-22 23:15:00 +00001475<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 +00001476<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1477
1478Given
1479 template &lt;typename T&gt; struct C {};
1480 C&lt;int&gt; c;
1481templateArgument()
1482 matches 'int' in C&lt;int&gt;.
1483</pre></td></tr>
1484
1485
Haojian Wub33b02e2016-07-29 15:45:11 +00001486<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>
1487<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1488
1489Given
1490 template &lt;typename T&gt; class X { };
1491 X&lt;int&gt; xi;
1492templateName()
1493 matches 'X' in X&lt;int&gt;.
1494</pre></td></tr>
1495
1496
Aaron Ballman672dde22016-01-22 23:15:00 +00001497<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 +00001498<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1499</pre></td></tr>
1500
1501
Aaron Ballman672dde22016-01-22 23:15:00 +00001502<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 +00001503<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1504
1505Given
1506 int a[] = { 2, 3 };
1507 int b[4];
1508 void f() { int c[a[0]]; }
1509arrayType()
1510 matches "int a[]", "int b[4]" and "int c[a[0]]";
1511</pre></td></tr>
1512
1513
Aaron Ballman672dde22016-01-22 23:15:00 +00001514<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 +00001515<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1516
1517Given
1518 _Atomic(int) i;
1519atomicType()
1520 matches "_Atomic(int) i"
1521</pre></td></tr>
1522
1523
Aaron Ballman672dde22016-01-22 23:15:00 +00001524<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 +00001525<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1526
1527Given:
1528 auto n = 4;
1529 int v[] = { 2, 3 }
1530 for (auto i : v) { }
1531autoType()
1532 matches "auto n" and "auto i"
1533</pre></td></tr>
1534
1535
Aaron Ballman672dde22016-01-22 23:15:00 +00001536<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 +00001537<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1538"void (^)(int)".
1539
1540The pointee is always required to be a FunctionType.
1541</pre></td></tr>
1542
1543
Aaron Ballman672dde22016-01-22 23:15:00 +00001544<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001545<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1546
1547Given
1548 struct A {};
1549 A a;
1550 int b;
1551 float c;
1552 bool d;
1553builtinType()
1554 matches "int b", "float c" and "bool d"
1555</pre></td></tr>
1556
1557
Aaron Ballman672dde22016-01-22 23:15:00 +00001558<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 +00001559<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1560
1561Given
1562 _Complex float f;
1563complexType()
1564 matches "_Complex float f"
1565</pre></td></tr>
1566
1567
Aaron Ballman672dde22016-01-22 23:15:00 +00001568<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 +00001569<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1570
1571Given
1572 void() {
1573 int a[2];
1574 int b[] = { 2, 3 };
1575 int c[b[0]];
1576 }
1577constantArrayType()
1578 matches "int a[2]"
1579</pre></td></tr>
1580
1581
Aaron Ballman672dde22016-01-22 23:15:00 +00001582<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 +00001583<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1584Example matches i[] in declaration of f.
1585 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1586Example matches i[1].
1587 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1588 void f(int i[]) {
1589 i[1] = 0;
1590 }
1591</pre></td></tr>
1592
1593
Jonas Tothacf83672018-07-26 13:02:05 +00001594<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
1595<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
1596
1597Given:
1598 short i = 1;
1599 int j = 42;
1600 decltype(i + j) result = i + j;
1601decltypeType()
1602 matches "decltype(i + j)"
1603</pre></td></tr>
1604
1605
Aaron Ballman672dde22016-01-22 23:15:00 +00001606<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 +00001607<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1608
1609Given
1610 template&lt;typename T, int Size&gt;
1611 class array {
1612 T data[Size];
1613 };
1614dependentSizedArrayType
1615 matches "T data[Size]"
1616</pre></td></tr>
1617
1618
Aaron Ballman672dde22016-01-22 23:15:00 +00001619<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 +00001620<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1621qualified name.
1622
1623Given
1624 namespace N {
1625 namespace M {
1626 class D {};
1627 }
1628 }
1629 class C {};
1630
1631 class C c;
1632 N::M::D d;
1633
1634elaboratedType() matches the type of the variable declarations of both
1635c and d.
1636</pre></td></tr>
1637
1638
Haojian Wue775de82016-06-30 07:50:01 +00001639<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1640<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1641
1642Given
1643 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001644 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001645
1646 C c;
1647 S s;
1648
1649enumType() matches the type of the variable declarations of both c and
1650s.
1651</pre></td></tr>
1652
1653
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001654<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>
1655<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1656
1657Given
1658 int (*f)(int);
1659 void g();
1660functionProtoType()
1661 matches "int (*f)(int)" and the type of "g" in C++ mode.
1662 In C mode, "g" is not matched because it does not contain a prototype.
1663</pre></td></tr>
1664
1665
Aaron Ballman672dde22016-01-22 23:15:00 +00001666<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 +00001667<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1668
1669Given
1670 int (*f)(int);
1671 void g();
1672functionType()
1673 matches "int (*f)(int)" and the type of "g".
1674</pre></td></tr>
1675
1676
Aaron Ballman672dde22016-01-22 23:15:00 +00001677<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 +00001678<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1679
1680Given
1681 int a[] = { 2, 3 };
1682 int b[42];
1683 void f(int c[]) { int d[a[0]]; };
1684incompleteArrayType()
1685 matches "int a[]" and "int c[]"
1686</pre></td></tr>
1687
1688
Aaron Ballman672dde22016-01-22 23:15:00 +00001689<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 +00001690<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1691
1692Example matches S s, but not S&lt;T&gt; s.
1693 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1694 template &lt;typename T&gt; struct S {
1695 void f(S s);
1696 void g(S&lt;T&gt; s);
1697 };
1698</pre></td></tr>
1699
1700
Aaron Ballman672dde22016-01-22 23:15:00 +00001701<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 +00001702<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1703
1704Given:
1705 int *a;
1706 int &amp;b = *a;
1707 int &amp;&amp;c = 1;
1708 auto &amp;d = b;
1709 auto &amp;&amp;e = c;
1710 auto &amp;&amp;f = 2;
1711 int g = 5;
1712
1713lValueReferenceType() matches the types of b, d, and e. e is
1714matched since the type is deduced as int&amp; by reference collapsing rules.
1715</pre></td></tr>
1716
1717
Aaron Ballman672dde22016-01-22 23:15:00 +00001718<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001719<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1720Given
1721 struct A { int i; }
1722 A::* ptr = A::i;
1723memberPointerType()
1724 matches "A::* ptr"
1725</pre></td></tr>
1726
1727
Aaron Ballman672dde22016-01-22 23:15:00 +00001728<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 +00001729<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1730a pointer type, despite being syntactically similar.
1731
1732Given
1733 int *a;
1734
1735 @interface Foo
1736 @end
1737 Foo *f;
1738pointerType()
1739 matches "Foo *f", but does not match "int *a".
1740</pre></td></tr>
1741
1742
Aaron Ballman672dde22016-01-22 23:15:00 +00001743<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 +00001744<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1745
1746Given
1747 int (*ptr_to_array)[4];
1748 int *array_of_ptrs[4];
1749
1750varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1751array_of_ptrs.
1752</pre></td></tr>
1753
1754
Aaron Ballman672dde22016-01-22 23:15:00 +00001755<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 +00001756<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1757types.
1758
1759Given
1760 int *a;
1761 int &amp;b = *a;
1762 int c = 5;
1763
1764 @interface Foo
1765 @end
1766 Foo *f;
1767pointerType()
1768 matches "int *a", but does not match "Foo *f".
1769</pre></td></tr>
1770
1771
Aaron Ballman672dde22016-01-22 23:15:00 +00001772<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 +00001773<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1774
1775Given:
1776 int *a;
1777 int &amp;b = *a;
1778 int &amp;&amp;c = 1;
1779 auto &amp;d = b;
1780 auto &amp;&amp;e = c;
1781 auto &amp;&amp;f = 2;
1782 int g = 5;
1783
1784rValueReferenceType() matches the types of c and f. e is not
1785matched as it is deduced to int&amp; by reference collapsing rules.
1786</pre></td></tr>
1787
1788
Aaron Ballman672dde22016-01-22 23:15:00 +00001789<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 +00001790<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1791
1792Given
1793 class C {};
1794 struct S {};
1795
1796 C c;
1797 S s;
1798
1799recordType() matches the type of the variable declarations of both c
1800and s.
1801</pre></td></tr>
1802
1803
Aaron Ballman672dde22016-01-22 23:15:00 +00001804<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 +00001805<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1806
1807Given
1808 int *a;
1809 int &amp;b = *a;
1810 int &amp;&amp;c = 1;
1811 auto &amp;d = b;
1812 auto &amp;&amp;e = c;
1813 auto &amp;&amp;f = 2;
1814 int g = 5;
1815
1816referenceType() matches the types of b, c, d, e, and f.
1817</pre></td></tr>
1818
1819
Aaron Ballman672dde22016-01-22 23:15:00 +00001820<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 +00001821<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1822template type parameter.
1823
1824Given
1825 template &lt;typename T&gt;
1826 void F(T t) {
1827 int i = 1 + t;
1828 }
1829
1830substTemplateTypeParmType() matches the type of 't' but not '1'
1831</pre></td></tr>
1832
1833
Manuel Klimek696e5052017-08-02 13:04:44 +00001834<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>
1835<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1836
1837Given
1838 enum E {};
1839 class C {};
1840
1841 E e;
1842 C c;
1843
1844tagType() matches the type of the variable declarations of both e
1845and c.
1846</pre></td></tr>
1847
1848
Aaron Ballman672dde22016-01-22 23:15:00 +00001849<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 +00001850<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1851
1852Given
1853 template &lt;typename T&gt;
1854 class C { };
1855
1856 template class C&lt;int&gt;; A
1857 C&lt;char&gt; var; B
1858
1859templateSpecializationType() matches the type of the explicit
1860instantiation in A and the type of the variable declaration in B.
1861</pre></td></tr>
1862
1863
Aaron Ballman672dde22016-01-22 23:15:00 +00001864<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 +00001865<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1866
1867Example matches T, but not int.
1868 (matcher = templateTypeParmType())
1869 template &lt;typename T&gt; void f(int i);
1870</pre></td></tr>
1871
1872
Aaron Ballman672dde22016-01-22 23:15:00 +00001873<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 +00001874<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1875</pre></td></tr>
1876
1877
Aaron Ballman672dde22016-01-22 23:15:00 +00001878<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 +00001879<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1880
1881Given
1882 typedef int X;
1883typedefType()
1884 matches "typedef int X"
1885</pre></td></tr>
1886
1887
Aaron Ballman672dde22016-01-22 23:15:00 +00001888<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 +00001889<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1890
1891Given:
1892 typedef __underlying_type(T) type;
1893unaryTransformType()
1894 matches "__underlying_type(T)"
1895</pre></td></tr>
1896
1897
Aaron Ballman672dde22016-01-22 23:15:00 +00001898<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 +00001899<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1900integer-constant-expression.
1901
1902Given
1903 void f() {
1904 int a[] = { 2, 3 }
1905 int b[42];
1906 int c[a[0]];
1907 }
1908variableArrayType()
1909 matches "int c[a[0]]"
1910</pre></td></tr>
1911
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001912<!--END_DECL_MATCHERS -->
1913</table>
1914
1915<!-- ======================================================================= -->
1916<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1917<!-- ======================================================================= -->
1918
1919<p>Narrowing matchers match certain attributes on the current node, thus
1920narrowing down the set of nodes of the current type to match on.</p>
1921
1922<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1923which allow users to create more powerful match expressions.</p>
1924
1925<table>
1926<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001927<!-- START_NARROWING_MATCHERS -->
1928
1929<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>
1930<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1931
1932Usable as: Any Matcher
1933</pre></td></tr>
1934
1935
1936<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>
1937<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1938
1939Usable as: Any Matcher
1940</pre></td></tr>
1941
1942
1943<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1944<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1945
1946Useful when another matcher requires a child matcher, but there's no
1947additional constraint. This will often be used with an explicit conversion
1948to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1949
1950Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1951"int* p" and "void f()" in
1952 int* p;
1953 void f();
1954
1955Usable as: Any Matcher
1956</pre></td></tr>
1957
1958
1959<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1960<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1961
1962Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1963 class X {};
1964 class Y {};
1965
1966Usable as: Any Matcher
1967</pre></td></tr>
1968
1969
Aaron Ballman672dde22016-01-22 23:15:00 +00001970<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 +00001971<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1972unary).
1973
1974Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1975 !(a || b)
1976</pre></td></tr>
1977
1978
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00001979<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
Peter Szecsifff11db2018-03-27 12:11:46 +00001980<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
1981
1982Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
1983 if (a == b)
1984 a += b;
1985
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00001986Example 2: matches s1 = s2
1987 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
1988 struct S { S&amp; operator=(const S&amp;); };
Peter Szecsifff11db2018-03-27 12:11:46 +00001989 void x() { S s1, s2; s1 = s2; })
1990</pre></td></tr>
1991
1992
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001993<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>
1994<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1995
1996
1997<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00001998<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 +00001999
Peter Wua9244b52017-06-08 22:00:58 +00002000Given
2001 f('false, 3.14, 42);
2002characterLiteral(equals(0))
2003 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2004 match false
2005floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2006 match 3.14
2007integerLiteral(equals(42))
2008 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002009
Clement Courbet43bdba42017-07-11 15:45:22 +00002010Note that you cannot directly match a negative numeric literal because the
2011minus sign is not part of the literal: It is a unary operator whose operand
2012is the positive numeric literal. Instead, you must use a unaryOperator()
2013matcher to match the minus sign:
2014
2015unaryOperator(hasOperatorName("-"),
2016 hasUnaryOperand(integerLiteral(equals(13))))
2017
Peter Wua9244b52017-06-08 22:00:58 +00002018Usable 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 +00002019 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 +00002020</pre></td></tr>
2021
2022
Peter Wua9244b52017-06-08 22:00:58 +00002023<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>
2024<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2025
2026
2027<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>
2028<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2029
2030
Aaron Ballman672dde22016-01-22 23:15:00 +00002031<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002032<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2033
2034Given
2035 try {
2036 ...
2037 } catch (int) {
2038 ...
2039 } catch (...) {
2040 ...
2041 }
2042endcode
2043cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2044</pre></td></tr>
2045
2046
Aaron Ballman672dde22016-01-22 23:15:00 +00002047<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 +00002048<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2049a specific number of arguments (including absent default arguments).
2050
2051Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2052 void f(int x, int y);
2053 f(0, 0);
2054</pre></td></tr>
2055
2056
Aaron Ballman672dde22016-01-22 23:15:00 +00002057<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 +00002058<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2059</pre></td></tr>
2060
2061
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002062<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>
2063<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2064zero initialization.
2065
2066Given
2067void foo() {
2068 struct point { double x; double y; };
2069 point pt[2] = { { 1.0, 2.0 } };
2070}
2071initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2072will match the implicit array filler for pt[1].
2073</pre></td></tr>
2074
2075
Aaron Ballman672dde22016-01-22 23:15:00 +00002076<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 +00002077<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2078
2079Given
2080 struct S {
2081 S(); #1
2082 S(const S &amp;); #2
2083 S(S &amp;&amp;); #3
2084 };
2085cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2086</pre></td></tr>
2087
2088
Aaron Ballman672dde22016-01-22 23:15:00 +00002089<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 +00002090<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2091
2092Given
2093 struct S {
2094 S(); #1
2095 S(const S &amp;); #2
2096 S(S &amp;&amp;); #3
2097 };
2098cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2099</pre></td></tr>
2100
2101
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002102<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>
2103<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2104
2105Given
2106 struct S {
2107 S(); #1
2108 S(int) {} #2
2109 S(S &amp;&amp;) : S() {} #3
2110 };
2111 S::S() : S(0) {} #4
2112cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2113#1 or #2.
2114</pre></td></tr>
2115
2116
Aaron Ballman672dde22016-01-22 23:15:00 +00002117<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 +00002118<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2119the explicit keyword.
2120
2121Given
2122 struct S {
2123 S(int); #1
2124 explicit S(double); #2
2125 operator int(); #3
2126 explicit operator bool(); #4
2127 };
2128cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2129cxxConversionDecl(isExplicit()) will match #4, but not #3.
2130</pre></td></tr>
2131
2132
Aaron Ballman672dde22016-01-22 23:15:00 +00002133<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 +00002134<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2135
2136Given
2137 struct S {
2138 S(); #1
2139 S(const S &amp;); #2
2140 S(S &amp;&amp;); #3
2141 };
2142cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2143</pre></td></tr>
2144
2145
Aaron Ballman672dde22016-01-22 23:15:00 +00002146<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 +00002147<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2148the explicit keyword.
2149
2150Given
2151 struct S {
2152 S(int); #1
2153 explicit S(double); #2
2154 operator int(); #3
2155 explicit operator bool(); #4
2156 };
2157cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2158cxxConversionDecl(isExplicit()) will match #4, but not #3.
2159</pre></td></tr>
2160
2161
Aaron Ballman672dde22016-01-22 23:15:00 +00002162<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002163<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2164opposed to a member.
2165
2166Given
2167 struct B {};
2168 struct D : B {
2169 int I;
2170 D(int i) : I(i) {}
2171 };
2172 struct E : B {
2173 E() : B() {}
2174 };
2175cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2176 will match E(), but not match D(int).
2177</pre></td></tr>
2178
2179
Aaron Ballman672dde22016-01-22 23:15:00 +00002180<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 +00002181<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2182opposed to a base.
2183
2184Given
2185 struct B {};
2186 struct D : B {
2187 int I;
2188 D(int i) : I(i) {}
2189 };
2190 struct E : B {
2191 E() : B() {}
2192 };
2193cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2194 will match D(int), but not match E().
2195</pre></td></tr>
2196
2197
Aaron Ballman672dde22016-01-22 23:15:00 +00002198<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 +00002199<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2200code (as opposed to implicitly added by the compiler).
2201
2202Given
2203 struct Foo {
2204 Foo() { }
2205 Foo(int) : foo_("A") { }
2206 string foo_;
2207 };
2208cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2209 will match Foo(int), but not Foo()
2210</pre></td></tr>
2211
2212
Aaron Ballman672dde22016-01-22 23:15:00 +00002213<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 +00002214<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2215
2216Given
2217struct A {
2218 void foo() const;
2219 void bar();
2220};
2221
2222cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2223</pre></td></tr>
2224
2225
Aaron Ballman672dde22016-01-22 23:15:00 +00002226<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 +00002227<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2228operator.
2229
2230Given
2231struct A {
2232 A &amp;operator=(const A &amp;);
2233 A &amp;operator=(A &amp;&amp;);
2234};
2235
2236cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2237the second one.
2238</pre></td></tr>
2239
2240
Aaron Ballman672dde22016-01-22 23:15:00 +00002241<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 +00002242<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2243
2244Given:
2245 class A final {};
2246
2247 struct B {
2248 virtual void f();
2249 };
2250
2251 struct C : B {
2252 void f() final;
2253 };
2254matches A and C::f, but not B, C, or B::f
2255</pre></td></tr>
2256
2257
Aaron Ballman672dde22016-01-22 23:15:00 +00002258<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 +00002259<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2260operator.
2261
2262Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002263struct A {
2264 A &amp;operator=(const A &amp;);
2265 A &amp;operator=(A &amp;&amp;);
2266};
2267
2268cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2269the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002270</pre></td></tr>
2271
2272
Aaron Ballman672dde22016-01-22 23:15:00 +00002273<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 +00002274<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2275
2276Given
2277 class A {
2278 public:
2279 virtual void x();
2280 };
2281 class B : public A {
2282 public:
2283 virtual void x();
2284 };
2285 matches B::x
2286</pre></td></tr>
2287
2288
Aaron Ballman672dde22016-01-22 23:15:00 +00002289<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 +00002290<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2291
2292Given
2293 class A {
2294 public:
2295 virtual void x() = 0;
2296 };
2297 matches A::x
2298</pre></td></tr>
2299
2300
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002301<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>
2302<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2303
2304Given
2305 struct S {
2306 S(); #1
2307 S(const S &amp;) = default; #2
2308 S(S &amp;&amp;) = delete; #3
2309 };
2310cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2311</pre></td></tr>
2312
2313
Aaron Ballman672dde22016-01-22 23:15:00 +00002314<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 +00002315<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2316
2317Given
2318 class A {
2319 public:
2320 virtual void x();
2321 };
2322 matches A::x
2323</pre></td></tr>
2324
Aaron Ballman672dde22016-01-22 23:15:00 +00002325
2326<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 +00002327<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2328
2329Given
2330 class A {
2331 public:
2332 virtual void x();
2333 };
2334 class B : public A {
2335 public:
2336 void x();
2337 };
2338 matches A::x but not B::x
2339</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002340
Aaron Ballman672dde22016-01-22 23:15:00 +00002341
Adam Baloghda488a62017-11-23 12:43:20 +00002342<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2343<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2344
2345Given:
2346 MyClass *p1 = new MyClass[10];
2347cxxNewExpr(isArray())
2348 matches the expression 'new MyClass[10]'.
2349</pre></td></tr>
2350
2351
Aaron Ballman672dde22016-01-22 23:15:00 +00002352<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 +00002353<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2354
2355Matches overloaded operator names specified in strings without the
2356"operator" prefix: e.g. "&lt;&lt;".
2357
2358Given:
2359 class A { int operator*(); };
2360 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2361 A a;
2362 a &lt;&lt; a; &lt;-- This matches
2363
2364cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2365specified line and
2366cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2367matches the declaration of A.
2368
Aaron Ballman672dde22016-01-22 23:15:00 +00002369Usable 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 +00002370</pre></td></tr>
2371
2372
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00002373<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
Peter Szecsifff11db2018-03-27 12:11:46 +00002374<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2375
2376Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2377 if (a == b)
2378 a += b;
2379
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00002380Example 2: matches s1 = s2
2381 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2382 struct S { S&amp; operator=(const S&amp;); };
Peter Szecsifff11db2018-03-27 12:11:46 +00002383 void x() { S s1, s2; s1 = s2; })
2384</pre></td></tr>
2385
2386
Aaron Ballman813e36c2017-11-29 21:21:51 +00002387<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
2388<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2389
2390Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2391class x {};
2392class y;
2393</pre></td></tr>
2394
2395
Aaron Ballman672dde22016-01-22 23:15:00 +00002396<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 +00002397<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2398</pre></td></tr>
2399
2400
Aaron Ballman672dde22016-01-22 23:15:00 +00002401<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 +00002402<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2403static member variable template instantiations.
2404
2405Given
2406 template&lt;typename T&gt; void A(T t) { }
2407 template&lt;&gt; void A(int N) { }
2408functionDecl(isExplicitTemplateSpecialization())
2409 matches the specialization A&lt;int&gt;().
2410
Aaron Ballman672dde22016-01-22 23:15:00 +00002411Usable 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 +00002412</pre></td></tr>
2413
2414
Aaron Ballman672dde22016-01-22 23:15:00 +00002415<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 +00002416<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2417
2418Given:
2419 class A final {};
2420
2421 struct B {
2422 virtual void f();
2423 };
2424
2425 struct C : B {
2426 void f() final;
2427 };
2428matches A and C::f, but not B, C, or B::f
2429</pre></td></tr>
2430
2431
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002432<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>
2433<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2434
2435Given:
2436 auto x = []{};
2437
2438cxxRecordDecl(isLambda()) matches the implicit class declaration of
2439decltype(x)
2440</pre></td></tr>
2441
2442
Aaron Ballman672dde22016-01-22 23:15:00 +00002443<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 +00002444<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2445isSameOrDerivedFrom(hasName(...)).
2446</pre></td></tr>
2447
2448
Aaron Ballman672dde22016-01-22 23:15:00 +00002449<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002450<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2451member variable template instantiations.
2452
2453Given
2454 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2455or
2456 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00002457or
2458 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002459cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2460 matches the template instantiation of X&lt;A&gt;.
2461
2462But given
2463 template &lt;typename T&gt; class X {}; class A {};
2464 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2465cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2466 does not match, as X&lt;A&gt; is an explicit template specialization.
2467
Aaron Ballman672dde22016-01-22 23:15:00 +00002468Usable 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 +00002469</pre></td></tr>
2470
2471
Aaron Ballman672dde22016-01-22 23:15:00 +00002472<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002473<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2474a specific number of arguments (including absent default arguments).
2475
2476Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2477 void f(int x, int y);
2478 f(0, 0);
2479</pre></td></tr>
2480
2481
Etienne Bergeron75e52722016-05-13 19:36:55 +00002482<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>
2483<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2484
2485Example: matches the implicit cast around 0
2486(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2487 int *p = 0;
2488</pre></td></tr>
2489
2490
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002491<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>
2492<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2493
2494
2495<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002496<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 +00002497
Peter Wua9244b52017-06-08 22:00:58 +00002498Given
2499 f('false, 3.14, 42);
2500characterLiteral(equals(0))
2501 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2502 match false
2503floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2504 match 3.14
2505integerLiteral(equals(42))
2506 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002507
Clement Courbet43bdba42017-07-11 15:45:22 +00002508Note that you cannot directly match a negative numeric literal because the
2509minus sign is not part of the literal: It is a unary operator whose operand
2510is the positive numeric literal. Instead, you must use a unaryOperator()
2511matcher to match the minus sign:
2512
2513unaryOperator(hasOperatorName("-"),
2514 hasUnaryOperand(integerLiteral(equals(13))))
2515
Peter Wua9244b52017-06-08 22:00:58 +00002516Usable 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 +00002517 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 +00002518</pre></td></tr>
2519
2520
Peter Wua9244b52017-06-08 22:00:58 +00002521<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>
2522<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2523
2524
2525<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>
2526<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2527
2528
Aaron Ballman672dde22016-01-22 23:15:00 +00002529<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 +00002530<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2531
2532Given
2533 template&lt;typename T&gt; struct C {};
2534 C&lt;int&gt; c;
2535classTemplateSpecializationDecl(templateArgumentCountIs(1))
2536 matches C&lt;int&gt;.
2537</pre></td></tr>
2538
2539
Aaron Ballman672dde22016-01-22 23:15:00 +00002540<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 +00002541<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2542child statements.
2543
2544Example: Given
2545 { for (;;) {} }
2546compoundStmt(statementCountIs(0)))
2547 matches '{}'
2548 but does not match the outer compound statement.
2549</pre></td></tr>
2550
2551
Aaron Ballman672dde22016-01-22 23:15:00 +00002552<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 +00002553<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002554
2555Given
2556 int a[42];
2557 int b[2 * 21];
2558 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002559 char *s = "abcd";
2560 wchar_t *ws = L"abcd";
2561 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002562constantArrayType(hasSize(42))
2563 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002564stringLiteral(hasSize(4))
2565 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002566</pre></td></tr>
2567
2568
Aaron Ballman672dde22016-01-22 23:15:00 +00002569<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 +00002570<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2571declarations.
2572
2573Example: Given
2574 int a, b;
2575 int c;
2576 int d = 2, e;
2577declCountIs(2)
2578 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2579</pre></td></tr>
2580
2581
Aaron Ballman672dde22016-01-22 23:15:00 +00002582<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 +00002583<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2584
2585Matches a node if it equals the node previously bound to ID.
2586
2587Given
2588 class X { int a; int b; };
2589cxxRecordDecl(
2590 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2591 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2592 matches the class X, as a and b have the same type.
2593
2594Note that when multiple matches are involved via forEach* matchers,
2595equalsBoundNodes acts as a filter.
2596For example:
2597compoundStmt(
2598 forEachDescendant(varDecl().bind("d")),
2599 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2600will trigger a match for each combination of variable declaration
2601and reference to that variable declaration within a compound statement.
2602</pre></td></tr>
2603
2604
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002605<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>
2606<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2607
2608Decl has pointer identity in the AST.
2609</pre></td></tr>
2610
2611
Aaron Ballman672dde22016-01-22 23:15:00 +00002612<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 +00002613<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2614
2615Given
2616 __attribute__((device)) void f() { ... }
2617decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2618f. If the matcher is use from clang-query, attr::Kind parameter should be
2619passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2620</pre></td></tr>
2621
2622
Aaron Ballman672dde22016-01-22 23:15:00 +00002623<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 +00002624<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2625partially matching a given regex.
2626
2627Example matches Y but not X
2628 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2629 #include "ASTMatcher.h"
2630 class X {};
2631ASTMatcher.h:
2632 class Y {};
2633
Aaron Ballman672dde22016-01-22 23:15:00 +00002634Usable 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 +00002635</pre></td></tr>
2636
2637
Aaron Ballman672dde22016-01-22 23:15:00 +00002638<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 +00002639<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2640
2641Example matches X but not Y
2642 (matcher = cxxRecordDecl(isExpansionInMainFile())
2643 #include &lt;Y.h&gt;
2644 class X {};
2645Y.h:
2646 class Y {};
2647
Aaron Ballman672dde22016-01-22 23:15:00 +00002648Usable 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 +00002649</pre></td></tr>
2650
2651
Aaron Ballman672dde22016-01-22 23:15:00 +00002652<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 +00002653<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2654
2655Example matches Y but not X
2656 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2657 #include &lt;SystemHeader.h&gt;
2658 class X {};
2659SystemHeader.h:
2660 class Y {};
2661
Aaron Ballman672dde22016-01-22 23:15:00 +00002662Usable 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 +00002663</pre></td></tr>
2664
2665
Aaron Ballman672dde22016-01-22 23:15:00 +00002666<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 +00002667<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2668by the compiler (eg. implicit defaultcopy constructors).
2669</pre></td></tr>
2670
2671
Aaron Ballman672dde22016-01-22 23:15:00 +00002672<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 +00002673<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2674
2675Given
2676 class C {
2677 public: int a;
2678 protected: int b;
2679 private: int c;
2680 };
2681fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002682 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002683</pre></td></tr>
2684
2685
Aaron Ballman672dde22016-01-22 23:15:00 +00002686<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 +00002687<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2688
2689Given
2690 class C {
2691 public: int a;
2692 protected: int b;
2693 private: int c;
2694 };
2695fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002696 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002697</pre></td></tr>
2698
2699
Aaron Ballman672dde22016-01-22 23:15:00 +00002700<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 +00002701<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2702
2703Given
2704 class C {
2705 public: int a;
2706 protected: int b;
2707 private: int c;
2708 };
2709fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002710 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002711</pre></td></tr>
2712
2713
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002714<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>
2715<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2716a specific number of designators.
2717
2718Example: Given
2719 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2720 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2721designatorCountIs(2)
2722 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2723 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2724</pre></td></tr>
2725
2726
Haojian Wu9c3be3a2018-01-18 09:47:57 +00002727<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
2728<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2729
2730Example matches Y (matcher = enumDecl(isScoped()))
2731enum X {};
2732enum class Y {};
2733</pre></td></tr>
2734
2735
Aaron Ballman5c574342016-07-06 18:25:16 +00002736<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 +00002737<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2738bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002739
2740Given
2741 class C {
2742 int a : 2;
2743 int b : 4;
2744 int c : 2;
2745 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002746fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002747 matches 'int a;' and 'int c;' but not 'int b;'.
2748</pre></td></tr>
2749
2750
2751<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>
2752<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2753
2754Given
2755 class C {
2756 int a : 2;
2757 int b;
2758 };
2759fieldDecl(isBitField())
2760 matches 'int a;' but not 'int b;'.
2761</pre></td></tr>
2762
2763
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002764<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002765<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 +00002766
Peter Wua9244b52017-06-08 22:00:58 +00002767Given
2768 f('false, 3.14, 42);
2769characterLiteral(equals(0))
2770 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2771 match false
2772floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2773 match 3.14
2774integerLiteral(equals(42))
2775 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002776
Clement Courbet43bdba42017-07-11 15:45:22 +00002777Note that you cannot directly match a negative numeric literal because the
2778minus sign is not part of the literal: It is a unary operator whose operand
2779is the positive numeric literal. Instead, you must use a unaryOperator()
2780matcher to match the minus sign:
2781
2782unaryOperator(hasOperatorName("-"),
2783 hasUnaryOperand(integerLiteral(equals(13))))
2784
Peter Wua9244b52017-06-08 22:00:58 +00002785Usable 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 +00002786 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 +00002787</pre></td></tr>
2788
2789
Peter Wua9244b52017-06-08 22:00:58 +00002790<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>
2791<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2792
2793
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002794<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>
2795<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2796
2797Given:
2798 void f();
2799 void g() noexcept;
2800 void h() noexcept(true);
2801 void i() noexcept(false);
2802 void j() throw();
2803 void k() throw(int);
2804 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002805functionDecl(hasDynamicExceptionSpec()) and
2806 functionProtoType(hasDynamicExceptionSpec())
2807 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002808</pre></td></tr>
2809
2810
Aaron Ballman672dde22016-01-22 23:15:00 +00002811<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002812<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2813
2814Matches overloaded operator names specified in strings without the
2815"operator" prefix: e.g. "&lt;&lt;".
2816
2817Given:
2818 class A { int operator*(); };
2819 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2820 A a;
2821 a &lt;&lt; a; &lt;-- This matches
2822
2823cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2824specified line and
2825cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2826matches the declaration of A.
2827
Aaron Ballman672dde22016-01-22 23:15:00 +00002828Usable 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 +00002829</pre></td></tr>
2830
2831
Julie Hockett239d25a2018-01-22 22:45:23 +00002832<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
2833<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
2834
2835Example matches Y (matcher = functionDecl(hasTrailingReturn()))
2836int X() {}
2837auto Y() -&gt; int {}
2838</pre></td></tr>
2839
2840
Aaron Ballman672dde22016-01-22 23:15:00 +00002841<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>
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00002842<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
2843 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002844
2845Given:
2846 constexpr int foo = 42;
2847 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00002848 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002849varDecl(isConstexpr())
2850 matches the declaration of foo.
2851functionDecl(isConstexpr())
2852 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00002853ifStmt(isConstexpr())
2854 matches the if statement in baz.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002855</pre></td></tr>
2856
2857
Aaron Ballman672dde22016-01-22 23:15:00 +00002858<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 +00002859<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2860
2861Given:
2862 class A { ~A(); };
2863 class B { ~B() = default; };
2864functionDecl(isDefaulted())
2865 matches the declaration of ~B, but not ~A.
2866</pre></td></tr>
2867
2868
Dave Leebe398682017-11-14 14:17:26 +00002869<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
2870<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002871
2872Example matches A, va, fa
2873 class A {};
2874 class B; Doesn't match, as it has no body.
2875 int va;
2876 extern int vb; Doesn't match, as it doesn't define the variable.
2877 void fa() {}
2878 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00002879 @interface X
2880 - (void)ma; Doesn't match, interface is declaration.
2881 @end
2882 @implementation X
2883 - (void)ma {}
2884 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002885
Dave Leebe398682017-11-14 14:17:26 +00002886Usable 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;,
2887 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002888</pre></td></tr>
2889
2890
Aaron Ballman672dde22016-01-22 23:15:00 +00002891<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 +00002892<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2893
2894Given:
2895 void Func();
2896 void DeletedFunc() = delete;
2897functionDecl(isDeleted())
2898 matches the declaration of DeletedFunc, but not Func.
2899</pre></td></tr>
2900
2901
Aaron Ballman672dde22016-01-22 23:15:00 +00002902<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 +00002903<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2904static member variable template instantiations.
2905
2906Given
2907 template&lt;typename T&gt; void A(T t) { }
2908 template&lt;&gt; void A(int N) { }
2909functionDecl(isExplicitTemplateSpecialization())
2910 matches the specialization A&lt;int&gt;().
2911
Aaron Ballman672dde22016-01-22 23:15:00 +00002912Usable 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 +00002913</pre></td></tr>
2914
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002915
Aaron Ballman672dde22016-01-22 23:15:00 +00002916<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002917<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002918
2919Given:
2920 extern "C" void f() {}
2921 extern "C" { void g() {} }
2922 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002923 extern "C" int x = 1;
2924 extern "C" int y = 2;
2925 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002926functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002927 matches the declaration of f and g, but not the declaration of h.
2928varDecl(isExternC())
2929 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002930</pre></td></tr>
2931
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002932
Aaron Ballman672dde22016-01-22 23:15:00 +00002933<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 +00002934<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2935the inline keyword.
2936
2937Given
2938 inline void f();
2939 void g();
2940 namespace n {
2941 inline namespace m {}
2942 }
2943functionDecl(isInline()) will match ::f().
2944namespaceDecl(isInline()) will match n::m.
2945</pre></td></tr>
2946
2947
George Karpenkovfc3d72e2018-07-23 22:29:35 +00002948<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
2949<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
2950into an executable program.
2951</pre></td></tr>
2952
2953
Roman Lebedev6c3871b2018-01-17 19:40:55 +00002954<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
2955<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
2956
2957Given
2958 void nope();
2959 [[noreturn]] void a();
2960 __attribute__((noreturn)) void b();
2961 struct c { [[noreturn]] c(); };
2962functionDecl(isNoReturn())
2963 matches all of those except
2964 void nope();
2965</pre></td></tr>
2966
2967
Aaron Ballman672dde22016-01-22 23:15:00 +00002968<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 +00002969<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2970
2971Given:
2972 void f();
2973 void g() noexcept;
2974 void h() throw();
2975 void i() throw(int);
2976 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002977functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2978 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002979</pre></td></tr>
2980
2981
Haojian Wub3d25462016-09-26 16:01:52 +00002982<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 +00002983<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2984class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002985
2986Given:
2987 static void f() {}
2988 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002989 extern int j;
2990 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002991functionDecl(isStaticStorageClass())
2992 matches the function declaration f.
2993varDecl(isStaticStorageClass())
2994 matches the variable declaration i.
2995</pre></td></tr>
2996
2997
Aaron Ballman672dde22016-01-22 23:15:00 +00002998<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 +00002999<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3000member variable template instantiations.
3001
3002Given
3003 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3004or
3005 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00003006or
3007 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003008cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3009 matches the template instantiation of X&lt;A&gt;.
3010
3011But given
3012 template &lt;typename T&gt; class X {}; class A {};
3013 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3014cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3015 does not match, as X&lt;A&gt; is an explicit template specialization.
3016
Aaron Ballman672dde22016-01-22 23:15:00 +00003017Usable 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 +00003018</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_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 +00003022<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3023
3024Example matches f, but not g or h. The function i will not match, even when
3025compiled in C mode.
3026 void f(...);
3027 void g(int);
3028 template &lt;typename... Ts&gt; void h(Ts...);
3029 void i();
3030</pre></td></tr>
3031
3032
Aaron Ballman672dde22016-01-22 23:15:00 +00003033<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 +00003034<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3035specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003036
3037Given
3038 void f(int i) {}
3039 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003040 void h(int i, int j);
3041 void j(int i);
3042 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003043functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003044 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003045functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003046 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003047functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003048 matches k
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003049</pre></td></tr>
3050
3051
Aaron Ballman230ad972016-06-07 17:34:45 +00003052<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>
3053<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3054
3055Given:
3056 void f();
3057 void g() noexcept;
3058 void h() noexcept(true);
3059 void i() noexcept(false);
3060 void j() throw();
3061 void k() throw(int);
3062 void l() throw(...);
3063functionDecl(hasDynamicExceptionSpec()) and
3064 functionProtoType(hasDynamicExceptionSpec())
3065 match the declarations of j, k, and l, but not f, g, h, or i.
3066</pre></td></tr>
3067
3068
3069<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>
3070<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3071
3072Given:
3073 void f();
3074 void g() noexcept;
3075 void h() throw();
3076 void i() throw(int);
3077 void j() noexcept(false);
3078functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3079 match the declarations of g, and h, but not f, i or j.
3080</pre></td></tr>
3081
3082
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003083<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>
3084<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3085specific parameter count.
3086
3087Given
3088 void f(int i) {}
3089 void g(int i, int j) {}
3090 void h(int i, int j);
3091 void j(int i);
3092 void k(int x, int y, int z, ...);
3093functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003094 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003095functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003096 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003097functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003098 matches k
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003099</pre></td></tr>
3100
3101
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003102<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
3103<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3104 and if constexpr.
3105
3106Given:
3107 constexpr int foo = 42;
3108 constexpr int bar();
3109 void baz() { if constexpr(1 &gt; 0) {} }
3110varDecl(isConstexpr())
3111 matches the declaration of foo.
3112functionDecl(isConstexpr())
3113 matches the declaration of bar.
3114ifStmt(isConstexpr())
3115 matches the if statement in baz.
3116</pre></td></tr>
3117
3118
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003119<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>
3120<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3121
3122
3123<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00003124<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 +00003125
Peter Wua9244b52017-06-08 22:00:58 +00003126Given
3127 f('false, 3.14, 42);
3128characterLiteral(equals(0))
3129 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3130 match false
3131floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3132 match 3.14
3133integerLiteral(equals(42))
3134 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003135
Clement Courbet43bdba42017-07-11 15:45:22 +00003136Note that you cannot directly match a negative numeric literal because the
3137minus sign is not part of the literal: It is a unary operator whose operand
3138is the positive numeric literal. Instead, you must use a unaryOperator()
3139matcher to match the minus sign:
3140
3141unaryOperator(hasOperatorName("-"),
3142 hasUnaryOperand(integerLiteral(equals(13))))
3143
Peter Wua9244b52017-06-08 22:00:58 +00003144Usable 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 +00003145 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 +00003146</pre></td></tr>
3147
3148
Peter Wua9244b52017-06-08 22:00:58 +00003149<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>
3150<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3151
3152
3153<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>
3154<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3155
3156
Aaron Ballman672dde22016-01-22 23:15:00 +00003157<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003158<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3159to '.'.
3160
3161Member calls on the implicit this pointer match as called with '-&gt;'.
3162
3163Given
3164 class Y {
3165 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3166 int a;
3167 static int b;
3168 };
3169memberExpr(isArrow())
3170 matches this-&gt;x, x, y.x, a, this-&gt;b
3171</pre></td></tr>
3172
3173
Aaron Ballmana086b9f2016-08-17 13:10:42 +00003174<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>
3175<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3176
3177Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3178void f() {
3179 int x;
3180 static int y;
3181}
3182int z;
3183
3184Example matches f() because it has external formal linkage despite being
3185unique to the translation unit as though it has internal likage
3186(matcher = functionDecl(hasExternalFormalLinkage()))
3187
3188namespace {
3189void f() {}
3190}
3191</pre></td></tr>
3192
3193
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003194<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>const std::string Name</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003195<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3196
3197Supports specifying enclosing namespaces or classes by prefixing the name
3198with '&lt;enclosing&gt;::'.
3199Does not match typedefs of an underlying type with the given name.
3200
3201Example matches X (Name == "X")
3202 class X;
3203
3204Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3205 namespace a { namespace b { class X; } }
3206</pre></td></tr>
3207
3208
Aaron Ballman672dde22016-01-22 23:15:00 +00003209<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003210<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3211a substring matched by the given RegExp.
3212
3213Supports specifying enclosing namespaces or classes by
3214prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3215of an underlying type with the given name.
3216
3217Example matches X (regexp == "::X")
3218 class X;
3219
3220Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3221 namespace foo { namespace bar { class X; } }
3222</pre></td></tr>
3223
3224
Aaron Ballman672dde22016-01-22 23:15:00 +00003225<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 +00003226<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3227
3228Given
3229 namespace n {
3230 namespace {} #1
3231 }
3232namespaceDecl(isAnonymous()) will match #1 but not ::n.
3233</pre></td></tr>
3234
3235
Aaron Ballman672dde22016-01-22 23:15:00 +00003236<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 +00003237<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3238the inline keyword.
3239
3240Given
3241 inline void f();
3242 void g();
3243 namespace n {
3244 inline namespace m {}
3245 }
3246functionDecl(isInline()) will match ::f().
3247namespaceDecl(isInline()) will match n::m.
3248</pre></td></tr>
3249
3250
Aaron Ballman672dde22016-01-22 23:15:00 +00003251<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 +00003252<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3253a specific number of arguments (including absent default arguments).
3254
3255Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3256 void f(int x, int y);
3257 f(0, 0);
3258</pre></td></tr>
3259
3260
Aaron Ballman672dde22016-01-22 23:15:00 +00003261<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 +00003262<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3263
3264objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3265message expression in
3266
3267 UIWebView *webView = ...;
3268 CGRect bodyFrame = webView.frame;
3269 bodyFrame.size.height = self.bodyContentHeight;
3270 webView.frame = bodyFrame;
3271 ^---- matches here
3272</pre></td></tr>
3273
3274
Aaron Ballman672dde22016-01-22 23:15:00 +00003275<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 +00003276<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3277
3278Matches only when the selector of the objCMessageExpr is NULL. This may
3279represent an error condition in the tree!
3280</pre></td></tr>
3281
3282
Aaron Ballman672dde22016-01-22 23:15:00 +00003283<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 +00003284<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3285
3286 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3287 matches the outer message expr in the code below, but NOT the message
3288 invocation for self.bodyView.
3289 [self.bodyView loadHTMLString:html baseURL:NULL];
3290</pre></td></tr>
3291
3292
Aaron Ballman672dde22016-01-22 23:15:00 +00003293<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 +00003294<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3295
3296 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3297 matches self.bodyView in the code below, but NOT the outer message
3298 invocation of "loadHTMLString:baseURL:".
3299 [self.bodyView loadHTMLString:html baseURL:NULL];
3300</pre></td></tr>
3301
3302
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003303<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
3304<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3305
3306Example
3307matcher = objcMessagaeExpr(isInstanceMessage())
3308matches
3309 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00003310 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003311but not
George Karpenkovdaac52c2018-07-23 22:29:10 +00003312 [NSString stringWithFormat:@"format"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003313</pre></td></tr>
3314
3315
Aaron Ballman672dde22016-01-22 23:15:00 +00003316<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 +00003317<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3318a substring matched by the given RegExp.
3319 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3320 invocation for self.bodyView.
3321 [self.bodyView loadHTMLString:html baseURL:NULL];
3322</pre></td></tr>
3323
3324
Aaron Ballman672dde22016-01-22 23:15:00 +00003325<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 +00003326<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3327
3328 matcher = objCMessageExpr(numSelectorArgs(0));
3329 matches self.bodyView in the code below
3330
3331 matcher = objCMessageExpr(numSelectorArgs(2));
3332 matches the invocation of "loadHTMLString:baseURL:" but not that
3333 of self.bodyView
3334 [self.bodyView loadHTMLString:html baseURL:NULL];
3335</pre></td></tr>
3336
3337
Dave Leebe398682017-11-14 14:17:26 +00003338<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
3339<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3340
3341Example matches A, va, fa
3342 class A {};
3343 class B; Doesn't match, as it has no body.
3344 int va;
3345 extern int vb; Doesn't match, as it doesn't define the variable.
3346 void fa() {}
3347 void fb(); Doesn't match, as it has no body.
3348 @interface X
3349 - (void)ma; Doesn't match, interface is declaration.
3350 @end
3351 @implementation X
3352 - (void)ma {}
3353 @end
3354
3355Usable 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;,
3356 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3357</pre></td></tr>
3358
3359
Aaron Ballman5f8980a2017-11-21 19:22:34 +00003360<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
3361<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3362
3363Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3364void x(int val) {}
3365void y(int val = 0) {}
3366</pre></td></tr>
3367
3368
Aaron Ballman672dde22016-01-22 23:15:00 +00003369<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 +00003370<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3371
3372Given
3373 class Y { public: void x(); };
3374 void z() { Y* y; y-&gt;x(); }
3375cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3376 matches y-&gt;x()
3377</pre></td></tr>
3378
3379
Aaron Ballman672dde22016-01-22 23:15:00 +00003380<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 +00003381<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3382
3383Matches a node if it equals the node previously bound to ID.
3384
3385Given
3386 class X { int a; int b; };
3387cxxRecordDecl(
3388 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3389 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3390 matches the class X, as a and b have the same type.
3391
3392Note that when multiple matches are involved via forEach* matchers,
3393equalsBoundNodes acts as a filter.
3394For example:
3395compoundStmt(
3396 forEachDescendant(varDecl().bind("d")),
3397 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3398will trigger a match for each combination of variable declaration
3399and reference to that variable declaration within a compound statement.
3400</pre></td></tr>
3401
3402
Aaron Ballman672dde22016-01-22 23:15:00 +00003403<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 +00003404<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3405the node, not hidden within a typedef.
3406
3407Given
3408 typedef const int const_int;
3409 const_int i;
3410 int *const j;
3411 int *volatile k;
3412 int m;
3413varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3414i is const-qualified but the qualifier is not local.
3415</pre></td></tr>
3416
3417
Aaron Ballman672dde22016-01-22 23:15:00 +00003418<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 +00003419<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3420
3421Given
3422 void a(char);
3423 void b(wchar_t);
3424 void c(double);
3425functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3426matches "a(char)", "b(wchar_t)", but not "c(double)".
3427</pre></td></tr>
3428
3429
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003430<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 +00003431<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3432the Objective-C object pointer type, which is different despite being
3433syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003434
3435Given
3436 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003437
3438 @interface Foo
3439 @end
3440 Foo *f;
3441
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003442 int j;
3443varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003444 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003445</pre></td></tr>
3446
3447
Aaron Ballman672dde22016-01-22 23:15:00 +00003448<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 +00003449<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3450include "top-level" const.
3451
3452Given
3453 void a(int);
3454 void b(int const);
3455 void c(const int);
3456 void d(const int*);
3457 void e(int const) {};
3458functionDecl(hasAnyParameter(hasType(isConstQualified())))
3459 matches "void b(int const)", "void c(const int)" and
3460 "void e(int const) {}". It does not match d as there
3461 is no top-level const on the parameter type "const int *".
3462</pre></td></tr>
3463
3464
Aaron Ballman672dde22016-01-22 23:15:00 +00003465<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 +00003466<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3467
3468Given
3469 void a(int);
3470 void b(long);
3471 void c(double);
3472functionDecl(hasAnyParameter(hasType(isInteger())))
3473matches "a(int)", "b(long)", but not "c(double)".
3474</pre></td></tr>
3475
3476
Clement Courbet42517592016-07-12 06:36:00 +00003477<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>
3478<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3479
3480Given
3481 void a(int);
3482 void b(unsigned long);
3483 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003484functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003485matches "a(int)", but not "b(unsigned long)" and "c(double)".
3486</pre></td></tr>
3487
3488
3489<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>
3490<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3491
3492Given
3493 void a(int);
3494 void b(unsigned long);
3495 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003496functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003497matches "b(unsigned long)", but not "a(int)" and "c(double)".
3498</pre></td></tr>
3499
3500
Aaron Ballman672dde22016-01-22 23:15:00 +00003501<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 +00003502<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3503include "top-level" volatile.
3504
3505Given
3506 void a(int);
3507 void b(int volatile);
3508 void c(volatile int);
3509 void d(volatile int*);
3510 void e(int volatile) {};
3511functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3512 matches "void b(int volatile)", "void c(volatile int)" and
3513 "void e(int volatile) {}". It does not match d as there
3514 is no top-level volatile on the parameter type "volatile int *".
3515</pre></td></tr>
3516
3517
Aaron Ballman672dde22016-01-22 23:15:00 +00003518<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 +00003519<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3520
3521Example matches C, but not S or U.
3522 struct S {};
3523 class C {};
3524 union U {};
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_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 +00003529<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3530
3531Example matches S, but not C or U.
3532 struct S {};
3533 class C {};
3534 union U {};
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_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 +00003539<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3540
3541Example matches U, but not C or S.
3542 struct S {};
3543 class C {};
3544 union U {};
3545</pre></td></tr>
3546
3547
Aaron Ballman672dde22016-01-22 23:15:00 +00003548<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003549<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3550
3551Matches a node if it equals the node previously bound to ID.
3552
3553Given
3554 class X { int a; int b; };
3555cxxRecordDecl(
3556 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3557 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3558 matches the class X, as a and b have the same type.
3559
3560Note that when multiple matches are involved via forEach* matchers,
3561equalsBoundNodes acts as a filter.
3562For example:
3563compoundStmt(
3564 forEachDescendant(varDecl().bind("d")),
3565 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3566will trigger a match for each combination of variable declaration
3567and reference to that variable declaration within a compound statement.
3568</pre></td></tr>
3569
3570
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003571<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>
3572<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3573
3574Stmt has pointer identity in the AST.
3575</pre></td></tr>
3576
3577
Aaron Ballman672dde22016-01-22 23:15:00 +00003578<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003579<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3580partially matching a given regex.
3581
3582Example matches Y but not X
3583 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3584 #include "ASTMatcher.h"
3585 class X {};
3586ASTMatcher.h:
3587 class Y {};
3588
Aaron Ballman672dde22016-01-22 23:15:00 +00003589Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003590</pre></td></tr>
3591
3592
Aaron Ballman672dde22016-01-22 23:15:00 +00003593<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003594<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3595
3596Example matches X but not Y
3597 (matcher = cxxRecordDecl(isExpansionInMainFile())
3598 #include &lt;Y.h&gt;
3599 class X {};
3600Y.h:
3601 class Y {};
3602
Aaron Ballman672dde22016-01-22 23:15:00 +00003603Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003604</pre></td></tr>
3605
3606
Aaron Ballman672dde22016-01-22 23:15:00 +00003607<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003608<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3609
3610Example matches Y but not X
3611 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3612 #include &lt;SystemHeader.h&gt;
3613 class X {};
3614SystemHeader.h:
3615 class Y {};
3616
Aaron Ballman672dde22016-01-22 23:15:00 +00003617Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003618</pre></td></tr>
3619
3620
Etienne Bergeron3588be72016-05-12 04:20:04 +00003621<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>
3622<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3623
3624Given
3625 int a[42];
3626 int b[2 * 21];
3627 int c[41], d[43];
3628 char *s = "abcd";
3629 wchar_t *ws = L"abcd";
3630 char *w = "a";
3631constantArrayType(hasSize(42))
3632 matches "int a[42]" and "int b[2 * 21]"
3633stringLiteral(hasSize(4))
3634 matches "abcd", L"abcd"
3635</pre></td></tr>
3636
3637
Aaron Ballman672dde22016-01-22 23:15:00 +00003638<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 +00003639<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3640
3641Example matches A, va, fa
3642 class A {};
3643 class B; Doesn't match, as it has no body.
3644 int va;
3645 extern int vb; Doesn't match, as it doesn't define the variable.
3646 void fa() {}
3647 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003648 @interface X
3649 - (void)ma; Doesn't match, interface is declaration.
3650 @end
3651 @implementation X
3652 - (void)ma {}
3653 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003654
Dave Leebe398682017-11-14 14:17:26 +00003655Usable 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;,
3656 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003657</pre></td></tr>
3658
3659
Aaron Ballman672dde22016-01-22 23:15:00 +00003660<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003661<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3662
3663Note that 'Value' is a string as the template argument's value is
3664an arbitrary precision integer. 'Value' must be euqal to the canonical
3665representation of that integral value in base 10.
3666
3667Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003668 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003669 C&lt;42&gt; c;
3670classTemplateSpecializationDecl(
3671 hasAnyTemplateArgument(equalsIntegralValue("42")))
3672 matches the implicit instantiation of C in C&lt;42&gt;.
3673</pre></td></tr>
3674
3675
Aaron Ballman672dde22016-01-22 23:15:00 +00003676<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 +00003677<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3678
3679Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003680 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003681 C&lt;42&gt; c;
3682classTemplateSpecializationDecl(
3683 hasAnyTemplateArgument(isIntegral()))
3684 matches the implicit instantiation of C in C&lt;42&gt;
3685 with isIntegral() matching 42.
3686</pre></td></tr>
3687
3688
Aaron Ballman672dde22016-01-22 23:15:00 +00003689<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 +00003690<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3691
3692Given
3693 template&lt;typename T&gt; struct C {};
3694 C&lt;int&gt; c;
3695classTemplateSpecializationDecl(templateArgumentCountIs(1))
3696 matches C&lt;int&gt;.
3697</pre></td></tr>
3698
3699
Aaron Ballman672dde22016-01-22 23:15:00 +00003700<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 +00003701<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3702partially matching a given regex.
3703
3704Example matches Y but not X
3705 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3706 #include "ASTMatcher.h"
3707 class X {};
3708ASTMatcher.h:
3709 class Y {};
3710
Aaron Ballman672dde22016-01-22 23:15:00 +00003711Usable 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 +00003712</pre></td></tr>
3713
3714
Aaron Ballman672dde22016-01-22 23:15:00 +00003715<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 +00003716<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3717
3718Example matches X but not Y
3719 (matcher = cxxRecordDecl(isExpansionInMainFile())
3720 #include &lt;Y.h&gt;
3721 class X {};
3722Y.h:
3723 class Y {};
3724
Aaron Ballman672dde22016-01-22 23:15:00 +00003725Usable 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 +00003726</pre></td></tr>
3727
3728
Aaron Ballman672dde22016-01-22 23:15:00 +00003729<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 +00003730<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3731
3732Example matches Y but not X
3733 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3734 #include &lt;SystemHeader.h&gt;
3735 class X {};
3736SystemHeader.h:
3737 class Y {};
3738
Aaron Ballman672dde22016-01-22 23:15:00 +00003739Usable 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 +00003740</pre></td></tr>
3741
3742
Aaron Ballman672dde22016-01-22 23:15:00 +00003743<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 +00003744<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3745
3746Given
3747 struct S { bool func(); };
3748functionDecl(returns(booleanType()))
3749 matches "bool func();"
3750</pre></td></tr>
3751
3752
Aaron Ballman672dde22016-01-22 23:15:00 +00003753<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 +00003754<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3755
3756Matches a node if it equals the node previously bound to ID.
3757
3758Given
3759 class X { int a; int b; };
3760cxxRecordDecl(
3761 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3762 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3763 matches the class X, as a and b have the same type.
3764
3765Note that when multiple matches are involved via forEach* matchers,
3766equalsBoundNodes acts as a filter.
3767For example:
3768compoundStmt(
3769 forEachDescendant(varDecl().bind("d")),
3770 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3771will trigger a match for each combination of variable declaration
3772and reference to that variable declaration within a compound statement.
3773</pre></td></tr>
3774
3775
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003776<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>
3777<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3778
3779Type has pointer identity in the AST.
3780</pre></td></tr>
3781
3782
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003783<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>
3784<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3785
3786Given
3787 int i;
3788 float f;
3789realFloatingPointType()
3790 matches "float f" but not "int i"
3791</pre></td></tr>
3792
3793
Aaron Ballman672dde22016-01-22 23:15:00 +00003794<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 +00003795<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3796
3797Given
3798 struct S { void func(); };
3799functionDecl(returns(voidType()))
3800 matches "void func();"
3801</pre></td></tr>
3802
3803
Aaron Ballman672dde22016-01-22 23:15:00 +00003804<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 +00003805<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3806
3807Given
3808 int x;
3809 int s = sizeof(x) + alignof(x)
3810unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3811 matches sizeof(x)
3812</pre></td></tr>
3813
3814
Aaron Ballman672dde22016-01-22 23:15:00 +00003815<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 +00003816<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3817unary).
3818
3819Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3820 !(a || b)
3821</pre></td></tr>
3822
3823
Aaron Ballman672dde22016-01-22 23:15:00 +00003824<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 +00003825<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3826
3827Example matches x, but not y, z, or a.
3828(matcher = varDecl(hasAutomaticStorageDuration())
3829void f() {
3830 int x;
3831 static int y;
3832 thread_local int z;
3833}
3834int a;
3835</pre></td></tr>
3836
3837
Aaron Ballman672dde22016-01-22 23:15:00 +00003838<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 +00003839<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3840
3841Example matches y and z (matcher = varDecl(hasGlobalStorage())
3842void f() {
3843 int x;
3844 static int y;
3845}
3846int z;
3847</pre></td></tr>
3848
3849
Aaron Ballman672dde22016-01-22 23:15:00 +00003850<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 +00003851<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3852non-static local variable.
3853
3854Example matches x (matcher = varDecl(hasLocalStorage())
3855void f() {
3856 int x;
3857 static int y;
3858}
3859int z;
3860</pre></td></tr>
3861
3862
Aaron Ballman672dde22016-01-22 23:15:00 +00003863<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 +00003864<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 +00003865It includes the variable declared at namespace scope and those declared
3866with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003867
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003868void f() {
3869 int x;
3870 static int y;
3871 thread_local int z;
3872}
3873int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003874static int b;
3875extern int c;
3876varDecl(hasStaticStorageDuration())
3877 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003878</pre></td></tr>
3879
3880
Aaron Ballman672dde22016-01-22 23:15:00 +00003881<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 +00003882<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3883
3884Example matches z, but not x, z, or a.
3885(matcher = varDecl(hasThreadStorageDuration())
3886void f() {
3887 int x;
3888 static int y;
3889 thread_local int z;
3890}
3891int a;
3892</pre></td></tr>
3893
3894
Aaron Ballman672dde22016-01-22 23:15:00 +00003895<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>
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003896<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
3897 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003898
3899Given:
3900 constexpr int foo = 42;
3901 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003902 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003903varDecl(isConstexpr())
3904 matches the declaration of foo.
3905functionDecl(isConstexpr())
3906 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003907ifStmt(isConstexpr())
3908 matches the if statement in baz.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003909</pre></td></tr>
3910
3911
Aaron Ballman672dde22016-01-22 23:15:00 +00003912<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 +00003913<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3914
3915Example matches A, va, fa
3916 class A {};
3917 class B; Doesn't match, as it has no body.
3918 int va;
3919 extern int vb; Doesn't match, as it doesn't define the variable.
3920 void fa() {}
3921 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003922 @interface X
3923 - (void)ma; Doesn't match, interface is declaration.
3924 @end
3925 @implementation X
3926 - (void)ma {}
3927 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003928
Dave Leebe398682017-11-14 14:17:26 +00003929Usable 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;,
3930 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003931</pre></td></tr>
3932
3933
Aaron Ballman672dde22016-01-22 23:15:00 +00003934<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 +00003935<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3936a C++ catch block, or an Objective-C statement.
3937
3938Example matches x (matcher = varDecl(isExceptionVariable())
3939void f(int y) {
3940 try {
3941 } catch (int x) {
3942 }
3943}
3944</pre></td></tr>
3945
3946
Aaron Ballman672dde22016-01-22 23:15:00 +00003947<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 +00003948<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3949static member variable template instantiations.
3950
3951Given
3952 template&lt;typename T&gt; void A(T t) { }
3953 template&lt;&gt; void A(int N) { }
3954functionDecl(isExplicitTemplateSpecialization())
3955 matches the specialization A&lt;int&gt;().
3956
Aaron Ballman672dde22016-01-22 23:15:00 +00003957Usable 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 +00003958</pre></td></tr>
3959
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003960
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003961<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003962<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003963
3964Given:
3965 extern "C" void f() {}
3966 extern "C" { void g() {} }
3967 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003968 extern "C" int x = 1;
3969 extern "C" int y = 2;
3970 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003971functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003972 matches the declaration of f and g, but not the declaration of h.
3973varDecl(isExternC())
3974 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003975</pre></td></tr>
3976
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003977
Haojian Wub3d25462016-09-26 16:01:52 +00003978<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 +00003979<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3980class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003981
3982Given:
3983 static void f() {}
3984 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003985 extern int j;
3986 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003987functionDecl(isStaticStorageClass())
3988 matches the function declaration f.
3989varDecl(isStaticStorageClass())
3990 matches the variable declaration i.
3991</pre></td></tr>
3992
3993
Aaron Ballman672dde22016-01-22 23:15:00 +00003994<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 +00003995<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3996member variable template instantiations.
3997
3998Given
3999 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4000or
4001 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00004002or
4003 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004004cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4005 matches the template instantiation of X&lt;A&gt;.
4006
4007But given
4008 template &lt;typename T&gt; class X {}; class A {};
4009 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4010cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4011 does not match, as X&lt;A&gt; is an explicit template specialization.
4012
Aaron Ballman672dde22016-01-22 23:15:00 +00004013Usable 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 +00004014</pre></td></tr>
4015
4016
Aaron Ballman672dde22016-01-22 23:15:00 +00004017<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 +00004018<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4019template instantiations.
4020
4021Given
4022 template&lt;typename T&gt; void A(T t) { T i; }
4023 A(0);
4024 A(0U);
4025functionDecl(isInstantiated())
4026 matches 'A(int) {...};' and 'A(unsigned) {...}'.
4027</pre></td></tr>
4028
4029
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00004030<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>
4031<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4032GNU's __null, C++11's nullptr, or C's NULL macro.
4033
4034Given:
4035 void *v1 = NULL;
4036 void *v2 = nullptr;
4037 void *v3 = __null; GNU extension
4038 char *cp = (char *)0;
4039 int *ip = 0;
4040 int i = 0;
4041expr(nullPointerConstant())
4042 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4043 initializer for i.
4044</pre></td></tr>
4045
4046
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00004047<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>
4048<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4049
4050This matcher is only provided as a performance optimization of hasName.
4051 hasAnyName(a, b, c)
4052 is equivalent to, but faster than
4053 anyOf(hasName(a), hasName(b), hasName(c))
4054</pre></td></tr>
4055
4056
George Karpenkov88a16a02018-03-29 00:51:12 +00004057<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
4058<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4059Selector.getAsString()
4060
4061 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4062 matches both of the expressions below:
4063 [myObj methodA:argA];
4064 [myObj methodB:argB];
4065</pre></td></tr>
4066
4067
Aaron Ballman672dde22016-01-22 23:15:00 +00004068<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 +00004069<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4070
4071Given
4072 int j;
4073 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4074 A(0);
4075 A(0U);
4076declStmt(isInTemplateInstantiation())
4077 matches 'int i;' and 'unsigned i'.
4078unless(stmt(isInTemplateInstantiation()))
4079 will NOT match j += 42; as it's shared between the template definition and
4080 instantiation.
4081</pre></td></tr>
4082
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00004083<!--END_NARROWING_MATCHERS -->
4084</table>
4085
4086<!-- ======================================================================= -->
4087<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4088<!-- ======================================================================= -->
4089
4090<p>Traversal matchers specify the relationship to other nodes that are
4091reachable from the current node.</p>
4092
4093<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4094forEachDescendant) which work on all nodes and allow users to write more generic
4095match expressions.</p>
4096
4097<table>
4098<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004099<!-- START_TRAVERSAL_MATCHERS -->
4100
4101<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>
4102<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4103
4104Unlike anyOf, eachOf will generate a match result for each
4105matching submatcher.
4106
4107For example, in:
4108 class A { int a; int b; };
4109The matcher:
4110 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4111 has(fieldDecl(hasName("b")).bind("v"))))
4112will generate two results binding "v", the first of which binds
4113the field declaration of a, the second the field declaration of
4114b.
4115
4116Usable as: Any Matcher
4117</pre></td></tr>
4118
4119
4120<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4121<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4122provided matcher.
4123
Fangrui Song55942ab2018-01-22 22:34:15 +00004124Example matches X, A, A::X, B, B::C, B::C::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004125 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
Fangrui Song55942ab2018-01-22 22:34:15 +00004126 class X {};
4127 class A { class X {}; }; Matches A, because A::X is a class of name
4128 X inside A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004129 class B { class C { class X {}; }; };
4130
4131DescendantT must be an AST base type.
4132
4133As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4134each result that matches instead of only on the first one.
4135
4136Note: Recursively combined ForEachDescendant can cause many matches:
4137 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4138 forEachDescendant(cxxRecordDecl())
4139 )))
4140will match 10 times (plus injected class name matches) on:
4141 class A { class B { class C { class D { class E {}; }; }; }; };
4142
4143Usable as: Any Matcher
4144</pre></td></tr>
4145
4146
4147<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4148<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4149provided matcher.
4150
Fangrui Song55942ab2018-01-22 22:34:15 +00004151Example matches X, Y, Y::X, Z::Y, Z::Y::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004152 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
Fangrui Song55942ab2018-01-22 22:34:15 +00004153 class X {};
4154 class Y { class X {}; }; Matches Y, because Y::X is a class of name X
4155 inside Y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004156 class Z { class Y { class X {}; }; }; Does not match Z.
4157
4158ChildT must be an AST base type.
4159
4160As opposed to 'has', 'forEach' will cause a match for each result that
4161matches instead of only on the first one.
4162
4163Usable as: Any Matcher
4164</pre></td></tr>
4165
4166
4167<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4168<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4169matcher.
4170
4171Given
4172void f() { if (true) { int x = 42; } }
4173void g() { for (;;) { int x = 43; } }
4174expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4175
4176Usable as: Any Matcher
4177</pre></td></tr>
4178
4179
4180<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4181<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4182provided matcher.
4183
4184Example matches X, Y, Z
4185 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4186 class X {}; Matches X, because X::X is a class of name X inside X.
4187 class Y { class X {}; };
4188 class Z { class Y { class X {}; }; };
4189
4190DescendantT must be an AST base type.
4191
4192Usable as: Any Matcher
4193</pre></td></tr>
4194
4195
4196<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4197<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4198provided matcher.
4199
4200Example matches X, Y
4201 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4202 class X {}; Matches X, because X::X is a class of name X inside X.
4203 class Y { class X {}; };
4204 class Z { class Y { class X {}; }; }; Does not match Z.
4205
4206ChildT must be an AST base type.
4207
4208Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00004209Note that has is direct matcher, so it also matches things like implicit
4210casts and paren casts. If you are matching with expr then you should
4211probably consider using ignoringParenImpCasts like:
4212has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004213</pre></td></tr>
4214
4215
4216<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4217<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4218matcher.
4219
4220Given
4221void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4222compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4223
4224Usable as: Any Matcher
4225</pre></td></tr>
4226
4227
Etienne Bergeron5500f952016-05-30 15:25:25 +00004228<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>
4229<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4230switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004231
4232Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4233 if (true) {}
4234</pre></td></tr>
4235
4236
4237<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>
4238<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4239(binary or ternary).
4240
4241Example matches b
4242 condition ? a : b
4243 condition ?: b
4244</pre></td></tr>
4245
4246
4247<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>
4248<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4249
4250Example 1 (conditional ternary operator): matches a
4251 condition ? a : b
4252
4253Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4254 condition ?: b
4255</pre></td></tr>
4256
4257
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004258<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00004259<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 +00004260matches the given matcher.
4261
4262The associated declaration is:
4263- for type nodes, the declaration of the underlying type
4264- for CallExpr, the declaration of the callee
4265- for MemberExpr, the declaration of the referenced member
4266- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004267- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004268- for ObjCIvarExpr, the declaration of the ivar
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004269
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004270For type nodes, hasDeclaration will generally match the declaration of the
4271sugared type. Given
4272 class X {};
4273 typedef X Y;
4274 Y y;
4275in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4276typedefDecl. A common use case is to match the underlying, desugared type.
4277This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4278 varDecl(hasType(hasUnqualifiedDesugaredType(
4279 recordType(hasDeclaration(decl())))))
4280In this matcher, the decl will match the CXXRecordDecl of class X.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004281
Manuel Klimeka37e1102016-12-01 15:45:06 +00004282Usable 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;,
4283 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;,
4284 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;,
4285 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;,
4286 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;,
4287 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;,
4288 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004289</pre></td></tr>
4290
4291
Aaron Ballman672dde22016-01-22 23:15:00 +00004292<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004293<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4294
4295Given
4296 int i[5];
4297 void f() { i[1] = 42; }
4298arraySubscriptExpression(hasBase(implicitCastExpr(
4299 hasSourceExpression(declRefExpr()))))
4300 matches i[1] with the declRefExpr() matching i
4301</pre></td></tr>
4302
4303
Aaron Ballman672dde22016-01-22 23:15:00 +00004304<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004305<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4306
4307Given
4308 int i[5];
4309 void f() { i[1] = 42; }
4310arraySubscriptExpression(hasIndex(integerLiteral()))
4311 matches i[1] with the integerLiteral() matching 1
4312</pre></td></tr>
4313
4314
Aaron Ballman672dde22016-01-22 23:15:00 +00004315<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 +00004316<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4317
4318Example matches a (matcher = binaryOperator(hasLHS()))
4319 a || b
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_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 +00004324<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4325
4326Example matches b (matcher = binaryOperator(hasRHS()))
4327 a || b
4328</pre></td></tr>
4329
4330
Aaron Ballman672dde22016-01-22 23:15:00 +00004331<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 +00004332<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4333type.
4334
4335Given
4336 struct A {};
4337 A a[7];
4338 int b[7];
4339arrayType(hasElementType(builtinType()))
4340 matches "int b[7]"
4341
Aaron Ballman672dde22016-01-22 23:15:00 +00004342Usable 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 +00004343</pre></td></tr>
4344
4345
Aaron Ballman672dde22016-01-22 23:15:00 +00004346<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 +00004347<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4348type.
4349
4350Given
4351 struct A {};
4352 A a[7];
4353 int b[7];
4354arrayType(hasElementType(builtinType()))
4355 matches "int b[7]"
4356
Aaron Ballman672dde22016-01-22 23:15:00 +00004357Usable 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 +00004358</pre></td></tr>
4359
4360
Aaron Ballman672dde22016-01-22 23:15:00 +00004361<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 +00004362<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4363
4364Given
4365 _Atomic(int) i;
4366 _Atomic(float) f;
4367atomicType(hasValueType(isInteger()))
4368 matches "_Atomic(int) i"
4369
Aaron Ballman672dde22016-01-22 23:15:00 +00004370Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004371</pre></td></tr>
4372
4373
Aaron Ballman672dde22016-01-22 23:15:00 +00004374<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 +00004375<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4376
4377Given
4378 _Atomic(int) i;
4379 _Atomic(float) f;
4380atomicType(hasValueType(isInteger()))
4381 matches "_Atomic(int) i"
4382
Aaron Ballman672dde22016-01-22 23:15:00 +00004383Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004384</pre></td></tr>
4385
4386
Aaron Ballman672dde22016-01-22 23:15:00 +00004387<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 +00004388<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4389
4390Note: There is no TypeLoc for the deduced type and thus no
4391getDeducedLoc() matcher.
4392
4393Given
4394 auto a = 1;
4395 auto b = 2.0;
4396autoType(hasDeducedType(isInteger()))
4397 matches "auto a"
4398
Aaron Ballman672dde22016-01-22 23:15:00 +00004399Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004400</pre></td></tr>
4401
4402
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004403<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004404<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4405binary operator matches.
4406</pre></td></tr>
4407
4408
Aaron Ballman672dde22016-01-22 23:15:00 +00004409<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 +00004410<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4411
4412Example matches a (matcher = binaryOperator(hasLHS()))
4413 a || b
4414</pre></td></tr>
4415
4416
Aaron Ballman672dde22016-01-22 23:15:00 +00004417<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 +00004418<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4419
4420Example matches b (matcher = binaryOperator(hasRHS()))
4421 a || b
4422</pre></td></tr>
4423
4424
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00004425<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
4426<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
4427block.
4428
4429Does not match the 'this' parameter of a method.
4430
4431Given
4432 class X { void f(int x, int y, int z) {} };
4433cxxMethodDecl(hasAnyParameter(hasName("y")))
4434 matches f(int x, int y, int z) {}
4435with hasAnyParameter(...)
4436 matching int y
4437
4438For ObjectiveC, given
4439 @interface I - (void) f:(int) y; @end
4440
4441the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
4442matches the declaration of method f with hasParameter
4443matching y.
4444
4445For blocks, given
4446 b = ^(int y) { printf("%d", y) };
4447
4448the matcher blockDecl(hasAnyParameter(hasName("y")))
4449matches the declaration of the block b with hasParameter
4450matching y.
4451</pre></td></tr>
4452
4453
4454<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">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>
4455<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
4456declaration or a block.
4457
4458Given
4459 class X { void f(int x) {} };
4460cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4461 matches f(int x) {}
4462with hasParameter(...)
4463 matching int x
4464
4465For ObjectiveC, given
4466 @interface I - (void) f:(int) y; @end
4467
4468the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4469matches the declaration of method f with hasParameter
4470matching y.
4471</pre></td></tr>
4472
4473
Aaron Ballman672dde22016-01-22 23:15:00 +00004474<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004475<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4476pointee matches a given matcher.
4477
4478Given
4479 int *a;
4480 int const *b;
4481 float const *f;
4482pointerType(pointee(isConstQualified(), isInteger()))
4483 matches "int const *b"
4484
Aaron Ballman672dde22016-01-22 23:15:00 +00004485Usable 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;,
4486 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 +00004487</pre></td></tr>
4488
4489
Aaron Ballman672dde22016-01-22 23:15:00 +00004490<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004491<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4492pointee matches a given matcher.
4493
4494Given
4495 int *a;
4496 int const *b;
4497 float const *f;
4498pointerType(pointee(isConstQualified(), isInteger()))
4499 matches "int const *b"
4500
Aaron Ballman672dde22016-01-22 23:15:00 +00004501Usable 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;,
4502 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 +00004503</pre></td></tr>
4504
4505
Aaron Ballman672dde22016-01-22 23:15:00 +00004506<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 +00004507<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4508
4509Given
4510 void f(int i);
4511 int y;
4512 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004513callExpr(
4514 forEachArgumentWithParam(
4515 declRefExpr(to(varDecl(hasName("y")))),
4516 parmVarDecl(hasType(isInteger()))
4517))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004518 matches f(y);
4519with declRefExpr(...)
4520 matching int y
4521and parmVarDecl(...)
4522 matching int i
4523</pre></td></tr>
4524
4525
Aaron Ballman672dde22016-01-22 23:15:00 +00004526<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 +00004527<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
George Karpenkova763fdf2018-03-07 02:32:44 +00004528expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004529
4530Given
4531 void x(int, int, int) { int y; x(1, y, 42); }
4532callExpr(hasAnyArgument(declRefExpr()))
4533 matches x(1, y, 42)
4534with hasAnyArgument(...)
4535 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00004536
4537For ObjectiveC, given
4538 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00004539 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00004540objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4541 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004542</pre></td></tr>
4543
4544
Aaron Ballman672dde22016-01-22 23:15:00 +00004545<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 +00004546<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4547call expression.
4548
4549Example matches y in x(y)
4550 (matcher = callExpr(hasArgument(0, declRefExpr())))
4551 void x(int) { int y; x(y); }
4552</pre></td></tr>
4553
4554
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004555<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004556<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 +00004557matches the given matcher.
4558
4559The associated declaration is:
4560- for type nodes, the declaration of the underlying type
4561- for CallExpr, the declaration of the callee
4562- for MemberExpr, the declaration of the referenced member
4563- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004564- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004565- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004566
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004567For type nodes, hasDeclaration will generally match the declaration of the
4568sugared type. Given
4569 class X {};
4570 typedef X Y;
4571 Y y;
4572in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4573typedefDecl. A common use case is to match the underlying, desugared type.
4574This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4575 varDecl(hasType(hasUnqualifiedDesugaredType(
4576 recordType(hasDeclaration(decl())))))
4577In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004578
Manuel Klimeka37e1102016-12-01 15:45:06 +00004579Usable 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;,
4580 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;,
4581 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;,
4582 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;,
4583 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;,
4584 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;,
4585 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004586</pre></td></tr>
4587
4588
Aaron Ballman672dde22016-01-22 23:15:00 +00004589<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 +00004590<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4591
4592Given
4593 class A { A() : i(42), j(42) {} int i; int j; };
4594cxxConstructorDecl(forEachConstructorInitializer(
4595 forField(decl().bind("x"))
4596))
4597 will trigger two matches, binding for 'i' and 'j' respectively.
4598</pre></td></tr>
4599
4600
Aaron Ballman672dde22016-01-22 23:15:00 +00004601<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 +00004602<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4603
4604Given
4605 struct Foo {
4606 Foo() : foo_(1) { }
4607 int foo_;
4608 };
4609cxxRecordDecl(has(cxxConstructorDecl(
4610 hasAnyConstructorInitializer(anything())
4611)))
4612 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4613</pre></td></tr>
4614
4615
Aaron Ballman672dde22016-01-22 23:15:00 +00004616<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 +00004617<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4618
4619Given
4620 struct Foo {
4621 Foo() : foo_(1) { }
4622 int foo_;
4623 };
4624cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4625 forField(hasName("foo_"))))))
4626 matches Foo
4627with forField matching foo_
4628</pre></td></tr>
4629
4630
Aaron Ballman672dde22016-01-22 23:15:00 +00004631<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 +00004632<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4633
4634Given
4635 struct Foo {
4636 Foo() : foo_(1) { }
4637 int foo_;
4638 };
4639cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4640 withInitializer(integerLiteral(equals(1)))))))
4641 matches Foo
4642with withInitializer matching (1)
4643</pre></td></tr>
4644
4645
Aaron Ballman672dde22016-01-22 23:15:00 +00004646<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004647<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4648definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004649
4650Given
4651 for (;;) {}
4652hasBody(compoundStmt())
4653 matches 'for (;;) {}'
4654with compoundStmt()
4655 matching '{}'
4656</pre></td></tr>
4657
4658
Aaron Ballman672dde22016-01-22 23:15:00 +00004659<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 +00004660<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4661
4662Example:
4663 forStmt(hasLoopVariable(anything()))
4664matches 'int x' in
4665 for (int x : a) { }
4666</pre></td></tr>
4667
4668
Aaron Ballman672dde22016-01-22 23:15:00 +00004669<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 +00004670<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4671
4672Example:
4673 forStmt(hasRangeInit(anything()))
4674matches 'a' in
4675 for (int x : a) { }
4676</pre></td></tr>
4677
4678
Aaron Ballman672dde22016-01-22 23:15:00 +00004679<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 +00004680<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4681
4682
Aaron Ballman672dde22016-01-22 23:15:00 +00004683<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004684<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4685
4686Example matches y.x()
4687 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4688 class Y { public: void x(); };
Fangrui Song55942ab2018-01-22 22:34:15 +00004689 void z() { Y y; y.x(); }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004690
4691FIXME: Overload to allow directly matching types?
4692</pre></td></tr>
4693
4694
Aaron Ballman672dde22016-01-22 23:15:00 +00004695<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 +00004696<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4697</pre></td></tr>
4698
4699
Aaron Ballman672dde22016-01-22 23:15:00 +00004700<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 +00004701<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4702matcher, or is a pointer to a type that matches the InnerMatcher.
4703</pre></td></tr>
4704
4705
Clement Courbet6ecaec82016-07-05 07:49:31 +00004706<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>
Alexander Kornienko2a8c18d2018-04-06 15:14:32 +00004707<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
Clement Courbet6ecaec82016-07-05 07:49:31 +00004708produce multiple matches.
4709
4710Given
4711 class A { virtual void f(); };
4712 class B : public A { void f(); };
4713 class C : public B { void f(); };
4714cxxMethodDecl(ofClass(hasName("C")),
4715 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4716 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4717 that B::f is not overridden by C::f).
4718
4719The check can produce multiple matches in case of multiple inheritance, e.g.
4720 class A1 { virtual void f(); };
4721 class A2 { virtual void f(); };
4722 class C : public A1, public A2 { void f(); };
4723cxxMethodDecl(ofClass(hasName("C")),
4724 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4725 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4726 once with "b" binding "A2::f" and "d" binding "C::f".
4727</pre></td></tr>
4728
4729
Aaron Ballman672dde22016-01-22 23:15:00 +00004730<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 +00004731<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4732belongs to.
4733
4734FIXME: Generalize this for other kinds of declarations.
4735FIXME: What other kind of declarations would we need to generalize
4736this to?
4737
4738Example matches A() in the last line
4739 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4740 ofClass(hasName("A"))))))
4741 class A {
4742 public:
4743 A();
4744 };
4745 A a = A();
4746</pre></td></tr>
4747
4748
Adam Baloghda488a62017-11-23 12:43:20 +00004749<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4750<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
4751
4752Given:
4753 MyClass *p1 = new MyClass[10];
4754cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
4755 matches the expression 'new MyClass[10]'.
4756</pre></td></tr>
4757
4758
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004759<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00004760<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 +00004761matches the given matcher.
4762
4763The associated declaration is:
4764- for type nodes, the declaration of the underlying type
4765- for CallExpr, the declaration of the callee
4766- for MemberExpr, the declaration of the referenced member
4767- for CXXConstructExpr, the declaration of the constructor
4768- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004769- for ObjCIvarExpr, the declaration of the ivar
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004770
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004771For type nodes, hasDeclaration will generally match the declaration of the
4772sugared type. Given
4773 class X {};
4774 typedef X Y;
4775 Y y;
4776in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4777typedefDecl. A common use case is to match the underlying, desugared type.
4778This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4779 varDecl(hasType(hasUnqualifiedDesugaredType(
4780 recordType(hasDeclaration(decl())))))
4781In this matcher, the decl will match the CXXRecordDecl of class X.
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004782
Manuel Klimeka37e1102016-12-01 15:45:06 +00004783Usable 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;,
4784 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;,
4785 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;,
4786 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;,
4787 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;,
4788 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;,
4789 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004790</pre></td></tr>
4791
4792
Aaron Ballman672dde22016-01-22 23:15:00 +00004793<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 +00004794<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4795
4796Given:
4797 class A { void func(); };
4798 class B { void member(); };
4799
4800cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4801A but not B.
4802</pre></td></tr>
4803
4804
Aaron Ballman672dde22016-01-22 23:15:00 +00004805<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004806<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4807a class matching Base.
4808
4809Note that a class is not considered to be derived from itself.
4810
4811Example matches Y, Z, C (Base == hasName("X"))
4812 class X;
4813 class Y : public X {}; directly derived
4814 class Z : public Y {}; indirectly derived
4815 typedef X A;
4816 typedef A B;
4817 class C : public B {}; derived from a typedef of X
4818
4819In the following example, Bar matches isDerivedFrom(hasName("X")):
4820 class Foo;
4821 typedef Foo X;
4822 class Bar : public Foo {}; derived from a type that X is a typedef of
4823</pre></td></tr>
4824
4825
Aaron Ballman672dde22016-01-22 23:15:00 +00004826<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004827<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4828match Base.
4829</pre></td></tr>
4830
4831
Aaron Ballman672dde22016-01-22 23:15:00 +00004832<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004833<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4834given matcher.
4835
4836Example matches y.x() (matcher = callExpr(callee(
4837 cxxMethodDecl(hasName("x")))))
4838 class Y { public: void x(); };
4839 void z() { Y y; y.x(); }
4840</pre></td></tr>
4841
4842
Aaron Ballman672dde22016-01-22 23:15:00 +00004843<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 +00004844<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4845
4846Given
4847 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4848 void f() { f(); }
4849callExpr(callee(expr()))
4850 matches this-&gt;x(), x(), y.x(), f()
4851with callee(...)
4852 matching this-&gt;x, x, y.x, f respectively
4853
Aaron Ballman672dde22016-01-22 23:15:00 +00004854Note: 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 +00004855because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004856internal::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 +00004857implemented in terms of implicit casts.
4858</pre></td></tr>
4859
4860
Aaron Ballman672dde22016-01-22 23:15:00 +00004861<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 +00004862<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4863
4864Given
4865 void f(int i);
4866 int y;
4867 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004868callExpr(
4869 forEachArgumentWithParam(
4870 declRefExpr(to(varDecl(hasName("y")))),
4871 parmVarDecl(hasType(isInteger()))
4872))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004873 matches f(y);
4874with declRefExpr(...)
4875 matching int y
4876and parmVarDecl(...)
4877 matching int i
4878</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_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 +00004882<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
George Karpenkova763fdf2018-03-07 02:32:44 +00004883expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004884
4885Given
4886 void x(int, int, int) { int y; x(1, y, 42); }
4887callExpr(hasAnyArgument(declRefExpr()))
4888 matches x(1, y, 42)
4889with hasAnyArgument(...)
4890 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00004891
4892For ObjectiveC, given
4893 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00004894 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00004895objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4896 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004897</pre></td></tr>
4898
4899
Aaron Ballman672dde22016-01-22 23:15:00 +00004900<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 +00004901<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4902call expression.
4903
4904Example matches y in x(y)
4905 (matcher = callExpr(hasArgument(0, declRefExpr())))
4906 void x(int) { int y; x(y); }
4907</pre></td></tr>
4908
4909
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004910<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004911<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 +00004912matches the given matcher.
4913
4914The associated declaration is:
4915- for type nodes, the declaration of the underlying type
4916- for CallExpr, the declaration of the callee
4917- for MemberExpr, the declaration of the referenced member
4918- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004919- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004920- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004921
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004922For type nodes, hasDeclaration will generally match the declaration of the
4923sugared type. Given
4924 class X {};
4925 typedef X Y;
4926 Y y;
4927in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4928typedefDecl. A common use case is to match the underlying, desugared type.
4929This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4930 varDecl(hasType(hasUnqualifiedDesugaredType(
4931 recordType(hasDeclaration(decl())))))
4932In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004933
Manuel Klimeka37e1102016-12-01 15:45:06 +00004934Usable 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;,
4935 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;,
4936 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;,
4937 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;,
4938 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;,
4939 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;,
4940 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004941</pre></td></tr>
4942
4943
Aaron Ballman672dde22016-01-22 23:15:00 +00004944<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 +00004945<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4946extension, matches the constant given in the statement.
4947
4948Given
4949 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4950caseStmt(hasCaseConstant(integerLiteral()))
4951 matches "case 1:"
4952</pre></td></tr>
4953
4954
Aaron Ballman672dde22016-01-22 23:15:00 +00004955<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004956<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
4957or opaque value's source expression matches the given matcher.
4958
4959Example 1: matches "a string"
4960(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
4961class URL { URL(string); };
4962URL url = "a string";
4963
4964Example 2: matches 'b' (matcher =
4965opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
4966int a = b ?: 1;
4967</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004968
4969
Aaron Ballman672dde22016-01-22 23:15:00 +00004970<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 +00004971<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4972functionDecl that have at least one TemplateArgument matching the given
4973InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004974
4975Given
4976 template&lt;typename T&gt; class A {};
4977 template&lt;&gt; class A&lt;double&gt; {};
4978 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004979
Haojian Wu99e39a72016-07-29 17:30:13 +00004980 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004981 void func() { f&lt;int&gt;(); };
4982
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004983classTemplateSpecializationDecl(hasAnyTemplateArgument(
4984 refersToType(asString("int"))))
4985 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004986
4987functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4988 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004989</pre></td></tr>
4990
4991
Manuel Klimek696e5052017-08-02 13:04:44 +00004992<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>
4993<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4994
4995Given
4996 tempalate&lt;typename T&gt; class A {};
4997 typedef A&lt;int&gt; B;
4998classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4999 matches 'B' with classTemplateDecl() matching the class template
5000 declaration of 'A'.
5001</pre></td></tr>
5002
5003
Aaron Ballman672dde22016-01-22 23:15:00 +00005004<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 +00005005<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5006functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005007
5008Given
5009 template&lt;typename T, typename U&gt; class A {};
5010 A&lt;bool, int&gt; b;
5011 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005012
Fangrui Song55942ab2018-01-22 22:34:15 +00005013 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005014 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005015classTemplateSpecializationDecl(hasTemplateArgument(
5016 1, refersToType(asString("int"))))
5017 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005018
5019functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5020 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005021</pre></td></tr>
5022
5023
Aaron Ballman672dde22016-01-22 23:15:00 +00005024<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005025<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
5026type.
5027
5028Given
5029 struct A {};
5030 A a[7];
5031 int b[7];
5032arrayType(hasElementType(builtinType()))
5033 matches "int b[7]"
5034
Aaron Ballman672dde22016-01-22 23:15:00 +00005035Usable 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 +00005036</pre></td></tr>
5037
5038
Aaron Ballman672dde22016-01-22 23:15:00 +00005039<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 +00005040<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5041type.
5042
5043Given
5044 struct A {};
5045 A a[7];
5046 int b[7];
5047arrayType(hasElementType(builtinType()))
5048 matches "int b[7]"
5049
Aaron Ballman672dde22016-01-22 23:15:00 +00005050Usable 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 +00005051</pre></td></tr>
5052
5053
Aaron Ballman672dde22016-01-22 23:15:00 +00005054<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 +00005055<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 +00005056a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005057
5058Given
5059 { {}; 1+2; }
5060hasAnySubstatement(compoundStmt())
5061 matches '{ {}; 1+2; }'
5062with compoundStmt()
5063 matching '{}'
5064</pre></td></tr>
5065
5066
Aaron Ballman672dde22016-01-22 23:15:00 +00005067<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 +00005068<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5069</pre></td></tr>
5070
5071
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005072<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005073<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 +00005074matches the given matcher.
5075
5076The associated declaration is:
5077- for type nodes, the declaration of the underlying type
5078- for CallExpr, the declaration of the callee
5079- for MemberExpr, the declaration of the referenced member
5080- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005081- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005082- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005083
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005084For type nodes, hasDeclaration will generally match the declaration of the
5085sugared type. Given
5086 class X {};
5087 typedef X Y;
5088 Y y;
5089in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5090typedefDecl. A common use case is to match the underlying, desugared type.
5091This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5092 varDecl(hasType(hasUnqualifiedDesugaredType(
5093 recordType(hasDeclaration(decl())))))
5094In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005095
Manuel Klimeka37e1102016-12-01 15:45:06 +00005096Usable 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;,
5097 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;,
5098 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;,
5099 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;,
5100 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;,
5101 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;,
5102 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005103</pre></td></tr>
5104
5105
Aaron Ballman672dde22016-01-22 23:15:00 +00005106<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005107<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5108specific using shadow declaration.
5109
5110Given
5111 namespace a { void f() {} }
5112 using a::f;
5113 void g() {
5114 f(); Matches this ..
5115 a::f(); .. but not this.
5116 }
5117declRefExpr(throughUsingDecl(anything()))
5118 matches f()
5119</pre></td></tr>
5120
5121
Aaron Ballman672dde22016-01-22 23:15:00 +00005122<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 +00005123<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5124specified matcher.
5125
5126Example matches x in if(x)
5127 (matcher = declRefExpr(to(varDecl(hasName("x")))))
5128 bool x;
5129 if (x) {}
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_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 +00005134<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5135
5136Note that this does not work for global declarations because the AST
5137breaks up multiple-declaration DeclStmt's into multiple single-declaration
5138DeclStmt's.
5139Example: Given non-global declarations
5140 int a, b = 0;
5141 int c;
5142 int d = 2, e;
5143declStmt(containsDeclaration(
5144 0, varDecl(hasInitializer(anything()))))
5145 matches only 'int d = 2, e;', and
5146declStmt(containsDeclaration(1, varDecl()))
5147 matches 'int a, b = 0' as well as 'int d = 2, e;'
5148 but 'int c;' is not matched.
5149</pre></td></tr>
5150
5151
Aaron Ballman672dde22016-01-22 23:15:00 +00005152<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 +00005153<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5154
5155Given
5156 int a, b;
5157 int c;
5158declStmt(hasSingleDecl(anything()))
5159 matches 'int c;' but not 'int a, b;'.
5160</pre></td></tr>
5161
5162
Aaron Ballman672dde22016-01-22 23:15:00 +00005163<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 +00005164<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5165the inner matcher.
5166
5167Given
5168 int x;
5169declaratorDecl(hasTypeLoc(loc(asString("int"))))
5170 matches int x
5171</pre></td></tr>
5172
5173
Aaron Ballman672dde22016-01-22 23:15:00 +00005174<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 +00005175<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5176Decl, matches InnerMatcher.
5177
5178Given
5179 namespace N {
5180 namespace M {
5181 class D {};
5182 }
5183 }
5184
5185cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5186declaration of class D.
5187</pre></td></tr>
5188
5189
Jonas Tothacf83672018-07-26 13:02:05 +00005190<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5191<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5192
5193Given
5194 decltype(1) a = 1;
5195 decltype(2.0) b = 2.0;
5196decltypeType(hasUnderlyingType(isInteger()))
5197 matches "auto a"
5198
5199Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
5200</pre></td></tr>
5201
5202
Aaron Ballman672dde22016-01-22 23:15:00 +00005203<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 +00005204<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5205definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005206
5207Given
5208 for (;;) {}
5209hasBody(compoundStmt())
5210 matches 'for (;;) {}'
5211with compoundStmt()
5212 matching '{}'
5213</pre></td></tr>
5214
5215
Aaron Ballman672dde22016-01-22 23:15:00 +00005216<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 +00005217<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 +00005218switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005219
5220Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5221 if (true) {}
5222</pre></td></tr>
5223
5224
Aaron Ballman672dde22016-01-22 23:15:00 +00005225<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 +00005226<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5227matches InnerMatcher if the qualifier exists.
5228
5229Given
5230 namespace N {
5231 namespace M {
5232 class D {};
5233 }
5234 }
5235 N::M::D d;
5236
5237elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5238matches the type of the variable declaration of d.
5239</pre></td></tr>
5240
5241
Aaron Ballman672dde22016-01-22 23:15:00 +00005242<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 +00005243<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5244
5245Given
5246 namespace N {
5247 namespace M {
5248 class D {};
5249 }
5250 }
5251 N::M::D d;
5252
5253elaboratedType(namesType(recordType(
5254hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5255declaration of d.
5256</pre></td></tr>
5257
5258
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005259<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005260<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 +00005261matches the given matcher.
5262
5263The associated declaration is:
5264- for type nodes, the declaration of the underlying type
5265- for CallExpr, the declaration of the callee
5266- for MemberExpr, the declaration of the referenced member
5267- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005268- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005269- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005270
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005271For type nodes, hasDeclaration will generally match the declaration of the
5272sugared type. Given
5273 class X {};
5274 typedef X Y;
5275 Y y;
5276in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5277typedefDecl. A common use case is to match the underlying, desugared type.
5278This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5279 varDecl(hasType(hasUnqualifiedDesugaredType(
5280 recordType(hasDeclaration(decl())))))
5281In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005282
Manuel Klimeka37e1102016-12-01 15:45:06 +00005283Usable 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;,
5284 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;,
5285 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;,
5286 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;,
5287 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;,
5288 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;,
5289 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005290</pre></td></tr>
5291
5292
Aaron Ballman672dde22016-01-22 23:15:00 +00005293<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 +00005294<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5295
5296(Note: Clang's AST refers to other conversions as "casts" too, and calls
5297actual casts "explicit" casts.)
5298</pre></td></tr>
5299
5300
George Karpenkovba02bc52018-07-06 21:36:04 +00005301<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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>
5302<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 +00005303declaration's type.
5304
5305In case of a value declaration (for example a variable declaration),
5306this resolves one layer of indirection. For example, in the value
5307declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5308X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5309declaration of x.
5310
5311Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5312 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00005313 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005314 class X {};
5315 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00005316 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005317
Aaron Ballman672dde22016-01-22 23:15:00 +00005318Usable 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 +00005319</pre></td></tr>
5320
5321
Aaron Ballman672dde22016-01-22 23:15:00 +00005322<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 +00005323<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5324matcher.
5325
5326Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5327 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005328 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00005329 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005330 class X {};
5331 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005332 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00005333 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005334</pre></td></tr>
5335
5336
Aaron Ballman672dde22016-01-22 23:15:00 +00005337<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005338<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5339are stripped off.
5340
5341Parentheses and explicit casts are not discarded.
5342Given
5343 int arr[5];
5344 int a = 0;
5345 char b = 0;
5346 const int c = a;
5347 int *d = arr;
5348 long e = (long) 0l;
5349The matchers
5350 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5351 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5352would match the declarations for a, b, c, and d, but not e.
5353While
5354 varDecl(hasInitializer(integerLiteral()))
5355 varDecl(hasInitializer(declRefExpr()))
5356only match the declarations for b, c, and d.
5357</pre></td></tr>
5358
5359
Clement Courbet369e9752018-03-21 10:54:29 +00005360<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>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Cong Liu8a02efb2016-06-24 09:38:03 +00005361<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5362nodes are stripped off.
5363
5364Parentheses and explicit casts are not discarded.
5365Given
5366 class C {};
5367 C a = C();
5368 C b;
5369 C c = b;
5370The matchers
5371 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5372would match the declarations for a, b, and c.
5373While
5374 varDecl(hasInitializer(cxxConstructExpr()))
5375only match the declarations for b and c.
5376</pre></td></tr>
5377
5378
Aaron Ballman672dde22016-01-22 23:15:00 +00005379<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 +00005380<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5381casts are stripped off.
5382
5383Implicit and non-C Style casts are also discarded.
5384Given
5385 int a = 0;
5386 char b = (0);
5387 void* c = reinterpret_cast&lt;char*&gt;(0);
5388 char d = char(0);
5389The matcher
5390 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5391would match the declarations for a, b, c, and d.
5392while
5393 varDecl(hasInitializer(integerLiteral()))
5394only match the declaration for a.
5395</pre></td></tr>
5396
5397
Aaron Ballman672dde22016-01-22 23:15:00 +00005398<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 +00005399<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5400parentheses are stripped off.
5401
5402Explicit casts are not discarded.
5403Given
5404 int arr[5];
5405 int a = 0;
5406 char b = (0);
5407 const int c = a;
5408 int *d = (arr);
5409 long e = ((long) 0l);
5410The matchers
5411 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5412 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5413would match the declarations for a, b, c, and d, but not e.
5414while
5415 varDecl(hasInitializer(integerLiteral()))
5416 varDecl(hasInitializer(declRefExpr()))
5417would only match the declaration for a.
5418</pre></td></tr>
5419
5420
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00005421<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>
5422<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5423
5424Given
5425 class C {
5426 int a = 2;
5427 int b = 3;
5428 int c;
5429 };
5430fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5431 matches 'int a;' but not 'int b;'.
5432fieldDecl(hasInClassInitializer(anything()))
5433 matches 'int a;' and 'int b;' but not 'int c;'.
5434</pre></td></tr>
5435
5436
Aaron Ballman672dde22016-01-22 23:15:00 +00005437<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005438<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5439definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005440
5441Given
5442 for (;;) {}
5443hasBody(compoundStmt())
5444 matches 'for (;;) {}'
5445with compoundStmt()
5446 matching '{}'
5447</pre></td></tr>
5448
5449
Aaron Ballman672dde22016-01-22 23:15:00 +00005450<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005451<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 +00005452switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005453
5454Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5455 if (true) {}
5456</pre></td></tr>
5457
5458
Aaron Ballman672dde22016-01-22 23:15:00 +00005459<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 +00005460<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5461
5462Example:
5463 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5464matches '++x' in
5465 for (x; x &lt; N; ++x) { }
5466</pre></td></tr>
5467
5468
Aaron Ballman672dde22016-01-22 23:15:00 +00005469<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 +00005470<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5471
5472Example:
5473 forStmt(hasLoopInit(declStmt()))
5474matches 'int x = 0' in
5475 for (int x = 0; x &lt; N; ++x) { }
5476</pre></td></tr>
5477
5478
George Karpenkovba02bc52018-07-06 21:36:04 +00005479<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;</td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5480<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
5481declaration's type.
5482
5483In case of a value declaration (for example a variable declaration),
5484this resolves one layer of indirection. For example, in the value
5485declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5486X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5487declaration of x.
5488
5489Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5490 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5491 and friend class X (matcher = friendDecl(hasType("X"))
5492 class X {};
5493 void y(X &amp;x) { x; X z; }
5494 class Y { friend class X; };
5495
5496Usable 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;
5497</pre></td></tr>
5498
5499
5500<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</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>
5501<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5502matcher.
5503
5504Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5505 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5506 and U (matcher = typedefDecl(hasType(asString("int")))
5507 and friend class X (matcher = friendDecl(hasType("X"))
5508 class X {};
5509 void y(X &amp;x) { x; X z; }
5510 typedef int U;
5511 class Y { friend class X; };
5512</pre></td></tr>
5513
5514
Aaron Ballman672dde22016-01-22 23:15:00 +00005515<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>
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005516<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
5517block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005518
5519Does not match the 'this' parameter of a method.
5520
5521Given
5522 class X { void f(int x, int y, int z) {} };
5523cxxMethodDecl(hasAnyParameter(hasName("y")))
5524 matches f(int x, int y, int z) {}
5525with hasAnyParameter(...)
5526 matching int y
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005527
5528For ObjectiveC, given
5529 @interface I - (void) f:(int) y; @end
5530
5531the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5532matches the declaration of method f with hasParameter
5533matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005534
5535For blocks, given
5536 b = ^(int y) { printf("%d", y) };
5537
5538the matcher blockDecl(hasAnyParameter(hasName("y")))
5539matches the declaration of the block b with hasParameter
5540matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005541</pre></td></tr>
5542
5543
Haojian Wud898b092016-07-29 13:57:27 +00005544<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>
5545<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5546functionDecl that have at least one TemplateArgument matching the given
5547InnerMatcher.
5548
5549Given
5550 template&lt;typename T&gt; class A {};
5551 template&lt;&gt; class A&lt;double&gt; {};
5552 A&lt;int&gt; a;
5553
Haojian Wu99e39a72016-07-29 17:30:13 +00005554 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005555 void func() { f&lt;int&gt;(); };
5556
5557classTemplateSpecializationDecl(hasAnyTemplateArgument(
5558 refersToType(asString("int"))))
5559 matches the specialization A&lt;int&gt;
5560
5561functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5562 matches the specialization f&lt;int&gt;
5563</pre></td></tr>
5564
5565
Aaron Ballman672dde22016-01-22 23:15:00 +00005566<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 +00005567<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5568definition that has a given body.
5569
5570Given
5571 for (;;) {}
5572hasBody(compoundStmt())
5573 matches 'for (;;) {}'
5574with compoundStmt()
5575 matching '{}'
5576</pre></td></tr>
5577
5578
Aaron Ballman672dde22016-01-22 23:15:00 +00005579<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>
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005580<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005581declaration or a block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005582
5583Given
5584 class X { void f(int x) {} };
5585cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5586 matches f(int x) {}
5587with hasParameter(...)
5588 matching int x
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005589
5590For ObjectiveC, given
5591 @interface I - (void) f:(int) y; @end
5592
5593the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5594matches the declaration of method f with hasParameter
5595matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005596</pre></td></tr>
5597
5598
Haojian Wud898b092016-07-29 13:57:27 +00005599<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>
5600<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5601functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5602
5603Given
5604 template&lt;typename T, typename U&gt; class A {};
5605 A&lt;bool, int&gt; b;
5606 A&lt;int, bool&gt; c;
5607
Fangrui Song55942ab2018-01-22 22:34:15 +00005608 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005609 void func() { f&lt;int&gt;(); };
5610classTemplateSpecializationDecl(hasTemplateArgument(
5611 1, refersToType(asString("int"))))
5612 matches the specialization A&lt;bool, int&gt;
5613
5614functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5615 matches the specialization f&lt;int&gt;
5616</pre></td></tr>
5617
5618
Aaron Ballman672dde22016-01-22 23:15:00 +00005619<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 +00005620<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5621
5622Given:
5623 class X { int f() { return 1; } };
5624cxxMethodDecl(returns(asString("int")))
5625 matches int f() { return 1; }
5626</pre></td></tr>
5627
5628
Aaron Ballman672dde22016-01-22 23:15:00 +00005629<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 +00005630<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 +00005631switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005632
5633Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5634 if (true) {}
5635</pre></td></tr>
5636
5637
Aaron Ballman672dde22016-01-22 23:15:00 +00005638<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 +00005639<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5640
5641Given
5642 if (A* a = GetAPointer()) {}
5643hasConditionVariableStatement(...)
5644 matches 'A* a = GetAPointer()'.
5645</pre></td></tr>
5646
5647
Aaron Ballman672dde22016-01-22 23:15:00 +00005648<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 +00005649<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5650
5651Examples matches the if statement
5652 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5653 if (false) false; else true;
5654</pre></td></tr>
5655
5656
Aaron Ballman672dde22016-01-22 23:15:00 +00005657<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 +00005658<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5659
5660Examples matches the if statement
5661 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5662 if (false) true; else false;
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_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 +00005667<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5668matcher.
5669
5670FIXME: Unit test this matcher
5671</pre></td></tr>
5672
5673
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005674<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>
5675<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5676(if expression have it).
5677</pre></td></tr>
5678
5679
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005680<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005681<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5682matches the given matcher.
5683
5684The associated declaration is:
5685- for type nodes, the declaration of the underlying type
5686- for CallExpr, the declaration of the callee
5687- for MemberExpr, the declaration of the referenced member
5688- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005689- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005690- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005691
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005692For type nodes, hasDeclaration will generally match the declaration of the
5693sugared type. Given
5694 class X {};
5695 typedef X Y;
5696 Y y;
5697in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5698typedefDecl. A common use case is to match the underlying, desugared type.
5699This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5700 varDecl(hasType(hasUnqualifiedDesugaredType(
5701 recordType(hasDeclaration(decl())))))
5702In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005703
Manuel Klimeka37e1102016-12-01 15:45:06 +00005704Usable 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;,
5705 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;,
5706 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;,
5707 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;,
5708 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;,
5709 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;,
5710 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5711</pre></td></tr>
5712
5713
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005714<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005715<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5716matches the given matcher.
5717
5718The associated declaration is:
5719- for type nodes, the declaration of the underlying type
5720- for CallExpr, the declaration of the callee
5721- for MemberExpr, the declaration of the referenced member
5722- for CXXConstructExpr, the declaration of the constructor
5723- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005724- for ObjCIvarExpr, the declaration of the ivar
Manuel Klimeka37e1102016-12-01 15:45:06 +00005725
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005726For type nodes, hasDeclaration will generally match the declaration of the
5727sugared type. Given
5728 class X {};
5729 typedef X Y;
5730 Y y;
5731in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5732typedefDecl. A common use case is to match the underlying, desugared type.
5733This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5734 varDecl(hasType(hasUnqualifiedDesugaredType(
5735 recordType(hasDeclaration(decl())))))
5736In this matcher, the decl will match the CXXRecordDecl of class X.
Manuel Klimeka37e1102016-12-01 15:45:06 +00005737
5738Usable 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;,
5739 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;,
5740 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;,
5741 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;,
5742 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;,
5743 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;,
5744 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005745</pre></td></tr>
5746
5747
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005748<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005749<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5750matches the given matcher.
5751
5752The associated declaration is:
5753- for type nodes, the declaration of the underlying type
5754- for CallExpr, the declaration of the callee
5755- for MemberExpr, the declaration of the referenced member
5756- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005757- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005758- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005759
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005760For type nodes, hasDeclaration will generally match the declaration of the
5761sugared type. Given
5762 class X {};
5763 typedef X Y;
5764 Y y;
5765in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5766typedefDecl. A common use case is to match the underlying, desugared type.
5767This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5768 varDecl(hasType(hasUnqualifiedDesugaredType(
5769 recordType(hasDeclaration(decl())))))
5770In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005771
Manuel Klimeka37e1102016-12-01 15:45:06 +00005772Usable 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;,
5773 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;,
5774 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;,
5775 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;,
5776 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;,
5777 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;,
5778 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005779</pre></td></tr>
5780
5781
Aaron Ballman672dde22016-01-22 23:15:00 +00005782<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 +00005783<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5784matched by a given matcher.
5785
5786Given
5787 struct X { int m; };
5788 void f(X x) { x.m; m; }
5789memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5790 matches "x.m" and "m"
5791with hasObjectExpression(...)
5792 matching "x" and the implicit object expression of "m" which has type X*.
5793</pre></td></tr>
5794
5795
Aaron Ballman672dde22016-01-22 23:15:00 +00005796<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005797<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5798given matcher.
5799
5800Given
5801 struct { int first, second; } first, second;
5802 int i(second.first);
5803 int j(first.second);
5804memberExpr(member(hasName("first")))
5805 matches second.first
5806 but not first.second (because the member name there is "second").
5807</pre></td></tr>
5808
5809
Aaron Ballman672dde22016-01-22 23:15:00 +00005810<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005811<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5812pointee matches a given matcher.
5813
5814Given
5815 int *a;
5816 int const *b;
5817 float const *f;
5818pointerType(pointee(isConstQualified(), isInteger()))
5819 matches "int const *b"
5820
Aaron Ballman672dde22016-01-22 23:15:00 +00005821Usable 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;,
5822 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 +00005823</pre></td></tr>
5824
5825
Aaron Ballman672dde22016-01-22 23:15:00 +00005826<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 +00005827<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5828pointee matches a given matcher.
5829
5830Given
5831 int *a;
5832 int const *b;
5833 float const *f;
5834pointerType(pointee(isConstQualified(), isInteger()))
5835 matches "int const *b"
5836
Aaron Ballman672dde22016-01-22 23:15:00 +00005837Usable 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;,
5838 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 +00005839</pre></td></tr>
5840
5841
Martin Bohme8cef2c22016-08-09 15:07:52 +00005842<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>
5843<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5844matcher.
5845
5846Given
5847 namespace N { template&lt;class T&gt; void f(T t); }
5848 template &lt;class T&gt; void g() { using N::f; f(T()); }
5849unresolvedLookupExpr(hasAnyDeclaration(
5850 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5851 matches the use of f in g() .
5852</pre></td></tr>
5853
5854
Aaron Ballman672dde22016-01-22 23:15:00 +00005855<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 +00005856<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5857
5858Given
5859 struct A { struct B { struct C {}; }; };
5860 A::B::C c;
5861nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5862 matches "A::"
5863</pre></td></tr>
5864
5865
Aaron Ballman672dde22016-01-22 23:15:00 +00005866<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 +00005867<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5868given TypeLoc.
5869
5870Given
5871 struct A { struct B { struct C {}; }; };
5872 A::B::C c;
5873nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5874 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5875 matches "A::"
5876</pre></td></tr>
5877
5878
Aaron Ballman672dde22016-01-22 23:15:00 +00005879<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 +00005880<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5881
5882Given
5883 struct A { struct B { struct C {}; }; };
5884 A::B::C c;
5885nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5886 matches "A::"
5887</pre></td></tr>
5888
5889
Aaron Ballman672dde22016-01-22 23:15:00 +00005890<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 +00005891<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5892given namespace matcher.
5893
5894Given
5895 namespace ns { struct A {}; }
5896 ns::A a;
5897nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5898 matches "ns::"
5899</pre></td></tr>
5900
5901
Aaron Ballman672dde22016-01-22 23:15:00 +00005902<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 +00005903<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5904given QualType matcher without qualifiers.
5905
5906Given
5907 struct A { struct B { struct C {}; }; };
5908 A::B::C c;
5909nestedNameSpecifier(specifiesType(
5910 hasDeclaration(cxxRecordDecl(hasName("A")))
5911))
5912 matches "A::"
5913</pre></td></tr>
5914
5915
George Karpenkova763fdf2018-03-07 02:32:44 +00005916<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5917<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5918expression, or an ObjC-message-send expression.
5919
5920Given
5921 void x(int, int, int) { int y; x(1, y, 42); }
5922callExpr(hasAnyArgument(declRefExpr()))
5923 matches x(1, y, 42)
5924with hasAnyArgument(...)
5925 matching y
5926
5927For ObjectiveC, given
5928 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00005929 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00005930objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5931 matches [i f:12]
5932</pre></td></tr>
5933
5934
Aaron Ballman672dde22016-01-22 23:15:00 +00005935<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 +00005936<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5937call expression.
5938
5939Example matches y in x(y)
5940 (matcher = callExpr(hasArgument(0, declRefExpr())))
5941 void x(int) { int y; x(y); }
5942</pre></td></tr>
5943
5944
George Karpenkovb5ea4df2018-07-16 20:22:12 +00005945<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5946<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
5947and the inner matcher matches on that instance.
5948
5949For example the method call in
5950 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00005951 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00005952is matched by
5953objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
5954</pre></td></tr>
5955
5956
Aaron Ballman672dde22016-01-22 23:15:00 +00005957<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 +00005958<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5959
5960Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005961matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005962matches the [webView ...] message invocation.
5963 NSString *webViewJavaScript = ...
5964 UIWebView *webView = ...
5965 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5966</pre></td></tr>
5967
5968
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005969<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005970<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
5971block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005972
5973Does not match the 'this' parameter of a method.
5974
5975Given
5976 class X { void f(int x, int y, int z) {} };
5977cxxMethodDecl(hasAnyParameter(hasName("y")))
5978 matches f(int x, int y, int z) {}
5979with hasAnyParameter(...)
5980 matching int y
5981
5982For ObjectiveC, given
5983 @interface I - (void) f:(int) y; @end
5984
5985the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5986matches the declaration of method f with hasParameter
5987matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005988
5989For blocks, given
5990 b = ^(int y) { printf("%d", y) };
5991
5992the matcher blockDecl(hasAnyParameter(hasName("y")))
5993matches the declaration of the block b with hasParameter
5994matching y.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005995</pre></td></tr>
5996
5997
5998<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">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>
5999<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00006000declaration or a block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006001
6002Given
6003 class X { void f(int x) {} };
6004cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6005 matches f(int x) {}
6006with hasParameter(...)
6007 matching int x
6008
6009For ObjectiveC, given
6010 @interface I - (void) f:(int) y; @end
6011
6012the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6013matches the declaration of method f with hasParameter
6014matching y.
6015</pre></td></tr>
6016
6017
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006018<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006019<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
6020or opaque value's source expression matches the given matcher.
6021
6022Example 1: matches "a string"
6023(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6024class URL { URL(string); };
6025URL url = "a string";
6026
6027Example 2: matches 'b' (matcher =
6028opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6029int a = b ?: 1;
6030</pre></td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006031
6032
Martin Bohme8cef2c22016-08-09 15:07:52 +00006033<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>
6034<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6035overloads matches the given matcher.
6036
6037Given
6038 template &lt;typename T&gt; void foo(T);
6039 template &lt;typename T&gt; void bar(T);
6040 template &lt;typename T&gt; void baz(T t) {
6041 foo(t);
6042 bar(t);
6043 }
6044unresolvedLookupExpr(hasAnyDeclaration(
6045 functionTemplateDecl(hasName("foo"))))
6046 matches foo in foo(t); but not bar in bar(t);
6047</pre></td></tr>
6048
6049
Aaron Ballman672dde22016-01-22 23:15:00 +00006050<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 +00006051<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6052
6053Given
6054 int (*ptr_to_array)[4];
6055 int (*ptr_to_func)(int);
6056
6057varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6058ptr_to_func but not ptr_to_array.
6059
Aaron Ballman672dde22016-01-22 23:15:00 +00006060Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006061</pre></td></tr>
6062
6063
Aaron Ballman672dde22016-01-22 23:15:00 +00006064<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00006065<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
6066pointee matches a given matcher.
6067
6068Given
6069 int *a;
6070 int const *b;
6071 float const *f;
6072pointerType(pointee(isConstQualified(), isInteger()))
6073 matches "int const *b"
6074
Aaron Ballman672dde22016-01-22 23:15:00 +00006075Usable 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;,
6076 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 +00006077</pre></td></tr>
6078
6079
Aaron Ballman672dde22016-01-22 23:15:00 +00006080<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 +00006081<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6082pointee matches a given matcher.
6083
6084Given
6085 int *a;
6086 int const *b;
6087 float const *f;
6088pointerType(pointee(isConstQualified(), isInteger()))
6089 matches "int const *b"
6090
Aaron Ballman672dde22016-01-22 23:15:00 +00006091Usable 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;,
6092 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 +00006093</pre></td></tr>
6094
6095
Aaron Ballman672dde22016-01-22 23:15:00 +00006096<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 +00006097<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
6098
6099Given:
6100 typedef int &amp;int_ref;
6101 int a;
6102 int_ref b = a;
6103
6104varDecl(hasType(qualType(referenceType()))))) will not match the
6105declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
6106</pre></td></tr>
6107
6108
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006109<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006110<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
6111matches the given matcher.
6112
6113The associated declaration is:
6114- for type nodes, the declaration of the underlying type
6115- for CallExpr, the declaration of the callee
6116- for MemberExpr, the declaration of the referenced member
6117- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006118- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006119- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006120
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006121For type nodes, hasDeclaration will generally match the declaration of the
6122sugared type. Given
6123 class X {};
6124 typedef X Y;
6125 Y y;
6126in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6127typedefDecl. A common use case is to match the underlying, desugared type.
6128This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6129 varDecl(hasType(hasUnqualifiedDesugaredType(
6130 recordType(hasDeclaration(decl())))))
6131In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006132
Manuel Klimeka37e1102016-12-01 15:45:06 +00006133Usable 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;,
6134 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;,
6135 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;,
6136 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;,
6137 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;,
6138 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;,
6139 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006140</pre></td></tr>
6141
6142
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00006143<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>
6144<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
6145
6146Given
6147 void (*fp)(void);
6148The matcher
6149 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
6150would match the declaration for fp.
6151</pre></td></tr>
6152
6153
Aaron Ballman672dde22016-01-22 23:15:00 +00006154<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 +00006155<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
6156</pre></td></tr>
6157
6158
Aaron Ballman672dde22016-01-22 23:15:00 +00006159<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 +00006160<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
6161matches the specified matcher.
6162
6163Example matches y-&gt;x()
6164 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
6165 cxxRecordDecl(hasName("Y")))))))
6166 class Y { public: void x(); };
6167 void z() { Y *y; y-&gt;x(); }
6168</pre></td></tr>
6169
6170
Aaron Ballman672dde22016-01-22 23:15:00 +00006171<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 +00006172<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
6173</pre></td></tr>
6174
6175
Aaron Ballman672dde22016-01-22 23:15:00 +00006176<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 +00006177<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
6178type matches the specified matcher.
6179
6180Example matches X &amp;x and const X &amp;y
6181 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
6182 class X {
6183 void a(X b) {
6184 X &amp;x = b;
6185 const X &amp;y = b;
6186 }
6187 };
6188</pre></td></tr>
6189
6190
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006191<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006192<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
6193matches the given matcher.
6194
6195The associated declaration is:
6196- for type nodes, the declaration of the underlying type
6197- for CallExpr, the declaration of the callee
6198- for MemberExpr, the declaration of the referenced member
6199- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006200- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006201- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006202
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006203For type nodes, hasDeclaration will generally match the declaration of the
6204sugared type. Given
6205 class X {};
6206 typedef X Y;
6207 Y y;
6208in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6209typedefDecl. A common use case is to match the underlying, desugared type.
6210This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6211 varDecl(hasType(hasUnqualifiedDesugaredType(
6212 recordType(hasDeclaration(decl())))))
6213In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006214
Manuel Klimeka37e1102016-12-01 15:45:06 +00006215Usable 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;,
6216 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;,
6217 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;,
6218 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;,
6219 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;,
6220 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;,
6221 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006222</pre></td></tr>
6223
6224
Aaron Ballman672dde22016-01-22 23:15:00 +00006225<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 +00006226<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
6227pointee matches a given matcher.
6228
6229Given
6230 int *a;
6231 int const *b;
6232 float const *f;
6233pointerType(pointee(isConstQualified(), isInteger()))
6234 matches "int const *b"
6235
Aaron Ballman672dde22016-01-22 23:15:00 +00006236Usable 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;,
6237 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 +00006238</pre></td></tr>
6239
6240
Aaron Ballman672dde22016-01-22 23:15:00 +00006241<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 +00006242<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
6243pointee matches a given matcher.
6244
6245Given
6246 int *a;
6247 int const *b;
6248 float const *f;
6249pointerType(pointee(isConstQualified(), isInteger()))
6250 matches "int const *b"
6251
Aaron Ballman672dde22016-01-22 23:15:00 +00006252Usable 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;,
6253 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 +00006254</pre></td></tr>
6255
6256
Alexander Kornienko976921d2016-03-22 11:03:03 +00006257<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>
6258<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
6259
6260Given
6261 return a + b;
6262hasReturnValue(binaryOperator())
6263 matches 'return a + b'
6264with binaryOperator()
6265 matching 'a + b'
6266</pre></td></tr>
6267
6268
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006269<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>
6270<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
6271a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6272
6273Given
6274 { {}; 1+2; }
6275hasAnySubstatement(compoundStmt())
6276 matches '{ {}; 1+2; }'
6277with compoundStmt()
6278 matching '{}'
6279</pre></td></tr>
6280
6281
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006282<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006283<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6284alignof.
6285</pre></td></tr>
6286
6287
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00006288<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 +00006289<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 +00006290
6291Given:
6292F&amp; operator=(const F&amp; o) {
6293 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
6294 return *this;
6295}
6296returnStmt(forFunction(hasName("operator=")))
6297 matches 'return *this'
6298 but does match 'return &gt; 0'
6299</pre></td></tr>
6300
6301
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006302<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006303<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6304sizeof.
6305</pre></td></tr>
6306
6307
Malcolm Parsons77f039b2016-12-08 11:46:22 +00006308<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>
6309<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
6310type that matches the provided matcher.
6311
6312Given
6313 template &lt;typename T&gt;
6314 double F(T t);
6315 int i;
6316 double j = F(i);
6317
6318substTemplateTypeParmType(hasReplacementType(type())) matches int
6319</pre></td></tr>
6320
6321
Aaron Ballman672dde22016-01-22 23:15:00 +00006322<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 +00006323<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
6324statement. This matcher may produce multiple matches.
6325
6326Given
6327 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
6328switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
6329 matches four times, with "c" binding each of "case 1:", "case 2:",
6330"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
6331"switch (1)", "switch (2)" and "switch (2)".
6332</pre></td></tr>
6333
6334
Etienne Bergeron5500f952016-05-30 15:25:25 +00006335<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>
6336<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
6337switch statement or conditional operator.
6338
6339Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6340 if (true) {}
6341</pre></td></tr>
6342
6343
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006344<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006345<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
6346matches the given matcher.
6347
6348The associated declaration is:
6349- for type nodes, the declaration of the underlying type
6350- for CallExpr, the declaration of the callee
6351- for MemberExpr, the declaration of the referenced member
6352- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006353- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006354- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006355
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006356For type nodes, hasDeclaration will generally match the declaration of the
6357sugared type. Given
6358 class X {};
6359 typedef X Y;
6360 Y y;
6361in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6362typedefDecl. A common use case is to match the underlying, desugared type.
6363This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6364 varDecl(hasType(hasUnqualifiedDesugaredType(
6365 recordType(hasDeclaration(decl())))))
6366In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006367
Manuel Klimeka37e1102016-12-01 15:45:06 +00006368Usable 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;,
6369 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;,
6370 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;,
6371 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;,
6372 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;,
6373 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;,
6374 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006375</pre></td></tr>
6376
6377
Aaron Ballman672dde22016-01-22 23:15:00 +00006378<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 +00006379<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6380
6381Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006382 struct B { int next; };
6383 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006384 A&lt;&amp;B::next&gt; a;
6385templateSpecializationType(hasAnyTemplateArgument(
6386 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6387 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6388 B::next
6389</pre></td></tr>
6390
6391
Aaron Ballman672dde22016-01-22 23:15:00 +00006392<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 +00006393<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6394declaration.
6395
6396Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006397 struct B { int next; };
6398 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006399 A&lt;&amp;B::next&gt; a;
6400classTemplateSpecializationDecl(hasAnyTemplateArgument(
Fangrui Song55942ab2018-01-22 22:34:15 +00006401 refersToDeclaration(fieldDecl(hasName("next")))))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006402 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6403 B::next
6404</pre></td></tr>
6405
6406
Aaron Ballman672dde22016-01-22 23:15:00 +00006407<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 +00006408<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6409
6410Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006411 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006412 C&lt;42&gt; c;
6413classTemplateSpecializationDecl(
6414 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6415 matches the implicit instantiation of C in C&lt;42&gt;.
6416</pre></td></tr>
6417
6418
Haojian Wub33b02e2016-07-29 15:45:11 +00006419<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>
6420<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6421
6422Given
6423 template&lt;template &lt;typename&gt; class S&gt; class X {};
6424 template&lt;typename T&gt; class Y {};"
6425 X&lt;Y&gt; xi;
6426classTemplateSpecializationDecl(hasAnyTemplateArgument(
6427 refersToTemplate(templateName())))
6428 matches the specialization X&lt;Y&gt;
6429</pre></td></tr>
6430
6431
Aaron Ballman672dde22016-01-22 23:15:00 +00006432<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 +00006433<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6434
6435Given
6436 struct X {};
6437 template&lt;typename T&gt; struct A {};
6438 A&lt;X&gt; a;
6439classTemplateSpecializationDecl(hasAnyTemplateArgument(
6440 refersToType(class(hasName("X")))))
6441 matches the specialization A&lt;X&gt;
6442</pre></td></tr>
6443
6444
Aaron Ballman672dde22016-01-22 23:15:00 +00006445<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 +00006446<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6447functionDecl that have at least one TemplateArgument matching the given
6448InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006449
6450Given
6451 template&lt;typename T&gt; class A {};
6452 template&lt;&gt; class A&lt;double&gt; {};
6453 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00006454
Haojian Wu99e39a72016-07-29 17:30:13 +00006455 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00006456 void func() { f&lt;int&gt;(); };
6457
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006458classTemplateSpecializationDecl(hasAnyTemplateArgument(
6459 refersToType(asString("int"))))
6460 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006461
6462functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6463 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006464</pre></td></tr>
6465
6466
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006467<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006468<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6469matches the given matcher.
6470
6471The associated declaration is:
6472- for type nodes, the declaration of the underlying type
6473- for CallExpr, the declaration of the callee
6474- for MemberExpr, the declaration of the referenced member
6475- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006476- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006477- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006478
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006479For type nodes, hasDeclaration will generally match the declaration of the
6480sugared type. Given
6481 class X {};
6482 typedef X Y;
6483 Y y;
6484in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6485typedefDecl. A common use case is to match the underlying, desugared type.
6486This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6487 varDecl(hasType(hasUnqualifiedDesugaredType(
6488 recordType(hasDeclaration(decl())))))
6489In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006490
Manuel Klimeka37e1102016-12-01 15:45:06 +00006491Usable 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;,
6492 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;,
6493 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;,
6494 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;,
6495 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;,
6496 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;,
6497 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006498</pre></td></tr>
6499
6500
Aaron Ballman672dde22016-01-22 23:15:00 +00006501<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 +00006502<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6503functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006504
6505Given
6506 template&lt;typename T, typename U&gt; class A {};
6507 A&lt;bool, int&gt; b;
6508 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00006509
Fangrui Song55942ab2018-01-22 22:34:15 +00006510 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00006511 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006512classTemplateSpecializationDecl(hasTemplateArgument(
6513 1, refersToType(asString("int"))))
6514 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006515
6516functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6517 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006518</pre></td></tr>
6519
6520
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006521<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006522<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
6523matches the given matcher.
6524
6525The associated declaration is:
6526- for type nodes, the declaration of the underlying type
6527- for CallExpr, the declaration of the callee
6528- for MemberExpr, the declaration of the referenced member
6529- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006530- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006531- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006532
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006533For type nodes, hasDeclaration will generally match the declaration of the
6534sugared type. Given
6535 class X {};
6536 typedef X Y;
6537 Y y;
6538in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6539typedefDecl. A common use case is to match the underlying, desugared type.
6540This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6541 varDecl(hasType(hasUnqualifiedDesugaredType(
6542 recordType(hasDeclaration(decl())))))
6543In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006544
Manuel Klimeka37e1102016-12-01 15:45:06 +00006545Usable 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;,
6546 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;,
6547 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;,
6548 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;,
6549 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;,
6550 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;,
6551 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006552</pre></td></tr>
6553
6554
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006555<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher&lt;T&gt; Matcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006556<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
6557
6558Generates results for each match.
6559
6560For example, in:
6561 class A { class B {}; class C {}; };
6562The matcher:
6563 cxxRecordDecl(hasName("::A"),
6564 findAll(cxxRecordDecl(isDefinition()).bind("m")))
6565will generate results for A, B and C.
6566
6567Usable as: Any Matcher
6568</pre></td></tr>
6569
6570
George Karpenkovba02bc52018-07-06 21:36:04 +00006571<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</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>
6572<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006573matcher.
6574
6575Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6576 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6577 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00006578 and friend class X (matcher = friendDecl(hasType("X"))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006579 class X {};
6580 void y(X &amp;x) { x; X z; }
6581 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00006582 class Y { friend class X; };
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006583</pre></td></tr>
6584
6585
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006586<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006587<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6588matches the given matcher.
6589
6590The associated declaration is:
6591- for type nodes, the declaration of the underlying type
6592- for CallExpr, the declaration of the callee
6593- for MemberExpr, the declaration of the referenced member
6594- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006595- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006596- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006597
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006598For type nodes, hasDeclaration will generally match the declaration of the
6599sugared type. Given
6600 class X {};
6601 typedef X Y;
6602 Y y;
6603in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6604typedefDecl. A common use case is to match the underlying, desugared type.
6605This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6606 varDecl(hasType(hasUnqualifiedDesugaredType(
6607 recordType(hasDeclaration(decl())))))
6608In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006609
Manuel Klimeka37e1102016-12-01 15:45:06 +00006610Usable 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;,
6611 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;,
6612 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;,
6613 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;,
6614 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;,
6615 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;,
6616 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6617</pre></td></tr>
6618
6619
6620<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>
6621<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
6622type of the matched node.
6623
6624For example, in:
6625 class A {};
6626 using B = A;
George Karpenkovdaac52c2018-07-23 22:29:10 +00006627The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
Manuel Klimeka37e1102016-12-01 15:45:06 +00006628both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006629</pre></td></tr>
6630
6631
Aaron Ballman672dde22016-01-22 23:15:00 +00006632<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 +00006633<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
6634
6635Given
6636 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
6637unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
6638 matches sizeof(a) and alignof(c)
6639</pre></td></tr>
6640
6641
Aaron Ballman672dde22016-01-22 23:15:00 +00006642<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 +00006643<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
6644
6645Example matches true (matcher = hasUnaryOperand(
6646 cxxBoolLiteral(equals(true))))
6647 !true
6648</pre></td></tr>
6649
6650
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006651<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006652<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
6653matches the given matcher.
6654
6655The associated declaration is:
6656- for type nodes, the declaration of the underlying type
6657- for CallExpr, the declaration of the callee
6658- for MemberExpr, the declaration of the referenced member
6659- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006660- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006661- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006662
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006663For type nodes, hasDeclaration will generally match the declaration of the
6664sugared type. Given
6665 class X {};
6666 typedef X Y;
6667 Y y;
6668in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6669typedefDecl. A common use case is to match the underlying, desugared type.
6670This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6671 varDecl(hasType(hasUnqualifiedDesugaredType(
6672 recordType(hasDeclaration(decl())))))
6673In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006674
Manuel Klimeka37e1102016-12-01 15:45:06 +00006675Usable 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;,
6676 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;,
6677 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;,
6678 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;,
6679 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;,
6680 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;,
6681 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006682</pre></td></tr>
6683
6684
Aaron Ballman672dde22016-01-22 23:15:00 +00006685<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 +00006686<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6687
6688Given
6689 namespace X { void b(); }
6690 using X::b;
6691usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6692 matches using X::b </pre></td></tr>
6693
6694
Aaron Ballman672dde22016-01-22 23:15:00 +00006695<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 +00006696<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
6697matched by the given matcher.
6698
6699Given
6700 namespace X { int a; void b(); }
6701 using X::a;
6702 using X::b;
6703usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6704 matches using X::b but not using X::a </pre></td></tr>
6705
6706
George Karpenkovba02bc52018-07-06 21:36:04 +00006707<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
6708<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006709declaration's type.
6710
6711In case of a value declaration (for example a variable declaration),
6712this resolves one layer of indirection. For example, in the value
6713declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6714X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6715declaration of x.
6716
6717Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6718 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00006719 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006720 class X {};
6721 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00006722 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006723
Aaron Ballman672dde22016-01-22 23:15:00 +00006724Usable 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 +00006725</pre></td></tr>
6726
6727
George Karpenkovba02bc52018-07-06 21:36:04 +00006728<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
6729<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006730matcher.
6731
6732Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6733 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006734 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00006735 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006736 class X {};
6737 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006738 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00006739 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006740</pre></td></tr>
6741
6742
Aaron Ballman672dde22016-01-22 23:15:00 +00006743<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 +00006744<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6745that matches the given matcher.
6746
6747Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6748 bool y() { return true; }
6749 bool x = y();
6750</pre></td></tr>
6751
6752
Aaron Ballman672dde22016-01-22 23:15:00 +00006753<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 +00006754<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6755expression.
6756
6757Given
6758 void f(int b) {
6759 int a[b];
6760 }
6761variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6762 varDecl(hasName("b")))))))
6763 matches "int a[b]"
6764</pre></td></tr>
6765
6766
Aaron Ballman672dde22016-01-22 23:15:00 +00006767<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 +00006768<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6769definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006770
6771Given
6772 for (;;) {}
6773hasBody(compoundStmt())
6774 matches 'for (;;) {}'
6775with compoundStmt()
6776 matching '{}'
6777</pre></td></tr>
6778
6779
Aaron Ballman672dde22016-01-22 23:15:00 +00006780<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 +00006781<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 +00006782switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006783
6784Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6785 if (true) {}
6786</pre></td></tr>
6787
6788
Aaron Ballman672dde22016-01-22 23:15:00 +00006789<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 +00006790<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6791NestedNameSpecifier-matcher matches.
6792</pre></td></tr>
6793
6794
Aaron Ballman672dde22016-01-22 23:15:00 +00006795<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 +00006796<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6797QualType-matcher matches.
6798</pre></td></tr>
6799
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006800<!--END_TRAVERSAL_MATCHERS -->
6801</table>
6802
6803</div>
6804</body>
6805</html>
6806
6807