blob: e8335d95e1ba52fb82af380c9b8f4c6ea57fa58c [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
Aaron Ballman672dde22016-01-22 23:15:00 +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('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 +00001271<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1272
1273The innermost message send invokes the "alloc" class method on the
1274NSString class, while the outermost message send invokes the
1275"initWithString" instance method on the object returned from
1276NSString's "alloc". This matcher should match both message sends.
1277 [[NSString alloc] initWithString:@"Hello"]
1278</pre></td></tr>
1279
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001280
Dave Lee0934fdc2017-11-11 22:46:15 +00001281<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 +00001282<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
Dave Lee0934fdc2017-11-11 22:46:15 +00001283
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001284Example matches @throw obj;
Dave Lee0934fdc2017-11-11 22:46:15 +00001285</pre></td></tr>
1286
1287
1288<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>
1289<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1290
1291Example matches @try
1292 @try {}
1293 @catch (...) {}
1294</pre></td></tr>
1295
1296
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001297<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>
1298<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1299to reference another expressions and can be met
1300in BinaryConditionalOperators, for example.
1301
1302Example matches 'a'
1303 (a ?: c) + 42;
1304</pre></td></tr>
1305
1306
Aaron Ballman672dde22016-01-22 23:15:00 +00001307<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 +00001308<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1309
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001310Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001311 int foo() { return 1; }
1312 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001313</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001314
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001315
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001316<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>
1317<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1318ParenListExprs don't have a predefined type and are used for late parsing.
1319In the final AST, they can be met in template declarations.
1320
1321Given
1322 template&lt;typename T&gt; class X {
1323 void f() {
1324 X x(*this);
1325 int a = 0, b = 1; int i = (a, b);
1326 }
1327 };
1328parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1329has a predefined type and is a ParenExpr, not a ParenListExpr.
1330</pre></td></tr>
1331
1332
1333<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>
1334<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1335
1336Example: Matches __func__
1337 printf("%s", __func__);
1338</pre></td></tr>
1339
1340
Aaron Ballman672dde22016-01-22 23:15:00 +00001341<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 +00001342<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1343
1344Given
1345 return 1;
1346returnStmt()
1347 matches 'return 1'
1348</pre></td></tr>
1349
1350
Aaron Ballman672dde22016-01-22 23:15:00 +00001351<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 +00001352<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1353
1354Given
1355 { ++a; }
1356stmt()
1357 matches both the compound statement '{ ++a; }' and '++a'.
1358</pre></td></tr>
1359
1360
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001361<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>
1362<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1363
1364Example match: ({ int X = 4; X; })
1365 int C = ({ int X = 4; X; });
1366</pre></td></tr>
1367
1368
Aaron Ballman672dde22016-01-22 23:15:00 +00001369<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 +00001370<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1371
1372Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001373 char *s = "abcd";
1374 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001375</pre></td></tr>
1376
1377
Aaron Ballman672dde22016-01-22 23:15:00 +00001378<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 +00001379<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1380
1381Given
1382 template &lt;int N&gt;
1383 struct A { static const int n = N; };
1384 struct B : public A&lt;42&gt; {};
1385substNonTypeTemplateParmExpr()
1386 matches "N" in the right-hand side of "static const int n = N;"
1387</pre></td></tr>
1388
1389
Aaron Ballman672dde22016-01-22 23:15:00 +00001390<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 +00001391<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1392
1393Given
1394 switch(a) { case 42: break; default: break; }
1395switchCase()
Fangrui Song55942ab2018-01-22 22:34:15 +00001396 matches 'case 42:' and 'default:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001397</pre></td></tr>
1398
1399
Aaron Ballman672dde22016-01-22 23:15:00 +00001400<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 +00001401<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1402
1403Given
1404 switch(a) { case 42: break; default: break; }
1405switchStmt()
1406 matches 'switch(a)'.
1407</pre></td></tr>
1408
1409
Aaron Ballman672dde22016-01-22 23:15:00 +00001410<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 +00001411<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1412
1413Given
1414 Foo x = bar;
1415 int y = sizeof(x) + alignof(x);
1416unaryExprOrTypeTraitExpr()
1417 matches sizeof(x) and alignof(x)
1418</pre></td></tr>
1419
1420
Aaron Ballman672dde22016-01-22 23:15:00 +00001421<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00001422<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1423
1424Example matches !a
1425 !a || b
1426</pre></td></tr>
1427
1428
Haojian Wu7751c922016-05-18 12:53:59 +00001429<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>
1430<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1431but could not be resolved to a specific declaration.
1432
1433Given
1434 template&lt;typename T&gt;
1435 T foo() { T a; return a; }
1436 template&lt;typename T&gt;
1437 void bar() {
1438 foo&lt;T&gt;();
1439 }
1440unresolvedLookupExpr()
1441 matches foo&lt;T&gt;() </pre></td></tr>
1442
1443
Aaron Ballman672dde22016-01-22 23:15:00 +00001444<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 +00001445<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1446
1447Example match: "foo"_suffix
1448</pre></td></tr>
1449
1450
Aaron Ballman672dde22016-01-22 23:15:00 +00001451<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 +00001452<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1453
1454Given
1455 while (true) {}
1456whileStmt()
1457 matches 'while (true) {}'.
1458</pre></td></tr>
1459
1460
Aaron Ballman672dde22016-01-22 23:15:00 +00001461<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 +00001462<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1463
1464Given
1465 template &lt;typename T&gt; struct C {};
1466 C&lt;int&gt; c;
1467templateArgument()
1468 matches 'int' in C&lt;int&gt;.
1469</pre></td></tr>
1470
1471
Haojian Wub33b02e2016-07-29 15:45:11 +00001472<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>
1473<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1474
1475Given
1476 template &lt;typename T&gt; class X { };
1477 X&lt;int&gt; xi;
1478templateName()
1479 matches 'X' in X&lt;int&gt;.
1480</pre></td></tr>
1481
1482
Aaron Ballman672dde22016-01-22 23:15:00 +00001483<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 +00001484<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1485</pre></td></tr>
1486
1487
Aaron Ballman672dde22016-01-22 23:15:00 +00001488<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 +00001489<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1490
1491Given
1492 int a[] = { 2, 3 };
1493 int b[4];
1494 void f() { int c[a[0]]; }
1495arrayType()
1496 matches "int a[]", "int b[4]" and "int c[a[0]]";
1497</pre></td></tr>
1498
1499
Aaron Ballman672dde22016-01-22 23:15:00 +00001500<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 +00001501<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1502
1503Given
1504 _Atomic(int) i;
1505atomicType()
1506 matches "_Atomic(int) i"
1507</pre></td></tr>
1508
1509
Aaron Ballman672dde22016-01-22 23:15:00 +00001510<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 +00001511<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1512
1513Given:
1514 auto n = 4;
1515 int v[] = { 2, 3 }
1516 for (auto i : v) { }
1517autoType()
1518 matches "auto n" and "auto i"
1519</pre></td></tr>
1520
1521
Aaron Ballman672dde22016-01-22 23:15:00 +00001522<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 +00001523<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1524"void (^)(int)".
1525
1526The pointee is always required to be a FunctionType.
1527</pre></td></tr>
1528
1529
Aaron Ballman672dde22016-01-22 23:15:00 +00001530<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001531<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1532
1533Given
1534 struct A {};
1535 A a;
1536 int b;
1537 float c;
1538 bool d;
1539builtinType()
1540 matches "int b", "float c" and "bool d"
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('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 +00001545<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1546
1547Given
1548 _Complex float f;
1549complexType()
1550 matches "_Complex float f"
1551</pre></td></tr>
1552
1553
Aaron Ballman672dde22016-01-22 23:15:00 +00001554<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 +00001555<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1556
1557Given
1558 void() {
1559 int a[2];
1560 int b[] = { 2, 3 };
1561 int c[b[0]];
1562 }
1563constantArrayType()
1564 matches "int a[2]"
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('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 +00001569<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1570Example matches i[] in declaration of f.
1571 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1572Example matches i[1].
1573 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1574 void f(int i[]) {
1575 i[1] = 0;
1576 }
1577</pre></td></tr>
1578
1579
Jonas Tothacf83672018-07-26 13:02:05 +00001580<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>
1581<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
1582
1583Given:
1584 short i = 1;
1585 int j = 42;
1586 decltype(i + j) result = i + j;
1587decltypeType()
1588 matches "decltype(i + j)"
1589</pre></td></tr>
1590
1591
Aaron Ballman672dde22016-01-22 23:15:00 +00001592<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 +00001593<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1594
1595Given
1596 template&lt;typename T, int Size&gt;
1597 class array {
1598 T data[Size];
1599 };
1600dependentSizedArrayType
1601 matches "T data[Size]"
1602</pre></td></tr>
1603
1604
Aaron Ballman672dde22016-01-22 23:15:00 +00001605<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 +00001606<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1607qualified name.
1608
1609Given
1610 namespace N {
1611 namespace M {
1612 class D {};
1613 }
1614 }
1615 class C {};
1616
1617 class C c;
1618 N::M::D d;
1619
1620elaboratedType() matches the type of the variable declarations of both
1621c and d.
1622</pre></td></tr>
1623
1624
Haojian Wue775de82016-06-30 07:50:01 +00001625<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1626<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1627
1628Given
1629 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001630 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001631
1632 C c;
1633 S s;
1634
1635enumType() matches the type of the variable declarations of both c and
1636s.
1637</pre></td></tr>
1638
1639
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001640<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>
1641<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1642
1643Given
1644 int (*f)(int);
1645 void g();
1646functionProtoType()
1647 matches "int (*f)(int)" and the type of "g" in C++ mode.
1648 In C mode, "g" is not matched because it does not contain a prototype.
1649</pre></td></tr>
1650
1651
Aaron Ballman672dde22016-01-22 23:15:00 +00001652<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 +00001653<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1654
1655Given
1656 int (*f)(int);
1657 void g();
1658functionType()
1659 matches "int (*f)(int)" and the type of "g".
1660</pre></td></tr>
1661
1662
Aaron Ballman672dde22016-01-22 23:15:00 +00001663<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 +00001664<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1665
1666Given
1667 int a[] = { 2, 3 };
1668 int b[42];
1669 void f(int c[]) { int d[a[0]]; };
1670incompleteArrayType()
1671 matches "int a[]" and "int c[]"
1672</pre></td></tr>
1673
1674
Aaron Ballman672dde22016-01-22 23:15:00 +00001675<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 +00001676<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1677
1678Example matches S s, but not S&lt;T&gt; s.
1679 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1680 template &lt;typename T&gt; struct S {
1681 void f(S s);
1682 void g(S&lt;T&gt; s);
1683 };
1684</pre></td></tr>
1685
1686
Aaron Ballman672dde22016-01-22 23:15:00 +00001687<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 +00001688<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1689
1690Given:
1691 int *a;
1692 int &amp;b = *a;
1693 int &amp;&amp;c = 1;
1694 auto &amp;d = b;
1695 auto &amp;&amp;e = c;
1696 auto &amp;&amp;f = 2;
1697 int g = 5;
1698
1699lValueReferenceType() matches the types of b, d, and e. e is
1700matched since the type is deduced as int&amp; by reference collapsing rules.
1701</pre></td></tr>
1702
1703
Aaron Ballman672dde22016-01-22 23:15:00 +00001704<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 +00001705<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1706Given
1707 struct A { int i; }
1708 A::* ptr = A::i;
1709memberPointerType()
1710 matches "A::* ptr"
1711</pre></td></tr>
1712
1713
Aaron Ballman672dde22016-01-22 23:15:00 +00001714<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 +00001715<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1716a pointer type, despite being syntactically similar.
1717
1718Given
1719 int *a;
1720
1721 @interface Foo
1722 @end
1723 Foo *f;
1724pointerType()
1725 matches "Foo *f", but does not match "int *a".
1726</pre></td></tr>
1727
1728
Aaron Ballman672dde22016-01-22 23:15:00 +00001729<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 +00001730<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1731
1732Given
1733 int (*ptr_to_array)[4];
1734 int *array_of_ptrs[4];
1735
1736varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1737array_of_ptrs.
1738</pre></td></tr>
1739
1740
Aaron Ballman672dde22016-01-22 23:15:00 +00001741<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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 +00001742<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1743types.
1744
1745Given
1746 int *a;
1747 int &amp;b = *a;
1748 int c = 5;
1749
1750 @interface Foo
1751 @end
1752 Foo *f;
1753pointerType()
1754 matches "int *a", but does not match "Foo *f".
1755</pre></td></tr>
1756
1757
Aaron Ballman672dde22016-01-22 23:15:00 +00001758<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 +00001759<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1760
1761Given:
1762 int *a;
1763 int &amp;b = *a;
1764 int &amp;&amp;c = 1;
1765 auto &amp;d = b;
1766 auto &amp;&amp;e = c;
1767 auto &amp;&amp;f = 2;
1768 int g = 5;
1769
1770rValueReferenceType() matches the types of c and f. e is not
1771matched as it is deduced to int&amp; by reference collapsing rules.
1772</pre></td></tr>
1773
1774
Aaron Ballman672dde22016-01-22 23:15:00 +00001775<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 +00001776<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1777
1778Given
1779 class C {};
1780 struct S {};
1781
1782 C c;
1783 S s;
1784
1785recordType() matches the type of the variable declarations of both c
1786and s.
1787</pre></td></tr>
1788
1789
Aaron Ballman672dde22016-01-22 23:15:00 +00001790<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 +00001791<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1792
1793Given
1794 int *a;
1795 int &amp;b = *a;
1796 int &amp;&amp;c = 1;
1797 auto &amp;d = b;
1798 auto &amp;&amp;e = c;
1799 auto &amp;&amp;f = 2;
1800 int g = 5;
1801
1802referenceType() matches the types of b, c, d, e, and f.
1803</pre></td></tr>
1804
1805
Aaron Ballman672dde22016-01-22 23:15:00 +00001806<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 +00001807<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1808template type parameter.
1809
1810Given
1811 template &lt;typename T&gt;
1812 void F(T t) {
1813 int i = 1 + t;
1814 }
1815
1816substTemplateTypeParmType() matches the type of 't' but not '1'
1817</pre></td></tr>
1818
1819
Manuel Klimek696e5052017-08-02 13:04:44 +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('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>
1821<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1822
1823Given
1824 enum E {};
1825 class C {};
1826
1827 E e;
1828 C c;
1829
1830tagType() matches the type of the variable declarations of both e
1831and c.
1832</pre></td></tr>
1833
1834
Aaron Ballman672dde22016-01-22 23:15:00 +00001835<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 +00001836<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1837
1838Given
1839 template &lt;typename T&gt;
1840 class C { };
1841
1842 template class C&lt;int&gt;; A
1843 C&lt;char&gt; var; B
1844
1845templateSpecializationType() matches the type of the explicit
1846instantiation in A and the type of the variable declaration in B.
1847</pre></td></tr>
1848
1849
Aaron Ballman672dde22016-01-22 23:15:00 +00001850<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 +00001851<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1852
1853Example matches T, but not int.
1854 (matcher = templateTypeParmType())
1855 template &lt;typename T&gt; void f(int i);
1856</pre></td></tr>
1857
1858
Aaron Ballman672dde22016-01-22 23:15:00 +00001859<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 +00001860<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
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('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 +00001865<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1866
1867Given
1868 typedef int X;
1869typedefType()
1870 matches "typedef int X"
1871</pre></td></tr>
1872
1873
Aaron Ballman672dde22016-01-22 23:15:00 +00001874<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 +00001875<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1876
1877Given:
1878 typedef __underlying_type(T) type;
1879unaryTransformType()
1880 matches "__underlying_type(T)"
1881</pre></td></tr>
1882
1883
Aaron Ballman672dde22016-01-22 23:15:00 +00001884<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 +00001885<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1886integer-constant-expression.
1887
1888Given
1889 void f() {
1890 int a[] = { 2, 3 }
1891 int b[42];
1892 int c[a[0]];
1893 }
1894variableArrayType()
1895 matches "int c[a[0]]"
1896</pre></td></tr>
1897
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001898<!--END_DECL_MATCHERS -->
1899</table>
1900
1901<!-- ======================================================================= -->
1902<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1903<!-- ======================================================================= -->
1904
1905<p>Narrowing matchers match certain attributes on the current node, thus
1906narrowing down the set of nodes of the current type to match on.</p>
1907
1908<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1909which allow users to create more powerful match expressions.</p>
1910
1911<table>
1912<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001913<!-- START_NARROWING_MATCHERS -->
1914
1915<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>
1916<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1917
1918Usable as: Any Matcher
1919</pre></td></tr>
1920
1921
1922<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>
1923<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1924
1925Usable as: Any Matcher
1926</pre></td></tr>
1927
1928
1929<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1930<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1931
1932Useful when another matcher requires a child matcher, but there's no
1933additional constraint. This will often be used with an explicit conversion
1934to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1935
1936Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1937"int* p" and "void f()" in
1938 int* p;
1939 void f();
1940
1941Usable as: Any Matcher
1942</pre></td></tr>
1943
1944
1945<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1946<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1947
1948Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1949 class X {};
1950 class Y {};
1951
1952Usable as: Any Matcher
1953</pre></td></tr>
1954
1955
Aaron Ballman672dde22016-01-22 23:15:00 +00001956<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 +00001957<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1958unary).
1959
1960Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1961 !(a || b)
1962</pre></td></tr>
1963
1964
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00001965<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 +00001966<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
1967
1968Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
1969 if (a == b)
1970 a += b;
1971
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00001972Example 2: matches s1 = s2
1973 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
1974 struct S { S&amp; operator=(const S&amp;); };
Peter Szecsifff11db2018-03-27 12:11:46 +00001975 void x() { S s1, s2; s1 = s2; })
1976</pre></td></tr>
1977
1978
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001979<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>
1980<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1981
1982
1983<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 +00001984<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 +00001985
Peter Wua9244b52017-06-08 22:00:58 +00001986Given
1987 f('false, 3.14, 42);
1988characterLiteral(equals(0))
1989 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1990 match false
1991floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1992 match 3.14
1993integerLiteral(equals(42))
1994 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001995
Clement Courbet43bdba42017-07-11 15:45:22 +00001996Note that you cannot directly match a negative numeric literal because the
1997minus sign is not part of the literal: It is a unary operator whose operand
1998is the positive numeric literal. Instead, you must use a unaryOperator()
1999matcher to match the minus sign:
2000
2001unaryOperator(hasOperatorName("-"),
2002 hasUnaryOperand(integerLiteral(equals(13))))
2003
Peter Wua9244b52017-06-08 22:00:58 +00002004Usable 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 +00002005 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 +00002006</pre></td></tr>
2007
2008
Peter Wua9244b52017-06-08 22:00:58 +00002009<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>
2010<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2011
2012
2013<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>
2014<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2015
2016
Aaron Ballman672dde22016-01-22 23:15:00 +00002017<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 +00002018<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2019
2020Given
2021 try {
2022 ...
2023 } catch (int) {
2024 ...
2025 } catch (...) {
2026 ...
2027 }
2028endcode
2029cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2030</pre></td></tr>
2031
2032
Aaron Ballman672dde22016-01-22 23:15:00 +00002033<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 +00002034<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2035a specific number of arguments (including absent default arguments).
2036
2037Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2038 void f(int x, int y);
2039 f(0, 0);
2040</pre></td></tr>
2041
2042
Aaron Ballman672dde22016-01-22 23:15:00 +00002043<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 +00002044<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2045</pre></td></tr>
2046
2047
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002048<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>
2049<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2050zero initialization.
2051
2052Given
2053void foo() {
2054 struct point { double x; double y; };
2055 point pt[2] = { { 1.0, 2.0 } };
2056}
2057initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2058will match the implicit array filler for pt[1].
2059</pre></td></tr>
2060
2061
Aaron Ballman672dde22016-01-22 23:15:00 +00002062<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 +00002063<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2064
2065Given
2066 struct S {
2067 S(); #1
2068 S(const S &amp;); #2
2069 S(S &amp;&amp;); #3
2070 };
2071cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2072</pre></td></tr>
2073
2074
Aaron Ballman672dde22016-01-22 23:15:00 +00002075<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 +00002076<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2077
2078Given
2079 struct S {
2080 S(); #1
2081 S(const S &amp;); #2
2082 S(S &amp;&amp;); #3
2083 };
2084cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2085</pre></td></tr>
2086
2087
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002088<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>
2089<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2090
2091Given
2092 struct S {
2093 S(); #1
2094 S(int) {} #2
2095 S(S &amp;&amp;) : S() {} #3
2096 };
2097 S::S() : S(0) {} #4
2098cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2099#1 or #2.
2100</pre></td></tr>
2101
2102
Aaron Ballman672dde22016-01-22 23:15:00 +00002103<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 +00002104<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2105the explicit keyword.
2106
2107Given
2108 struct S {
2109 S(int); #1
2110 explicit S(double); #2
2111 operator int(); #3
2112 explicit operator bool(); #4
2113 };
2114cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2115cxxConversionDecl(isExplicit()) will match #4, but not #3.
2116</pre></td></tr>
2117
2118
Aaron Ballman672dde22016-01-22 23:15:00 +00002119<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002120<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2121
2122Given
2123 struct S {
2124 S(); #1
2125 S(const S &amp;); #2
2126 S(S &amp;&amp;); #3
2127 };
2128cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2129</pre></td></tr>
2130
2131
Aaron Ballman672dde22016-01-22 23:15:00 +00002132<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 +00002133<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2134the explicit keyword.
2135
2136Given
2137 struct S {
2138 S(int); #1
2139 explicit S(double); #2
2140 operator int(); #3
2141 explicit operator bool(); #4
2142 };
2143cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2144cxxConversionDecl(isExplicit()) will match #4, but not #3.
2145</pre></td></tr>
2146
2147
Aaron Ballman672dde22016-01-22 23:15:00 +00002148<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 +00002149<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2150opposed to a member.
2151
2152Given
2153 struct B {};
2154 struct D : B {
2155 int I;
2156 D(int i) : I(i) {}
2157 };
2158 struct E : B {
2159 E() : B() {}
2160 };
2161cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2162 will match E(), but not match D(int).
2163</pre></td></tr>
2164
2165
Aaron Ballman672dde22016-01-22 23:15:00 +00002166<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002167<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2168opposed to a base.
2169
2170Given
2171 struct B {};
2172 struct D : B {
2173 int I;
2174 D(int i) : I(i) {}
2175 };
2176 struct E : B {
2177 E() : B() {}
2178 };
2179cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2180 will match D(int), but not match E().
2181</pre></td></tr>
2182
2183
Aaron Ballman672dde22016-01-22 23:15:00 +00002184<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 +00002185<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2186code (as opposed to implicitly added by the compiler).
2187
2188Given
2189 struct Foo {
2190 Foo() { }
2191 Foo(int) : foo_("A") { }
2192 string foo_;
2193 };
2194cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2195 will match Foo(int), but not Foo()
2196</pre></td></tr>
2197
2198
Aaron Ballman672dde22016-01-22 23:15:00 +00002199<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 +00002200<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2201
2202Given
2203struct A {
2204 void foo() const;
2205 void bar();
2206};
2207
2208cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2209</pre></td></tr>
2210
2211
Aaron Ballman672dde22016-01-22 23:15:00 +00002212<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 +00002213<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2214operator.
2215
2216Given
2217struct A {
2218 A &amp;operator=(const A &amp;);
2219 A &amp;operator=(A &amp;&amp;);
2220};
2221
2222cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2223the second one.
2224</pre></td></tr>
2225
2226
Aaron Ballman672dde22016-01-22 23:15:00 +00002227<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 +00002228<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2229
2230Given:
2231 class A final {};
2232
2233 struct B {
2234 virtual void f();
2235 };
2236
2237 struct C : B {
2238 void f() final;
2239 };
2240matches A and C::f, but not B, C, or B::f
2241</pre></td></tr>
2242
2243
Aaron Ballman672dde22016-01-22 23:15:00 +00002244<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 +00002245<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2246operator.
2247
2248Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002249struct A {
2250 A &amp;operator=(const A &amp;);
2251 A &amp;operator=(A &amp;&amp;);
2252};
2253
2254cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2255the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002256</pre></td></tr>
2257
2258
Aaron Ballman672dde22016-01-22 23:15:00 +00002259<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 +00002260<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2261
2262Given
2263 class A {
2264 public:
2265 virtual void x();
2266 };
2267 class B : public A {
2268 public:
2269 virtual void x();
2270 };
2271 matches B::x
2272</pre></td></tr>
2273
2274
Aaron Ballman672dde22016-01-22 23:15:00 +00002275<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002276<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2277
2278Given
2279 class A {
2280 public:
2281 virtual void x() = 0;
2282 };
2283 matches A::x
2284</pre></td></tr>
2285
2286
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002287<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>
2288<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2289
2290Given
2291 struct S {
2292 S(); #1
2293 S(const S &amp;) = default; #2
2294 S(S &amp;&amp;) = delete; #3
2295 };
2296cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2297</pre></td></tr>
2298
2299
Aaron Ballman672dde22016-01-22 23:15:00 +00002300<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 +00002301<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2302
2303Given
2304 class A {
2305 public:
2306 virtual void x();
2307 };
2308 matches A::x
2309</pre></td></tr>
2310
Aaron Ballman672dde22016-01-22 23:15:00 +00002311
2312<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 +00002313<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2314
2315Given
2316 class A {
2317 public:
2318 virtual void x();
2319 };
2320 class B : public A {
2321 public:
2322 void x();
2323 };
2324 matches A::x but not B::x
2325</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002326
Aaron Ballman672dde22016-01-22 23:15:00 +00002327
Adam Baloghda488a62017-11-23 12:43:20 +00002328<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>
2329<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2330
2331Given:
2332 MyClass *p1 = new MyClass[10];
2333cxxNewExpr(isArray())
2334 matches the expression 'new MyClass[10]'.
2335</pre></td></tr>
2336
2337
Aaron Ballman672dde22016-01-22 23:15:00 +00002338<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 +00002339<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2340
2341Matches overloaded operator names specified in strings without the
2342"operator" prefix: e.g. "&lt;&lt;".
2343
2344Given:
2345 class A { int operator*(); };
2346 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2347 A a;
2348 a &lt;&lt; a; &lt;-- This matches
2349
2350cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2351specified line and
2352cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2353matches the declaration of A.
2354
Aaron Ballman672dde22016-01-22 23:15:00 +00002355Usable 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 +00002356</pre></td></tr>
2357
2358
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00002359<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 +00002360<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2361
2362Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2363 if (a == b)
2364 a += b;
2365
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00002366Example 2: matches s1 = s2
2367 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2368 struct S { S&amp; operator=(const S&amp;); };
Peter Szecsifff11db2018-03-27 12:11:46 +00002369 void x() { S s1, s2; s1 = s2; })
2370</pre></td></tr>
2371
2372
Aaron Ballman813e36c2017-11-29 21:21:51 +00002373<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>
2374<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2375
2376Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2377class x {};
2378class y;
2379</pre></td></tr>
2380
2381
Aaron Ballman672dde22016-01-22 23:15:00 +00002382<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 +00002383<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2384</pre></td></tr>
2385
2386
Aaron Ballman672dde22016-01-22 23:15:00 +00002387<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00002388<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2389static member variable template instantiations.
2390
2391Given
2392 template&lt;typename T&gt; void A(T t) { }
2393 template&lt;&gt; void A(int N) { }
2394functionDecl(isExplicitTemplateSpecialization())
2395 matches the specialization A&lt;int&gt;().
2396
Aaron Ballman672dde22016-01-22 23:15:00 +00002397Usable 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 +00002398</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('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002402<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2403
2404Given:
2405 class A final {};
2406
2407 struct B {
2408 virtual void f();
2409 };
2410
2411 struct C : B {
2412 void f() final;
2413 };
2414matches A and C::f, but not B, C, or B::f
2415</pre></td></tr>
2416
2417
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002418<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>
2419<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2420
2421Given:
2422 auto x = []{};
2423
2424cxxRecordDecl(isLambda()) matches the implicit class declaration of
2425decltype(x)
2426</pre></td></tr>
2427
2428
Aaron Ballman672dde22016-01-22 23:15:00 +00002429<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 +00002430<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2431isSameOrDerivedFrom(hasName(...)).
2432</pre></td></tr>
2433
2434
Aaron Ballman672dde22016-01-22 23:15:00 +00002435<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 +00002436<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2437member variable template instantiations.
2438
2439Given
2440 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2441or
2442 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00002443or
2444 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002445cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2446 matches the template instantiation of X&lt;A&gt;.
2447
2448But given
2449 template &lt;typename T&gt; class X {}; class A {};
2450 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2451cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2452 does not match, as X&lt;A&gt; is an explicit template specialization.
2453
Aaron Ballman672dde22016-01-22 23:15:00 +00002454Usable 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 +00002455</pre></td></tr>
2456
2457
Aaron Ballman672dde22016-01-22 23:15:00 +00002458<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 +00002459<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2460a specific number of arguments (including absent default arguments).
2461
2462Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2463 void f(int x, int y);
2464 f(0, 0);
2465</pre></td></tr>
2466
2467
Etienne Bergeron75e52722016-05-13 19:36:55 +00002468<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>
2469<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2470
2471Example: matches the implicit cast around 0
2472(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2473 int *p = 0;
2474</pre></td></tr>
2475
2476
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002477<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>
2478<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2479
2480
2481<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 +00002482<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 +00002483
Peter Wua9244b52017-06-08 22:00:58 +00002484Given
2485 f('false, 3.14, 42);
2486characterLiteral(equals(0))
2487 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2488 match false
2489floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2490 match 3.14
2491integerLiteral(equals(42))
2492 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002493
Clement Courbet43bdba42017-07-11 15:45:22 +00002494Note that you cannot directly match a negative numeric literal because the
2495minus sign is not part of the literal: It is a unary operator whose operand
2496is the positive numeric literal. Instead, you must use a unaryOperator()
2497matcher to match the minus sign:
2498
2499unaryOperator(hasOperatorName("-"),
2500 hasUnaryOperand(integerLiteral(equals(13))))
2501
Peter Wua9244b52017-06-08 22:00:58 +00002502Usable 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 +00002503 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 +00002504</pre></td></tr>
2505
2506
Peter Wua9244b52017-06-08 22:00:58 +00002507<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>
2508<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2509
2510
2511<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>
2512<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2513
2514
Aaron Ballman672dde22016-01-22 23:15:00 +00002515<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 +00002516<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2517
2518Given
2519 template&lt;typename T&gt; struct C {};
2520 C&lt;int&gt; c;
2521classTemplateSpecializationDecl(templateArgumentCountIs(1))
2522 matches C&lt;int&gt;.
2523</pre></td></tr>
2524
2525
Aaron Ballman672dde22016-01-22 23:15:00 +00002526<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 +00002527<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2528child statements.
2529
2530Example: Given
2531 { for (;;) {} }
2532compoundStmt(statementCountIs(0)))
2533 matches '{}'
2534 but does not match the outer compound statement.
2535</pre></td></tr>
2536
2537
Aaron Ballman672dde22016-01-22 23:15:00 +00002538<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 +00002539<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002540
2541Given
2542 int a[42];
2543 int b[2 * 21];
2544 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002545 char *s = "abcd";
2546 wchar_t *ws = L"abcd";
2547 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002548constantArrayType(hasSize(42))
2549 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002550stringLiteral(hasSize(4))
2551 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002552</pre></td></tr>
2553
2554
Aaron Ballman672dde22016-01-22 23:15:00 +00002555<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 +00002556<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2557declarations.
2558
2559Example: Given
2560 int a, b;
2561 int c;
2562 int d = 2, e;
2563declCountIs(2)
2564 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2565</pre></td></tr>
2566
2567
Aaron Ballman672dde22016-01-22 23:15:00 +00002568<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 +00002569<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2570
2571Matches a node if it equals the node previously bound to ID.
2572
2573Given
2574 class X { int a; int b; };
2575cxxRecordDecl(
2576 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2577 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2578 matches the class X, as a and b have the same type.
2579
2580Note that when multiple matches are involved via forEach* matchers,
2581equalsBoundNodes acts as a filter.
2582For example:
2583compoundStmt(
2584 forEachDescendant(varDecl().bind("d")),
2585 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2586will trigger a match for each combination of variable declaration
2587and reference to that variable declaration within a compound statement.
2588</pre></td></tr>
2589
2590
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002591<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>
2592<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2593
2594Decl has pointer identity in the AST.
2595</pre></td></tr>
2596
2597
Aaron Ballman672dde22016-01-22 23:15:00 +00002598<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 +00002599<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2600
2601Given
2602 __attribute__((device)) void f() { ... }
2603decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2604f. If the matcher is use from clang-query, attr::Kind parameter should be
2605passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2606</pre></td></tr>
2607
2608
Aaron Ballman672dde22016-01-22 23:15:00 +00002609<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 +00002610<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2611partially matching a given regex.
2612
2613Example matches Y but not X
2614 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2615 #include "ASTMatcher.h"
2616 class X {};
2617ASTMatcher.h:
2618 class Y {};
2619
Aaron Ballman672dde22016-01-22 23:15:00 +00002620Usable 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 +00002621</pre></td></tr>
2622
2623
Aaron Ballman672dde22016-01-22 23:15:00 +00002624<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 +00002625<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2626
2627Example matches X but not Y
2628 (matcher = cxxRecordDecl(isExpansionInMainFile())
2629 #include &lt;Y.h&gt;
2630 class X {};
2631Y.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('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002639<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2640
2641Example matches Y but not X
2642 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2643 #include &lt;SystemHeader.h&gt;
2644 class X {};
2645SystemHeader.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('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002653<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2654by the compiler (eg. implicit defaultcopy constructors).
2655</pre></td></tr>
2656
2657
Aaron Ballman672dde22016-01-22 23:15:00 +00002658<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 +00002659<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2660
2661Given
2662 class C {
2663 public: int a;
2664 protected: int b;
2665 private: int c;
2666 };
2667fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002668 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002669</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('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002673<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2674
2675Given
2676 class C {
2677 public: int a;
2678 protected: int b;
2679 private: int c;
2680 };
2681fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002682 matches 'int b;'
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('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002687<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2688
2689Given
2690 class C {
2691 public: int a;
2692 protected: int b;
2693 private: int c;
2694 };
2695fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002696 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002697</pre></td></tr>
2698
2699
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002700<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>
2701<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2702a specific number of designators.
2703
2704Example: Given
2705 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2706 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2707designatorCountIs(2)
2708 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2709 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2710</pre></td></tr>
2711
2712
Haojian Wu9c3be3a2018-01-18 09:47:57 +00002713<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>
2714<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2715
2716Example matches Y (matcher = enumDecl(isScoped()))
2717enum X {};
2718enum class Y {};
2719</pre></td></tr>
2720
2721
Aaron Ballman5c574342016-07-06 18:25:16 +00002722<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 +00002723<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2724bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002725
2726Given
2727 class C {
2728 int a : 2;
2729 int b : 4;
2730 int c : 2;
2731 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002732fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002733 matches 'int a;' and 'int c;' but not 'int b;'.
2734</pre></td></tr>
2735
2736
2737<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>
2738<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2739
2740Given
2741 class C {
2742 int a : 2;
2743 int b;
2744 };
2745fieldDecl(isBitField())
2746 matches 'int a;' but not 'int b;'.
2747</pre></td></tr>
2748
2749
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002750<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 +00002751<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 +00002752
Peter Wua9244b52017-06-08 22:00:58 +00002753Given
2754 f('false, 3.14, 42);
2755characterLiteral(equals(0))
2756 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2757 match false
2758floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2759 match 3.14
2760integerLiteral(equals(42))
2761 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002762
Clement Courbet43bdba42017-07-11 15:45:22 +00002763Note that you cannot directly match a negative numeric literal because the
2764minus sign is not part of the literal: It is a unary operator whose operand
2765is the positive numeric literal. Instead, you must use a unaryOperator()
2766matcher to match the minus sign:
2767
2768unaryOperator(hasOperatorName("-"),
2769 hasUnaryOperand(integerLiteral(equals(13))))
2770
Peter Wua9244b52017-06-08 22:00:58 +00002771Usable 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 +00002772 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 +00002773</pre></td></tr>
2774
2775
Peter Wua9244b52017-06-08 22:00:58 +00002776<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>
2777<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2778
2779
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002780<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>
2781<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2782
2783Given:
2784 void f();
2785 void g() noexcept;
2786 void h() noexcept(true);
2787 void i() noexcept(false);
2788 void j() throw();
2789 void k() throw(int);
2790 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00002791functionDecl(hasDynamicExceptionSpec()) and
2792 functionProtoType(hasDynamicExceptionSpec())
2793 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00002794</pre></td></tr>
2795
2796
Aaron Ballman672dde22016-01-22 23:15:00 +00002797<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 +00002798<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2799
2800Matches overloaded operator names specified in strings without the
2801"operator" prefix: e.g. "&lt;&lt;".
2802
2803Given:
2804 class A { int operator*(); };
2805 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2806 A a;
2807 a &lt;&lt; a; &lt;-- This matches
2808
2809cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2810specified line and
2811cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2812matches the declaration of A.
2813
Aaron Ballman672dde22016-01-22 23:15:00 +00002814Usable 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 +00002815</pre></td></tr>
2816
2817
Julie Hockett239d25a2018-01-22 22:45:23 +00002818<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
2819<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
2820
2821Example matches Y (matcher = functionDecl(hasTrailingReturn()))
2822int X() {}
2823auto Y() -&gt; int {}
2824</pre></td></tr>
2825
2826
Aaron Ballman672dde22016-01-22 23:15:00 +00002827<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 +00002828<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
2829 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002830
2831Given:
2832 constexpr int foo = 42;
2833 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00002834 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002835varDecl(isConstexpr())
2836 matches the declaration of foo.
2837functionDecl(isConstexpr())
2838 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00002839ifStmt(isConstexpr())
2840 matches the if statement in baz.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002841</pre></td></tr>
2842
2843
Aaron Ballman672dde22016-01-22 23:15:00 +00002844<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 +00002845<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2846
2847Given:
2848 class A { ~A(); };
2849 class B { ~B() = default; };
2850functionDecl(isDefaulted())
2851 matches the declaration of ~B, but not ~A.
2852</pre></td></tr>
2853
2854
Dave Leebe398682017-11-14 14:17:26 +00002855<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
2856<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002857
2858Example matches A, va, fa
2859 class A {};
2860 class B; Doesn't match, as it has no body.
2861 int va;
2862 extern int vb; Doesn't match, as it doesn't define the variable.
2863 void fa() {}
2864 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00002865 @interface X
2866 - (void)ma; Doesn't match, interface is declaration.
2867 @end
2868 @implementation X
2869 - (void)ma {}
2870 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002871
Dave Leebe398682017-11-14 14:17:26 +00002872Usable 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;,
2873 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002874</pre></td></tr>
2875
2876
Aaron Ballman672dde22016-01-22 23:15:00 +00002877<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 +00002878<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2879
2880Given:
2881 void Func();
2882 void DeletedFunc() = delete;
2883functionDecl(isDeleted())
2884 matches the declaration of DeletedFunc, but not Func.
2885</pre></td></tr>
2886
2887
Aaron Ballman672dde22016-01-22 23:15:00 +00002888<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 +00002889<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2890static member variable template instantiations.
2891
2892Given
2893 template&lt;typename T&gt; void A(T t) { }
2894 template&lt;&gt; void A(int N) { }
2895functionDecl(isExplicitTemplateSpecialization())
2896 matches the specialization A&lt;int&gt;().
2897
Aaron Ballman672dde22016-01-22 23:15:00 +00002898Usable 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 +00002899</pre></td></tr>
2900
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002901
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('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002903<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002904
2905Given:
2906 extern "C" void f() {}
2907 extern "C" { void g() {} }
2908 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002909 extern "C" int x = 1;
2910 extern "C" int y = 2;
2911 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002912functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00002913 matches the declaration of f and g, but not the declaration of h.
2914varDecl(isExternC())
2915 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002916</pre></td></tr>
2917
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002918
Aaron Ballman672dde22016-01-22 23:15:00 +00002919<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 +00002920<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2921the inline keyword.
2922
2923Given
2924 inline void f();
2925 void g();
2926 namespace n {
2927 inline namespace m {}
2928 }
2929functionDecl(isInline()) will match ::f().
2930namespaceDecl(isInline()) will match n::m.
2931</pre></td></tr>
2932
2933
George Karpenkovfc3d72e2018-07-23 22:29:35 +00002934<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>
2935<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
2936into an executable program.
2937</pre></td></tr>
2938
2939
Roman Lebedev6c3871b2018-01-17 19:40:55 +00002940<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>
2941<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
2942
2943Given
2944 void nope();
2945 [[noreturn]] void a();
2946 __attribute__((noreturn)) void b();
2947 struct c { [[noreturn]] c(); };
2948functionDecl(isNoReturn())
2949 matches all of those except
2950 void nope();
2951</pre></td></tr>
2952
2953
Aaron Ballman672dde22016-01-22 23:15:00 +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('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002955<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2956
2957Given:
2958 void f();
2959 void g() noexcept;
2960 void h() throw();
2961 void i() throw(int);
2962 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00002963functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2964 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002965</pre></td></tr>
2966
2967
Haojian Wub3d25462016-09-26 16:01:52 +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('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
Haojian Wu398a8ea2016-09-27 07:53:20 +00002969<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2970class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00002971
2972Given:
2973 static void f() {}
2974 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00002975 extern int j;
2976 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00002977functionDecl(isStaticStorageClass())
2978 matches the function declaration f.
2979varDecl(isStaticStorageClass())
2980 matches the variable declaration i.
2981</pre></td></tr>
2982
2983
Aaron Ballman672dde22016-01-22 23:15:00 +00002984<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 +00002985<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2986member variable template instantiations.
2987
2988Given
2989 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2990or
2991 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00002992or
2993 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002994cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2995 matches the template instantiation of X&lt;A&gt;.
2996
2997But given
2998 template &lt;typename T&gt; class X {}; class A {};
2999 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3000cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3001 does not match, as X&lt;A&gt; is an explicit template specialization.
3002
Aaron Ballman672dde22016-01-22 23:15:00 +00003003Usable 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 +00003004</pre></td></tr>
3005
3006
Aaron Ballman672dde22016-01-22 23:15:00 +00003007<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 +00003008<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3009
3010Example matches f, but not g or h. The function i will not match, even when
3011compiled in C mode.
3012 void f(...);
3013 void g(int);
3014 template &lt;typename... Ts&gt; void h(Ts...);
3015 void i();
3016</pre></td></tr>
3017
3018
Aaron Ballman672dde22016-01-22 23:15:00 +00003019<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 +00003020<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3021specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003022
3023Given
3024 void f(int i) {}
3025 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003026 void h(int i, int j);
3027 void j(int i);
3028 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003029functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003030 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003031functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003032 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003033functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003034 matches k
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003035</pre></td></tr>
3036
3037
Aaron Ballman230ad972016-06-07 17:34:45 +00003038<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>
3039<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3040
3041Given:
3042 void f();
3043 void g() noexcept;
3044 void h() noexcept(true);
3045 void i() noexcept(false);
3046 void j() throw();
3047 void k() throw(int);
3048 void l() throw(...);
3049functionDecl(hasDynamicExceptionSpec()) and
3050 functionProtoType(hasDynamicExceptionSpec())
3051 match the declarations of j, k, and l, but not f, g, h, or i.
3052</pre></td></tr>
3053
3054
3055<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>
3056<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3057
3058Given:
3059 void f();
3060 void g() noexcept;
3061 void h() throw();
3062 void i() throw(int);
3063 void j() noexcept(false);
3064functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3065 match the declarations of g, and h, but not f, i or j.
3066</pre></td></tr>
3067
3068
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003069<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>
3070<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3071specific parameter count.
3072
3073Given
3074 void f(int i) {}
3075 void g(int i, int j) {}
3076 void h(int i, int j);
3077 void j(int i);
3078 void k(int x, int y, int z, ...);
3079functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003080 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003081functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003082 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003083functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003084 matches k
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003085</pre></td></tr>
3086
3087
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003088<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>
3089<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3090 and if constexpr.
3091
3092Given:
3093 constexpr int foo = 42;
3094 constexpr int bar();
3095 void baz() { if constexpr(1 &gt; 0) {} }
3096varDecl(isConstexpr())
3097 matches the declaration of foo.
3098functionDecl(isConstexpr())
3099 matches the declaration of bar.
3100ifStmt(isConstexpr())
3101 matches the if statement in baz.
3102</pre></td></tr>
3103
3104
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003105<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>
3106<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3107
3108
3109<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 +00003110<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 +00003111
Peter Wua9244b52017-06-08 22:00:58 +00003112Given
3113 f('false, 3.14, 42);
3114characterLiteral(equals(0))
3115 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3116 match false
3117floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3118 match 3.14
3119integerLiteral(equals(42))
3120 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003121
Clement Courbet43bdba42017-07-11 15:45:22 +00003122Note that you cannot directly match a negative numeric literal because the
3123minus sign is not part of the literal: It is a unary operator whose operand
3124is the positive numeric literal. Instead, you must use a unaryOperator()
3125matcher to match the minus sign:
3126
3127unaryOperator(hasOperatorName("-"),
3128 hasUnaryOperand(integerLiteral(equals(13))))
3129
Peter Wua9244b52017-06-08 22:00:58 +00003130Usable 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 +00003131 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 +00003132</pre></td></tr>
3133
3134
Peter Wua9244b52017-06-08 22:00:58 +00003135<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>
3136<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3137
3138
3139<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>
3140<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3141
3142
Aaron Ballman672dde22016-01-22 23:15:00 +00003143<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003144<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3145to '.'.
3146
3147Member calls on the implicit this pointer match as called with '-&gt;'.
3148
3149Given
3150 class Y {
3151 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3152 int a;
3153 static int b;
3154 };
3155memberExpr(isArrow())
3156 matches this-&gt;x, x, y.x, a, this-&gt;b
3157</pre></td></tr>
3158
3159
Aaron Ballmana086b9f2016-08-17 13:10:42 +00003160<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>
3161<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3162
3163Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3164void f() {
3165 int x;
3166 static int y;
3167}
3168int z;
3169
3170Example matches f() because it has external formal linkage despite being
3171unique to the translation unit as though it has internal likage
3172(matcher = functionDecl(hasExternalFormalLinkage()))
3173
3174namespace {
3175void f() {}
3176}
3177</pre></td></tr>
3178
3179
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003180<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 +00003181<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3182
3183Supports specifying enclosing namespaces or classes by prefixing the name
3184with '&lt;enclosing&gt;::'.
3185Does not match typedefs of an underlying type with the given name.
3186
3187Example matches X (Name == "X")
3188 class X;
3189
3190Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3191 namespace a { namespace b { class X; } }
3192</pre></td></tr>
3193
3194
Aaron Ballman672dde22016-01-22 23:15:00 +00003195<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 +00003196<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3197a substring matched by the given RegExp.
3198
3199Supports specifying enclosing namespaces or classes by
3200prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3201of an underlying type with the given name.
3202
3203Example matches X (regexp == "::X")
3204 class X;
3205
3206Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3207 namespace foo { namespace bar { class X; } }
3208</pre></td></tr>
3209
3210
Aaron Ballman672dde22016-01-22 23:15:00 +00003211<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 +00003212<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3213
3214Given
3215 namespace n {
3216 namespace {} #1
3217 }
3218namespaceDecl(isAnonymous()) will match #1 but not ::n.
3219</pre></td></tr>
3220
3221
Aaron Ballman672dde22016-01-22 23:15:00 +00003222<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 +00003223<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3224the inline keyword.
3225
3226Given
3227 inline void f();
3228 void g();
3229 namespace n {
3230 inline namespace m {}
3231 }
3232functionDecl(isInline()) will match ::f().
3233namespaceDecl(isInline()) will match n::m.
3234</pre></td></tr>
3235
3236
Aaron Ballman672dde22016-01-22 23:15:00 +00003237<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 +00003238<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3239a specific number of arguments (including absent default arguments).
3240
3241Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3242 void f(int x, int y);
3243 f(0, 0);
3244</pre></td></tr>
3245
3246
Aaron Ballman672dde22016-01-22 23:15:00 +00003247<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003248<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3249
3250objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3251message expression in
3252
3253 UIWebView *webView = ...;
3254 CGRect bodyFrame = webView.frame;
3255 bodyFrame.size.height = self.bodyContentHeight;
3256 webView.frame = bodyFrame;
3257 ^---- matches here
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('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003262<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3263
3264Matches only when the selector of the objCMessageExpr is NULL. This may
3265represent an error condition in the tree!
3266</pre></td></tr>
3267
3268
Aaron Ballman672dde22016-01-22 23:15:00 +00003269<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003270<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3271
3272 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3273 matches the outer message expr in the code below, but NOT the message
3274 invocation for self.bodyView.
3275 [self.bodyView loadHTMLString:html baseURL:NULL];
3276</pre></td></tr>
3277
3278
Aaron Ballman672dde22016-01-22 23:15:00 +00003279<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003280<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3281
3282 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3283 matches self.bodyView in the code below, but NOT the outer message
3284 invocation of "loadHTMLString:baseURL:".
3285 [self.bodyView loadHTMLString:html baseURL:NULL];
3286</pre></td></tr>
3287
3288
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003289<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>
3290<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3291
3292Example
3293matcher = objcMessagaeExpr(isInstanceMessage())
3294matches
3295 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00003296 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003297but not
George Karpenkovdaac52c2018-07-23 22:29:10 +00003298 [NSString stringWithFormat:@"format"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003299</pre></td></tr>
3300
3301
Aaron Ballman672dde22016-01-22 23:15:00 +00003302<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 +00003303<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3304a substring matched by the given RegExp.
3305 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3306 invocation for self.bodyView.
3307 [self.bodyView loadHTMLString:html baseURL:NULL];
3308</pre></td></tr>
3309
3310
Aaron Ballman672dde22016-01-22 23:15:00 +00003311<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 +00003312<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3313
3314 matcher = objCMessageExpr(numSelectorArgs(0));
3315 matches self.bodyView in the code below
3316
3317 matcher = objCMessageExpr(numSelectorArgs(2));
3318 matches the invocation of "loadHTMLString:baseURL:" but not that
3319 of self.bodyView
3320 [self.bodyView loadHTMLString:html baseURL:NULL];
3321</pre></td></tr>
3322
3323
Dave Leebe398682017-11-14 14:17:26 +00003324<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>
3325<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3326
3327Example matches A, va, fa
3328 class A {};
3329 class B; Doesn't match, as it has no body.
3330 int va;
3331 extern int vb; Doesn't match, as it doesn't define the variable.
3332 void fa() {}
3333 void fb(); Doesn't match, as it has no body.
3334 @interface X
3335 - (void)ma; Doesn't match, interface is declaration.
3336 @end
3337 @implementation X
3338 - (void)ma {}
3339 @end
3340
3341Usable 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;,
3342 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3343</pre></td></tr>
3344
3345
Aaron Ballman5f8980a2017-11-21 19:22:34 +00003346<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>
3347<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3348
3349Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3350void x(int val) {}
3351void y(int val = 0) {}
3352</pre></td></tr>
3353
3354
Aaron Ballman672dde22016-01-22 23:15:00 +00003355<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003356<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3357
3358Given
3359 class Y { public: void x(); };
3360 void z() { Y* y; y-&gt;x(); }
3361cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3362 matches y-&gt;x()
3363</pre></td></tr>
3364
3365
Aaron Ballman672dde22016-01-22 23:15:00 +00003366<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 +00003367<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3368
3369Matches a node if it equals the node previously bound to ID.
3370
3371Given
3372 class X { int a; int b; };
3373cxxRecordDecl(
3374 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3375 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3376 matches the class X, as a and b have the same type.
3377
3378Note that when multiple matches are involved via forEach* matchers,
3379equalsBoundNodes acts as a filter.
3380For example:
3381compoundStmt(
3382 forEachDescendant(varDecl().bind("d")),
3383 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3384will trigger a match for each combination of variable declaration
3385and reference to that variable declaration within a compound statement.
3386</pre></td></tr>
3387
3388
Aaron Ballman672dde22016-01-22 23:15:00 +00003389<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 +00003390<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3391the node, not hidden within a typedef.
3392
3393Given
3394 typedef const int const_int;
3395 const_int i;
3396 int *const j;
3397 int *volatile k;
3398 int m;
3399varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3400i is const-qualified but the qualifier is not local.
3401</pre></td></tr>
3402
3403
Aaron Ballman672dde22016-01-22 23:15:00 +00003404<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 +00003405<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3406
3407Given
3408 void a(char);
3409 void b(wchar_t);
3410 void c(double);
3411functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3412matches "a(char)", "b(wchar_t)", but not "c(double)".
3413</pre></td></tr>
3414
3415
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003416<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 +00003417<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3418the Objective-C object pointer type, which is different despite being
3419syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003420
3421Given
3422 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003423
3424 @interface Foo
3425 @end
3426 Foo *f;
3427
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003428 int j;
3429varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003430 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003431</pre></td></tr>
3432
3433
Aaron Ballman672dde22016-01-22 23:15:00 +00003434<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003435<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3436include "top-level" const.
3437
3438Given
3439 void a(int);
3440 void b(int const);
3441 void c(const int);
3442 void d(const int*);
3443 void e(int const) {};
3444functionDecl(hasAnyParameter(hasType(isConstQualified())))
3445 matches "void b(int const)", "void c(const int)" and
3446 "void e(int const) {}". It does not match d as there
3447 is no top-level const on the parameter type "const int *".
3448</pre></td></tr>
3449
3450
Aaron Ballman672dde22016-01-22 23:15:00 +00003451<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 +00003452<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3453
3454Given
3455 void a(int);
3456 void b(long);
3457 void c(double);
3458functionDecl(hasAnyParameter(hasType(isInteger())))
3459matches "a(int)", "b(long)", but not "c(double)".
3460</pre></td></tr>
3461
3462
Clement Courbet42517592016-07-12 06:36:00 +00003463<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>
3464<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3465
3466Given
3467 void a(int);
3468 void b(unsigned long);
3469 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003470functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003471matches "a(int)", but not "b(unsigned long)" and "c(double)".
3472</pre></td></tr>
3473
3474
3475<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>
3476<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3477
3478Given
3479 void a(int);
3480 void b(unsigned long);
3481 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003482functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003483matches "b(unsigned long)", but not "a(int)" and "c(double)".
3484</pre></td></tr>
3485
3486
Aaron Ballman672dde22016-01-22 23:15:00 +00003487<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00003488<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3489include "top-level" volatile.
3490
3491Given
3492 void a(int);
3493 void b(int volatile);
3494 void c(volatile int);
3495 void d(volatile int*);
3496 void e(int volatile) {};
3497functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3498 matches "void b(int volatile)", "void c(volatile int)" and
3499 "void e(int volatile) {}". It does not match d as there
3500 is no top-level volatile on the parameter type "volatile int *".
3501</pre></td></tr>
3502
3503
Aaron Ballman672dde22016-01-22 23:15:00 +00003504<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 +00003505<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3506
3507Example matches C, but not S or U.
3508 struct S {};
3509 class C {};
3510 union U {};
3511</pre></td></tr>
3512
3513
Aaron Ballman672dde22016-01-22 23:15:00 +00003514<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 +00003515<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3516
3517Example matches S, but not C or U.
3518 struct S {};
3519 class C {};
3520 union U {};
3521</pre></td></tr>
3522
3523
Aaron Ballman672dde22016-01-22 23:15:00 +00003524<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 +00003525<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3526
3527Example matches U, but not C or S.
3528 struct S {};
3529 class C {};
3530 union U {};
3531</pre></td></tr>
3532
3533
Aaron Ballman672dde22016-01-22 23:15:00 +00003534<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 +00003535<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3536
3537Matches a node if it equals the node previously bound to ID.
3538
3539Given
3540 class X { int a; int b; };
3541cxxRecordDecl(
3542 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3543 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3544 matches the class X, as a and b have the same type.
3545
3546Note that when multiple matches are involved via forEach* matchers,
3547equalsBoundNodes acts as a filter.
3548For example:
3549compoundStmt(
3550 forEachDescendant(varDecl().bind("d")),
3551 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3552will trigger a match for each combination of variable declaration
3553and reference to that variable declaration within a compound statement.
3554</pre></td></tr>
3555
3556
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003557<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>
3558<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3559
3560Stmt has pointer identity in the AST.
3561</pre></td></tr>
3562
3563
Aaron Ballman672dde22016-01-22 23:15:00 +00003564<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 +00003565<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3566partially matching a given regex.
3567
3568Example matches Y but not X
3569 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3570 #include "ASTMatcher.h"
3571 class X {};
3572ASTMatcher.h:
3573 class Y {};
3574
Aaron Ballman672dde22016-01-22 23:15:00 +00003575Usable 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 +00003576</pre></td></tr>
3577
3578
Aaron Ballman672dde22016-01-22 23:15:00 +00003579<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 +00003580<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3581
3582Example matches X but not Y
3583 (matcher = cxxRecordDecl(isExpansionInMainFile())
3584 #include &lt;Y.h&gt;
3585 class X {};
3586Y.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('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003594<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3595
3596Example matches Y but not X
3597 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3598 #include &lt;SystemHeader.h&gt;
3599 class X {};
3600SystemHeader.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
Etienne Bergeron3588be72016-05-12 04:20:04 +00003607<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>
3608<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3609
3610Given
3611 int a[42];
3612 int b[2 * 21];
3613 int c[41], d[43];
3614 char *s = "abcd";
3615 wchar_t *ws = L"abcd";
3616 char *w = "a";
3617constantArrayType(hasSize(42))
3618 matches "int a[42]" and "int b[2 * 21]"
3619stringLiteral(hasSize(4))
3620 matches "abcd", L"abcd"
3621</pre></td></tr>
3622
3623
Aaron Ballman672dde22016-01-22 23:15:00 +00003624<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 +00003625<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3626
3627Example matches A, va, fa
3628 class A {};
3629 class B; Doesn't match, as it has no body.
3630 int va;
3631 extern int vb; Doesn't match, as it doesn't define the variable.
3632 void fa() {}
3633 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003634 @interface X
3635 - (void)ma; Doesn't match, interface is declaration.
3636 @end
3637 @implementation X
3638 - (void)ma {}
3639 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003640
Dave Leebe398682017-11-14 14:17:26 +00003641Usable 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;,
3642 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003643</pre></td></tr>
3644
3645
Aaron Ballman672dde22016-01-22 23:15:00 +00003646<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 +00003647<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3648
3649Note that 'Value' is a string as the template argument's value is
3650an arbitrary precision integer. 'Value' must be euqal to the canonical
3651representation of that integral value in base 10.
3652
3653Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003654 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003655 C&lt;42&gt; c;
3656classTemplateSpecializationDecl(
3657 hasAnyTemplateArgument(equalsIntegralValue("42")))
3658 matches the implicit instantiation of C in C&lt;42&gt;.
3659</pre></td></tr>
3660
3661
Aaron Ballman672dde22016-01-22 23:15:00 +00003662<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 +00003663<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3664
3665Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003666 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003667 C&lt;42&gt; c;
3668classTemplateSpecializationDecl(
3669 hasAnyTemplateArgument(isIntegral()))
3670 matches the implicit instantiation of C in C&lt;42&gt;
3671 with isIntegral() matching 42.
3672</pre></td></tr>
3673
3674
Aaron Ballman672dde22016-01-22 23:15:00 +00003675<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 +00003676<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3677
3678Given
3679 template&lt;typename T&gt; struct C {};
3680 C&lt;int&gt; c;
3681classTemplateSpecializationDecl(templateArgumentCountIs(1))
3682 matches C&lt;int&gt;.
3683</pre></td></tr>
3684
3685
Aaron Ballman672dde22016-01-22 23:15:00 +00003686<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 +00003687<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3688partially matching a given regex.
3689
3690Example matches Y but not X
3691 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3692 #include "ASTMatcher.h"
3693 class X {};
3694ASTMatcher.h:
3695 class Y {};
3696
Aaron Ballman672dde22016-01-22 23:15:00 +00003697Usable 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 +00003698</pre></td></tr>
3699
3700
Aaron Ballman672dde22016-01-22 23:15:00 +00003701<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 +00003702<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3703
3704Example matches X but not Y
3705 (matcher = cxxRecordDecl(isExpansionInMainFile())
3706 #include &lt;Y.h&gt;
3707 class X {};
3708Y.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('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003716<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3717
3718Example matches Y but not X
3719 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3720 #include &lt;SystemHeader.h&gt;
3721 class X {};
3722SystemHeader.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_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 +00003730<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3731
3732Given
3733 struct S { bool func(); };
3734functionDecl(returns(booleanType()))
3735 matches "bool func();"
3736</pre></td></tr>
3737
3738
Aaron Ballman672dde22016-01-22 23:15:00 +00003739<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 +00003740<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3741
3742Matches a node if it equals the node previously bound to ID.
3743
3744Given
3745 class X { int a; int b; };
3746cxxRecordDecl(
3747 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3748 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3749 matches the class X, as a and b have the same type.
3750
3751Note that when multiple matches are involved via forEach* matchers,
3752equalsBoundNodes acts as a filter.
3753For example:
3754compoundStmt(
3755 forEachDescendant(varDecl().bind("d")),
3756 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3757will trigger a match for each combination of variable declaration
3758and reference to that variable declaration within a compound statement.
3759</pre></td></tr>
3760
3761
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003762<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>
3763<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3764
3765Type has pointer identity in the AST.
3766</pre></td></tr>
3767
3768
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003769<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>
3770<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3771
3772Given
3773 int i;
3774 float f;
3775realFloatingPointType()
3776 matches "float f" but not "int i"
3777</pre></td></tr>
3778
3779
Aaron Ballman672dde22016-01-22 23:15:00 +00003780<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 +00003781<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3782
3783Given
3784 struct S { void func(); };
3785functionDecl(returns(voidType()))
3786 matches "void func();"
3787</pre></td></tr>
3788
3789
Aaron Ballman672dde22016-01-22 23:15:00 +00003790<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 +00003791<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3792
3793Given
3794 int x;
3795 int s = sizeof(x) + alignof(x)
3796unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3797 matches sizeof(x)
3798</pre></td></tr>
3799
3800
Aaron Ballman672dde22016-01-22 23:15:00 +00003801<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 +00003802<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3803unary).
3804
3805Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3806 !(a || b)
3807</pre></td></tr>
3808
3809
Aaron Ballman672dde22016-01-22 23:15:00 +00003810<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 +00003811<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3812
3813Example matches x, but not y, z, or a.
3814(matcher = varDecl(hasAutomaticStorageDuration())
3815void f() {
3816 int x;
3817 static int y;
3818 thread_local int z;
3819}
3820int a;
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('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003825<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3826
3827Example matches y and z (matcher = varDecl(hasGlobalStorage())
3828void f() {
3829 int x;
3830 static int y;
3831}
3832int z;
3833</pre></td></tr>
3834
3835
Aaron Ballman672dde22016-01-22 23:15:00 +00003836<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 +00003837<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3838non-static local variable.
3839
3840Example matches x (matcher = varDecl(hasLocalStorage())
3841void f() {
3842 int x;
3843 static int y;
3844}
3845int z;
3846</pre></td></tr>
3847
3848
Aaron Ballman672dde22016-01-22 23:15:00 +00003849<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 +00003850<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 +00003851It includes the variable declared at namespace scope and those declared
3852with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003853
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003854void f() {
3855 int x;
3856 static int y;
3857 thread_local int z;
3858}
3859int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003860static int b;
3861extern int c;
3862varDecl(hasStaticStorageDuration())
3863 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003864</pre></td></tr>
3865
3866
Aaron Ballman672dde22016-01-22 23:15:00 +00003867<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 +00003868<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3869
3870Example matches z, but not x, z, or a.
3871(matcher = varDecl(hasThreadStorageDuration())
3872void f() {
3873 int x;
3874 static int y;
3875 thread_local int z;
3876}
3877int a;
3878</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('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003882<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
3883 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003884
3885Given:
3886 constexpr int foo = 42;
3887 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003888 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003889varDecl(isConstexpr())
3890 matches the declaration of foo.
3891functionDecl(isConstexpr())
3892 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003893ifStmt(isConstexpr())
3894 matches the if statement in baz.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003895</pre></td></tr>
3896
3897
Aaron Ballman672dde22016-01-22 23:15:00 +00003898<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 +00003899<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3900
3901Example matches A, va, fa
3902 class A {};
3903 class B; Doesn't match, as it has no body.
3904 int va;
3905 extern int vb; Doesn't match, as it doesn't define the variable.
3906 void fa() {}
3907 void fb(); Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003908 @interface X
3909 - (void)ma; Doesn't match, interface is declaration.
3910 @end
3911 @implementation X
3912 - (void)ma {}
3913 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003914
Dave Leebe398682017-11-14 14:17:26 +00003915Usable 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;,
3916 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003917</pre></td></tr>
3918
3919
Aaron Ballman672dde22016-01-22 23:15:00 +00003920<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 +00003921<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3922a C++ catch block, or an Objective-C statement.
3923
3924Example matches x (matcher = varDecl(isExceptionVariable())
3925void f(int y) {
3926 try {
3927 } catch (int x) {
3928 }
3929}
3930</pre></td></tr>
3931
3932
Aaron Ballman672dde22016-01-22 23:15:00 +00003933<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 +00003934<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3935static member variable template instantiations.
3936
3937Given
3938 template&lt;typename T&gt; void A(T t) { }
3939 template&lt;&gt; void A(int N) { }
3940functionDecl(isExplicitTemplateSpecialization())
3941 matches the specialization A&lt;int&gt;().
3942
Aaron Ballman672dde22016-01-22 23:15:00 +00003943Usable 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 +00003944</pre></td></tr>
3945
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003946
Benjamin Kramer87e6d992016-08-04 10:02:03 +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('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003948<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003949
3950Given:
3951 extern "C" void f() {}
3952 extern "C" { void g() {} }
3953 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003954 extern "C" int x = 1;
3955 extern "C" int y = 2;
3956 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003957functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003958 matches the declaration of f and g, but not the declaration of h.
3959varDecl(isExternC())
3960 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00003961</pre></td></tr>
3962
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003963
Haojian Wub3d25462016-09-26 16:01:52 +00003964<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 +00003965<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3966class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003967
3968Given:
3969 static void f() {}
3970 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003971 extern int j;
3972 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003973functionDecl(isStaticStorageClass())
3974 matches the function declaration f.
3975varDecl(isStaticStorageClass())
3976 matches the variable declaration i.
3977</pre></td></tr>
3978
3979
Aaron Ballman672dde22016-01-22 23:15:00 +00003980<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 +00003981<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3982member variable template instantiations.
3983
3984Given
3985 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3986or
3987 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00003988or
3989 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003990cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3991 matches the template instantiation of X&lt;A&gt;.
3992
3993But given
3994 template &lt;typename T&gt; class X {}; class A {};
3995 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3996cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3997 does not match, as X&lt;A&gt; is an explicit template specialization.
3998
Aaron Ballman672dde22016-01-22 23:15:00 +00003999Usable 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 +00004000</pre></td></tr>
4001
4002
Aaron Ballman672dde22016-01-22 23:15:00 +00004003<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 +00004004<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4005template instantiations.
4006
4007Given
4008 template&lt;typename T&gt; void A(T t) { T i; }
4009 A(0);
4010 A(0U);
4011functionDecl(isInstantiated())
4012 matches 'A(int) {...};' and 'A(unsigned) {...}'.
4013</pre></td></tr>
4014
4015
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00004016<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>
4017<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4018GNU's __null, C++11's nullptr, or C's NULL macro.
4019
4020Given:
4021 void *v1 = NULL;
4022 void *v2 = nullptr;
4023 void *v3 = __null; GNU extension
4024 char *cp = (char *)0;
4025 int *ip = 0;
4026 int i = 0;
4027expr(nullPointerConstant())
4028 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4029 initializer for i.
4030</pre></td></tr>
4031
4032
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00004033<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>
4034<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4035
4036This matcher is only provided as a performance optimization of hasName.
4037 hasAnyName(a, b, c)
4038 is equivalent to, but faster than
4039 anyOf(hasName(a), hasName(b), hasName(c))
4040</pre></td></tr>
4041
4042
George Karpenkov88a16a02018-03-29 00:51:12 +00004043<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>
4044<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4045Selector.getAsString()
4046
4047 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4048 matches both of the expressions below:
4049 [myObj methodA:argA];
4050 [myObj methodB:argB];
4051</pre></td></tr>
4052
4053
Aaron Ballman672dde22016-01-22 23:15:00 +00004054<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 +00004055<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4056
4057Given
4058 int j;
4059 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4060 A(0);
4061 A(0U);
4062declStmt(isInTemplateInstantiation())
4063 matches 'int i;' and 'unsigned i'.
4064unless(stmt(isInTemplateInstantiation()))
4065 will NOT match j += 42; as it's shared between the template definition and
4066 instantiation.
4067</pre></td></tr>
4068
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00004069<!--END_NARROWING_MATCHERS -->
4070</table>
4071
4072<!-- ======================================================================= -->
4073<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4074<!-- ======================================================================= -->
4075
4076<p>Traversal matchers specify the relationship to other nodes that are
4077reachable from the current node.</p>
4078
4079<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4080forEachDescendant) which work on all nodes and allow users to write more generic
4081match expressions.</p>
4082
4083<table>
4084<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004085<!-- START_TRAVERSAL_MATCHERS -->
4086
4087<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>
4088<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4089
4090Unlike anyOf, eachOf will generate a match result for each
4091matching submatcher.
4092
4093For example, in:
4094 class A { int a; int b; };
4095The matcher:
4096 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4097 has(fieldDecl(hasName("b")).bind("v"))))
4098will generate two results binding "v", the first of which binds
4099the field declaration of a, the second the field declaration of
4100b.
4101
4102Usable as: Any Matcher
4103</pre></td></tr>
4104
4105
4106<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4107<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4108provided matcher.
4109
Fangrui Song55942ab2018-01-22 22:34:15 +00004110Example matches X, A, A::X, B, B::C, B::C::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004111 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
Fangrui Song55942ab2018-01-22 22:34:15 +00004112 class X {};
4113 class A { class X {}; }; Matches A, because A::X is a class of name
4114 X inside A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004115 class B { class C { class X {}; }; };
4116
4117DescendantT must be an AST base type.
4118
4119As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4120each result that matches instead of only on the first one.
4121
4122Note: Recursively combined ForEachDescendant can cause many matches:
4123 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4124 forEachDescendant(cxxRecordDecl())
4125 )))
4126will match 10 times (plus injected class name matches) on:
4127 class A { class B { class C { class D { class E {}; }; }; }; };
4128
4129Usable as: Any Matcher
4130</pre></td></tr>
4131
4132
4133<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4134<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4135provided matcher.
4136
Fangrui Song55942ab2018-01-22 22:34:15 +00004137Example matches X, Y, Y::X, Z::Y, Z::Y::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004138 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
Fangrui Song55942ab2018-01-22 22:34:15 +00004139 class X {};
4140 class Y { class X {}; }; Matches Y, because Y::X is a class of name X
4141 inside Y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004142 class Z { class Y { class X {}; }; }; Does not match Z.
4143
4144ChildT must be an AST base type.
4145
4146As opposed to 'has', 'forEach' will cause a match for each result that
4147matches instead of only on the first one.
4148
4149Usable as: Any Matcher
4150</pre></td></tr>
4151
4152
4153<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4154<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4155matcher.
4156
4157Given
4158void f() { if (true) { int x = 42; } }
4159void g() { for (;;) { int x = 43; } }
4160expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4161
4162Usable as: Any Matcher
4163</pre></td></tr>
4164
4165
4166<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4167<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4168provided matcher.
4169
4170Example matches X, Y, Z
4171 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4172 class X {}; Matches X, because X::X is a class of name X inside X.
4173 class Y { class X {}; };
4174 class Z { class Y { class X {}; }; };
4175
4176DescendantT must be an AST base type.
4177
4178Usable as: Any Matcher
4179</pre></td></tr>
4180
4181
4182<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4183<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4184provided matcher.
4185
4186Example matches X, Y
4187 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4188 class X {}; Matches X, because X::X is a class of name X inside X.
4189 class Y { class X {}; };
4190 class Z { class Y { class X {}; }; }; Does not match Z.
4191
4192ChildT must be an AST base type.
4193
4194Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00004195Note that has is direct matcher, so it also matches things like implicit
4196casts and paren casts. If you are matching with expr then you should
4197probably consider using ignoringParenImpCasts like:
4198has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004199</pre></td></tr>
4200
4201
4202<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4203<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4204matcher.
4205
4206Given
4207void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4208compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4209
4210Usable as: Any Matcher
4211</pre></td></tr>
4212
4213
Etienne Bergeron5500f952016-05-30 15:25:25 +00004214<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>
4215<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4216switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004217
4218Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4219 if (true) {}
4220</pre></td></tr>
4221
4222
4223<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>
4224<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4225(binary or ternary).
4226
4227Example matches b
4228 condition ? a : b
4229 condition ?: b
4230</pre></td></tr>
4231
4232
4233<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>
4234<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4235
4236Example 1 (conditional ternary operator): matches a
4237 condition ? a : b
4238
4239Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4240 condition ?: b
4241</pre></td></tr>
4242
4243
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004244<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 +00004245<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 +00004246matches the given matcher.
4247
4248The associated declaration is:
4249- for type nodes, the declaration of the underlying type
4250- for CallExpr, the declaration of the callee
4251- for MemberExpr, the declaration of the referenced member
4252- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004253- for CXXNewExpr, the declaration of the operator new
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004254
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004255For type nodes, hasDeclaration will generally match the declaration of the
4256sugared type. Given
4257 class X {};
4258 typedef X Y;
4259 Y y;
4260in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4261typedefDecl. A common use case is to match the underlying, desugared type.
4262This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4263 varDecl(hasType(hasUnqualifiedDesugaredType(
4264 recordType(hasDeclaration(decl())))))
4265In this matcher, the decl will match the CXXRecordDecl of class X.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004266
Manuel Klimeka37e1102016-12-01 15:45:06 +00004267Usable 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;,
4268 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;,
4269 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;,
4270 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;,
4271 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;,
4272 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;,
4273 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004274</pre></td></tr>
4275
4276
Aaron Ballman672dde22016-01-22 23:15:00 +00004277<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004278<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4279
4280Given
4281 int i[5];
4282 void f() { i[1] = 42; }
4283arraySubscriptExpression(hasBase(implicitCastExpr(
4284 hasSourceExpression(declRefExpr()))))
4285 matches i[1] with the declRefExpr() matching i
4286</pre></td></tr>
4287
4288
Aaron Ballman672dde22016-01-22 23:15:00 +00004289<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 +00004290<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4291
4292Given
4293 int i[5];
4294 void f() { i[1] = 42; }
4295arraySubscriptExpression(hasIndex(integerLiteral()))
4296 matches i[1] with the integerLiteral() matching 1
4297</pre></td></tr>
4298
4299
Aaron Ballman672dde22016-01-22 23:15:00 +00004300<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 +00004301<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4302
4303Example matches a (matcher = binaryOperator(hasLHS()))
4304 a || b
4305</pre></td></tr>
4306
4307
Aaron Ballman672dde22016-01-22 23:15:00 +00004308<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004309<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4310
4311Example matches b (matcher = binaryOperator(hasRHS()))
4312 a || b
4313</pre></td></tr>
4314
4315
Aaron Ballman672dde22016-01-22 23:15:00 +00004316<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 +00004317<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4318type.
4319
4320Given
4321 struct A {};
4322 A a[7];
4323 int b[7];
4324arrayType(hasElementType(builtinType()))
4325 matches "int b[7]"
4326
Aaron Ballman672dde22016-01-22 23:15:00 +00004327Usable 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 +00004328</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_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 +00004332<tr><td colspan="4" class="doc" id="hasElementType0"><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_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 +00004347<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4348
4349Given
4350 _Atomic(int) i;
4351 _Atomic(float) f;
4352atomicType(hasValueType(isInteger()))
4353 matches "_Atomic(int) i"
4354
Aaron Ballman672dde22016-01-22 23:15:00 +00004355Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004356</pre></td></tr>
4357
4358
Aaron Ballman672dde22016-01-22 23:15:00 +00004359<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 +00004360<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4361
4362Given
4363 _Atomic(int) i;
4364 _Atomic(float) f;
4365atomicType(hasValueType(isInteger()))
4366 matches "_Atomic(int) i"
4367
Aaron Ballman672dde22016-01-22 23:15:00 +00004368Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004369</pre></td></tr>
4370
4371
Aaron Ballman672dde22016-01-22 23:15:00 +00004372<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 +00004373<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4374
4375Note: There is no TypeLoc for the deduced type and thus no
4376getDeducedLoc() matcher.
4377
4378Given
4379 auto a = 1;
4380 auto b = 2.0;
4381autoType(hasDeducedType(isInteger()))
4382 matches "auto a"
4383
Aaron Ballman672dde22016-01-22 23:15:00 +00004384Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004385</pre></td></tr>
4386
4387
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004388<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 +00004389<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4390binary operator matches.
4391</pre></td></tr>
4392
4393
Aaron Ballman672dde22016-01-22 23:15:00 +00004394<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 +00004395<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4396
4397Example matches a (matcher = binaryOperator(hasLHS()))
4398 a || b
4399</pre></td></tr>
4400
4401
Aaron Ballman672dde22016-01-22 23:15:00 +00004402<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 +00004403<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4404
4405Example matches b (matcher = binaryOperator(hasRHS()))
4406 a || b
4407</pre></td></tr>
4408
4409
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00004410<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>
4411<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
4412block.
4413
4414Does not match the 'this' parameter of a method.
4415
4416Given
4417 class X { void f(int x, int y, int z) {} };
4418cxxMethodDecl(hasAnyParameter(hasName("y")))
4419 matches f(int x, int y, int z) {}
4420with hasAnyParameter(...)
4421 matching int y
4422
4423For ObjectiveC, given
4424 @interface I - (void) f:(int) y; @end
4425
4426the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
4427matches the declaration of method f with hasParameter
4428matching y.
4429
4430For blocks, given
4431 b = ^(int y) { printf("%d", y) };
4432
4433the matcher blockDecl(hasAnyParameter(hasName("y")))
4434matches the declaration of the block b with hasParameter
4435matching y.
4436</pre></td></tr>
4437
4438
4439<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>
4440<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
4441declaration or a block.
4442
4443Given
4444 class X { void f(int x) {} };
4445cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4446 matches f(int x) {}
4447with hasParameter(...)
4448 matching int x
4449
4450For ObjectiveC, given
4451 @interface I - (void) f:(int) y; @end
4452
4453the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4454matches the declaration of method f with hasParameter
4455matching y.
4456</pre></td></tr>
4457
4458
Aaron Ballman672dde22016-01-22 23:15:00 +00004459<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 +00004460<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4461pointee matches a given matcher.
4462
4463Given
4464 int *a;
4465 int const *b;
4466 float const *f;
4467pointerType(pointee(isConstQualified(), isInteger()))
4468 matches "int const *b"
4469
Aaron Ballman672dde22016-01-22 23:15:00 +00004470Usable 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;,
4471 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 +00004472</pre></td></tr>
4473
4474
Aaron Ballman672dde22016-01-22 23:15:00 +00004475<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004476<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4477pointee matches a given matcher.
4478
4479Given
4480 int *a;
4481 int const *b;
4482 float const *f;
4483pointerType(pointee(isConstQualified(), isInteger()))
4484 matches "int const *b"
4485
Aaron Ballman672dde22016-01-22 23:15:00 +00004486Usable 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;,
4487 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 +00004488</pre></td></tr>
4489
4490
Aaron Ballman672dde22016-01-22 23:15:00 +00004491<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 +00004492<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4493
4494Given
4495 void f(int i);
4496 int y;
4497 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004498callExpr(
4499 forEachArgumentWithParam(
4500 declRefExpr(to(varDecl(hasName("y")))),
4501 parmVarDecl(hasType(isInteger()))
4502))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004503 matches f(y);
4504with declRefExpr(...)
4505 matching int y
4506and parmVarDecl(...)
4507 matching int i
4508</pre></td></tr>
4509
4510
Aaron Ballman672dde22016-01-22 23:15:00 +00004511<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 +00004512<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 +00004513expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004514
4515Given
4516 void x(int, int, int) { int y; x(1, y, 42); }
4517callExpr(hasAnyArgument(declRefExpr()))
4518 matches x(1, y, 42)
4519with hasAnyArgument(...)
4520 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00004521
4522For ObjectiveC, given
4523 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00004524 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00004525objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4526 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004527</pre></td></tr>
4528
4529
Aaron Ballman672dde22016-01-22 23:15:00 +00004530<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 +00004531<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4532call expression.
4533
4534Example matches y in x(y)
4535 (matcher = callExpr(hasArgument(0, declRefExpr())))
4536 void x(int) { int y; x(y); }
4537</pre></td></tr>
4538
4539
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004540<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 +00004541<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 +00004542matches the given matcher.
4543
4544The associated declaration is:
4545- for type nodes, the declaration of the underlying type
4546- for CallExpr, the declaration of the callee
4547- for MemberExpr, the declaration of the referenced member
4548- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004549- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004550
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004551For type nodes, hasDeclaration will generally match the declaration of the
4552sugared type. Given
4553 class X {};
4554 typedef X Y;
4555 Y y;
4556in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4557typedefDecl. A common use case is to match the underlying, desugared type.
4558This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4559 varDecl(hasType(hasUnqualifiedDesugaredType(
4560 recordType(hasDeclaration(decl())))))
4561In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004562
Manuel Klimeka37e1102016-12-01 15:45:06 +00004563Usable 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;,
4564 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;,
4565 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;,
4566 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;,
4567 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;,
4568 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;,
4569 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004570</pre></td></tr>
4571
4572
Aaron Ballman672dde22016-01-22 23:15:00 +00004573<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 +00004574<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4575
4576Given
4577 class A { A() : i(42), j(42) {} int i; int j; };
4578cxxConstructorDecl(forEachConstructorInitializer(
4579 forField(decl().bind("x"))
4580))
4581 will trigger two matches, binding for 'i' and 'j' respectively.
4582</pre></td></tr>
4583
4584
Aaron Ballman672dde22016-01-22 23:15:00 +00004585<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004586<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4587
4588Given
4589 struct Foo {
4590 Foo() : foo_(1) { }
4591 int foo_;
4592 };
4593cxxRecordDecl(has(cxxConstructorDecl(
4594 hasAnyConstructorInitializer(anything())
4595)))
4596 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4597</pre></td></tr>
4598
4599
Aaron Ballman672dde22016-01-22 23:15:00 +00004600<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 +00004601<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4602
4603Given
4604 struct Foo {
4605 Foo() : foo_(1) { }
4606 int foo_;
4607 };
4608cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4609 forField(hasName("foo_"))))))
4610 matches Foo
4611with forField matching foo_
4612</pre></td></tr>
4613
4614
Aaron Ballman672dde22016-01-22 23:15:00 +00004615<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 +00004616<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4617
4618Given
4619 struct Foo {
4620 Foo() : foo_(1) { }
4621 int foo_;
4622 };
4623cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4624 withInitializer(integerLiteral(equals(1)))))))
4625 matches Foo
4626with withInitializer matching (1)
4627</pre></td></tr>
4628
4629
Aaron Ballman672dde22016-01-22 23:15:00 +00004630<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 +00004631<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4632definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004633
4634Given
4635 for (;;) {}
4636hasBody(compoundStmt())
4637 matches 'for (;;) {}'
4638with compoundStmt()
4639 matching '{}'
4640</pre></td></tr>
4641
4642
Aaron Ballman672dde22016-01-22 23:15:00 +00004643<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 +00004644<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4645
4646Example:
4647 forStmt(hasLoopVariable(anything()))
4648matches 'int x' in
4649 for (int x : a) { }
4650</pre></td></tr>
4651
4652
Aaron Ballman672dde22016-01-22 23:15:00 +00004653<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 +00004654<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4655
4656Example:
4657 forStmt(hasRangeInit(anything()))
4658matches 'a' in
4659 for (int x : a) { }
4660</pre></td></tr>
4661
4662
Aaron Ballman672dde22016-01-22 23:15:00 +00004663<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 +00004664<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4665
4666
Aaron Ballman672dde22016-01-22 23:15:00 +00004667<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 +00004668<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4669
4670Example matches y.x()
4671 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4672 class Y { public: void x(); };
Fangrui Song55942ab2018-01-22 22:34:15 +00004673 void z() { Y y; y.x(); }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004674
4675FIXME: Overload to allow directly matching types?
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('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 +00004680<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4681</pre></td></tr>
4682
4683
Aaron Ballman672dde22016-01-22 23:15:00 +00004684<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00004685<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4686matcher, or is a pointer to a type that matches the InnerMatcher.
4687</pre></td></tr>
4688
4689
Clement Courbet6ecaec82016-07-05 07:49:31 +00004690<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 +00004691<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 +00004692produce multiple matches.
4693
4694Given
4695 class A { virtual void f(); };
4696 class B : public A { void f(); };
4697 class C : public B { void f(); };
4698cxxMethodDecl(ofClass(hasName("C")),
4699 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4700 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4701 that B::f is not overridden by C::f).
4702
4703The check can produce multiple matches in case of multiple inheritance, e.g.
4704 class A1 { virtual void f(); };
4705 class A2 { virtual void f(); };
4706 class C : public A1, public A2 { void f(); };
4707cxxMethodDecl(ofClass(hasName("C")),
4708 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4709 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4710 once with "b" binding "A2::f" and "d" binding "C::f".
4711</pre></td></tr>
4712
4713
Aaron Ballman672dde22016-01-22 23:15:00 +00004714<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 +00004715<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4716belongs to.
4717
4718FIXME: Generalize this for other kinds of declarations.
4719FIXME: What other kind of declarations would we need to generalize
4720this to?
4721
4722Example matches A() in the last line
4723 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4724 ofClass(hasName("A"))))))
4725 class A {
4726 public:
4727 A();
4728 };
4729 A a = A();
4730</pre></td></tr>
4731
4732
Adam Baloghda488a62017-11-23 12:43:20 +00004733<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>
4734<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
4735
4736Given:
4737 MyClass *p1 = new MyClass[10];
4738cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
4739 matches the expression 'new MyClass[10]'.
4740</pre></td></tr>
4741
4742
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004743<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 +00004744<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 +00004745matches the given matcher.
4746
4747The associated declaration is:
4748- for type nodes, the declaration of the underlying type
4749- for CallExpr, the declaration of the callee
4750- for MemberExpr, the declaration of the referenced member
4751- for CXXConstructExpr, the declaration of the constructor
4752- for CXXNewExpr, the declaration of the operator new
4753
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004754For type nodes, hasDeclaration will generally match the declaration of the
4755sugared type. Given
4756 class X {};
4757 typedef X Y;
4758 Y y;
4759in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4760typedefDecl. A common use case is to match the underlying, desugared type.
4761This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4762 varDecl(hasType(hasUnqualifiedDesugaredType(
4763 recordType(hasDeclaration(decl())))))
4764In this matcher, the decl will match the CXXRecordDecl of class X.
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004765
Manuel Klimeka37e1102016-12-01 15:45:06 +00004766Usable 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;,
4767 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;,
4768 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;,
4769 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;,
4770 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;,
4771 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;,
4772 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004773</pre></td></tr>
4774
4775
Aaron Ballman672dde22016-01-22 23:15:00 +00004776<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 +00004777<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4778
4779Given:
4780 class A { void func(); };
4781 class B { void member(); };
4782
4783cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4784A but not B.
4785</pre></td></tr>
4786
4787
Aaron Ballman672dde22016-01-22 23:15:00 +00004788<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 +00004789<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4790a class matching Base.
4791
4792Note that a class is not considered to be derived from itself.
4793
4794Example matches Y, Z, C (Base == hasName("X"))
4795 class X;
4796 class Y : public X {}; directly derived
4797 class Z : public Y {}; indirectly derived
4798 typedef X A;
4799 typedef A B;
4800 class C : public B {}; derived from a typedef of X
4801
4802In the following example, Bar matches isDerivedFrom(hasName("X")):
4803 class Foo;
4804 typedef Foo X;
4805 class Bar : public Foo {}; derived from a type that X is a typedef of
4806</pre></td></tr>
4807
4808
Aaron Ballman672dde22016-01-22 23:15:00 +00004809<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 +00004810<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4811match Base.
4812</pre></td></tr>
4813
4814
Aaron Ballman672dde22016-01-22 23:15:00 +00004815<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 +00004816<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4817given matcher.
4818
4819Example matches y.x() (matcher = callExpr(callee(
4820 cxxMethodDecl(hasName("x")))))
4821 class Y { public: void x(); };
4822 void z() { Y y; y.x(); }
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_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 +00004827<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4828
4829Given
4830 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4831 void f() { f(); }
4832callExpr(callee(expr()))
4833 matches this-&gt;x(), x(), y.x(), f()
4834with callee(...)
4835 matching this-&gt;x, x, y.x, f respectively
4836
Aaron Ballman672dde22016-01-22 23:15:00 +00004837Note: 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 +00004838because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00004839internal::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 +00004840implemented in terms of implicit casts.
4841</pre></td></tr>
4842
4843
Aaron Ballman672dde22016-01-22 23:15:00 +00004844<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 +00004845<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4846
4847Given
4848 void f(int i);
4849 int y;
4850 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004851callExpr(
4852 forEachArgumentWithParam(
4853 declRefExpr(to(varDecl(hasName("y")))),
4854 parmVarDecl(hasType(isInteger()))
4855))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004856 matches f(y);
4857with declRefExpr(...)
4858 matching int y
4859and parmVarDecl(...)
4860 matching int i
4861</pre></td></tr>
4862
4863
Aaron Ballman672dde22016-01-22 23:15:00 +00004864<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 +00004865<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 +00004866expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004867
4868Given
4869 void x(int, int, int) { int y; x(1, y, 42); }
4870callExpr(hasAnyArgument(declRefExpr()))
4871 matches x(1, y, 42)
4872with hasAnyArgument(...)
4873 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00004874
4875For ObjectiveC, given
4876 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00004877 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00004878objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4879 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004880</pre></td></tr>
4881
4882
Aaron Ballman672dde22016-01-22 23:15:00 +00004883<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 +00004884<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4885call expression.
4886
4887Example matches y in x(y)
4888 (matcher = callExpr(hasArgument(0, declRefExpr())))
4889 void x(int) { int y; x(y); }
4890</pre></td></tr>
4891
4892
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004893<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 +00004894<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 +00004895matches the given matcher.
4896
4897The associated declaration is:
4898- for type nodes, the declaration of the underlying type
4899- for CallExpr, the declaration of the callee
4900- for MemberExpr, the declaration of the referenced member
4901- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004902- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004903
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004904For type nodes, hasDeclaration will generally match the declaration of the
4905sugared type. Given
4906 class X {};
4907 typedef X Y;
4908 Y y;
4909in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4910typedefDecl. A common use case is to match the underlying, desugared type.
4911This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4912 varDecl(hasType(hasUnqualifiedDesugaredType(
4913 recordType(hasDeclaration(decl())))))
4914In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004915
Manuel Klimeka37e1102016-12-01 15:45:06 +00004916Usable 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;,
4917 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;,
4918 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;,
4919 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;,
4920 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;,
4921 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;,
4922 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004923</pre></td></tr>
4924
4925
Aaron Ballman672dde22016-01-22 23:15:00 +00004926<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 +00004927<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4928extension, matches the constant given in the statement.
4929
4930Given
4931 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4932caseStmt(hasCaseConstant(integerLiteral()))
4933 matches "case 1:"
4934</pre></td></tr>
4935
4936
Aaron Ballman672dde22016-01-22 23:15:00 +00004937<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 +00004938<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
4939or opaque value's source expression matches the given matcher.
4940
4941Example 1: matches "a string"
4942(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
4943class URL { URL(string); };
4944URL url = "a string";
4945
4946Example 2: matches 'b' (matcher =
4947opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
4948int a = b ?: 1;
4949</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004950
4951
Aaron Ballman672dde22016-01-22 23:15:00 +00004952<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 +00004953<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4954functionDecl that have at least one TemplateArgument matching the given
4955InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004956
4957Given
4958 template&lt;typename T&gt; class A {};
4959 template&lt;&gt; class A&lt;double&gt; {};
4960 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00004961
Haojian Wu99e39a72016-07-29 17:30:13 +00004962 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00004963 void func() { f&lt;int&gt;(); };
4964
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004965classTemplateSpecializationDecl(hasAnyTemplateArgument(
4966 refersToType(asString("int"))))
4967 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00004968
4969functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4970 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004971</pre></td></tr>
4972
4973
Manuel Klimek696e5052017-08-02 13:04:44 +00004974<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>
4975<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4976
4977Given
4978 tempalate&lt;typename T&gt; class A {};
4979 typedef A&lt;int&gt; B;
4980classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4981 matches 'B' with classTemplateDecl() matching the class template
4982 declaration of 'A'.
4983</pre></td></tr>
4984
4985
Aaron Ballman672dde22016-01-22 23:15:00 +00004986<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 +00004987<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4988functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004989
4990Given
4991 template&lt;typename T, typename U&gt; class A {};
4992 A&lt;bool, int&gt; b;
4993 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00004994
Fangrui Song55942ab2018-01-22 22:34:15 +00004995 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00004996 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004997classTemplateSpecializationDecl(hasTemplateArgument(
4998 1, refersToType(asString("int"))))
4999 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005000
5001functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5002 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005003</pre></td></tr>
5004
5005
Aaron Ballman672dde22016-01-22 23:15:00 +00005006<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 +00005007<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
5008type.
5009
5010Given
5011 struct A {};
5012 A a[7];
5013 int b[7];
5014arrayType(hasElementType(builtinType()))
5015 matches "int b[7]"
5016
Aaron Ballman672dde22016-01-22 23:15:00 +00005017Usable 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 +00005018</pre></td></tr>
5019
5020
Aaron Ballman672dde22016-01-22 23:15:00 +00005021<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 +00005022<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5023type.
5024
5025Given
5026 struct A {};
5027 A a[7];
5028 int b[7];
5029arrayType(hasElementType(builtinType()))
5030 matches "int b[7]"
5031
Aaron Ballman672dde22016-01-22 23:15:00 +00005032Usable 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 +00005033</pre></td></tr>
5034
5035
Aaron Ballman672dde22016-01-22 23:15:00 +00005036<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 +00005037<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 +00005038a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005039
5040Given
5041 { {}; 1+2; }
5042hasAnySubstatement(compoundStmt())
5043 matches '{ {}; 1+2; }'
5044with compoundStmt()
5045 matching '{}'
5046</pre></td></tr>
5047
5048
Aaron Ballman672dde22016-01-22 23:15:00 +00005049<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 +00005050<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5051</pre></td></tr>
5052
5053
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005054<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 +00005055<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 +00005056matches the given matcher.
5057
5058The associated declaration is:
5059- for type nodes, the declaration of the underlying type
5060- for CallExpr, the declaration of the callee
5061- for MemberExpr, the declaration of the referenced member
5062- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005063- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005064
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005065For type nodes, hasDeclaration will generally match the declaration of the
5066sugared type. Given
5067 class X {};
5068 typedef X Y;
5069 Y y;
5070in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5071typedefDecl. A common use case is to match the underlying, desugared type.
5072This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5073 varDecl(hasType(hasUnqualifiedDesugaredType(
5074 recordType(hasDeclaration(decl())))))
5075In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005076
Manuel Klimeka37e1102016-12-01 15:45:06 +00005077Usable 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;,
5078 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;,
5079 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;,
5080 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;,
5081 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;,
5082 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;,
5083 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005084</pre></td></tr>
5085
5086
Aaron Ballman672dde22016-01-22 23:15:00 +00005087<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 +00005088<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5089specific using shadow declaration.
5090
5091Given
5092 namespace a { void f() {} }
5093 using a::f;
5094 void g() {
5095 f(); Matches this ..
5096 a::f(); .. but not this.
5097 }
5098declRefExpr(throughUsingDecl(anything()))
5099 matches f()
5100</pre></td></tr>
5101
5102
Aaron Ballman672dde22016-01-22 23:15:00 +00005103<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 +00005104<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5105specified matcher.
5106
5107Example matches x in if(x)
5108 (matcher = declRefExpr(to(varDecl(hasName("x")))))
5109 bool x;
5110 if (x) {}
5111</pre></td></tr>
5112
5113
Aaron Ballman672dde22016-01-22 23:15:00 +00005114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005115<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5116
5117Note that this does not work for global declarations because the AST
5118breaks up multiple-declaration DeclStmt's into multiple single-declaration
5119DeclStmt's.
5120Example: Given non-global declarations
5121 int a, b = 0;
5122 int c;
5123 int d = 2, e;
5124declStmt(containsDeclaration(
5125 0, varDecl(hasInitializer(anything()))))
5126 matches only 'int d = 2, e;', and
5127declStmt(containsDeclaration(1, varDecl()))
5128 matches 'int a, b = 0' as well as 'int d = 2, e;'
5129 but 'int c;' is not matched.
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('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 +00005134<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5135
5136Given
5137 int a, b;
5138 int c;
5139declStmt(hasSingleDecl(anything()))
5140 matches 'int c;' but not 'int a, b;'.
5141</pre></td></tr>
5142
5143
Aaron Ballman672dde22016-01-22 23:15:00 +00005144<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 +00005145<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5146the inner matcher.
5147
5148Given
5149 int x;
5150declaratorDecl(hasTypeLoc(loc(asString("int"))))
5151 matches int x
5152</pre></td></tr>
5153
5154
Aaron Ballman672dde22016-01-22 23:15:00 +00005155<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 +00005156<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5157Decl, matches InnerMatcher.
5158
5159Given
5160 namespace N {
5161 namespace M {
5162 class D {};
5163 }
5164 }
5165
5166cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5167declaration of class D.
5168</pre></td></tr>
5169
5170
Jonas Tothacf83672018-07-26 13:02:05 +00005171<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>
5172<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5173
5174Given
5175 decltype(1) a = 1;
5176 decltype(2.0) b = 2.0;
5177decltypeType(hasUnderlyingType(isInteger()))
5178 matches "auto a"
5179
5180Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
5181</pre></td></tr>
5182
5183
Aaron Ballman672dde22016-01-22 23:15:00 +00005184<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 +00005185<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5186definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005187
5188Given
5189 for (;;) {}
5190hasBody(compoundStmt())
5191 matches 'for (;;) {}'
5192with compoundStmt()
5193 matching '{}'
5194</pre></td></tr>
5195
5196
Aaron Ballman672dde22016-01-22 23:15:00 +00005197<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 +00005198<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 +00005199switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005200
5201Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5202 if (true) {}
5203</pre></td></tr>
5204
5205
Aaron Ballman672dde22016-01-22 23:15:00 +00005206<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 +00005207<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5208matches InnerMatcher if the qualifier exists.
5209
5210Given
5211 namespace N {
5212 namespace M {
5213 class D {};
5214 }
5215 }
5216 N::M::D d;
5217
5218elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5219matches the type of the variable declaration of d.
5220</pre></td></tr>
5221
5222
Aaron Ballman672dde22016-01-22 23:15:00 +00005223<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 +00005224<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5225
5226Given
5227 namespace N {
5228 namespace M {
5229 class D {};
5230 }
5231 }
5232 N::M::D d;
5233
5234elaboratedType(namesType(recordType(
5235hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5236declaration of d.
5237</pre></td></tr>
5238
5239
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005240<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 +00005241<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 +00005242matches the given matcher.
5243
5244The associated declaration is:
5245- for type nodes, the declaration of the underlying type
5246- for CallExpr, the declaration of the callee
5247- for MemberExpr, the declaration of the referenced member
5248- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005249- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005250
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005251For type nodes, hasDeclaration will generally match the declaration of the
5252sugared type. Given
5253 class X {};
5254 typedef X Y;
5255 Y y;
5256in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5257typedefDecl. A common use case is to match the underlying, desugared type.
5258This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5259 varDecl(hasType(hasUnqualifiedDesugaredType(
5260 recordType(hasDeclaration(decl())))))
5261In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005262
Manuel Klimeka37e1102016-12-01 15:45:06 +00005263Usable 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;,
5264 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;,
5265 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;,
5266 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;,
5267 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;,
5268 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;,
5269 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005270</pre></td></tr>
5271
5272
Aaron Ballman672dde22016-01-22 23:15:00 +00005273<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 +00005274<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5275
5276(Note: Clang's AST refers to other conversions as "casts" too, and calls
5277actual casts "explicit" casts.)
5278</pre></td></tr>
5279
5280
George Karpenkovba02bc52018-07-06 21:36:04 +00005281<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>
5282<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 +00005283declaration's type.
5284
5285In case of a value declaration (for example a variable declaration),
5286this resolves one layer of indirection. For example, in the value
5287declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5288X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5289declaration of x.
5290
5291Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5292 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00005293 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005294 class X {};
5295 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00005296 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005297
Aaron Ballman672dde22016-01-22 23:15:00 +00005298Usable 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 +00005299</pre></td></tr>
5300
5301
Aaron Ballman672dde22016-01-22 23:15:00 +00005302<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 +00005303<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5304matcher.
5305
5306Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5307 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005308 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00005309 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005310 class X {};
5311 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005312 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00005313 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005314</pre></td></tr>
5315
5316
Aaron Ballman672dde22016-01-22 23:15:00 +00005317<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 +00005318<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5319are stripped off.
5320
5321Parentheses and explicit casts are not discarded.
5322Given
5323 int arr[5];
5324 int a = 0;
5325 char b = 0;
5326 const int c = a;
5327 int *d = arr;
5328 long e = (long) 0l;
5329The matchers
5330 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5331 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5332would match the declarations for a, b, c, and d, but not e.
5333While
5334 varDecl(hasInitializer(integerLiteral()))
5335 varDecl(hasInitializer(declRefExpr()))
5336only match the declarations for b, c, and d.
5337</pre></td></tr>
5338
5339
Clement Courbet369e9752018-03-21 10:54:29 +00005340<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 +00005341<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5342nodes are stripped off.
5343
5344Parentheses and explicit casts are not discarded.
5345Given
5346 class C {};
5347 C a = C();
5348 C b;
5349 C c = b;
5350The matchers
5351 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5352would match the declarations for a, b, and c.
5353While
5354 varDecl(hasInitializer(cxxConstructExpr()))
5355only match the declarations for b and c.
5356</pre></td></tr>
5357
5358
Aaron Ballman672dde22016-01-22 23:15:00 +00005359<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 +00005360<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5361casts are stripped off.
5362
5363Implicit and non-C Style casts are also discarded.
5364Given
5365 int a = 0;
5366 char b = (0);
5367 void* c = reinterpret_cast&lt;char*&gt;(0);
5368 char d = char(0);
5369The matcher
5370 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5371would match the declarations for a, b, c, and d.
5372while
5373 varDecl(hasInitializer(integerLiteral()))
5374only match the declaration for a.
5375</pre></td></tr>
5376
5377
Aaron Ballman672dde22016-01-22 23:15:00 +00005378<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 +00005379<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5380parentheses are stripped off.
5381
5382Explicit casts are not discarded.
5383Given
5384 int arr[5];
5385 int a = 0;
5386 char b = (0);
5387 const int c = a;
5388 int *d = (arr);
5389 long e = ((long) 0l);
5390The matchers
5391 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5392 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5393would match the declarations for a, b, c, and d, but not e.
5394while
5395 varDecl(hasInitializer(integerLiteral()))
5396 varDecl(hasInitializer(declRefExpr()))
5397would only match the declaration for a.
5398</pre></td></tr>
5399
5400
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00005401<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>
5402<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5403
5404Given
5405 class C {
5406 int a = 2;
5407 int b = 3;
5408 int c;
5409 };
5410fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5411 matches 'int a;' but not 'int b;'.
5412fieldDecl(hasInClassInitializer(anything()))
5413 matches 'int a;' and 'int b;' but not 'int c;'.
5414</pre></td></tr>
5415
5416
Aaron Ballman672dde22016-01-22 23:15:00 +00005417<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 +00005418<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5419definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005420
5421Given
5422 for (;;) {}
5423hasBody(compoundStmt())
5424 matches 'for (;;) {}'
5425with compoundStmt()
5426 matching '{}'
5427</pre></td></tr>
5428
5429
Aaron Ballman672dde22016-01-22 23:15:00 +00005430<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 +00005431<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 +00005432switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005433
5434Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5435 if (true) {}
5436</pre></td></tr>
5437
5438
Aaron Ballman672dde22016-01-22 23:15:00 +00005439<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 +00005440<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5441
5442Example:
5443 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5444matches '++x' in
5445 for (x; x &lt; N; ++x) { }
5446</pre></td></tr>
5447
5448
Aaron Ballman672dde22016-01-22 23:15:00 +00005449<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 +00005450<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5451
5452Example:
5453 forStmt(hasLoopInit(declStmt()))
5454matches 'int x = 0' in
5455 for (int x = 0; x &lt; N; ++x) { }
5456</pre></td></tr>
5457
5458
George Karpenkovba02bc52018-07-06 21:36:04 +00005459<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>
5460<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
5461declaration's type.
5462
5463In case of a value declaration (for example a variable declaration),
5464this resolves one layer of indirection. For example, in the value
5465declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5466X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5467declaration of x.
5468
5469Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5470 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5471 and friend class X (matcher = friendDecl(hasType("X"))
5472 class X {};
5473 void y(X &amp;x) { x; X z; }
5474 class Y { friend class X; };
5475
5476Usable 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;
5477</pre></td></tr>
5478
5479
5480<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>
5481<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5482matcher.
5483
5484Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5485 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5486 and U (matcher = typedefDecl(hasType(asString("int")))
5487 and friend class X (matcher = friendDecl(hasType("X"))
5488 class X {};
5489 void y(X &amp;x) { x; X z; }
5490 typedef int U;
5491 class Y { friend class X; };
5492</pre></td></tr>
5493
5494
Aaron Ballman672dde22016-01-22 23:15:00 +00005495<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 +00005496<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
5497block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005498
5499Does not match the 'this' parameter of a method.
5500
5501Given
5502 class X { void f(int x, int y, int z) {} };
5503cxxMethodDecl(hasAnyParameter(hasName("y")))
5504 matches f(int x, int y, int z) {}
5505with hasAnyParameter(...)
5506 matching int y
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005507
5508For ObjectiveC, given
5509 @interface I - (void) f:(int) y; @end
5510
5511the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5512matches the declaration of method f with hasParameter
5513matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005514
5515For blocks, given
5516 b = ^(int y) { printf("%d", y) };
5517
5518the matcher blockDecl(hasAnyParameter(hasName("y")))
5519matches the declaration of the block b with hasParameter
5520matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005521</pre></td></tr>
5522
5523
Haojian Wud898b092016-07-29 13:57:27 +00005524<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>
5525<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5526functionDecl that have at least one TemplateArgument matching the given
5527InnerMatcher.
5528
5529Given
5530 template&lt;typename T&gt; class A {};
5531 template&lt;&gt; class A&lt;double&gt; {};
5532 A&lt;int&gt; a;
5533
Haojian Wu99e39a72016-07-29 17:30:13 +00005534 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005535 void func() { f&lt;int&gt;(); };
5536
5537classTemplateSpecializationDecl(hasAnyTemplateArgument(
5538 refersToType(asString("int"))))
5539 matches the specialization A&lt;int&gt;
5540
5541functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5542 matches the specialization f&lt;int&gt;
5543</pre></td></tr>
5544
5545
Aaron Ballman672dde22016-01-22 23:15:00 +00005546<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 +00005547<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5548definition that has a given body.
5549
5550Given
5551 for (;;) {}
5552hasBody(compoundStmt())
5553 matches 'for (;;) {}'
5554with compoundStmt()
5555 matching '{}'
5556</pre></td></tr>
5557
5558
Aaron Ballman672dde22016-01-22 23:15:00 +00005559<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 +00005560<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 +00005561declaration or a block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005562
5563Given
5564 class X { void f(int x) {} };
5565cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5566 matches f(int x) {}
5567with hasParameter(...)
5568 matching int x
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005569
5570For ObjectiveC, given
5571 @interface I - (void) f:(int) y; @end
5572
5573the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5574matches the declaration of method f with hasParameter
5575matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005576</pre></td></tr>
5577
5578
Haojian Wud898b092016-07-29 13:57:27 +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('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>
5580<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5581functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5582
5583Given
5584 template&lt;typename T, typename U&gt; class A {};
5585 A&lt;bool, int&gt; b;
5586 A&lt;int, bool&gt; c;
5587
Fangrui Song55942ab2018-01-22 22:34:15 +00005588 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005589 void func() { f&lt;int&gt;(); };
5590classTemplateSpecializationDecl(hasTemplateArgument(
5591 1, refersToType(asString("int"))))
5592 matches the specialization A&lt;bool, int&gt;
5593
5594functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5595 matches the specialization f&lt;int&gt;
5596</pre></td></tr>
5597
5598
Aaron Ballman672dde22016-01-22 23:15:00 +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('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 +00005600<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5601
5602Given:
5603 class X { int f() { return 1; } };
5604cxxMethodDecl(returns(asString("int")))
5605 matches int f() { return 1; }
5606</pre></td></tr>
5607
5608
Aaron Ballman672dde22016-01-22 23:15:00 +00005609<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 +00005610<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 +00005611switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005612
5613Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5614 if (true) {}
5615</pre></td></tr>
5616
5617
Aaron Ballman672dde22016-01-22 23:15:00 +00005618<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 +00005619<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5620
5621Given
5622 if (A* a = GetAPointer()) {}
5623hasConditionVariableStatement(...)
5624 matches 'A* a = GetAPointer()'.
5625</pre></td></tr>
5626
5627
Aaron Ballman672dde22016-01-22 23:15:00 +00005628<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 +00005629<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5630
5631Examples matches the if statement
5632 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5633 if (false) false; else true;
5634</pre></td></tr>
5635
5636
Aaron Ballman672dde22016-01-22 23:15:00 +00005637<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 +00005638<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5639
5640Examples matches the if statement
5641 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5642 if (false) true; else false;
5643</pre></td></tr>
5644
5645
Aaron Ballman672dde22016-01-22 23:15:00 +00005646<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005647<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5648matcher.
5649
5650FIXME: Unit test this matcher
5651</pre></td></tr>
5652
5653
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005654<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>
5655<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5656(if expression have it).
5657</pre></td></tr>
5658
5659
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005660<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 +00005661<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5662matches the given matcher.
5663
5664The associated declaration is:
5665- for type nodes, the declaration of the underlying type
5666- for CallExpr, the declaration of the callee
5667- for MemberExpr, the declaration of the referenced member
5668- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005669- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005670
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005671For type nodes, hasDeclaration will generally match the declaration of the
5672sugared type. Given
5673 class X {};
5674 typedef X Y;
5675 Y y;
5676in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5677typedefDecl. A common use case is to match the underlying, desugared type.
5678This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5679 varDecl(hasType(hasUnqualifiedDesugaredType(
5680 recordType(hasDeclaration(decl())))))
5681In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005682
Manuel Klimeka37e1102016-12-01 15:45:06 +00005683Usable 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;,
5684 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;,
5685 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;,
5686 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;,
5687 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;,
5688 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;,
5689 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5690</pre></td></tr>
5691
5692
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005693<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 +00005694<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5695matches the given matcher.
5696
5697The associated declaration is:
5698- for type nodes, the declaration of the underlying type
5699- for CallExpr, the declaration of the callee
5700- for MemberExpr, the declaration of the referenced member
5701- for CXXConstructExpr, the declaration of the constructor
5702- for CXXNewExpr, the declaration of the operator new
5703
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005704For type nodes, hasDeclaration will generally match the declaration of the
5705sugared type. Given
5706 class X {};
5707 typedef X Y;
5708 Y y;
5709in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5710typedefDecl. A common use case is to match the underlying, desugared type.
5711This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5712 varDecl(hasType(hasUnqualifiedDesugaredType(
5713 recordType(hasDeclaration(decl())))))
5714In this matcher, the decl will match the CXXRecordDecl of class X.
Manuel Klimeka37e1102016-12-01 15:45:06 +00005715
5716Usable 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;,
5717 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;,
5718 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;,
5719 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;,
5720 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;,
5721 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;,
5722 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005723</pre></td></tr>
5724
5725
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005726<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 +00005727<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5728matches the given matcher.
5729
5730The associated declaration is:
5731- for type nodes, the declaration of the underlying type
5732- for CallExpr, the declaration of the callee
5733- for MemberExpr, the declaration of the referenced member
5734- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005735- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005736
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005737For type nodes, hasDeclaration will generally match the declaration of the
5738sugared type. Given
5739 class X {};
5740 typedef X Y;
5741 Y y;
5742in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5743typedefDecl. A common use case is to match the underlying, desugared type.
5744This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5745 varDecl(hasType(hasUnqualifiedDesugaredType(
5746 recordType(hasDeclaration(decl())))))
5747In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005748
Manuel Klimeka37e1102016-12-01 15:45:06 +00005749Usable 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;,
5750 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;,
5751 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;,
5752 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;,
5753 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;,
5754 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;,
5755 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005756</pre></td></tr>
5757
5758
Aaron Ballman672dde22016-01-22 23:15:00 +00005759<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 +00005760<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5761matched by a given matcher.
5762
5763Given
5764 struct X { int m; };
5765 void f(X x) { x.m; m; }
5766memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5767 matches "x.m" and "m"
5768with hasObjectExpression(...)
5769 matching "x" and the implicit object expression of "m" which has type X*.
5770</pre></td></tr>
5771
5772
Aaron Ballman672dde22016-01-22 23:15:00 +00005773<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 +00005774<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5775given matcher.
5776
5777Given
5778 struct { int first, second; } first, second;
5779 int i(second.first);
5780 int j(first.second);
5781memberExpr(member(hasName("first")))
5782 matches second.first
5783 but not first.second (because the member name there is "second").
5784</pre></td></tr>
5785
5786
Aaron Ballman672dde22016-01-22 23:15:00 +00005787<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 +00005788<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5789pointee matches a given matcher.
5790
5791Given
5792 int *a;
5793 int const *b;
5794 float const *f;
5795pointerType(pointee(isConstQualified(), isInteger()))
5796 matches "int const *b"
5797
Aaron Ballman672dde22016-01-22 23:15:00 +00005798Usable 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;,
5799 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 +00005800</pre></td></tr>
5801
5802
Aaron Ballman672dde22016-01-22 23:15:00 +00005803<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 +00005804<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5805pointee matches a given matcher.
5806
5807Given
5808 int *a;
5809 int const *b;
5810 float const *f;
5811pointerType(pointee(isConstQualified(), isInteger()))
5812 matches "int const *b"
5813
Aaron Ballman672dde22016-01-22 23:15:00 +00005814Usable 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;,
5815 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 +00005816</pre></td></tr>
5817
5818
Martin Bohme8cef2c22016-08-09 15:07:52 +00005819<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>
5820<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5821matcher.
5822
5823Given
5824 namespace N { template&lt;class T&gt; void f(T t); }
5825 template &lt;class T&gt; void g() { using N::f; f(T()); }
5826unresolvedLookupExpr(hasAnyDeclaration(
5827 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5828 matches the use of f in g() .
5829</pre></td></tr>
5830
5831
Aaron Ballman672dde22016-01-22 23:15:00 +00005832<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 +00005833<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5834
5835Given
5836 struct A { struct B { struct C {}; }; };
5837 A::B::C c;
5838nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5839 matches "A::"
5840</pre></td></tr>
5841
5842
Aaron Ballman672dde22016-01-22 23:15:00 +00005843<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 +00005844<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5845given TypeLoc.
5846
5847Given
5848 struct A { struct B { struct C {}; }; };
5849 A::B::C c;
5850nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5851 hasDeclaration(cxxRecordDecl(hasName("A")))))))
5852 matches "A::"
5853</pre></td></tr>
5854
5855
Aaron Ballman672dde22016-01-22 23:15:00 +00005856<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 +00005857<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5858
5859Given
5860 struct A { struct B { struct C {}; }; };
5861 A::B::C c;
5862nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5863 matches "A::"
5864</pre></td></tr>
5865
5866
Aaron Ballman672dde22016-01-22 23:15:00 +00005867<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 +00005868<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5869given namespace matcher.
5870
5871Given
5872 namespace ns { struct A {}; }
5873 ns::A a;
5874nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5875 matches "ns::"
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('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 +00005880<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5881given QualType matcher without qualifiers.
5882
5883Given
5884 struct A { struct B { struct C {}; }; };
5885 A::B::C c;
5886nestedNameSpecifier(specifiesType(
5887 hasDeclaration(cxxRecordDecl(hasName("A")))
5888))
5889 matches "A::"
5890</pre></td></tr>
5891
5892
George Karpenkova763fdf2018-03-07 02:32:44 +00005893<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>
5894<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5895expression, or an ObjC-message-send expression.
5896
5897Given
5898 void x(int, int, int) { int y; x(1, y, 42); }
5899callExpr(hasAnyArgument(declRefExpr()))
5900 matches x(1, y, 42)
5901with hasAnyArgument(...)
5902 matching y
5903
5904For ObjectiveC, given
5905 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00005906 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00005907objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5908 matches [i f:12]
5909</pre></td></tr>
5910
5911
Aaron Ballman672dde22016-01-22 23:15:00 +00005912<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 +00005913<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5914call expression.
5915
5916Example matches y in x(y)
5917 (matcher = callExpr(hasArgument(0, declRefExpr())))
5918 void x(int) { int y; x(y); }
5919</pre></td></tr>
5920
5921
George Karpenkovb5ea4df2018-07-16 20:22:12 +00005922<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>
5923<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
5924and the inner matcher matches on that instance.
5925
5926For example the method call in
5927 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00005928 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00005929is matched by
5930objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
5931</pre></td></tr>
5932
5933
Aaron Ballman672dde22016-01-22 23:15:00 +00005934<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00005935<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5936
5937Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00005938matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005939matches the [webView ...] message invocation.
5940 NSString *webViewJavaScript = ...
5941 UIWebView *webView = ...
5942 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5943</pre></td></tr>
5944
5945
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005946<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 +00005947<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
5948block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005949
5950Does not match the 'this' parameter of a method.
5951
5952Given
5953 class X { void f(int x, int y, int z) {} };
5954cxxMethodDecl(hasAnyParameter(hasName("y")))
5955 matches f(int x, int y, int z) {}
5956with hasAnyParameter(...)
5957 matching int y
5958
5959For ObjectiveC, given
5960 @interface I - (void) f:(int) y; @end
5961
5962the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5963matches the declaration of method f with hasParameter
5964matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005965
5966For blocks, given
5967 b = ^(int y) { printf("%d", y) };
5968
5969the matcher blockDecl(hasAnyParameter(hasName("y")))
5970matches the declaration of the block b with hasParameter
5971matching y.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005972</pre></td></tr>
5973
5974
5975<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>
5976<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 +00005977declaration or a block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005978
5979Given
5980 class X { void f(int x) {} };
5981cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5982 matches f(int x) {}
5983with hasParameter(...)
5984 matching int x
5985
5986For ObjectiveC, given
5987 @interface I - (void) f:(int) y; @end
5988
5989the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5990matches the declaration of method f with hasParameter
5991matching y.
5992</pre></td></tr>
5993
5994
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005995<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 +00005996<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
5997or opaque value's source expression matches the given matcher.
5998
5999Example 1: matches "a string"
6000(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6001class URL { URL(string); };
6002URL url = "a string";
6003
6004Example 2: matches 'b' (matcher =
6005opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6006int a = b ?: 1;
6007</pre></td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006008
6009
Martin Bohme8cef2c22016-08-09 15:07:52 +00006010<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>
6011<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6012overloads matches the given matcher.
6013
6014Given
6015 template &lt;typename T&gt; void foo(T);
6016 template &lt;typename T&gt; void bar(T);
6017 template &lt;typename T&gt; void baz(T t) {
6018 foo(t);
6019 bar(t);
6020 }
6021unresolvedLookupExpr(hasAnyDeclaration(
6022 functionTemplateDecl(hasName("foo"))))
6023 matches foo in foo(t); but not bar in bar(t);
6024</pre></td></tr>
6025
6026
Aaron Ballman672dde22016-01-22 23:15:00 +00006027<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 +00006028<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6029
6030Given
6031 int (*ptr_to_array)[4];
6032 int (*ptr_to_func)(int);
6033
6034varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6035ptr_to_func but not ptr_to_array.
6036
Aaron Ballman672dde22016-01-22 23:15:00 +00006037Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006038</pre></td></tr>
6039
6040
Aaron Ballman672dde22016-01-22 23:15:00 +00006041<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00006042<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
6043pointee matches a given matcher.
6044
6045Given
6046 int *a;
6047 int const *b;
6048 float const *f;
6049pointerType(pointee(isConstQualified(), isInteger()))
6050 matches "int const *b"
6051
Aaron Ballman672dde22016-01-22 23:15:00 +00006052Usable 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;,
6053 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 +00006054</pre></td></tr>
6055
6056
Aaron Ballman672dde22016-01-22 23:15:00 +00006057<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 +00006058<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6059pointee matches a given matcher.
6060
6061Given
6062 int *a;
6063 int const *b;
6064 float const *f;
6065pointerType(pointee(isConstQualified(), isInteger()))
6066 matches "int const *b"
6067
Aaron Ballman672dde22016-01-22 23:15:00 +00006068Usable 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;,
6069 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 +00006070</pre></td></tr>
6071
6072
Aaron Ballman672dde22016-01-22 23:15:00 +00006073<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 +00006074<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
6075
6076Given:
6077 typedef int &amp;int_ref;
6078 int a;
6079 int_ref b = a;
6080
6081varDecl(hasType(qualType(referenceType()))))) will not match the
6082declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
6083</pre></td></tr>
6084
6085
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006086<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 +00006087<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
6088matches the given matcher.
6089
6090The associated declaration is:
6091- for type nodes, the declaration of the underlying type
6092- for CallExpr, the declaration of the callee
6093- for MemberExpr, the declaration of the referenced member
6094- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006095- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006096
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006097For type nodes, hasDeclaration will generally match the declaration of the
6098sugared type. Given
6099 class X {};
6100 typedef X Y;
6101 Y y;
6102in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6103typedefDecl. A common use case is to match the underlying, desugared type.
6104This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6105 varDecl(hasType(hasUnqualifiedDesugaredType(
6106 recordType(hasDeclaration(decl())))))
6107In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006108
Manuel Klimeka37e1102016-12-01 15:45:06 +00006109Usable 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;,
6110 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;,
6111 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;,
6112 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;,
6113 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;,
6114 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;,
6115 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006116</pre></td></tr>
6117
6118
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00006119<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>
6120<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
6121
6122Given
6123 void (*fp)(void);
6124The matcher
6125 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
6126would match the declaration for fp.
6127</pre></td></tr>
6128
6129
Aaron Ballman672dde22016-01-22 23:15:00 +00006130<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 +00006131<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
6132</pre></td></tr>
6133
6134
Aaron Ballman672dde22016-01-22 23:15:00 +00006135<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 +00006136<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
6137matches the specified matcher.
6138
6139Example matches y-&gt;x()
6140 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
6141 cxxRecordDecl(hasName("Y")))))))
6142 class Y { public: void x(); };
6143 void z() { Y *y; y-&gt;x(); }
6144</pre></td></tr>
6145
6146
Aaron Ballman672dde22016-01-22 23:15:00 +00006147<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 +00006148<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
6149</pre></td></tr>
6150
6151
Aaron Ballman672dde22016-01-22 23:15:00 +00006152<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 +00006153<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
6154type matches the specified matcher.
6155
6156Example matches X &amp;x and const X &amp;y
6157 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
6158 class X {
6159 void a(X b) {
6160 X &amp;x = b;
6161 const X &amp;y = b;
6162 }
6163 };
6164</pre></td></tr>
6165
6166
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006167<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 +00006168<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
6169matches the given matcher.
6170
6171The associated declaration is:
6172- for type nodes, the declaration of the underlying type
6173- for CallExpr, the declaration of the callee
6174- for MemberExpr, the declaration of the referenced member
6175- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006176- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006177
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006178For type nodes, hasDeclaration will generally match the declaration of the
6179sugared type. Given
6180 class X {};
6181 typedef X Y;
6182 Y y;
6183in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6184typedefDecl. A common use case is to match the underlying, desugared type.
6185This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6186 varDecl(hasType(hasUnqualifiedDesugaredType(
6187 recordType(hasDeclaration(decl())))))
6188In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006189
Manuel Klimeka37e1102016-12-01 15:45:06 +00006190Usable 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;,
6191 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;,
6192 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;,
6193 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;,
6194 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;,
6195 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;,
6196 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006197</pre></td></tr>
6198
6199
Aaron Ballman672dde22016-01-22 23:15:00 +00006200<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 +00006201<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
6202pointee matches a given matcher.
6203
6204Given
6205 int *a;
6206 int const *b;
6207 float const *f;
6208pointerType(pointee(isConstQualified(), isInteger()))
6209 matches "int const *b"
6210
Aaron Ballman672dde22016-01-22 23:15:00 +00006211Usable 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;,
6212 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 +00006213</pre></td></tr>
6214
6215
Aaron Ballman672dde22016-01-22 23:15:00 +00006216<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 +00006217<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
6218pointee matches a given matcher.
6219
6220Given
6221 int *a;
6222 int const *b;
6223 float const *f;
6224pointerType(pointee(isConstQualified(), isInteger()))
6225 matches "int const *b"
6226
Aaron Ballman672dde22016-01-22 23:15:00 +00006227Usable 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;,
6228 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 +00006229</pre></td></tr>
6230
6231
Alexander Kornienko976921d2016-03-22 11:03:03 +00006232<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>
6233<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
6234
6235Given
6236 return a + b;
6237hasReturnValue(binaryOperator())
6238 matches 'return a + b'
6239with binaryOperator()
6240 matching 'a + b'
6241</pre></td></tr>
6242
6243
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006244<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>
6245<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
6246a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6247
6248Given
6249 { {}; 1+2; }
6250hasAnySubstatement(compoundStmt())
6251 matches '{ {}; 1+2; }'
6252with compoundStmt()
6253 matching '{}'
6254</pre></td></tr>
6255
6256
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006257<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 +00006258<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6259alignof.
6260</pre></td></tr>
6261
6262
Gabor Horvath1b3f8db2016-05-04 11:59:39 +00006263<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 +00006264<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 +00006265
6266Given:
6267F&amp; operator=(const F&amp; o) {
6268 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
6269 return *this;
6270}
6271returnStmt(forFunction(hasName("operator=")))
6272 matches 'return *this'
6273 but does match 'return &gt; 0'
6274</pre></td></tr>
6275
6276
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006277<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 +00006278<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6279sizeof.
6280</pre></td></tr>
6281
6282
Malcolm Parsons77f039b2016-12-08 11:46:22 +00006283<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>
6284<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
6285type that matches the provided matcher.
6286
6287Given
6288 template &lt;typename T&gt;
6289 double F(T t);
6290 int i;
6291 double j = F(i);
6292
6293substTemplateTypeParmType(hasReplacementType(type())) matches int
6294</pre></td></tr>
6295
6296
Aaron Ballman672dde22016-01-22 23:15:00 +00006297<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 +00006298<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
6299statement. This matcher may produce multiple matches.
6300
6301Given
6302 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
6303switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
6304 matches four times, with "c" binding each of "case 1:", "case 2:",
6305"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
6306"switch (1)", "switch (2)" and "switch (2)".
6307</pre></td></tr>
6308
6309
Etienne Bergeron5500f952016-05-30 15:25:25 +00006310<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>
6311<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
6312switch statement or conditional operator.
6313
6314Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6315 if (true) {}
6316</pre></td></tr>
6317
6318
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006319<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 +00006320<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
6321matches the given matcher.
6322
6323The associated declaration is:
6324- for type nodes, the declaration of the underlying type
6325- for CallExpr, the declaration of the callee
6326- for MemberExpr, the declaration of the referenced member
6327- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006328- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006329
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006330For type nodes, hasDeclaration will generally match the declaration of the
6331sugared type. Given
6332 class X {};
6333 typedef X Y;
6334 Y y;
6335in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6336typedefDecl. A common use case is to match the underlying, desugared type.
6337This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6338 varDecl(hasType(hasUnqualifiedDesugaredType(
6339 recordType(hasDeclaration(decl())))))
6340In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006341
Manuel Klimeka37e1102016-12-01 15:45:06 +00006342Usable 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;,
6343 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;,
6344 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;,
6345 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;,
6346 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;,
6347 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;,
6348 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006349</pre></td></tr>
6350
6351
Aaron Ballman672dde22016-01-22 23:15:00 +00006352<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 +00006353<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6354
6355Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006356 struct B { int next; };
6357 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006358 A&lt;&amp;B::next&gt; a;
6359templateSpecializationType(hasAnyTemplateArgument(
6360 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6361 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6362 B::next
6363</pre></td></tr>
6364
6365
Aaron Ballman672dde22016-01-22 23:15:00 +00006366<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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 +00006367<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6368declaration.
6369
6370Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006371 struct B { int next; };
6372 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006373 A&lt;&amp;B::next&gt; a;
6374classTemplateSpecializationDecl(hasAnyTemplateArgument(
Fangrui Song55942ab2018-01-22 22:34:15 +00006375 refersToDeclaration(fieldDecl(hasName("next")))))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006376 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6377 B::next
6378</pre></td></tr>
6379
6380
Aaron Ballman672dde22016-01-22 23:15:00 +00006381<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 +00006382<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6383
6384Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006385 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006386 C&lt;42&gt; c;
6387classTemplateSpecializationDecl(
6388 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6389 matches the implicit instantiation of C in C&lt;42&gt;.
6390</pre></td></tr>
6391
6392
Haojian Wub33b02e2016-07-29 15:45:11 +00006393<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>
6394<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6395
6396Given
6397 template&lt;template &lt;typename&gt; class S&gt; class X {};
6398 template&lt;typename T&gt; class Y {};"
6399 X&lt;Y&gt; xi;
6400classTemplateSpecializationDecl(hasAnyTemplateArgument(
6401 refersToTemplate(templateName())))
6402 matches the specialization X&lt;Y&gt;
6403</pre></td></tr>
6404
6405
Aaron Ballman672dde22016-01-22 23:15:00 +00006406<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 +00006407<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6408
6409Given
6410 struct X {};
6411 template&lt;typename T&gt; struct A {};
6412 A&lt;X&gt; a;
6413classTemplateSpecializationDecl(hasAnyTemplateArgument(
6414 refersToType(class(hasName("X")))))
6415 matches the specialization A&lt;X&gt;
6416</pre></td></tr>
6417
6418
Aaron Ballman672dde22016-01-22 23:15:00 +00006419<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 +00006420<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6421functionDecl that have at least one TemplateArgument matching the given
6422InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006423
6424Given
6425 template&lt;typename T&gt; class A {};
6426 template&lt;&gt; class A&lt;double&gt; {};
6427 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00006428
Haojian Wu99e39a72016-07-29 17:30:13 +00006429 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00006430 void func() { f&lt;int&gt;(); };
6431
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006432classTemplateSpecializationDecl(hasAnyTemplateArgument(
6433 refersToType(asString("int"))))
6434 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006435
6436functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6437 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006438</pre></td></tr>
6439
6440
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006441<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 +00006442<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6443matches the given matcher.
6444
6445The associated declaration is:
6446- for type nodes, the declaration of the underlying type
6447- for CallExpr, the declaration of the callee
6448- for MemberExpr, the declaration of the referenced member
6449- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006450- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006451
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006452For type nodes, hasDeclaration will generally match the declaration of the
6453sugared type. Given
6454 class X {};
6455 typedef X Y;
6456 Y y;
6457in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6458typedefDecl. A common use case is to match the underlying, desugared type.
6459This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6460 varDecl(hasType(hasUnqualifiedDesugaredType(
6461 recordType(hasDeclaration(decl())))))
6462In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006463
Manuel Klimeka37e1102016-12-01 15:45:06 +00006464Usable 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;,
6465 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;,
6466 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;,
6467 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;,
6468 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;,
6469 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;,
6470 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006471</pre></td></tr>
6472
6473
Aaron Ballman672dde22016-01-22 23:15:00 +00006474<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 +00006475<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6476functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006477
6478Given
6479 template&lt;typename T, typename U&gt; class A {};
6480 A&lt;bool, int&gt; b;
6481 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00006482
Fangrui Song55942ab2018-01-22 22:34:15 +00006483 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00006484 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006485classTemplateSpecializationDecl(hasTemplateArgument(
6486 1, refersToType(asString("int"))))
6487 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006488
6489functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6490 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006491</pre></td></tr>
6492
6493
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006494<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 +00006495<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
6496matches the given matcher.
6497
6498The associated declaration is:
6499- for type nodes, the declaration of the underlying type
6500- for CallExpr, the declaration of the callee
6501- for MemberExpr, the declaration of the referenced member
6502- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006503- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006504
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006505For type nodes, hasDeclaration will generally match the declaration of the
6506sugared type. Given
6507 class X {};
6508 typedef X Y;
6509 Y y;
6510in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6511typedefDecl. A common use case is to match the underlying, desugared type.
6512This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6513 varDecl(hasType(hasUnqualifiedDesugaredType(
6514 recordType(hasDeclaration(decl())))))
6515In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006516
Manuel Klimeka37e1102016-12-01 15:45:06 +00006517Usable 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;,
6518 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;,
6519 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;,
6520 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;,
6521 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;,
6522 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;,
6523 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006524</pre></td></tr>
6525
6526
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006527<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 +00006528<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
6529
6530Generates results for each match.
6531
6532For example, in:
6533 class A { class B {}; class C {}; };
6534The matcher:
6535 cxxRecordDecl(hasName("::A"),
6536 findAll(cxxRecordDecl(isDefinition()).bind("m")))
6537will generate results for A, B and C.
6538
6539Usable as: Any Matcher
6540</pre></td></tr>
6541
6542
George Karpenkovba02bc52018-07-06 21:36:04 +00006543<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>
6544<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 +00006545matcher.
6546
6547Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6548 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6549 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00006550 and friend class X (matcher = friendDecl(hasType("X"))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006551 class X {};
6552 void y(X &amp;x) { x; X z; }
6553 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00006554 class Y { friend class X; };
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006555</pre></td></tr>
6556
6557
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006558<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 +00006559<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6560matches the given matcher.
6561
6562The associated declaration is:
6563- for type nodes, the declaration of the underlying type
6564- for CallExpr, the declaration of the callee
6565- for MemberExpr, the declaration of the referenced member
6566- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006567- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006568
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006569For type nodes, hasDeclaration will generally match the declaration of the
6570sugared type. Given
6571 class X {};
6572 typedef X Y;
6573 Y y;
6574in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6575typedefDecl. A common use case is to match the underlying, desugared type.
6576This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6577 varDecl(hasType(hasUnqualifiedDesugaredType(
6578 recordType(hasDeclaration(decl())))))
6579In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006580
Manuel Klimeka37e1102016-12-01 15:45:06 +00006581Usable 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;,
6582 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;,
6583 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;,
6584 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;,
6585 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;,
6586 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;,
6587 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6588</pre></td></tr>
6589
6590
6591<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>
6592<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
6593type of the matched node.
6594
6595For example, in:
6596 class A {};
6597 using B = A;
George Karpenkovdaac52c2018-07-23 22:29:10 +00006598The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
Manuel Klimeka37e1102016-12-01 15:45:06 +00006599both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006600</pre></td></tr>
6601
6602
Aaron Ballman672dde22016-01-22 23:15:00 +00006603<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 +00006604<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
6605
6606Given
6607 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
6608unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
6609 matches sizeof(a) and alignof(c)
6610</pre></td></tr>
6611
6612
Aaron Ballman672dde22016-01-22 23:15:00 +00006613<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 +00006614<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
6615
6616Example matches true (matcher = hasUnaryOperand(
6617 cxxBoolLiteral(equals(true))))
6618 !true
6619</pre></td></tr>
6620
6621
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006622<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 +00006623<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
6624matches the given matcher.
6625
6626The associated declaration is:
6627- for type nodes, the declaration of the underlying type
6628- for CallExpr, the declaration of the callee
6629- for MemberExpr, the declaration of the referenced member
6630- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006631- for CXXNewExpr, the declaration of the operator new
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006632
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006633For type nodes, hasDeclaration will generally match the declaration of the
6634sugared type. Given
6635 class X {};
6636 typedef X Y;
6637 Y y;
6638in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6639typedefDecl. A common use case is to match the underlying, desugared type.
6640This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6641 varDecl(hasType(hasUnqualifiedDesugaredType(
6642 recordType(hasDeclaration(decl())))))
6643In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006644
Manuel Klimeka37e1102016-12-01 15:45:06 +00006645Usable 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;,
6646 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;,
6647 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;,
6648 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;,
6649 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;,
6650 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;,
6651 Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006652</pre></td></tr>
6653
6654
Aaron Ballman672dde22016-01-22 23:15:00 +00006655<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 +00006656<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6657
6658Given
6659 namespace X { void b(); }
6660 using X::b;
6661usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6662 matches using X::b </pre></td></tr>
6663
6664
Aaron Ballman672dde22016-01-22 23:15:00 +00006665<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 +00006666<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
6667matched by the given matcher.
6668
6669Given
6670 namespace X { int a; void b(); }
6671 using X::a;
6672 using X::b;
6673usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6674 matches using X::b but not using X::a </pre></td></tr>
6675
6676
George Karpenkovba02bc52018-07-06 21:36:04 +00006677<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>
6678<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 +00006679declaration's type.
6680
6681In case of a value declaration (for example a variable declaration),
6682this resolves one layer of indirection. For example, in the value
6683declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6684X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6685declaration of x.
6686
6687Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6688 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00006689 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006690 class X {};
6691 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00006692 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006693
Aaron Ballman672dde22016-01-22 23:15:00 +00006694Usable 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 +00006695</pre></td></tr>
6696
6697
George Karpenkovba02bc52018-07-06 21:36:04 +00006698<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>
6699<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 +00006700matcher.
6701
6702Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6703 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006704 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00006705 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006706 class X {};
6707 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006708 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00006709 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006710</pre></td></tr>
6711
6712
Aaron Ballman672dde22016-01-22 23:15:00 +00006713<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 +00006714<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6715that matches the given matcher.
6716
6717Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6718 bool y() { return true; }
6719 bool x = y();
6720</pre></td></tr>
6721
6722
Aaron Ballman672dde22016-01-22 23:15:00 +00006723<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 +00006724<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6725expression.
6726
6727Given
6728 void f(int b) {
6729 int a[b];
6730 }
6731variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6732 varDecl(hasName("b")))))))
6733 matches "int a[b]"
6734</pre></td></tr>
6735
6736
Aaron Ballman672dde22016-01-22 23:15:00 +00006737<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 +00006738<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6739definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006740
6741Given
6742 for (;;) {}
6743hasBody(compoundStmt())
6744 matches 'for (;;) {}'
6745with compoundStmt()
6746 matching '{}'
6747</pre></td></tr>
6748
6749
Aaron Ballman672dde22016-01-22 23:15:00 +00006750<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 +00006751<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 +00006752switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006753
6754Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6755 if (true) {}
6756</pre></td></tr>
6757
6758
Aaron Ballman672dde22016-01-22 23:15:00 +00006759<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 +00006760<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6761NestedNameSpecifier-matcher matches.
6762</pre></td></tr>
6763
6764
Aaron Ballman672dde22016-01-22 23:15:00 +00006765<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 +00006766<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6767QualType-matcher matches.
6768</pre></td></tr>
6769
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00006770<!--END_TRAVERSAL_MATCHERS -->
6771</table>
6772
6773</div>
6774</body>
6775</html>
6776
6777