blob: a053bd1bb5f6d503b93edc27357f7c988d08aa4c [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
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000103<tr><td>Matcher&lt;<a href="https://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="https://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
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000114<tr><td>Matcher&lt;<a href="https://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="https://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
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000127<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
George Karpenkovb4c0cbd2018-05-16 22:47:03 +0000128<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
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000139<tr><td>Matcher&lt;<a href="https://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="https://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
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000147<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
Stephen Kelly9b8fa522018-10-09 08:24:11 +0000148<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
149
150Given
151 template&lt;class T1, class T2, int I&gt;
152 class A {};
153
154 template&lt;class T, int I&gt;
155 class A&lt;T, T*, I&gt; {};
156
157 template&lt;&gt;
158 class A&lt;int, int, 1&gt; {};
159classTemplatePartialSpecializationDecl()
160 matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
161</pre></td></tr>
162
163
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000164<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000165<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
166
167Given
168 template&lt;typename T&gt; class A {};
169 template&lt;&gt; class A&lt;double&gt; {};
170 A&lt;int&gt; a;
171classTemplateSpecializationDecl()
172 matches the specializations A&lt;int&gt; and A&lt;double&gt;
173</pre></td></tr>
174
175
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000176<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000177<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
178
179Example matches Foo::Foo() and Foo::Foo(int)
180 class Foo {
181 public:
182 Foo();
183 Foo(int);
184 int DoSomething();
185 };
186</pre></td></tr>
187
188
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000189<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000190<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
191
192Example matches the operator.
193 class X { operator int() const; };
194</pre></td></tr>
195
196
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000197<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000198<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
199
200Example matches Foo::~Foo()
201 class Foo {
202 public:
203 virtual ~Foo();
204 };
205</pre></td></tr>
206
207
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000208<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000209<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
210
211Example matches y
212 class X { void y(); };
213</pre></td></tr>
214
215
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000216<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000217<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
218
219Example matches X, Z
220 class X;
221 template&lt;class T&gt; class Z {};
222</pre></td></tr>
223
224
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000225<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000226<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
227
228Examples matches X, C, and the friend declaration inside C;
229 void X();
230 class C {
231 friend X;
232 };
233</pre></td></tr>
234
235
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000236<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000237<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
238and non-type template parameter declarations).
239
240Given
241 class X { int y; };
242declaratorDecl()
243 matches int y.
244</pre></td></tr>
245
246
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000247<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000248<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
249
250Example matches A, B, C
251 enum X {
252 A, B, C
253 };
254</pre></td></tr>
255
256
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000257<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000258<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
259
260Example matches X
261 enum X {
262 A, B, C
263 };
264</pre></td></tr>
265
266
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000267<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000268<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
269
270Given
271 class X { int m; };
272fieldDecl()
273 matches 'm'.
274</pre></td></tr>
275
276
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000277<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000278<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
279
280Given
281 class X { friend void foo(); };
282friendDecl()
283 matches 'friend void foo()'.
284</pre></td></tr>
285
286
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000287<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000288<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
289
290Example matches f
291 void f();
292</pre></td></tr>
293
294
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000295<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000296<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
297
298Example matches f
299 template&lt;class T&gt; void f(T t) {}
300</pre></td></tr>
301
302
Gabor Marton7df342a2018-12-17 12:42:12 +0000303<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
304<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
305
306Given
307 struct X { struct { int a; }; };
308indirectFieldDecl()
309 matches 'a'.
310</pre></td></tr>
311
312
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000313<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000314<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
315
316Given
317 goto FOO;
318 FOO: bar();
319labelDecl()
320 matches 'FOO:'
321</pre></td></tr>
322
323
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000324<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000325<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
326
327Given
328 extern "C" {}
329linkageSpecDecl()
330 matches "extern "C" {}"
331</pre></td></tr>
332
333
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000334<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000335<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
336
337Example matches X, S, the anonymous union type, i, and U;
338 typedef int X;
339 struct S {
340 union {
341 int i;
342 } U;
343 };
344</pre></td></tr>
345
346
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000347<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000348<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
349
350Given
351 namespace test {}
352 namespace alias = ::test;
353namespaceAliasDecl()
354 matches "namespace alias" but not "namespace test"
355</pre></td></tr>
356
357
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000358<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000359<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
360
361Given
362 namespace {}
363 namespace test {}
364namespaceDecl()
365 matches "namespace {}" and "namespace test {}"
366</pre></td></tr>
367
368
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000369<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000370<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
371
372Given
373 template &lt;typename T, int N&gt; struct C {};
374nonTypeTemplateParmDecl()
375 matches 'N', but not 'T'.
376</pre></td></tr>
377
378
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000379<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000380<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
381
382Example matches Foo (Additions)
383 @interface Foo (Additions)
384 @end
385</pre></td></tr>
386
387
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000388<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
Dave Lee55540a02017-10-26 15:53:37 +0000389<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
390
391Example matches Foo (Additions)
392 @implementation Foo (Additions)
393 @end
394</pre></td></tr>
395
396
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000397<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
Dave Leee6d362c2017-09-10 21:00:15 +0000398<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
399
400Example matches Foo
401 @implementation Foo
402 @end
403</pre></td></tr>
404
405
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000406<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000407<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
408
409Example matches Foo
410 @interface Foo
411 @end
412</pre></td></tr>
413
414
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000415<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000416<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
417
418Example matches _enabled
419 @implementation Foo {
420 BOOL _enabled;
421 }
422 @end
423</pre></td></tr>
424
425
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000426<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000427<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
428
429Example matches both declaration and definition of -[Foo method]
430 @interface Foo
431 - (void)method;
432 @end
433
434 @implementation Foo
435 - (void)method {}
436 @end
437</pre></td></tr>
438
439
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000440<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000441<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
442
443Example matches enabled
444 @interface Foo
445 @property BOOL enabled;
446 @end
447</pre></td></tr>
448
449
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000450<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
Aaron Ballman9fd6ee62017-03-15 20:14:25 +0000451<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
452
453Example matches FooDelegate
454 @protocol FooDelegate
455 @end
456</pre></td></tr>
457
458
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000459<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000460<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
461
462Given
463 void f(int x);
464parmVarDecl()
465 matches int x.
466</pre></td></tr>
467
468
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000469<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000470<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
471
472Example matches X, Z, U, and S
473 class X;
474 template&lt;class T&gt; class Z {};
475 struct S {};
476 union U {};
477</pre></td></tr>
478
479
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000480<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000481<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
482
483Example:
484 staticAssertExpr()
485matches
486 static_assert(sizeof(S) == sizeof(int))
487in
488 struct S {
489 int x;
490 };
491 static_assert(sizeof(S) == sizeof(int));
492</pre></td></tr>
493
494
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000495<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000496<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
497
498Given
499 template &lt;typename T, int N&gt; struct C {};
500templateTypeParmDecl()
501 matches 'T', but not 'N'.
502</pre></td></tr>
503
504
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000505<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000506<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
507
508Given
509 int X;
510 namespace NS {
511 int Y;
Aaron Ballman94f3e742018-12-11 19:30:49 +0000512 } // namespace NS
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000513decl(hasDeclContext(translationUnitDecl()))
514 matches "int X", but not "int Y".
515</pre></td></tr>
516
517
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000518<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000519<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
520
521Given
522 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000523 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000524typeAliasDecl()
525 matches "using Y = int", but not "typedef int X"
526</pre></td></tr>
527
528
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000529<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
Eric Liu285f8042017-03-28 12:56:47 +0000530<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
531
532typeAliasTemplateDecl() matches
533 template &lt;typename T&gt;
534 using Y = X&lt;T&gt;;
535</pre></td></tr>
536
537
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000538<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000539<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
540
541Given
542 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000543 using Y = int;
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000544typedefDecl()
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000545 matches "typedef int X", but not "using Y = int"
546</pre></td></tr>
547
548
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000549<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000550<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
551
552Given
553 typedef int X;
Samuel Benzaquena4076ea2016-05-04 20:45:00 +0000554 using Y = int;
Aaron Ballman66eb58a2016-04-14 16:05:45 +0000555typedefNameDecl()
556 matches "typedef int X" and "using Y = int"
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000557</pre></td></tr>
558
559
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000560<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000561<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
562typename.
563
564Given
565 template &lt;typename T&gt;
566 struct Base { typedef T Foo; };
567
568 template&lt;typename T&gt;
569 struct S : private Base&lt;T&gt; {
570 using typename Base&lt;T&gt;::Foo;
571 };
572unresolvedUsingTypenameDecl()
573 matches using Base&lt;T&gt;::Foo </pre></td></tr>
574
575
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000576<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000577<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
578
579Given
580 template&lt;typename X&gt;
581 class C : private X {
582 using X::x;
583 };
584unresolvedUsingValueDecl()
585 matches using X::x </pre></td></tr>
586
587
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000588<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000589<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
590
591Given
592 namespace X { int x; }
593 using X::x;
594usingDecl()
595 matches using X::x </pre></td></tr>
596
597
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000598<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000599<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
600
601Given
602 namespace X { int x; }
603 using namespace X;
604usingDirectiveDecl()
605 matches using namespace X </pre></td></tr>
606
607
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000608<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000609<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
610
611Example matches A, B, C and F
612 enum X { A, B, C };
613 void F();
614</pre></td></tr>
615
616
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000617<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000618<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
619
620Note: this does not match declarations of member variables, which are
621"field" declarations in Clang parlance.
622
623Example matches a
624 int a;
625</pre></td></tr>
626
627
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000628<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000629<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
630</pre></td></tr>
631
632
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000633<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000634<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
635
636Given
637 namespace ns {
638 struct A { static void f(); };
639 void A::f() {}
640 void g() { A::f(); }
641 }
642 ns::A a;
643nestedNameSpecifier()
644 matches "ns::" and both "A::"
645</pre></td></tr>
646
647
Roman Lebedev33ef20e2019-03-21 15:33:24 +0000648<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
649<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
650
651Given
652
653 #pragma omp parallel default(none)
654 #pragma omp parallel default(shared)
655 #pragma omp parallel
656
657``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
658</pre></td></tr>
659
660
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000661<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000662<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
663</pre></td></tr>
664
665
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000666<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000667<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
668
669Given
670 FOO: bar();
671 void *ptr = &amp;&amp;FOO;
672 goto *bar;
673addrLabelExpr()
674 matches '&amp;&amp;FOO'
675</pre></td></tr>
676
677
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000678<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000679<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
680
681Given
682 int i = a[1];
683arraySubscriptExpr()
684 matches "a[1]"
685</pre></td></tr>
686
687
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000688<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000689<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
690
691 int i = 100;
692 __asm("mov al, 2");
693asmStmt()
694 matches '__asm("mov al, 2")'
695</pre></td></tr>
696
697
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000698<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000699<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
700Example matches __atomic_load_n(ptr, 1)
701 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
702</pre></td></tr>
703
704
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000705<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
George Karpenkovba02bc52018-07-06 21:36:04 +0000706<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
707
708Given
709 @autoreleasepool {
710 int x = 0;
711 }
712autoreleasePoolStmt(stmt()) matches the declaration of "x"
713inside the autorelease pool.
714</pre></td></tr>
715
716
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000717<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +0000718<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
719
720Example matches a ?: b
721 (a ?: b) + 42;
722</pre></td></tr>
723
724
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000725<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000726<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
727
728Example matches a || b
729 !(a || b)
730</pre></td></tr>
731
732
Stephane Moore3897b2d2018-12-13 03:35:10 +0000733<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
Hyrum Wright2cd40c02019-01-07 14:14:36 +0000734<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
Stephane Moore3897b2d2018-12-13 03:35:10 +0000735
736Example: matches "^{}":
737 void f() { ^{}(); }
738</pre></td></tr>
739
740
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000741<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000742<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
743
744Given
745 while (true) { break; }
746breakStmt()
747 matches 'break'
748</pre></td></tr>
749
750
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000751<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000752<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
753
Artem Dergachevded92a92016-11-11 22:34:53 +0000754Example: Matches (int) 2.2f in
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000755 int i = (int) 2.2f;
756</pre></td></tr>
757
758
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000759<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000760<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
761
762Example matches x.y() and y()
763 X x;
764 x.y();
765 y();
766</pre></td></tr>
767
768
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000769<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000770<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
771
772Given
773 switch(a) { case 42: break; default: break; }
774caseStmt()
Fangrui Song55942ab2018-01-22 22:34:15 +0000775 matches 'case 42:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000776</pre></td></tr>
777
778
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000779<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000780<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
781
782Example: castExpr() matches each of the following:
783 (int) 3;
784 const_cast&lt;Expr *&gt;(SubExpr);
785 char c = 0;
786but does not match
787 int i = (0);
788 int k = 0;
789</pre></td></tr>
790
791
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000792<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000793<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
794
795Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
796though.
797
798Example matches 'a', L'a'
Etienne Bergeron3588be72016-05-12 04:20:04 +0000799 char ch = 'a';
800 wchar_t chw = L'a';
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000801</pre></td></tr>
802
803
Tom Roeder521f0042019-02-26 19:26:41 +0000804<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
805<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
806</pre></td></tr>
807
808
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000809<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000810<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
811
812Example match: {1}, (1, 2)
Etienne Bergeron3588be72016-05-12 04:20:04 +0000813 int array[4] = {1};
814 vector int myvec = (vector int)(1, 2);
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000815</pre></td></tr>
816
817
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000818<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000819<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
820
Fangrui Song55942ab2018-01-22 22:34:15 +0000821Example matches '{}' and '{{}}' in 'for (;;) {{}}'
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000822 for (;;) {{}}
823</pre></td></tr>
824
825
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000826<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000827<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
828
829Example matches a ? b : c
830 (a ? b : c) + 42
831</pre></td></tr>
832
833
Clement Courbet314cfb52018-11-22 10:44:36 +0000834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
835<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
836
837Example matches the constant in the case statement:
838 (matcher = constantExpr())
839 switch (a) {
840 case 37: break;
841 }
842</pre></td></tr>
843
844
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000845<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000846<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
847
848Given
849 while (true) { continue; }
850continueStmt()
851 matches 'continue'
852</pre></td></tr>
853
854
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000855<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000856<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
857
858Example matches,
859 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
860</pre></td></tr>
861
862
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000863<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000864<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
865
866Example matches FunctionTakesString(GetStringByValue())
867 (matcher = cxxBindTemporaryExpr())
868 FunctionTakesString(GetStringByValue());
869 FunctionTakesStringByPointer(GetStringPointer());
870</pre></td></tr>
871
872
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000873<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000874<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
875
876Example matches true
877 true
878</pre></td></tr>
879
880
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000881<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000882<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
883
884 try {} catch(int i) {}
885cxxCatchStmt()
886 matches 'catch(int i)'
887</pre></td></tr>
888
889
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000890<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000891<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
892
893Example: Matches const_cast&lt;int*&gt;(&amp;r) in
894 int n = 42;
895 const int &amp;r(n);
896 int* p = const_cast&lt;int*&gt;(&amp;r);
897</pre></td></tr>
898
899
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000900<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000901<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
902
903Example matches string(ptr, n) and ptr within arguments of f
904 (matcher = cxxConstructExpr())
905 void f(const string &amp;a, const string &amp;b);
906 char *ptr;
907 int n;
908 f(string(ptr, n), ptr);
909</pre></td></tr>
910
911
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000912<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000913<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
914
915Example matches the CXXDefaultArgExpr placeholder inserted for the
916 default value of the second parameter in the call expression f(42)
917 (matcher = cxxDefaultArgExpr())
918 void f(int x, int y = 0);
919 f(42);
920</pre></td></tr>
921
922
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000923<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000924<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
925
926Given
927 delete X;
928cxxDeleteExpr()
929 matches 'delete X'.
930</pre></td></tr>
931
932
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000933<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
Shuai Wang72b56ed2018-08-12 17:34:36 +0000934<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
935resolved because the base expression or the member name was dependent.
936
937Given
938 template &lt;class T&gt; void f() { T t; t.g(); }
939cxxDependentScopeMemberExpr()
940 matches t.g
941</pre></td></tr>
942
943
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000944<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000945<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
946
947Example:
948 cxxDynamicCastExpr()
949matches
950 dynamic_cast&lt;D*&gt;(&amp;b);
951in
952 struct B { virtual ~B() {} }; struct D : B {};
953 B b;
954 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
955</pre></td></tr>
956
957
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000958<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000959<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
960
961cxxForRangeStmt() matches 'for (auto a : i)'
962 int i[] = {1, 2, 3}; for (auto a : i);
963 for(int j = 0; j &lt; 5; ++j);
964</pre></td></tr>
965
966
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000967<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000968<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
969
970Example: Matches Foo(bar);
971 Foo f = bar;
972 Foo g = (Foo) bar;
973 Foo h = Foo(bar);
974</pre></td></tr>
975
976
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000977<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000978<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
979
980Example matches x.y()
981 X x;
982 x.y();
983</pre></td></tr>
984
985
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000986<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000987<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
988
989Given
990 new X;
991cxxNewExpr()
992 matches 'new X'.
993</pre></td></tr>
994
995
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +0000996<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000997<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
998</pre></td></tr>
999
1000
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001001<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001002<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1003
1004Note that if an operator isn't overloaded, it won't match. Instead, use
1005binaryOperator matcher.
1006Currently it does not match operators such as new delete.
1007FIXME: figure out why these do not match?
1008
1009Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1010 (matcher = cxxOperatorCallExpr())
1011 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1012 ostream &amp;o; int b = 1, c = 1;
1013 o &lt;&lt; b &lt;&lt; c;
1014</pre></td></tr>
1015
1016
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001017<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001018<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1019
1020Either the source expression or the destination type can be matched
1021using has(), but hasDestinationType() is more specific and can be
1022more readable.
1023
1024Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1025 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1026</pre></td></tr>
1027
1028
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001029<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001030<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1031
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001032See also: hasDestinationType
1033See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001034
1035Example:
1036 cxxStaticCastExpr()
1037matches
1038 static_cast&lt;long&gt;(8)
1039in
1040 long eight(static_cast&lt;long&gt;(8));
1041</pre></td></tr>
1042
1043
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001044<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
Jakub Kuderski64b6c782017-05-05 21:01:12 +00001045<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1046
1047Given
1048 std::vector&lt;int&gt; a({ 1, 2, 3 });
1049 std::vector&lt;int&gt; b = { 4, 5 };
1050 int c[] = { 6, 7 };
1051 std::pair&lt;int, int&gt; d = { 8, 9 };
1052cxxStdInitializerListExpr()
1053 matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1054</pre></td></tr>
1055
1056
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001057<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001058<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1059
1060Example: Matches Foo(bar, bar)
1061 Foo h = Foo(bar, bar);
1062</pre></td></tr>
1063
1064
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001065<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001066<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1067
1068Example matches the implicit this expression in "return i".
1069 (matcher = cxxThisExpr())
1070struct foo {
1071 int i;
1072 int f() { return i; }
1073};
1074</pre></td></tr>
1075
1076
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001077<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001078<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1079
1080 try { throw 5; } catch(int i) {}
1081cxxThrowExpr()
1082 matches 'throw 5'
1083</pre></td></tr>
1084
1085
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001086<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001087<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1088
1089 try {} catch(int i) {}
1090cxxTryStmt()
1091 matches 'try {}'
1092</pre></td></tr>
1093
1094
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001095<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001096<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1097
1098Example matches T(t) in return statement of f
1099 (matcher = cxxUnresolvedConstructExpr())
1100 template &lt;typename T&gt;
1101 void f(const T&amp; t) { return T(t); }
1102</pre></td></tr>
1103
1104
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001105<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001106<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1107
1108Example matches x in if (x)
1109 bool x;
1110 if (x) {}
1111</pre></td></tr>
1112
1113
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001114<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001115<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1116
1117Given
1118 int a;
1119declStmt()
1120 matches 'int a'.
1121</pre></td></tr>
1122
1123
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001124<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001125<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1126
1127Given
1128 switch(a) { case 42: break; default: break; }
1129defaultStmt()
Fangrui Song55942ab2018-01-22 22:34:15 +00001130 matches 'default:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001131</pre></td></tr>
1132
1133
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001134<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001135<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1136
1137Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1138 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1139</pre></td></tr>
1140
1141
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001142<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001143<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1144
1145Given
1146 do {} while (true);
1147doStmt()
1148 matches 'do {} while(true)'
1149</pre></td></tr>
1150
1151
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001152<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001153<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1154
1155Matches any cast expression written in user code, whether it be a
1156C-style cast, a functional-style cast, or a keyword cast.
1157
1158Does not match implicit conversions.
1159
1160Note: the name "explicitCast" is chosen to match Clang's terminology, as
1161Clang uses the term "cast" to apply to implicit conversions as well as to
1162actual cast expressions.
1163
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001164See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001165
1166Example: matches all five of the casts in
1167 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1168but does not match the implicit conversion in
1169 long ell = 42;
1170</pre></td></tr>
1171
1172
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001173<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001174<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1175
1176Example matches x()
1177 void f() { x(); }
1178</pre></td></tr>
1179
1180
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001181<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001182<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1183of the sub-expression's evaluation.
1184
1185Example matches std::string()
1186 const std::string str = std::string();
1187</pre></td></tr>
1188
1189
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001190<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
Aaron Ballman94f3e742018-12-11 19:30:49 +00001191<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
Benjamin Kramer611d33a2015-11-20 07:46:19 +000011921.0, 1.0f, 1.0L and 1e10.
1193
1194Does not match implicit conversions such as
1195 float a = 10;
1196</pre></td></tr>
1197
1198
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001199<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001200<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1201
1202Example matches 'for (;;) {}'
1203 for (;;) {}
1204 int i[] = {1, 2, 3}; for (auto a : i);
1205</pre></td></tr>
1206
1207
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001208<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001209<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1210</pre></td></tr>
1211
1212
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001213<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001214<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1215
1216Given
1217 goto FOO;
1218 FOO: bar();
1219gotoStmt()
1220 matches 'goto FOO'
1221</pre></td></tr>
1222
1223
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001224<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001225<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1226
1227Example matches 'if (x) {}'
1228 if (x) {}
1229</pre></td></tr>
1230
1231
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001232<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
Stephen Kelly9b8fa522018-10-09 08:24:11 +00001233<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1234point literals e.g.: 1i, 1.0i
1235</pre></td></tr>
1236
1237
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001238<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001239<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1240
1241This matches many different places, including function call return value
1242eliding, as well as any type conversions.
1243</pre></td></tr>
1244
1245
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001246<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001247<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1248
1249Given
1250 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1251implicitValueInitExpr()
1252 matches "[0].y" (implicitly)
1253</pre></td></tr>
1254
1255
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001256<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001257<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1258
1259Given
1260 int a[] = { 1, 2 };
1261 struct B { int x, y; };
1262 B b = { 5, 6 };
1263initListExpr()
1264 matches "{ 1, 2 }" and "{ 5, 6 }"
1265</pre></td></tr>
1266
1267
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001268<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
Aaron Ballman94f3e742018-12-11 19:30:49 +00001269<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
Benjamin Kramer611d33a2015-11-20 07:46:19 +000012701, 1L, 0x1 and 1U.
1271
1272Does not match character-encoded integers such as L'a'.
1273</pre></td></tr>
1274
1275
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001276<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001277<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1278
1279Given
1280 goto FOO;
1281 FOO: bar();
1282labelStmt()
1283 matches 'FOO:'
1284</pre></td></tr>
1285
1286
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001287<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001288<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1289
1290Example matches [&amp;](){return 5;}
1291 [&amp;](){return 5;}
1292</pre></td></tr>
1293
1294
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001295<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001296<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1297
1298Example: Given
Jakub Kuderski64b6c782017-05-05 21:01:12 +00001299 struct T {void func();};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001300 T f();
1301 void g(T);
1302materializeTemporaryExpr() matches 'f()' in these statements
1303 T u(f());
1304 g(f());
Fangrui Song55942ab2018-01-22 22:34:15 +00001305 f().func();
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001306but does not match
1307 f();
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001308</pre></td></tr>
1309
1310
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001311<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001312<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1313
1314Given
1315 class Y {
1316 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1317 int a; static int b;
1318 };
1319memberExpr()
1320 matches this-&gt;x, x, y.x, a, this-&gt;b
1321</pre></td></tr>
1322
1323
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001324<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001325<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1326
1327 foo();;
1328nullStmt()
1329 matches the second ';'
1330</pre></td></tr>
1331
1332
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001333<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
Dave Lee0934fdc2017-11-11 22:46:15 +00001334<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1335
1336Example matches @catch
1337 @try {}
1338 @catch (...) {}
1339</pre></td></tr>
1340
1341
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001342<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
Dave Lee0934fdc2017-11-11 22:46:15 +00001343<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1344
1345Example matches @finally
1346 @try {}
1347 @finally {}
1348</pre></td></tr>
1349
1350
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001351<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
George Karpenkov079275b2018-07-27 17:26:11 +00001352<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1353
1354Example: matches "a" in "init" method:
1355@implementation A {
1356 NSString *a;
1357}
1358- (void) init {
1359 a = @"hello";
1360}
George Karpenkov079275b2018-07-27 17:26:11 +00001361</pre></td></tr>
1362
1363
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001364<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001365<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1366
1367The innermost message send invokes the "alloc" class method on the
1368NSString class, while the outermost message send invokes the
1369"initWithString" instance method on the object returned from
1370NSString's "alloc". This matcher should match both message sends.
1371 [[NSString alloc] initWithString:@"Hello"]
1372</pre></td></tr>
1373
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001374
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001375<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001376<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
Dave Lee0934fdc2017-11-11 22:46:15 +00001377
Benjamin Kramerae7ff382018-01-17 16:50:14 +00001378Example matches @throw obj;
Dave Lee0934fdc2017-11-11 22:46:15 +00001379</pre></td></tr>
1380
1381
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001382<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
Dave Lee0934fdc2017-11-11 22:46:15 +00001383<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1384
1385Example matches @try
1386 @try {}
1387 @catch (...) {}
1388</pre></td></tr>
1389
1390
Roman Lebedevde0e4ae2019-03-21 15:33:10 +00001391<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
1392<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
1393
1394Given
1395
1396 #pragma omp parallel
1397 #pragma omp parallel default(none)
1398 #pragma omp taskyield
1399
1400``ompExecutableDirective()`` matches ``omp parallel``,
1401``omp parallel default(none)`` and ``omp taskyield``.
1402</pre></td></tr>
1403
1404
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001405<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001406<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1407to reference another expressions and can be met
1408in BinaryConditionalOperators, for example.
1409
1410Example matches 'a'
1411 (a ?: c) + 42;
1412</pre></td></tr>
1413
1414
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001415<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
Aaron Ballmane8295d72016-01-20 16:17:39 +00001416<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1417
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001418Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001419 int foo() { return 1; }
1420 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001421</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001422
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001423
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001424<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001425<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1426ParenListExprs don't have a predefined type and are used for late parsing.
1427In the final AST, they can be met in template declarations.
1428
1429Given
1430 template&lt;typename T&gt; class X {
1431 void f() {
1432 X x(*this);
1433 int a = 0, b = 1; int i = (a, b);
1434 }
1435 };
1436parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1437has a predefined type and is a ParenExpr, not a ParenListExpr.
1438</pre></td></tr>
1439
1440
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001441<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001442<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1443
1444Example: Matches __func__
1445 printf("%s", __func__);
1446</pre></td></tr>
1447
1448
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001449<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001450<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1451
1452Given
1453 return 1;
1454returnStmt()
1455 matches 'return 1'
1456</pre></td></tr>
1457
1458
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001459<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001460<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1461
1462Given
1463 { ++a; }
1464stmt()
1465 matches both the compound statement '{ ++a; }' and '++a'.
1466</pre></td></tr>
1467
1468
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001469<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00001470<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1471
1472Example match: ({ int X = 4; X; })
1473 int C = ({ int X = 4; X; });
1474</pre></td></tr>
1475
1476
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001477<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001478<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1479
1480Example matches "abcd", L"abcd"
Etienne Bergeron3588be72016-05-12 04:20:04 +00001481 char *s = "abcd";
1482 wchar_t *ws = L"abcd";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001483</pre></td></tr>
1484
1485
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001486<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001487<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1488
1489Given
1490 template &lt;int N&gt;
1491 struct A { static const int n = N; };
1492 struct B : public A&lt;42&gt; {};
1493substNonTypeTemplateParmExpr()
1494 matches "N" in the right-hand side of "static const int n = N;"
1495</pre></td></tr>
1496
1497
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001498<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001499<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1500
1501Given
1502 switch(a) { case 42: break; default: break; }
1503switchCase()
Fangrui Song55942ab2018-01-22 22:34:15 +00001504 matches 'case 42:' and 'default:'.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001505</pre></td></tr>
1506
1507
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001508<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001509<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1510
1511Given
1512 switch(a) { case 42: break; default: break; }
1513switchStmt()
1514 matches 'switch(a)'.
1515</pre></td></tr>
1516
1517
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001518<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001519<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1520
1521Given
1522 Foo x = bar;
1523 int y = sizeof(x) + alignof(x);
1524unaryExprOrTypeTraitExpr()
1525 matches sizeof(x) and alignof(x)
1526</pre></td></tr>
1527
1528
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001529<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001530<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1531
1532Example matches !a
1533 !a || b
1534</pre></td></tr>
1535
1536
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001537<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
Haojian Wu7751c922016-05-18 12:53:59 +00001538<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1539but could not be resolved to a specific declaration.
1540
1541Given
1542 template&lt;typename T&gt;
1543 T foo() { T a; return a; }
1544 template&lt;typename T&gt;
1545 void bar() {
1546 foo&lt;T&gt;();
1547 }
1548unresolvedLookupExpr()
1549 matches foo&lt;T&gt;() </pre></td></tr>
1550
1551
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001552<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
Shuai Wang72b56ed2018-08-12 17:34:36 +00001553<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
1554
1555Given
1556 struct X {
1557 template &lt;class T&gt; void f();
1558 void g();
1559 };
1560 template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
1561unresolvedMemberExpr()
1562 matches x.f&lt;T&gt;
1563</pre></td></tr>
1564
1565
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001566<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001567<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1568
1569Example match: "foo"_suffix
1570</pre></td></tr>
1571
1572
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001573<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001574<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1575
1576Given
1577 while (true) {}
1578whileStmt()
1579 matches 'while (true) {}'.
1580</pre></td></tr>
1581
1582
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001583<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001584<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1585
1586Given
1587 template &lt;typename T&gt; struct C {};
1588 C&lt;int&gt; c;
1589templateArgument()
1590 matches 'int' in C&lt;int&gt;.
1591</pre></td></tr>
1592
1593
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001594<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
Haojian Wub33b02e2016-07-29 15:45:11 +00001595<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1596
1597Given
1598 template &lt;typename T&gt; class X { };
1599 X&lt;int&gt; xi;
1600templateName()
1601 matches 'X' in X&lt;int&gt;.
1602</pre></td></tr>
1603
1604
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001605<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001606<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1607</pre></td></tr>
1608
1609
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001610<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001611<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1612
1613Given
1614 int a[] = { 2, 3 };
1615 int b[4];
1616 void f() { int c[a[0]]; }
1617arrayType()
1618 matches "int a[]", "int b[4]" and "int c[a[0]]";
1619</pre></td></tr>
1620
1621
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001622<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001623<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1624
1625Given
1626 _Atomic(int) i;
1627atomicType()
1628 matches "_Atomic(int) i"
1629</pre></td></tr>
1630
1631
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001632<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001633<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1634
1635Given:
1636 auto n = 4;
1637 int v[] = { 2, 3 }
1638 for (auto i : v) { }
1639autoType()
1640 matches "auto n" and "auto i"
1641</pre></td></tr>
1642
1643
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001644<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001645<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1646"void (^)(int)".
1647
1648The pointee is always required to be a FunctionType.
1649</pre></td></tr>
1650
1651
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001652<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001653<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1654
1655Given
1656 struct A {};
1657 A a;
1658 int b;
1659 float c;
1660 bool d;
1661builtinType()
1662 matches "int b", "float c" and "bool d"
1663</pre></td></tr>
1664
1665
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001666<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001667<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1668
1669Given
1670 _Complex float f;
1671complexType()
1672 matches "_Complex float f"
1673</pre></td></tr>
1674
1675
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001676<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001677<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1678
1679Given
1680 void() {
1681 int a[2];
1682 int b[] = { 2, 3 };
1683 int c[b[0]];
1684 }
1685constantArrayType()
1686 matches "int a[2]"
1687</pre></td></tr>
1688
1689
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001690<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001691<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1692Example matches i[] in declaration of f.
1693 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1694Example matches i[1].
1695 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1696 void f(int i[]) {
1697 i[1] = 0;
1698 }
1699</pre></td></tr>
1700
1701
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001702<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
Jonas Tothacf83672018-07-26 13:02:05 +00001703<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
1704
1705Given:
1706 short i = 1;
1707 int j = 42;
1708 decltype(i + j) result = i + j;
Shuai Wang72b56ed2018-08-12 17:34:36 +00001709decltypeType()
Jonas Tothacf83672018-07-26 13:02:05 +00001710 matches "decltype(i + j)"
1711</pre></td></tr>
1712
1713
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001714<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001715<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1716
1717Given
1718 template&lt;typename T, int Size&gt;
1719 class array {
1720 T data[Size];
1721 };
1722dependentSizedArrayType
1723 matches "T data[Size]"
1724</pre></td></tr>
1725
1726
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001727<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001728<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1729qualified name.
1730
1731Given
1732 namespace N {
1733 namespace M {
1734 class D {};
1735 }
1736 }
1737 class C {};
1738
1739 class C c;
1740 N::M::D d;
1741
1742elaboratedType() matches the type of the variable declarations of both
1743c and d.
1744</pre></td></tr>
1745
1746
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001747<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
Haojian Wue775de82016-06-30 07:50:01 +00001748<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1749
1750Given
1751 enum C { Green };
Aaron Ballman5c574342016-07-06 18:25:16 +00001752 enum class S { Red };
Haojian Wue775de82016-06-30 07:50:01 +00001753
1754 C c;
1755 S s;
1756
1757enumType() matches the type of the variable declarations of both c and
1758s.
1759</pre></td></tr>
1760
1761
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001762<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001763<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1764
1765Given
1766 int (*f)(int);
1767 void g();
1768functionProtoType()
1769 matches "int (*f)(int)" and the type of "g" in C++ mode.
1770 In C mode, "g" is not matched because it does not contain a prototype.
1771</pre></td></tr>
1772
1773
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001774<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001775<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1776
1777Given
1778 int (*f)(int);
1779 void g();
1780functionType()
1781 matches "int (*f)(int)" and the type of "g".
1782</pre></td></tr>
1783
1784
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001785<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001786<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1787
1788Given
1789 int a[] = { 2, 3 };
1790 int b[42];
1791 void f(int c[]) { int d[a[0]]; };
1792incompleteArrayType()
1793 matches "int a[]" and "int c[]"
1794</pre></td></tr>
1795
1796
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001797<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001798<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1799
1800Example matches S s, but not S&lt;T&gt; s.
1801 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1802 template &lt;typename T&gt; struct S {
1803 void f(S s);
1804 void g(S&lt;T&gt; s);
1805 };
1806</pre></td></tr>
1807
1808
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001809<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001810<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1811
1812Given:
1813 int *a;
1814 int &amp;b = *a;
1815 int &amp;&amp;c = 1;
1816 auto &amp;d = b;
1817 auto &amp;&amp;e = c;
1818 auto &amp;&amp;f = 2;
1819 int g = 5;
1820
1821lValueReferenceType() matches the types of b, d, and e. e is
1822matched since the type is deduced as int&amp; by reference collapsing rules.
1823</pre></td></tr>
1824
1825
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001826<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001827<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1828Given
1829 struct A { int i; }
1830 A::* ptr = A::i;
1831memberPointerType()
1832 matches "A::* ptr"
1833</pre></td></tr>
1834
1835
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001836<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001837<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1838a pointer type, despite being syntactically similar.
1839
1840Given
1841 int *a;
1842
1843 @interface Foo
1844 @end
1845 Foo *f;
1846pointerType()
1847 matches "Foo *f", but does not match "int *a".
1848</pre></td></tr>
1849
1850
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001851<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001852<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1853
1854Given
1855 int (*ptr_to_array)[4];
1856 int *array_of_ptrs[4];
1857
1858varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1859array_of_ptrs.
1860</pre></td></tr>
1861
1862
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001863<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001864<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1865types.
1866
1867Given
1868 int *a;
1869 int &amp;b = *a;
1870 int c = 5;
1871
1872 @interface Foo
1873 @end
1874 Foo *f;
1875pointerType()
1876 matches "int *a", but does not match "Foo *f".
1877</pre></td></tr>
1878
1879
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001880<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001881<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1882
1883Given:
1884 int *a;
1885 int &amp;b = *a;
1886 int &amp;&amp;c = 1;
1887 auto &amp;d = b;
1888 auto &amp;&amp;e = c;
1889 auto &amp;&amp;f = 2;
1890 int g = 5;
1891
1892rValueReferenceType() matches the types of c and f. e is not
1893matched as it is deduced to int&amp; by reference collapsing rules.
1894</pre></td></tr>
1895
1896
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001897<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001898<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1899
1900Given
1901 class C {};
1902 struct S {};
1903
1904 C c;
1905 S s;
1906
1907recordType() matches the type of the variable declarations of both c
1908and s.
1909</pre></td></tr>
1910
1911
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001912<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001913<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1914
1915Given
1916 int *a;
1917 int &amp;b = *a;
1918 int &amp;&amp;c = 1;
1919 auto &amp;d = b;
1920 auto &amp;&amp;e = c;
1921 auto &amp;&amp;f = 2;
1922 int g = 5;
1923
1924referenceType() matches the types of b, c, d, e, and f.
1925</pre></td></tr>
1926
1927
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001928<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001929<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1930template type parameter.
1931
1932Given
1933 template &lt;typename T&gt;
1934 void F(T t) {
1935 int i = 1 + t;
1936 }
1937
1938substTemplateTypeParmType() matches the type of 't' but not '1'
1939</pre></td></tr>
1940
1941
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001942<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
Manuel Klimek696e5052017-08-02 13:04:44 +00001943<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1944
1945Given
1946 enum E {};
1947 class C {};
1948
1949 E e;
1950 C c;
1951
1952tagType() matches the type of the variable declarations of both e
1953and c.
1954</pre></td></tr>
1955
1956
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001957<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001958<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1959
1960Given
1961 template &lt;typename T&gt;
1962 class C { };
1963
Aaron Ballman94f3e742018-12-11 19:30:49 +00001964 template class C&lt;int&gt;; // A
1965 C&lt;char&gt; var; // B
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001966
1967templateSpecializationType() matches the type of the explicit
1968instantiation in A and the type of the variable declaration in B.
1969</pre></td></tr>
1970
1971
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001972<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001973<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1974
1975Example matches T, but not int.
1976 (matcher = templateTypeParmType())
1977 template &lt;typename T&gt; void f(int i);
1978</pre></td></tr>
1979
1980
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001981<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001982<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1983</pre></td></tr>
1984
1985
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001986<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001987<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1988
1989Given
1990 typedef int X;
1991typedefType()
1992 matches "typedef int X"
1993</pre></td></tr>
1994
1995
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00001996<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001997<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1998
1999Given:
2000 typedef __underlying_type(T) type;
2001unaryTransformType()
2002 matches "__underlying_type(T)"
2003</pre></td></tr>
2004
2005
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002006<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002007<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2008integer-constant-expression.
2009
2010Given
2011 void f() {
2012 int a[] = { 2, 3 }
2013 int b[42];
2014 int c[a[0]];
2015 }
2016variableArrayType()
2017 matches "int c[a[0]]"
2018</pre></td></tr>
2019
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00002020<!--END_DECL_MATCHERS -->
2021</table>
2022
2023<!-- ======================================================================= -->
2024<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2025<!-- ======================================================================= -->
2026
2027<p>Narrowing matchers match certain attributes on the current node, thus
2028narrowing down the set of nodes of the current type to match on.</p>
2029
2030<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2031which allow users to create more powerful match expressions.</p>
2032
2033<table>
2034<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002035<!-- START_NARROWING_MATCHERS -->
2036
2037<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>
2038<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2039
2040Usable as: Any Matcher
2041</pre></td></tr>
2042
2043
2044<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>
2045<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2046
2047Usable as: Any Matcher
2048</pre></td></tr>
2049
2050
2051<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2052<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2053
2054Useful when another matcher requires a child matcher, but there's no
2055additional constraint. This will often be used with an explicit conversion
2056to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2057
2058Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2059"int* p" and "void f()" in
2060 int* p;
2061 void f();
2062
2063Usable as: Any Matcher
2064</pre></td></tr>
2065
2066
2067<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2068<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2069
2070Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2071 class X {};
2072 class Y {};
2073
2074Usable as: Any Matcher
2075</pre></td></tr>
2076
2077
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002078<tr><td>Matcher&lt;<a href="https://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 +00002079<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2080unary).
2081
2082Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2083 !(a || b)
2084</pre></td></tr>
2085
2086
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002087<tr><td>Matcher&lt;<a href="https://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 +00002088<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2089
2090Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2091 if (a == b)
2092 a += b;
2093
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00002094Example 2: matches s1 = s2
2095 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2096 struct S { S&amp; operator=(const S&amp;); };
Peter Szecsifff11db2018-03-27 12:11:46 +00002097 void x() { S s1, s2; s1 = s2; })
2098</pre></td></tr>
2099
2100
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002101<tr><td>Matcher&lt;<a href="https://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>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002102<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2103
2104
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002105<tr><td>Matcher&lt;<a href="https://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 +00002106<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 +00002107
Peter Wua9244b52017-06-08 22:00:58 +00002108Given
2109 f('false, 3.14, 42);
2110characterLiteral(equals(0))
2111 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2112 match false
2113floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2114 match 3.14
2115integerLiteral(equals(42))
2116 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002117
Clement Courbet43bdba42017-07-11 15:45:22 +00002118Note that you cannot directly match a negative numeric literal because the
2119minus sign is not part of the literal: It is a unary operator whose operand
2120is the positive numeric literal. Instead, you must use a unaryOperator()
2121matcher to match the minus sign:
2122
2123unaryOperator(hasOperatorName("-"),
2124 hasUnaryOperand(integerLiteral(equals(13))))
2125
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002126Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2127 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002128</pre></td></tr>
2129
2130
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002131<tr><td>Matcher&lt;<a href="https://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>
Peter Wua9244b52017-06-08 22:00:58 +00002132<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2133
2134
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002135<tr><td>Matcher&lt;<a href="https://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>
Peter Wua9244b52017-06-08 22:00:58 +00002136<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2137
2138
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002139<tr><td>Matcher&lt;<a href="https://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 +00002140<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2141
2142Given
2143 try {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002144 // ...
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002145 } catch (int) {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002146 // ...
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002147 } catch (...) {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002148 // ...
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002149 }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002150cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2151</pre></td></tr>
2152
2153
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002154<tr><td>Matcher&lt;<a href="https://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 +00002155<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2156a specific number of arguments (including absent default arguments).
2157
2158Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2159 void f(int x, int y);
2160 f(0, 0);
2161</pre></td></tr>
2162
2163
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002164<tr><td>Matcher&lt;<a href="https://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 +00002165<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2166</pre></td></tr>
2167
2168
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002169<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002170<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2171zero initialization.
2172
2173Given
2174void foo() {
2175 struct point { double x; double y; };
2176 point pt[2] = { { 1.0, 2.0 } };
2177}
2178initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2179will match the implicit array filler for pt[1].
2180</pre></td></tr>
2181
2182
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002183<tr><td>Matcher&lt;<a href="https://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 +00002184<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2185
2186Given
2187 struct S {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002188 S(); // #1
2189 S(const S &amp;); // #2
2190 S(S &amp;&amp;); // #3
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002191 };
2192cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2193</pre></td></tr>
2194
2195
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002196<tr><td>Matcher&lt;<a href="https://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 +00002197<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2198
2199Given
2200 struct S {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002201 S(); // #1
2202 S(const S &amp;); // #2
2203 S(S &amp;&amp;); // #3
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002204 };
2205cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2206</pre></td></tr>
2207
2208
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002209<tr><td>Matcher&lt;<a href="https://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>
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002210<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2211
2212Given
2213 struct S {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002214 S(); // #1
2215 S(int) {} // #2
2216 S(S &amp;&amp;) : S() {} // #3
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002217 };
Aaron Ballman94f3e742018-12-11 19:30:49 +00002218 S::S() : S(0) {} // #4
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002219cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2220#1 or #2.
2221</pre></td></tr>
2222
2223
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002224<tr><td>Matcher&lt;<a href="https://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 +00002225<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2226the explicit keyword.
2227
2228Given
2229 struct S {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002230 S(int); // #1
2231 explicit S(double); // #2
2232 operator int(); // #3
2233 explicit operator bool(); // #4
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002234 };
2235cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2236cxxConversionDecl(isExplicit()) will match #4, but not #3.
2237</pre></td></tr>
2238
2239
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002240<tr><td>Matcher&lt;<a href="https://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 +00002241<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2242
2243Given
2244 struct S {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002245 S(); // #1
2246 S(const S &amp;); // #2
2247 S(S &amp;&amp;); // #3
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002248 };
2249cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2250</pre></td></tr>
2251
2252
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002253<tr><td>Matcher&lt;<a href="https://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 +00002254<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2255the explicit keyword.
2256
2257Given
2258 struct S {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002259 S(int); // #1
2260 explicit S(double); // #2
2261 operator int(); // #3
2262 explicit operator bool(); // #4
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002263 };
2264cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2265cxxConversionDecl(isExplicit()) will match #4, but not #3.
2266</pre></td></tr>
2267
2268
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002269<tr><td>Matcher&lt;<a href="https://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 +00002270<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2271opposed to a member.
2272
2273Given
2274 struct B {};
2275 struct D : B {
2276 int I;
2277 D(int i) : I(i) {}
2278 };
2279 struct E : B {
2280 E() : B() {}
2281 };
2282cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2283 will match E(), but not match D(int).
2284</pre></td></tr>
2285
2286
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002287<tr><td>Matcher&lt;<a href="https://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 +00002288<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2289opposed to a base.
2290
2291Given
2292 struct B {};
2293 struct D : B {
2294 int I;
2295 D(int i) : I(i) {}
2296 };
2297 struct E : B {
2298 E() : B() {}
2299 };
2300cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2301 will match D(int), but not match E().
2302</pre></td></tr>
2303
2304
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002305<tr><td>Matcher&lt;<a href="https://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 +00002306<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2307code (as opposed to implicitly added by the compiler).
2308
2309Given
2310 struct Foo {
2311 Foo() { }
2312 Foo(int) : foo_("A") { }
2313 string foo_;
2314 };
2315cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2316 will match Foo(int), but not Foo()
2317</pre></td></tr>
2318
2319
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002320<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
Shuai Wange0248ae2018-09-17 18:48:43 +00002321<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
2322to '.'.
2323
2324Member calls on the implicit this pointer match as called with '-&gt;'.
2325
2326Given
2327 class Y {
2328 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2329 template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
2330 int a;
2331 static int b;
2332 };
2333 template &lt;class T&gt;
2334 class Z {
2335 void x() { this-&gt;m; }
2336 };
2337memberExpr(isArrow())
2338 matches this-&gt;x, x, y.x, a, this-&gt;b
2339cxxDependentScopeMemberExpr(isArrow())
2340 matches this-&gt;m
2341unresolvedMemberExpr(isArrow())
2342 matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
2343</pre></td></tr>
2344
2345
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002346<tr><td>Matcher&lt;<a href="https://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 +00002347<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2348
2349Given
2350struct A {
2351 void foo() const;
2352 void bar();
2353};
2354
2355cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2356</pre></td></tr>
2357
2358
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002359<tr><td>Matcher&lt;<a href="https://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 +00002360<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2361operator.
2362
2363Given
2364struct A {
2365 A &amp;operator=(const A &amp;);
2366 A &amp;operator=(A &amp;&amp;);
2367};
2368
2369cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2370the second one.
2371</pre></td></tr>
2372
2373
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002374<tr><td>Matcher&lt;<a href="https://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 +00002375<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2376
2377Given:
2378 class A final {};
2379
2380 struct B {
2381 virtual void f();
2382 };
2383
2384 struct C : B {
2385 void f() final;
2386 };
2387matches A and C::f, but not B, C, or B::f
2388</pre></td></tr>
2389
2390
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002391<tr><td>Matcher&lt;<a href="https://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 +00002392<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2393operator.
2394
2395Given
Aaron Ballmana6811512016-01-23 17:49:18 +00002396struct A {
2397 A &amp;operator=(const A &amp;);
2398 A &amp;operator=(A &amp;&amp;);
2399};
2400
2401cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2402the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00002403</pre></td></tr>
2404
2405
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002406<tr><td>Matcher&lt;<a href="https://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 +00002407<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2408
2409Given
2410 class A {
2411 public:
2412 virtual void x();
2413 };
2414 class B : public A {
2415 public:
2416 virtual void x();
2417 };
2418 matches B::x
2419</pre></td></tr>
2420
2421
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002422<tr><td>Matcher&lt;<a href="https://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 +00002423<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2424
2425Given
2426 class A {
2427 public:
2428 virtual void x() = 0;
2429 };
2430 matches A::x
2431</pre></td></tr>
2432
2433
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002434<tr><td>Matcher&lt;<a href="https://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>
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002435<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2436
2437Given
2438 struct S {
Aaron Ballman94f3e742018-12-11 19:30:49 +00002439 S(); // #1
2440 S(const S &amp;) = default; // #2
2441 S(S &amp;&amp;) = delete; // #3
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00002442 };
2443cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2444</pre></td></tr>
2445
2446
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002447<tr><td>Matcher&lt;<a href="https://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 +00002448<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2449
2450Given
2451 class A {
2452 public:
2453 virtual void x();
2454 };
2455 matches A::x
2456</pre></td></tr>
2457
Aaron Ballman672dde22016-01-22 23:15:00 +00002458
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002459<tr><td>Matcher&lt;<a href="https://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 +00002460<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2461
2462Given
2463 class A {
2464 public:
2465 virtual void x();
2466 };
2467 class B : public A {
2468 public:
2469 void x();
2470 };
2471 matches A::x but not B::x
2472</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002473
Aaron Ballman672dde22016-01-22 23:15:00 +00002474
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002475<tr><td>Matcher&lt;<a href="https://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>
Adam Baloghda488a62017-11-23 12:43:20 +00002476<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2477
2478Given:
2479 MyClass *p1 = new MyClass[10];
2480cxxNewExpr(isArray())
2481 matches the expression 'new MyClass[10]'.
2482</pre></td></tr>
2483
2484
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002485<tr><td>Matcher&lt;<a href="https://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 +00002486<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2487
2488Matches overloaded operator names specified in strings without the
2489"operator" prefix: e.g. "&lt;&lt;".
2490
2491Given:
2492 class A { int operator*(); };
2493 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2494 A a;
Aaron Ballman94f3e742018-12-11 19:30:49 +00002495 a &lt;&lt; a; // &lt;-- This matches
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002496
2497cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2498specified line and
2499cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2500matches the declaration of A.
2501
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002502Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002503</pre></td></tr>
2504
2505
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002506<tr><td>Matcher&lt;<a href="https://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 +00002507<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2508
2509Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2510 if (a == b)
2511 a += b;
2512
Alexander Kornienko395ab2e2018-04-30 18:12:15 +00002513Example 2: matches s1 = s2
2514 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2515 struct S { S&amp; operator=(const S&amp;); };
Peter Szecsifff11db2018-03-27 12:11:46 +00002516 void x() { S s1, s2; s1 = s2; })
2517</pre></td></tr>
2518
2519
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002520<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman813e36c2017-11-29 21:21:51 +00002521<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2522
2523Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2524class x {};
2525class y;
2526</pre></td></tr>
2527
2528
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002529<tr><td>Matcher&lt;<a href="https://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 +00002530<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2531</pre></td></tr>
2532
2533
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002534<tr><td>Matcher&lt;<a href="https://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 +00002535<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2536static member variable template instantiations.
2537
2538Given
2539 template&lt;typename T&gt; void A(T t) { }
2540 template&lt;&gt; void A(int N) { }
2541functionDecl(isExplicitTemplateSpecialization())
2542 matches the specialization A&lt;int&gt;().
2543
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002544Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002545</pre></td></tr>
2546
2547
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002548<tr><td>Matcher&lt;<a href="https://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 +00002549<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2550
2551Given:
2552 class A final {};
2553
2554 struct B {
2555 virtual void f();
2556 };
2557
2558 struct C : B {
2559 void f() final;
2560 };
2561matches A and C::f, but not B, C, or B::f
2562</pre></td></tr>
2563
2564
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002565<tr><td>Matcher&lt;<a href="https://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>
Samuel Benzaquen49385c72016-06-28 14:08:56 +00002566<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2567
2568Given:
2569 auto x = []{};
2570
2571cxxRecordDecl(isLambda()) matches the implicit class declaration of
2572decltype(x)
2573</pre></td></tr>
2574
2575
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002576<tr><td>Matcher&lt;<a href="https://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 +00002577<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2578isSameOrDerivedFrom(hasName(...)).
2579</pre></td></tr>
2580
2581
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002582<tr><td>Matcher&lt;<a href="https://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 +00002583<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2584member variable template instantiations.
2585
2586Given
2587 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2588or
2589 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00002590or
2591 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002592cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2593 matches the template instantiation of X&lt;A&gt;.
2594
2595But given
2596 template &lt;typename T&gt; class X {}; class A {};
2597 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2598cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2599 does not match, as X&lt;A&gt; is an explicit template specialization.
2600
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002601Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002602</pre></td></tr>
2603
2604
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002605<tr><td>Matcher&lt;<a href="https://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 +00002606<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2607a specific number of arguments (including absent default arguments).
2608
2609Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2610 void f(int x, int y);
2611 f(0, 0);
2612</pre></td></tr>
2613
2614
Eric Fiselier5cdc2cd2018-12-12 21:50:55 +00002615<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
2616<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
2617
2618Example matches y(x) but not y(42) or NS::y(x).
2619 namespace NS {
2620 struct X {};
2621 void y(X);
2622 }
2623
2624 void y(...);
2625
2626 void test() {
2627 NS::X x;
2628 y(x); // Matches
2629 NS::y(x); // Doesn't match
2630 y(42); // Doesn't match
2631 using NS::y;
2632 y(x); // Found by both unqualified lookup and ADL, doesn't match
2633 }
2634</pre></td></tr>
2635
2636
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002637<tr><td>Matcher&lt;<a href="https://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>
Etienne Bergeron75e52722016-05-13 19:36:55 +00002638<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2639
2640Example: matches the implicit cast around 0
2641(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2642 int *p = 0;
Roman Lebedev408eb442019-03-21 15:33:43 +00002643
2644If the matcher is use from clang-query, CastKind parameter
2645should be passed as a quoted string. e.g., ofKind("CK_NullToPointer").
Etienne Bergeron75e52722016-05-13 19:36:55 +00002646</pre></td></tr>
2647
2648
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002649<tr><td>Matcher&lt;<a href="https://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>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00002650<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2651
2652
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002653<tr><td>Matcher&lt;<a href="https://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 +00002654<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 +00002655
Peter Wua9244b52017-06-08 22:00:58 +00002656Given
2657 f('false, 3.14, 42);
2658characterLiteral(equals(0))
2659 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2660 match false
2661floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2662 match 3.14
2663integerLiteral(equals(42))
2664 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002665
Clement Courbet43bdba42017-07-11 15:45:22 +00002666Note that you cannot directly match a negative numeric literal because the
2667minus sign is not part of the literal: It is a unary operator whose operand
2668is the positive numeric literal. Instead, you must use a unaryOperator()
2669matcher to match the minus sign:
2670
2671unaryOperator(hasOperatorName("-"),
2672 hasUnaryOperand(integerLiteral(equals(13))))
2673
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002674Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2675 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002676</pre></td></tr>
2677
2678
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002679<tr><td>Matcher&lt;<a href="https://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>
Peter Wua9244b52017-06-08 22:00:58 +00002680<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2681
2682
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002683<tr><td>Matcher&lt;<a href="https://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>
Peter Wua9244b52017-06-08 22:00:58 +00002684<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2685
2686
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002687<tr><td>Matcher&lt;<a href="https://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 +00002688<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2689
2690Given
2691 template&lt;typename T&gt; struct C {};
2692 C&lt;int&gt; c;
2693classTemplateSpecializationDecl(templateArgumentCountIs(1))
2694 matches C&lt;int&gt;.
2695</pre></td></tr>
2696
2697
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002698<tr><td>Matcher&lt;<a href="https://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 +00002699<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2700child statements.
2701
2702Example: Given
2703 { for (;;) {} }
2704compoundStmt(statementCountIs(0)))
2705 matches '{}'
2706 but does not match the outer compound statement.
2707</pre></td></tr>
2708
2709
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002710<tr><td>Matcher&lt;<a href="https://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 +00002711<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002712
2713Given
2714 int a[42];
2715 int b[2 * 21];
2716 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002717 char *s = "abcd";
2718 wchar_t *ws = L"abcd";
2719 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002720constantArrayType(hasSize(42))
2721 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002722stringLiteral(hasSize(4))
2723 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002724</pre></td></tr>
2725
2726
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002727<tr><td>Matcher&lt;<a href="https://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 +00002728<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2729declarations.
2730
2731Example: Given
2732 int a, b;
2733 int c;
2734 int d = 2, e;
2735declCountIs(2)
2736 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2737</pre></td></tr>
2738
2739
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002740<tr><td>Matcher&lt;<a href="https://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 +00002741<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2742
2743Matches a node if it equals the node previously bound to ID.
2744
2745Given
2746 class X { int a; int b; };
2747cxxRecordDecl(
2748 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2749 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2750 matches the class X, as a and b have the same type.
2751
2752Note that when multiple matches are involved via forEach* matchers,
2753equalsBoundNodes acts as a filter.
2754For example:
2755compoundStmt(
2756 forEachDescendant(varDecl().bind("d")),
2757 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2758will trigger a match for each combination of variable declaration
2759and reference to that variable declaration within a compound statement.
2760</pre></td></tr>
2761
2762
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002763<tr><td>Matcher&lt;<a href="https://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>
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00002764<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2765
2766Decl has pointer identity in the AST.
2767</pre></td></tr>
2768
2769
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002770<tr><td>Matcher&lt;<a href="https://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 +00002771<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2772
2773Given
2774 __attribute__((device)) void f() { ... }
2775decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
Aaron Ballmanf36b2532019-04-03 13:37:56 +00002776f. If the matcher is used from clang-query, attr::Kind parameter should be
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002777passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2778</pre></td></tr>
2779
2780
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002781<tr><td>Matcher&lt;<a href="https://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 +00002782<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2783partially matching a given regex.
2784
2785Example matches Y but not X
2786 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2787 #include "ASTMatcher.h"
2788 class X {};
2789ASTMatcher.h:
2790 class Y {};
2791
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002792Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002793</pre></td></tr>
2794
2795
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002796<tr><td>Matcher&lt;<a href="https://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 +00002797<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2798
2799Example matches X but not Y
2800 (matcher = cxxRecordDecl(isExpansionInMainFile())
2801 #include &lt;Y.h&gt;
2802 class X {};
2803Y.h:
2804 class Y {};
2805
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002806Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002807</pre></td></tr>
2808
2809
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002810<tr><td>Matcher&lt;<a href="https://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 +00002811<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2812
2813Example matches Y but not X
2814 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2815 #include &lt;SystemHeader.h&gt;
2816 class X {};
2817SystemHeader.h:
2818 class Y {};
2819
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002820Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002821</pre></td></tr>
2822
2823
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002824<tr><td>Matcher&lt;<a href="https://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 +00002825<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
Aaron Ballman94f3e742018-12-11 19:30:49 +00002826by the compiler (eg. implicit default/copy constructors).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002827</pre></td></tr>
2828
2829
Dmitri Gribenkob641b912019-05-03 12:50:00 +00002830<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
2831<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
2832
2833Given
2834 class vector {};
2835 namespace foo {
2836 class vector {};
2837 namespace std {
2838 class vector {};
2839 }
2840 }
2841 namespace std {
2842 inline namespace __1 {
2843 class vector {}; // #1
2844 namespace experimental {
2845 class vector {};
2846 }
2847 }
2848 }
2849cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
2850</pre></td></tr>
2851
2852
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002853<tr><td>Matcher&lt;<a href="https://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 +00002854<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2855
2856Given
2857 class C {
2858 public: int a;
2859 protected: int b;
2860 private: int c;
2861 };
2862fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002863 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002864</pre></td></tr>
2865
2866
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002867<tr><td>Matcher&lt;<a href="https://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 +00002868<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2869
2870Given
2871 class C {
2872 public: int a;
2873 protected: int b;
2874 private: int c;
2875 };
2876fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002877 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002878</pre></td></tr>
2879
2880
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002881<tr><td>Matcher&lt;<a href="https://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 +00002882<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2883
2884Given
2885 class C {
2886 public: int a;
2887 protected: int b;
2888 private: int c;
2889 };
2890fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002891 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002892</pre></td></tr>
2893
2894
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002895<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00002896<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2897a specific number of designators.
2898
2899Example: Given
2900 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2901 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2902designatorCountIs(2)
2903 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2904 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2905</pre></td></tr>
2906
2907
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002908<tr><td>Matcher&lt;<a href="https://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>
Haojian Wu9c3be3a2018-01-18 09:47:57 +00002909<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2910
2911Example matches Y (matcher = enumDecl(isScoped()))
2912enum X {};
2913enum class Y {};
2914</pre></td></tr>
2915
2916
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002917<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
Jonas Toth22538782018-09-11 16:09:19 +00002918<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
2919neither type- nor value-dependent.
2920
2921In the following example, the expression sizeof(sizeof(T() + T()))
2922is instantiation-dependent (since it involves a template parameter T),
2923but is neither type- nor value-dependent, since the type of the inner
2924sizeof is known (std::size_t) and therefore the size of the outer
2925sizeof is known.
2926 template&lt;typename T&gt;
2927 void f(T x, T y) { sizeof(sizeof(T() + T()); }
2928expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
2929</pre></td></tr>
2930
2931
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002932<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
Jonas Toth22538782018-09-11 16:09:19 +00002933<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
2934is not yet instantiated.
2935
2936For example, the expressions "x" and "x + y" are type-dependent in
2937the following code, but "y" is not type-dependent:
2938 template&lt;typename T&gt;
2939 void add(T x, int y) {
2940 x + y;
2941 }
2942expr(isTypeDependent()) matches x + y
2943</pre></td></tr>
2944
2945
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
Jonas Toth22538782018-09-11 16:09:19 +00002947<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
2948non-type template parameter.
2949
2950For example, the array bound of "Chars" in the following example is
2951value-dependent.
2952 template&lt;int Size&gt; int f() { return Size; }
2953expr(isValueDependent()) matches return Size
2954</pre></td></tr>
2955
2956
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002957<tr><td>Matcher&lt;<a href="https://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 +00002958<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2959bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002960
2961Given
2962 class C {
2963 int a : 2;
2964 int b : 4;
2965 int c : 2;
2966 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002967fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002968 matches 'int a;' and 'int c;' but not 'int b;'.
2969</pre></td></tr>
2970
2971
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002972<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman5c574342016-07-06 18:25:16 +00002973<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2974
2975Given
2976 class C {
2977 int a : 2;
2978 int b;
2979 };
2980fieldDecl(isBitField())
2981 matches 'int a;' but not 'int b;'.
2982</pre></td></tr>
2983
2984
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002985<tr><td>Matcher&lt;<a href="https://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 +00002986<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 +00002987
Peter Wua9244b52017-06-08 22:00:58 +00002988Given
2989 f('false, 3.14, 42);
2990characterLiteral(equals(0))
2991 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2992 match false
2993floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2994 match 3.14
2995integerLiteral(equals(42))
2996 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002997
Clement Courbet43bdba42017-07-11 15:45:22 +00002998Note that you cannot directly match a negative numeric literal because the
2999minus sign is not part of the literal: It is a unary operator whose operand
3000is the positive numeric literal. Instead, you must use a unaryOperator()
3001matcher to match the minus sign:
3002
3003unaryOperator(hasOperatorName("-"),
3004 hasUnaryOperand(integerLiteral(equals(13))))
3005
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003006Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3007 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003008</pre></td></tr>
3009
3010
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003011<tr><td>Matcher&lt;<a href="https://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>
Peter Wua9244b52017-06-08 22:00:58 +00003012<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3013
3014
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003015<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00003016<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3017
3018Given:
3019 void f();
3020 void g() noexcept;
3021 void h() noexcept(true);
3022 void i() noexcept(false);
3023 void j() throw();
3024 void k() throw(int);
3025 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00003026functionDecl(hasDynamicExceptionSpec()) and
3027 functionProtoType(hasDynamicExceptionSpec())
3028 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00003029</pre></td></tr>
3030
3031
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003032<tr><td>Matcher&lt;<a href="https://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 +00003033<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3034
3035Matches overloaded operator names specified in strings without the
3036"operator" prefix: e.g. "&lt;&lt;".
3037
3038Given:
3039 class A { int operator*(); };
3040 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3041 A a;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003042 a &lt;&lt; a; // &lt;-- This matches
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003043
3044cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3045specified line and
3046cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3047matches the declaration of A.
3048
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003049Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003050</pre></td></tr>
3051
3052
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003053<tr><td>Matcher&lt;<a href="https://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>
Julie Hockett239d25a2018-01-22 22:45:23 +00003054<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3055
3056Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3057int X() {}
3058auto Y() -&gt; int {}
3059</pre></td></tr>
3060
3061
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003062<tr><td>Matcher&lt;<a href="https://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 +00003063<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3064 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003065
3066Given:
3067 constexpr int foo = 42;
3068 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003069 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003070varDecl(isConstexpr())
3071 matches the declaration of foo.
3072functionDecl(isConstexpr())
3073 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003074ifStmt(isConstexpr())
3075 matches the if statement in baz.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003076</pre></td></tr>
3077
3078
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003079<tr><td>Matcher&lt;<a href="https://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 +00003080<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3081
3082Given:
3083 class A { ~A(); };
3084 class B { ~B() = default; };
3085functionDecl(isDefaulted())
3086 matches the declaration of ~B, but not ~A.
3087</pre></td></tr>
3088
3089
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003090<tr><td>Matcher&lt;<a href="https://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>
Dave Leebe398682017-11-14 14:17:26 +00003091<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003092
3093Example matches A, va, fa
3094 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00003095 class B; // Doesn't match, as it has no body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003096 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003097 extern int vb; // Doesn't match, as it doesn't define the variable.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003098 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00003099 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003100 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00003101 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00003102 @end
3103 @implementation X
3104 - (void)ma {}
3105 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003106
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003107Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
3108 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003109</pre></td></tr>
3110
3111
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003112<tr><td>Matcher&lt;<a href="https://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 +00003113<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3114
3115Given:
3116 void Func();
3117 void DeletedFunc() = delete;
3118functionDecl(isDeleted())
3119 matches the declaration of DeletedFunc, but not Func.
3120</pre></td></tr>
3121
3122
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003123<tr><td>Matcher&lt;<a href="https://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 +00003124<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3125static member variable template instantiations.
3126
3127Given
3128 template&lt;typename T&gt; void A(T t) { }
3129 template&lt;&gt; void A(int N) { }
3130functionDecl(isExplicitTemplateSpecialization())
3131 matches the specialization A&lt;int&gt;().
3132
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003133Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003134</pre></td></tr>
3135
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003136
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003137<tr><td>Matcher&lt;<a href="https://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 +00003138<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003139
3140Given:
3141 extern "C" void f() {}
3142 extern "C" { void g() {} }
3143 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003144 extern "C" int x = 1;
3145 extern "C" int y = 2;
3146 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003147functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003148 matches the declaration of f and g, but not the declaration of h.
3149varDecl(isExternC())
3150 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003151</pre></td></tr>
3152
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003153
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003154<tr><td>Matcher&lt;<a href="https://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 +00003155<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3156the inline keyword.
3157
3158Given
3159 inline void f();
3160 void g();
3161 namespace n {
3162 inline namespace m {}
3163 }
3164functionDecl(isInline()) will match ::f().
3165namespaceDecl(isInline()) will match n::m.
3166</pre></td></tr>
3167
3168
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003169<tr><td>Matcher&lt;<a href="https://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>
George Karpenkovfc3d72e2018-07-23 22:29:35 +00003170<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3171into an executable program.
3172</pre></td></tr>
3173
3174
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003175<tr><td>Matcher&lt;<a href="https://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>
Roman Lebedev6c3871b2018-01-17 19:40:55 +00003176<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3177
3178Given
3179 void nope();
3180 [[noreturn]] void a();
3181 __attribute__((noreturn)) void b();
3182 struct c { [[noreturn]] c(); };
3183functionDecl(isNoReturn())
3184 matches all of those except
3185 void nope();
3186</pre></td></tr>
3187
3188
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003189<tr><td>Matcher&lt;<a href="https://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 +00003190<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3191
3192Given:
3193 void f();
3194 void g() noexcept;
3195 void h() throw();
3196 void i() throw(int);
3197 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00003198functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3199 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00003200</pre></td></tr>
3201
3202
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003203<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman94f3e742018-12-11 19:30:49 +00003204<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
Haojian Wu398a8ea2016-09-27 07:53:20 +00003205class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003206
3207Given:
3208 static void f() {}
3209 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003210 extern int j;
3211 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003212functionDecl(isStaticStorageClass())
3213 matches the function declaration f.
3214varDecl(isStaticStorageClass())
3215 matches the variable declaration i.
3216</pre></td></tr>
3217
3218
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003219<tr><td>Matcher&lt;<a href="https://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 +00003220<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3221member variable template instantiations.
3222
3223Given
3224 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3225or
3226 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00003227or
3228 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003229cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3230 matches the template instantiation of X&lt;A&gt;.
3231
3232But given
3233 template &lt;typename T&gt; class X {}; class A {};
3234 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3235cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3236 does not match, as X&lt;A&gt; is an explicit template specialization.
3237
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003238Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003239</pre></td></tr>
3240
3241
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003242<tr><td>Matcher&lt;<a href="https://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 +00003243<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3244
3245Example matches f, but not g or h. The function i will not match, even when
3246compiled in C mode.
3247 void f(...);
3248 void g(int);
3249 template &lt;typename... Ts&gt; void h(Ts...);
3250 void i();
3251</pre></td></tr>
3252
3253
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003254<tr><td>Matcher&lt;<a href="https://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 +00003255<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3256specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003257
3258Given
3259 void f(int i) {}
3260 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003261 void h(int i, int j);
3262 void j(int i);
3263 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003264functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003265 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003266functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003267 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003268functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003269 matches k
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003270</pre></td></tr>
3271
3272
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003273<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman230ad972016-06-07 17:34:45 +00003274<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3275
3276Given:
3277 void f();
3278 void g() noexcept;
3279 void h() noexcept(true);
3280 void i() noexcept(false);
3281 void j() throw();
3282 void k() throw(int);
3283 void l() throw(...);
3284functionDecl(hasDynamicExceptionSpec()) and
3285 functionProtoType(hasDynamicExceptionSpec())
3286 match the declarations of j, k, and l, but not f, g, h, or i.
3287</pre></td></tr>
3288
3289
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003290<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman230ad972016-06-07 17:34:45 +00003291<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3292
3293Given:
3294 void f();
3295 void g() noexcept;
3296 void h() throw();
3297 void i() throw(int);
3298 void j() noexcept(false);
3299functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3300 match the declarations of g, and h, but not f, i or j.
3301</pre></td></tr>
3302
3303
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003304<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003305<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3306specific parameter count.
3307
3308Given
3309 void f(int i) {}
3310 void g(int i, int j) {}
3311 void h(int i, int j);
3312 void j(int i);
3313 void k(int x, int y, int z, ...);
3314functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003315 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003316functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003317 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003318functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003319 matches k
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003320</pre></td></tr>
3321
3322
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003323<tr><td>Matcher&lt;<a href="https://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>
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003324<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3325 and if constexpr.
3326
3327Given:
3328 constexpr int foo = 42;
3329 constexpr int bar();
3330 void baz() { if constexpr(1 &gt; 0) {} }
3331varDecl(isConstexpr())
3332 matches the declaration of foo.
3333functionDecl(isConstexpr())
3334 matches the declaration of bar.
3335ifStmt(isConstexpr())
3336 matches the if statement in baz.
3337</pre></td></tr>
3338
3339
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003340<tr><td>Matcher&lt;<a href="https://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>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003341<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3342
3343
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003344<tr><td>Matcher&lt;<a href="https://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 +00003345<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 +00003346
Peter Wua9244b52017-06-08 22:00:58 +00003347Given
3348 f('false, 3.14, 42);
3349characterLiteral(equals(0))
3350 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3351 match false
3352floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3353 match 3.14
3354integerLiteral(equals(42))
3355 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003356
Clement Courbet43bdba42017-07-11 15:45:22 +00003357Note that you cannot directly match a negative numeric literal because the
3358minus sign is not part of the literal: It is a unary operator whose operand
3359is the positive numeric literal. Instead, you must use a unaryOperator()
3360matcher to match the minus sign:
3361
3362unaryOperator(hasOperatorName("-"),
3363 hasUnaryOperand(integerLiteral(equals(13))))
3364
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003365Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3366 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003367</pre></td></tr>
3368
3369
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003370<tr><td>Matcher&lt;<a href="https://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>
Peter Wua9244b52017-06-08 22:00:58 +00003371<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3372
3373
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003374<tr><td>Matcher&lt;<a href="https://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>
Peter Wua9244b52017-06-08 22:00:58 +00003375<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3376
3377
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003378<tr><td>Matcher&lt;<a href="https://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 +00003379<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3380to '.'.
3381
3382Member calls on the implicit this pointer match as called with '-&gt;'.
3383
3384Given
3385 class Y {
3386 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
Shuai Wange0248ae2018-09-17 18:48:43 +00003387 template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003388 int a;
3389 static int b;
3390 };
Shuai Wange0248ae2018-09-17 18:48:43 +00003391 template &lt;class T&gt;
3392 class Z {
3393 void x() { this-&gt;m; }
3394 };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003395memberExpr(isArrow())
3396 matches this-&gt;x, x, y.x, a, this-&gt;b
Shuai Wange0248ae2018-09-17 18:48:43 +00003397cxxDependentScopeMemberExpr(isArrow())
3398 matches this-&gt;m
3399unresolvedMemberExpr(isArrow())
3400 matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003401</pre></td></tr>
3402
3403
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003404<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballmana086b9f2016-08-17 13:10:42 +00003405<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3406
3407Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3408void f() {
3409 int x;
3410 static int y;
3411}
3412int z;
3413
3414Example matches f() because it has external formal linkage despite being
3415unique to the translation unit as though it has internal likage
3416(matcher = functionDecl(hasExternalFormalLinkage()))
3417
3418namespace {
3419void f() {}
3420}
3421</pre></td></tr>
3422
3423
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003424<tr><td>Matcher&lt;<a href="https://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 +00003425<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3426
3427Supports specifying enclosing namespaces or classes by prefixing the name
3428with '&lt;enclosing&gt;::'.
3429Does not match typedefs of an underlying type with the given name.
3430
3431Example matches X (Name == "X")
3432 class X;
3433
3434Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3435 namespace a { namespace b { class X; } }
3436</pre></td></tr>
3437
3438
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003439<tr><td>Matcher&lt;<a href="https://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 +00003440<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3441a substring matched by the given RegExp.
3442
3443Supports specifying enclosing namespaces or classes by
3444prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3445of an underlying type with the given name.
3446
3447Example matches X (regexp == "::X")
3448 class X;
3449
3450Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3451 namespace foo { namespace bar { class X; } }
3452</pre></td></tr>
3453
3454
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003455<tr><td>Matcher&lt;<a href="https://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 +00003456<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3457
3458Given
3459 namespace n {
Aaron Ballman94f3e742018-12-11 19:30:49 +00003460 namespace {} // #1
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003461 }
3462namespaceDecl(isAnonymous()) will match #1 but not ::n.
3463</pre></td></tr>
3464
3465
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003466<tr><td>Matcher&lt;<a href="https://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 +00003467<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3468the inline keyword.
3469
3470Given
3471 inline void f();
3472 void g();
3473 namespace n {
3474 inline namespace m {}
3475 }
3476functionDecl(isInline()) will match ::f().
3477namespaceDecl(isInline()) will match n::m.
3478</pre></td></tr>
3479
3480
Roman Lebedev33ef20e2019-03-21 15:33:24 +00003481<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
3482<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3483
3484Given
3485
3486 #pragma omp parallel
3487 #pragma omp parallel default(none)
3488 #pragma omp parallel default(shared)
3489
3490``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3491</pre></td></tr>
3492
3493
3494<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
3495<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3496
3497Given
3498
3499 #pragma omp parallel
3500 #pragma omp parallel default(none)
3501 #pragma omp parallel default(shared)
3502
3503``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3504</pre></td></tr>
3505
3506
3507<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
3508<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3509clause kind.
3510
3511Given
3512
3513 #pragma omp parallel
3514 #pragma omp parallel for
3515 #pragma omp for
3516
3517`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3518``omp parallel`` and ``omp parallel for``.
3519
3520If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3521should be passed as a quoted string. e.g.,
3522``isAllowedToContainClauseKind("OMPC_default").``
3523</pre></td></tr>
3524
3525
Roman Lebedevc8161952019-03-21 15:33:35 +00003526<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
3527<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3528i.e., directives that can't have a structured block.
3529
3530Given
3531
3532 #pragma omp parallel
3533 {}
3534 #pragma omp taskyield
3535
3536``ompExecutableDirective(isStandaloneDirective()))`` matches
3537``omp taskyield``.
3538</pre></td></tr>
3539
3540
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003541<tr><td>Matcher&lt;<a href="https://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 +00003542<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3543a specific number of arguments (including absent default arguments).
3544
3545Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3546 void f(int x, int y);
3547 f(0, 0);
3548</pre></td></tr>
3549
3550
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003551<tr><td>Matcher&lt;<a href="https://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 +00003552<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3553
3554objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3555message expression in
3556
3557 UIWebView *webView = ...;
3558 CGRect bodyFrame = webView.frame;
3559 bodyFrame.size.height = self.bodyContentHeight;
3560 webView.frame = bodyFrame;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003561 // ^---- matches here
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003562</pre></td></tr>
3563
3564
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003565<tr><td>Matcher&lt;<a href="https://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 +00003566<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3567
3568Matches only when the selector of the objCMessageExpr is NULL. This may
3569represent an error condition in the tree!
3570</pre></td></tr>
3571
3572
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003573<tr><td>Matcher&lt;<a href="https://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 +00003574<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3575
3576 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3577 matches the outer message expr in the code below, but NOT the message
3578 invocation for self.bodyView.
3579 [self.bodyView loadHTMLString:html baseURL:NULL];
3580</pre></td></tr>
3581
3582
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003583<tr><td>Matcher&lt;<a href="https://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 +00003584<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3585
3586 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3587 matches self.bodyView in the code below, but NOT the outer message
3588 invocation of "loadHTMLString:baseURL:".
3589 [self.bodyView loadHTMLString:html baseURL:NULL];
3590</pre></td></tr>
3591
3592
Ben Hamiltona282bde2019-04-22 17:54:11 +00003593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
3594<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3595
3596Example
3597matcher = objcMessageExpr(isClassMessage())
3598matches
3599 [NSString stringWithFormat:@"format"];
3600but not
3601 NSString *x = @"hello";
3602 [x containsString:@"h"];
3603</pre></td></tr>
3604
3605
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003606<tr><td>Matcher&lt;<a href="https://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>
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003607<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3608
3609Example
Ben Hamiltona282bde2019-04-22 17:54:11 +00003610matcher = objcMessageExpr(isInstanceMessage())
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003611matches
3612 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00003613 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003614but not
George Karpenkovdaac52c2018-07-23 22:29:10 +00003615 [NSString stringWithFormat:@"format"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003616</pre></td></tr>
3617
3618
Ben Hamiltona282bde2019-04-22 17:54:11 +00003619<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
3620<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
3621
3622Example
3623matcher = objcMethodDecl(isClassMethod())
3624matches
3625 @interface I + (void)foo; @end
3626but not
3627 @interface I - (void)bar; @end
3628</pre></td></tr>
3629
3630
3631<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMethod</a></td><td></td></tr>
3632<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
3633
3634Example
3635matcher = objcMethodDecl(isInstanceMethod())
3636matches
3637 @interface I - (void)bar; @end
3638but not
3639 @interface I + (void)foo; @end
3640</pre></td></tr>
3641
3642
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003643<tr><td>Matcher&lt;<a href="https://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 +00003644<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3645a substring matched by the given RegExp.
3646 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3647 invocation for self.bodyView.
3648 [self.bodyView loadHTMLString:html baseURL:NULL];
3649</pre></td></tr>
3650
3651
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003652<tr><td>Matcher&lt;<a href="https://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 +00003653<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3654
3655 matcher = objCMessageExpr(numSelectorArgs(0));
3656 matches self.bodyView in the code below
3657
3658 matcher = objCMessageExpr(numSelectorArgs(2));
3659 matches the invocation of "loadHTMLString:baseURL:" but not that
3660 of self.bodyView
3661 [self.bodyView loadHTMLString:html baseURL:NULL];
3662</pre></td></tr>
3663
3664
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003665<tr><td>Matcher&lt;<a href="https://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>
Dave Leebe398682017-11-14 14:17:26 +00003666<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3667
3668Example matches A, va, fa
3669 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00003670 class B; // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003671 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003672 extern int vb; // Doesn't match, as it doesn't define the variable.
Dave Leebe398682017-11-14 14:17:26 +00003673 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00003674 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003675 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00003676 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00003677 @end
3678 @implementation X
3679 - (void)ma {}
3680 @end
3681
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003682Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
3683 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Dave Leebe398682017-11-14 14:17:26 +00003684</pre></td></tr>
3685
3686
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003687<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman5f8980a2017-11-21 19:22:34 +00003688<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3689
3690Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3691void x(int val) {}
3692void y(int val = 0) {}
3693</pre></td></tr>
3694
3695
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003696<tr><td>Matcher&lt;<a href="https://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 +00003697<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3698
3699Given
3700 class Y { public: void x(); };
3701 void z() { Y* y; y-&gt;x(); }
3702cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3703 matches y-&gt;x()
3704</pre></td></tr>
3705
3706
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003707<tr><td>Matcher&lt;<a href="https://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 +00003708<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3709
3710Matches a node if it equals the node previously bound to ID.
3711
3712Given
3713 class X { int a; int b; };
3714cxxRecordDecl(
3715 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3716 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3717 matches the class X, as a and b have the same type.
3718
3719Note that when multiple matches are involved via forEach* matchers,
3720equalsBoundNodes acts as a filter.
3721For example:
3722compoundStmt(
3723 forEachDescendant(varDecl().bind("d")),
3724 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3725will trigger a match for each combination of variable declaration
3726and reference to that variable declaration within a compound statement.
3727</pre></td></tr>
3728
3729
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003730<tr><td>Matcher&lt;<a href="https://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 +00003731<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3732the node, not hidden within a typedef.
3733
3734Given
3735 typedef const int const_int;
3736 const_int i;
3737 int *const j;
3738 int *volatile k;
3739 int m;
3740varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3741i is const-qualified but the qualifier is not local.
3742</pre></td></tr>
3743
3744
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003745<tr><td>Matcher&lt;<a href="https://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 +00003746<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3747
3748Given
3749 void a(char);
3750 void b(wchar_t);
3751 void c(double);
3752functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3753matches "a(char)", "b(wchar_t)", but not "c(double)".
3754</pre></td></tr>
3755
3756
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003757<tr><td>Matcher&lt;<a href="https://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 +00003758<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3759the Objective-C object pointer type, which is different despite being
3760syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003761
3762Given
3763 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003764
3765 @interface Foo
3766 @end
3767 Foo *f;
3768
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003769 int j;
3770varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003771 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003772</pre></td></tr>
3773
3774
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003775<tr><td>Matcher&lt;<a href="https://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 +00003776<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3777include "top-level" const.
3778
3779Given
3780 void a(int);
3781 void b(int const);
3782 void c(const int);
3783 void d(const int*);
3784 void e(int const) {};
3785functionDecl(hasAnyParameter(hasType(isConstQualified())))
3786 matches "void b(int const)", "void c(const int)" and
3787 "void e(int const) {}". It does not match d as there
3788 is no top-level const on the parameter type "const int *".
3789</pre></td></tr>
3790
3791
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003792<tr><td>Matcher&lt;<a href="https://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 +00003793<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3794
3795Given
3796 void a(int);
3797 void b(long);
3798 void c(double);
3799functionDecl(hasAnyParameter(hasType(isInteger())))
3800matches "a(int)", "b(long)", but not "c(double)".
3801</pre></td></tr>
3802
3803
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003804<tr><td>Matcher&lt;<a href="https://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>
Clement Courbet42517592016-07-12 06:36:00 +00003805<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3806
3807Given
3808 void a(int);
3809 void b(unsigned long);
3810 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003811functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003812matches "a(int)", but not "b(unsigned long)" and "c(double)".
3813</pre></td></tr>
3814
3815
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003816<tr><td>Matcher&lt;<a href="https://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>
Clement Courbet42517592016-07-12 06:36:00 +00003817<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3818
3819Given
3820 void a(int);
3821 void b(unsigned long);
3822 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003823functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003824matches "b(unsigned long)", but not "a(int)" and "c(double)".
3825</pre></td></tr>
3826
3827
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003828<tr><td>Matcher&lt;<a href="https://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 +00003829<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3830include "top-level" volatile.
3831
3832Given
3833 void a(int);
3834 void b(int volatile);
3835 void c(volatile int);
3836 void d(volatile int*);
3837 void e(int volatile) {};
3838functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3839 matches "void b(int volatile)", "void c(volatile int)" and
3840 "void e(int volatile) {}". It does not match d as there
3841 is no top-level volatile on the parameter type "volatile int *".
3842</pre></td></tr>
3843
3844
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003845<tr><td>Matcher&lt;<a href="https://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 +00003846<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3847
3848Example matches C, but not S or U.
3849 struct S {};
3850 class C {};
3851 union U {};
3852</pre></td></tr>
3853
3854
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003855<tr><td>Matcher&lt;<a href="https://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 +00003856<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3857
3858Example matches S, but not C or U.
3859 struct S {};
3860 class C {};
3861 union U {};
3862</pre></td></tr>
3863
3864
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003865<tr><td>Matcher&lt;<a href="https://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 +00003866<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3867
3868Example matches U, but not C or S.
3869 struct S {};
3870 class C {};
3871 union U {};
3872</pre></td></tr>
3873
3874
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003875<tr><td>Matcher&lt;<a href="https://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 +00003876<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3877
3878Matches a node if it equals the node previously bound to ID.
3879
3880Given
3881 class X { int a; int b; };
3882cxxRecordDecl(
3883 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3884 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3885 matches the class X, as a and b have the same type.
3886
3887Note that when multiple matches are involved via forEach* matchers,
3888equalsBoundNodes acts as a filter.
3889For example:
3890compoundStmt(
3891 forEachDescendant(varDecl().bind("d")),
3892 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3893will trigger a match for each combination of variable declaration
3894and reference to that variable declaration within a compound statement.
3895</pre></td></tr>
3896
3897
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003898<tr><td>Matcher&lt;<a href="https://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>
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00003899<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3900
3901Stmt has pointer identity in the AST.
3902</pre></td></tr>
3903
3904
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003905<tr><td>Matcher&lt;<a href="https://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 +00003906<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3907partially matching a given regex.
3908
3909Example matches Y but not X
3910 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3911 #include "ASTMatcher.h"
3912 class X {};
3913ASTMatcher.h:
3914 class Y {};
3915
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003916Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003917</pre></td></tr>
3918
3919
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003920<tr><td>Matcher&lt;<a href="https://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 +00003921<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3922
3923Example matches X but not Y
3924 (matcher = cxxRecordDecl(isExpansionInMainFile())
3925 #include &lt;Y.h&gt;
3926 class X {};
3927Y.h:
3928 class Y {};
3929
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003930Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003931</pre></td></tr>
3932
3933
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003934<tr><td>Matcher&lt;<a href="https://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 +00003935<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3936
3937Example matches Y but not X
3938 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3939 #include &lt;SystemHeader.h&gt;
3940 class X {};
3941SystemHeader.h:
3942 class Y {};
3943
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003944Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003945</pre></td></tr>
3946
3947
Roman Lebedevc8161952019-03-21 15:33:35 +00003948<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isOMPStructuredBlock0')"><a name="isOMPStructuredBlock0Anchor">isOMPStructuredBlock</a></td><td></td></tr>
3949<tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block
3950of an OpenMP executable directive.
3951
3952Given
3953
3954 #pragma omp parallel
3955 {}
3956
3957``stmt(isOMPStructuredBlock()))`` matches ``{}``.
3958</pre></td></tr>
3959
3960
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003961<tr><td>Matcher&lt;<a href="https://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>
Etienne Bergeron3588be72016-05-12 04:20:04 +00003962<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3963
3964Given
3965 int a[42];
3966 int b[2 * 21];
3967 int c[41], d[43];
3968 char *s = "abcd";
3969 wchar_t *ws = L"abcd";
3970 char *w = "a";
3971constantArrayType(hasSize(42))
3972 matches "int a[42]" and "int b[2 * 21]"
3973stringLiteral(hasSize(4))
3974 matches "abcd", L"abcd"
3975</pre></td></tr>
3976
3977
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003978<tr><td>Matcher&lt;<a href="https://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 +00003979<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3980
3981Example matches A, va, fa
3982 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00003983 class B; // Doesn't match, as it has no body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003984 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003985 extern int vb; // Doesn't match, as it doesn't define the variable.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003986 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00003987 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003988 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00003989 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00003990 @end
3991 @implementation X
3992 - (void)ma {}
3993 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003994
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003995Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
3996 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003997</pre></td></tr>
3998
3999
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004000<tr><td>Matcher&lt;<a href="https://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 +00004001<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4002
4003Note that 'Value' is a string as the template argument's value is
4004an arbitrary precision integer. 'Value' must be euqal to the canonical
4005representation of that integral value in base 10.
4006
4007Given
Fangrui Song55942ab2018-01-22 22:34:15 +00004008 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004009 C&lt;42&gt; c;
4010classTemplateSpecializationDecl(
4011 hasAnyTemplateArgument(equalsIntegralValue("42")))
4012 matches the implicit instantiation of C in C&lt;42&gt;.
4013</pre></td></tr>
4014
4015
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004016<tr><td>Matcher&lt;<a href="https://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 +00004017<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4018
4019Given
Fangrui Song55942ab2018-01-22 22:34:15 +00004020 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004021 C&lt;42&gt; c;
4022classTemplateSpecializationDecl(
4023 hasAnyTemplateArgument(isIntegral()))
4024 matches the implicit instantiation of C in C&lt;42&gt;
4025 with isIntegral() matching 42.
4026</pre></td></tr>
4027
4028
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004029<tr><td>Matcher&lt;<a href="https://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 +00004030<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4031
4032Given
4033 template&lt;typename T&gt; struct C {};
4034 C&lt;int&gt; c;
4035classTemplateSpecializationDecl(templateArgumentCountIs(1))
4036 matches C&lt;int&gt;.
4037</pre></td></tr>
4038
4039
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004040<tr><td>Matcher&lt;<a href="https://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 +00004041<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4042partially matching a given regex.
4043
4044Example matches Y but not X
4045 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4046 #include "ASTMatcher.h"
4047 class X {};
4048ASTMatcher.h:
4049 class Y {};
4050
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004051Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004052</pre></td></tr>
4053
4054
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004055<tr><td>Matcher&lt;<a href="https://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 +00004056<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4057
4058Example matches X but not Y
4059 (matcher = cxxRecordDecl(isExpansionInMainFile())
4060 #include &lt;Y.h&gt;
4061 class X {};
4062Y.h:
4063 class Y {};
4064
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004065Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004066</pre></td></tr>
4067
4068
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004069<tr><td>Matcher&lt;<a href="https://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 +00004070<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4071
4072Example matches Y but not X
4073 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4074 #include &lt;SystemHeader.h&gt;
4075 class X {};
4076SystemHeader.h:
4077 class Y {};
4078
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004079Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004080</pre></td></tr>
4081
4082
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004083<tr><td>Matcher&lt;<a href="https://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 +00004084<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4085
4086Given
4087 struct S { bool func(); };
4088functionDecl(returns(booleanType()))
4089 matches "bool func();"
4090</pre></td></tr>
4091
4092
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004093<tr><td>Matcher&lt;<a href="https://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 +00004094<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4095
4096Matches a node if it equals the node previously bound to ID.
4097
4098Given
4099 class X { int a; int b; };
4100cxxRecordDecl(
4101 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4102 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4103 matches the class X, as a and b have the same type.
4104
4105Note that when multiple matches are involved via forEach* matchers,
4106equalsBoundNodes acts as a filter.
4107For example:
4108compoundStmt(
4109 forEachDescendant(varDecl().bind("d")),
4110 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4111will trigger a match for each combination of variable declaration
4112and reference to that variable declaration within a compound statement.
4113</pre></td></tr>
4114
4115
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004116<tr><td>Matcher&lt;<a href="https://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>
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00004117<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4118
4119Type has pointer identity in the AST.
4120</pre></td></tr>
4121
4122
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004123<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00004124<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4125
4126Given
4127 int i;
4128 float f;
4129realFloatingPointType()
4130 matches "float f" but not "int i"
4131</pre></td></tr>
4132
4133
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004134<tr><td>Matcher&lt;<a href="https://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 +00004135<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4136
4137Given
4138 struct S { void func(); };
4139functionDecl(returns(voidType()))
4140 matches "void func();"
4141</pre></td></tr>
4142
4143
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004144<tr><td>Matcher&lt;<a href="https://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 +00004145<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4146
4147Given
4148 int x;
4149 int s = sizeof(x) + alignof(x)
4150unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4151 matches sizeof(x)
Roman Lebedev408eb442019-03-21 15:33:43 +00004152
4153If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4154should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004155</pre></td></tr>
4156
4157
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004158<tr><td>Matcher&lt;<a href="https://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 +00004159<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4160unary).
4161
4162Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4163 !(a || b)
4164</pre></td></tr>
4165
4166
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004167<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
Shuai Wange0248ae2018-09-17 18:48:43 +00004168<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4169to '.'.
4170
4171Member calls on the implicit this pointer match as called with '-&gt;'.
4172
4173Given
4174 class Y {
4175 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4176 template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4177 int a;
4178 static int b;
4179 };
4180 template &lt;class T&gt;
4181 class Z {
4182 void x() { this-&gt;m; }
4183 };
4184memberExpr(isArrow())
4185 matches this-&gt;x, x, y.x, a, this-&gt;b
4186cxxDependentScopeMemberExpr(isArrow())
4187 matches this-&gt;m
4188unresolvedMemberExpr(isArrow())
4189 matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4190</pre></td></tr>
4191
4192
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004193<tr><td>Matcher&lt;<a href="https://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 +00004194<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4195
4196Example matches x, but not y, z, or a.
4197(matcher = varDecl(hasAutomaticStorageDuration())
4198void f() {
4199 int x;
4200 static int y;
4201 thread_local int z;
4202}
4203int a;
4204</pre></td></tr>
4205
4206
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004207<tr><td>Matcher&lt;<a href="https://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 +00004208<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4209
4210Example matches y and z (matcher = varDecl(hasGlobalStorage())
4211void f() {
4212 int x;
4213 static int y;
4214}
4215int z;
4216</pre></td></tr>
4217
4218
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004219<tr><td>Matcher&lt;<a href="https://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 +00004220<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4221non-static local variable.
4222
4223Example matches x (matcher = varDecl(hasLocalStorage())
4224void f() {
4225 int x;
4226 static int y;
4227}
4228int z;
4229</pre></td></tr>
4230
4231
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004232<tr><td>Matcher&lt;<a href="https://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 +00004233<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 +00004234It includes the variable declared at namespace scope and those declared
4235with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004236
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004237void f() {
4238 int x;
4239 static int y;
4240 thread_local int z;
4241}
4242int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00004243static int b;
4244extern int c;
4245varDecl(hasStaticStorageDuration())
4246 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004247</pre></td></tr>
4248
4249
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004250<tr><td>Matcher&lt;<a href="https://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 +00004251<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4252
4253Example matches z, but not x, z, or a.
4254(matcher = varDecl(hasThreadStorageDuration())
4255void f() {
4256 int x;
4257 static int y;
4258 thread_local int z;
4259}
4260int a;
4261</pre></td></tr>
4262
4263
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004264<tr><td>Matcher&lt;<a href="https://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 +00004265<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4266 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004267
4268Given:
4269 constexpr int foo = 42;
4270 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00004271 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004272varDecl(isConstexpr())
4273 matches the declaration of foo.
4274functionDecl(isConstexpr())
4275 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00004276ifStmt(isConstexpr())
4277 matches the if statement in baz.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004278</pre></td></tr>
4279
4280
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004281<tr><td>Matcher&lt;<a href="https://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 +00004282<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4283
4284Example matches A, va, fa
4285 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00004286 class B; // Doesn't match, as it has no body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004287 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00004288 extern int vb; // Doesn't match, as it doesn't define the variable.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004289 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00004290 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00004291 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00004292 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00004293 @end
4294 @implementation X
4295 - (void)ma {}
4296 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004297
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004298Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4299 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004300</pre></td></tr>
4301
4302
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004303<tr><td>Matcher&lt;<a href="https://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 +00004304<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4305a C++ catch block, or an Objective-C statement.
4306
4307Example matches x (matcher = varDecl(isExceptionVariable())
4308void f(int y) {
4309 try {
4310 } catch (int x) {
4311 }
4312}
4313</pre></td></tr>
4314
4315
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004316<tr><td>Matcher&lt;<a href="https://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 +00004317<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4318static member variable template instantiations.
4319
4320Given
4321 template&lt;typename T&gt; void A(T t) { }
4322 template&lt;&gt; void A(int N) { }
4323functionDecl(isExplicitTemplateSpecialization())
4324 matches the specialization A&lt;int&gt;().
4325
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004326Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004327</pre></td></tr>
4328
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004329
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004330<tr><td>Matcher&lt;<a href="https://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 +00004331<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00004332
4333Given:
4334 extern "C" void f() {}
4335 extern "C" { void g() {} }
4336 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00004337 extern "C" int x = 1;
4338 extern "C" int y = 2;
4339 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00004340functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00004341 matches the declaration of f and g, but not the declaration of h.
4342varDecl(isExternC())
4343 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00004344</pre></td></tr>
4345
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004346
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004347<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
Aaron Ballman31f48c52018-10-29 13:47:56 +00004348<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4349
4350Example matches y (matcher = varDecl(isStaticLocal()))
4351void f() {
4352 int x;
4353 static int y;
4354}
4355static int z;
4356</pre></td></tr>
4357
4358
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004359<tr><td>Matcher&lt;<a href="https://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>
Aaron Ballman94f3e742018-12-11 19:30:49 +00004360<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
Haojian Wu398a8ea2016-09-27 07:53:20 +00004361class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00004362
4363Given:
4364 static void f() {}
4365 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00004366 extern int j;
4367 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00004368functionDecl(isStaticStorageClass())
4369 matches the function declaration f.
4370varDecl(isStaticStorageClass())
4371 matches the variable declaration i.
4372</pre></td></tr>
4373
4374
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004375<tr><td>Matcher&lt;<a href="https://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 +00004376<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4377member variable template instantiations.
4378
4379Given
4380 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4381or
4382 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00004383or
4384 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004385cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4386 matches the template instantiation of X&lt;A&gt;.
4387
4388But given
4389 template &lt;typename T&gt; class X {}; class A {};
4390 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4391cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4392 does not match, as X&lt;A&gt; is an explicit template specialization.
4393
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004394Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004395</pre></td></tr>
4396
4397
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004398<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://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 +00004399<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4400template instantiations.
4401
4402Given
4403 template&lt;typename T&gt; void A(T t) { T i; }
4404 A(0);
4405 A(0U);
4406functionDecl(isInstantiated())
4407 matches 'A(int) {...};' and 'A(unsigned) {...}'.
4408</pre></td></tr>
4409
4410
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004411<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://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>
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00004412<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4413GNU's __null, C++11's nullptr, or C's NULL macro.
4414
4415Given:
4416 void *v1 = NULL;
4417 void *v2 = nullptr;
Aaron Ballman94f3e742018-12-11 19:30:49 +00004418 void *v3 = __null; // GNU extension
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00004419 char *cp = (char *)0;
4420 int *ip = 0;
4421 int i = 0;
4422expr(nullPointerConstant())
4423 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4424 initializer for i.
4425</pre></td></tr>
4426
4427
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004428<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://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>
Samuel Benzaquena4076ea2016-05-04 20:45:00 +00004429<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4430
4431This matcher is only provided as a performance optimization of hasName.
4432 hasAnyName(a, b, c)
4433 is equivalent to, but faster than
4434 anyOf(hasName(a), hasName(b), hasName(c))
4435</pre></td></tr>
4436
4437
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004438<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://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>
George Karpenkov88a16a02018-03-29 00:51:12 +00004439<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4440Selector.getAsString()
4441
4442 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4443 matches both of the expressions below:
4444 [myObj methodA:argA];
4445 [myObj methodB:argB];
4446</pre></td></tr>
4447
4448
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004449<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://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 +00004450<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4451
4452Given
4453 int j;
4454 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4455 A(0);
4456 A(0U);
4457declStmt(isInTemplateInstantiation())
4458 matches 'int i;' and 'unsigned i'.
4459unless(stmt(isInTemplateInstantiation()))
4460 will NOT match j += 42; as it's shared between the template definition and
4461 instantiation.
4462</pre></td></tr>
4463
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00004464<!--END_NARROWING_MATCHERS -->
4465</table>
4466
4467<!-- ======================================================================= -->
4468<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4469<!-- ======================================================================= -->
4470
4471<p>Traversal matchers specify the relationship to other nodes that are
4472reachable from the current node.</p>
4473
4474<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4475forEachDescendant) which work on all nodes and allow users to write more generic
4476match expressions.</p>
4477
4478<table>
4479<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004480<!-- START_TRAVERSAL_MATCHERS -->
4481
4482<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>
4483<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4484
4485Unlike anyOf, eachOf will generate a match result for each
4486matching submatcher.
4487
4488For example, in:
4489 class A { int a; int b; };
4490The matcher:
4491 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4492 has(fieldDecl(hasName("b")).bind("v"))))
4493will generate two results binding "v", the first of which binds
4494the field declaration of a, the second the field declaration of
4495b.
4496
4497Usable as: Any Matcher
4498</pre></td></tr>
4499
4500
4501<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4502<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4503provided matcher.
4504
Fangrui Song55942ab2018-01-22 22:34:15 +00004505Example matches X, A, A::X, B, B::C, B::C::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004506 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
Fangrui Song55942ab2018-01-22 22:34:15 +00004507 class X {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00004508 class A { class X {}; }; // Matches A, because A::X is a class of name
4509 // X inside A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004510 class B { class C { class X {}; }; };
4511
4512DescendantT must be an AST base type.
4513
4514As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4515each result that matches instead of only on the first one.
4516
4517Note: Recursively combined ForEachDescendant can cause many matches:
4518 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4519 forEachDescendant(cxxRecordDecl())
4520 )))
4521will match 10 times (plus injected class name matches) on:
4522 class A { class B { class C { class D { class E {}; }; }; }; };
4523
4524Usable as: Any Matcher
4525</pre></td></tr>
4526
4527
4528<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4529<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4530provided matcher.
4531
Fangrui Song55942ab2018-01-22 22:34:15 +00004532Example matches X, Y, Y::X, Z::Y, Z::Y::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004533 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
Fangrui Song55942ab2018-01-22 22:34:15 +00004534 class X {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00004535 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
4536 // inside Y.
4537 class Z { class Y { class X {}; }; }; // Does not match Z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004538
4539ChildT must be an AST base type.
4540
4541As opposed to 'has', 'forEach' will cause a match for each result that
4542matches instead of only on the first one.
4543
4544Usable as: Any Matcher
4545</pre></td></tr>
4546
4547
4548<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4549<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4550matcher.
4551
4552Given
4553void f() { if (true) { int x = 42; } }
4554void g() { for (;;) { int x = 43; } }
4555expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4556
4557Usable as: Any Matcher
4558</pre></td></tr>
4559
4560
4561<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4562<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4563provided matcher.
4564
4565Example matches X, Y, Z
4566 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
Aaron Ballman94f3e742018-12-11 19:30:49 +00004567 class X {}; // Matches X, because X::X is a class of name X inside X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004568 class Y { class X {}; };
4569 class Z { class Y { class X {}; }; };
4570
4571DescendantT must be an AST base type.
4572
4573Usable as: Any Matcher
4574</pre></td></tr>
4575
4576
4577<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4578<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4579provided matcher.
4580
4581Example matches X, Y
4582 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
Aaron Ballman94f3e742018-12-11 19:30:49 +00004583 class X {}; // Matches X, because X::X is a class of name X inside X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004584 class Y { class X {}; };
Aaron Ballman94f3e742018-12-11 19:30:49 +00004585 class Z { class Y { class X {}; }; }; // Does not match Z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004586
4587ChildT must be an AST base type.
4588
4589Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00004590Note that has is direct matcher, so it also matches things like implicit
4591casts and paren casts. If you are matching with expr then you should
4592probably consider using ignoringParenImpCasts like:
4593has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004594</pre></td></tr>
4595
4596
4597<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4598<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4599matcher.
4600
4601Given
4602void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4603compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4604
4605Usable as: Any Matcher
4606</pre></td></tr>
4607
4608
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004609<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Etienne Bergeron5500f952016-05-30 15:25:25 +00004610<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4611switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004612
4613Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4614 if (true) {}
4615</pre></td></tr>
4616
4617
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004618<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004619<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4620(binary or ternary).
4621
4622Example matches b
4623 condition ? a : b
4624 condition ?: b
4625</pre></td></tr>
4626
4627
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004628<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004629<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4630
4631Example 1 (conditional ternary operator): matches a
4632 condition ? a : b
4633
4634Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4635 condition ?: b
4636</pre></td></tr>
4637
4638
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004639<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00004640<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 +00004641matches the given matcher.
4642
4643The associated declaration is:
4644- for type nodes, the declaration of the underlying type
4645- for CallExpr, the declaration of the callee
4646- for MemberExpr, the declaration of the referenced member
4647- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004648- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004649- for ObjCIvarExpr, the declaration of the ivar
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004650
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004651For type nodes, hasDeclaration will generally match the declaration of the
4652sugared type. Given
4653 class X {};
4654 typedef X Y;
4655 Y y;
4656in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4657typedefDecl. A common use case is to match the underlying, desugared type.
4658This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4659 varDecl(hasType(hasUnqualifiedDesugaredType(
4660 recordType(hasDeclaration(decl())))))
4661In this matcher, the decl will match the CXXRecordDecl of class X.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004662
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004663Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4664 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4665 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4666 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4667 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4668 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4669 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004670</pre></td></tr>
4671
4672
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004673<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004674<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4675
4676Given
4677 int i[5];
4678 void f() { i[1] = 42; }
4679arraySubscriptExpression(hasBase(implicitCastExpr(
4680 hasSourceExpression(declRefExpr()))))
4681 matches i[1] with the declRefExpr() matching i
4682</pre></td></tr>
4683
4684
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004685<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004686<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4687
4688Given
4689 int i[5];
4690 void f() { i[1] = 42; }
4691arraySubscriptExpression(hasIndex(integerLiteral()))
4692 matches i[1] with the integerLiteral() matching 1
4693</pre></td></tr>
4694
4695
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004696<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004697<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4698
4699Example matches a (matcher = binaryOperator(hasLHS()))
4700 a || b
4701</pre></td></tr>
4702
4703
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004704<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004705<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4706
4707Example matches b (matcher = binaryOperator(hasRHS()))
4708 a || b
4709</pre></td></tr>
4710
4711
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004712<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004713<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4714type.
4715
4716Given
4717 struct A {};
4718 A a[7];
4719 int b[7];
4720arrayType(hasElementType(builtinType()))
4721 matches "int b[7]"
4722
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004723Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004724</pre></td></tr>
4725
4726
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004727<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004728<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4729
4730Given
4731 _Atomic(int) i;
4732 _Atomic(float) f;
4733atomicType(hasValueType(isInteger()))
4734 matches "_Atomic(int) i"
4735
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004736Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004737</pre></td></tr>
4738
4739
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004740<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004741<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4742
4743Note: There is no TypeLoc for the deduced type and thus no
4744getDeducedLoc() matcher.
4745
4746Given
4747 auto a = 1;
4748 auto b = 2.0;
4749autoType(hasDeducedType(isInteger()))
4750 matches "auto a"
4751
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004752Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004753</pre></td></tr>
4754
4755
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004756<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004757<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4758binary operator matches.
4759</pre></td></tr>
4760
4761
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004762<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004763<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4764
4765Example matches a (matcher = binaryOperator(hasLHS()))
4766 a || b
4767</pre></td></tr>
4768
4769
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004770<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004771<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4772
4773Example matches b (matcher = binaryOperator(hasRHS()))
4774 a || b
4775</pre></td></tr>
4776
4777
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004778<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00004779<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
4780block.
4781
4782Does not match the 'this' parameter of a method.
4783
4784Given
4785 class X { void f(int x, int y, int z) {} };
4786cxxMethodDecl(hasAnyParameter(hasName("y")))
4787 matches f(int x, int y, int z) {}
4788with hasAnyParameter(...)
4789 matching int y
4790
4791For ObjectiveC, given
4792 @interface I - (void) f:(int) y; @end
4793
4794the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
4795matches the declaration of method f with hasParameter
4796matching y.
4797
4798For blocks, given
4799 b = ^(int y) { printf("%d", y) };
4800
4801the matcher blockDecl(hasAnyParameter(hasName("y")))
4802matches the declaration of the block b with hasParameter
4803matching y.
4804</pre></td></tr>
4805
4806
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004807<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00004808<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
4809declaration or a block.
4810
4811Given
4812 class X { void f(int x) {} };
4813cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4814 matches f(int x) {}
4815with hasParameter(...)
4816 matching int x
4817
4818For ObjectiveC, given
4819 @interface I - (void) f:(int) y; @end
4820
4821the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4822matches the declaration of method f with hasParameter
4823matching y.
4824</pre></td></tr>
4825
4826
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004827<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004828<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4829pointee matches a given matcher.
4830
4831Given
4832 int *a;
4833 int const *b;
4834 float const *f;
4835pointerType(pointee(isConstQualified(), isInteger()))
4836 matches "int const *b"
4837
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004838Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
4839 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004840</pre></td></tr>
4841
4842
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004843<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004844<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4845
4846Given
4847 void f(int i);
4848 int y;
4849 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004850callExpr(
4851 forEachArgumentWithParam(
4852 declRefExpr(to(varDecl(hasName("y")))),
4853 parmVarDecl(hasType(isInteger()))
4854))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004855 matches f(y);
4856with declRefExpr(...)
4857 matching int y
4858and parmVarDecl(...)
4859 matching int i
4860</pre></td></tr>
4861
4862
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004863<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004864<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 +00004865expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004866
4867Given
4868 void x(int, int, int) { int y; x(1, y, 42); }
4869callExpr(hasAnyArgument(declRefExpr()))
4870 matches x(1, y, 42)
4871with hasAnyArgument(...)
4872 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00004873
4874For ObjectiveC, given
4875 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00004876 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00004877objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4878 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004879</pre></td></tr>
4880
4881
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004882<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004883<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4884call expression.
4885
4886Example matches y in x(y)
4887 (matcher = callExpr(hasArgument(0, declRefExpr())))
4888 void x(int) { int y; x(y); }
4889</pre></td></tr>
4890
4891
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004892<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004893<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 +00004894matches the given matcher.
4895
4896The associated declaration is:
4897- for type nodes, the declaration of the underlying type
4898- for CallExpr, the declaration of the callee
4899- for MemberExpr, the declaration of the referenced member
4900- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004901- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004902- for ObjCIvarExpr, the declaration of the ivar
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
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004916Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4917 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4918 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4919 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4920 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4921 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4922 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004923</pre></td></tr>
4924
4925
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004926<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004927<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4928
4929Given
4930 class A { A() : i(42), j(42) {} int i; int j; };
4931cxxConstructorDecl(forEachConstructorInitializer(
4932 forField(decl().bind("x"))
4933))
4934 will trigger two matches, binding for 'i' and 'j' respectively.
4935</pre></td></tr>
4936
4937
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004938<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004939<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4940
4941Given
4942 struct Foo {
4943 Foo() : foo_(1) { }
4944 int foo_;
4945 };
4946cxxRecordDecl(has(cxxConstructorDecl(
4947 hasAnyConstructorInitializer(anything())
4948)))
4949 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4950</pre></td></tr>
4951
4952
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004953<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004954<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4955
4956Given
4957 struct Foo {
4958 Foo() : foo_(1) { }
4959 int foo_;
4960 };
4961cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4962 forField(hasName("foo_"))))))
4963 matches Foo
4964with forField matching foo_
4965</pre></td></tr>
4966
4967
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004968<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004969<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4970
4971Given
4972 struct Foo {
4973 Foo() : foo_(1) { }
4974 int foo_;
4975 };
4976cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4977 withInitializer(integerLiteral(equals(1)))))))
4978 matches Foo
4979with withInitializer matching (1)
4980</pre></td></tr>
4981
4982
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004983<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00004984<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
4985given matcher. Implicit object expressions are included; that is, it matches
4986use of implicit `this`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00004987
4988Given
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00004989 struct X {
4990 int m;
4991 int f(X x) { x.m; return m; }
4992 };
4993memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
4994 matches `x.m`, but not `m`; however,
4995memberExpr(hasObjectExpression(hasType(pointsTo(
4996 cxxRecordDecl(hasName("X"))))))
4997 matches `m` (aka. `this-&gt;m`), but not `x.m`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00004998</pre></td></tr>
4999
5000
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005001<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00005002<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
5003definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005004
5005Given
5006 for (;;) {}
5007hasBody(compoundStmt())
5008 matches 'for (;;) {}'
5009with compoundStmt()
5010 matching '{}'
5011</pre></td></tr>
5012
5013
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005014<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005015<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5016
5017Example:
5018 forStmt(hasLoopVariable(anything()))
5019matches 'int x' in
5020 for (int x : a) { }
5021</pre></td></tr>
5022
5023
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005024<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005025<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5026
5027Example:
5028 forStmt(hasRangeInit(anything()))
5029matches 'a' in
5030 for (int x : a) { }
5031</pre></td></tr>
5032
5033
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005034<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00005035<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5036`on`, matches the argument directly without stripping away anything.
5037
5038Given
5039 class Y { public: void m(); };
5040 Y g();
5041 class X : public Y { void g(); };
5042 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5043cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5044 cxxRecordDecl(hasName("Y")))))
5045 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5046cxxMemberCallExpr(on(callExpr()))
5047 does not match `(g()).m()`, because the parens are not ignored.
5048
5049FIXME: Overload to allow directly matching types?
5050</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005051
5052
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005053<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00005054<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5055stripping off any parentheses or implicit casts.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005056
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00005057Given
5058 class Y { public: void m(); };
5059 Y g();
5060 class X : public Y {};
5061 void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5062cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5063 matches `y.m()` and `(g()).m()`.
5064cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5065 matches `x.m()`.
5066cxxMemberCallExpr(on(callExpr()))
5067 matches `(g()).m()`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005068
5069FIXME: Overload to allow directly matching types?
5070</pre></td></tr>
5071
5072
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005073<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005074<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5075</pre></td></tr>
5076
5077
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005078<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00005079<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5080matches the InnerMatcher, or is a pointer to a type that matches the
5081InnerMatcher.
5082
5083Given
5084 class Y { public: void m(); };
5085 class X : public Y { void g(); };
5086 void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5087cxxMemberCallExpr(thisPointerType(hasDeclaration(
5088 cxxRecordDecl(hasName("Y")))))
5089 matches `y.m()`, `p-&gt;m()` and `x.m()`.
5090cxxMemberCallExpr(thisPointerType(hasDeclaration(
5091 cxxRecordDecl(hasName("X")))))
5092 matches `x.g()`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005093</pre></td></tr>
5094
5095
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005096<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
Alexander Kornienko2a8c18d2018-04-06 15:14:32 +00005097<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 +00005098produce multiple matches.
5099
5100Given
5101 class A { virtual void f(); };
5102 class B : public A { void f(); };
5103 class C : public B { void f(); };
5104cxxMethodDecl(ofClass(hasName("C")),
5105 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5106 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5107 that B::f is not overridden by C::f).
5108
5109The check can produce multiple matches in case of multiple inheritance, e.g.
5110 class A1 { virtual void f(); };
5111 class A2 { virtual void f(); };
5112 class C : public A1, public A2 { void f(); };
5113cxxMethodDecl(ofClass(hasName("C")),
5114 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5115 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5116 once with "b" binding "A2::f" and "d" binding "C::f".
5117</pre></td></tr>
5118
5119
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005120<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005121<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5122belongs to.
5123
5124FIXME: Generalize this for other kinds of declarations.
5125FIXME: What other kind of declarations would we need to generalize
5126this to?
5127
5128Example matches A() in the last line
5129 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5130 ofClass(hasName("A"))))))
5131 class A {
5132 public:
5133 A();
5134 };
5135 A a = A();
5136</pre></td></tr>
5137
5138
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005139<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Adam Baloghda488a62017-11-23 12:43:20 +00005140<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5141
5142Given:
5143 MyClass *p1 = new MyClass[10];
5144cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
5145 matches the expression 'new MyClass[10]'.
5146</pre></td></tr>
5147
5148
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005149<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005150<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 +00005151matches the given matcher.
5152
5153The associated declaration is:
5154- for type nodes, the declaration of the underlying type
5155- for CallExpr, the declaration of the callee
5156- for MemberExpr, the declaration of the referenced member
5157- for CXXConstructExpr, the declaration of the constructor
5158- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005159- for ObjCIvarExpr, the declaration of the ivar
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005160
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005161For type nodes, hasDeclaration will generally match the declaration of the
5162sugared type. Given
5163 class X {};
5164 typedef X Y;
5165 Y y;
5166in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5167typedefDecl. A common use case is to match the underlying, desugared type.
5168This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5169 varDecl(hasType(hasUnqualifiedDesugaredType(
5170 recordType(hasDeclaration(decl())))))
5171In this matcher, the decl will match the CXXRecordDecl of class X.
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005172
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005173Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5174 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5175 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5176 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5177 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5178 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5179 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005180</pre></td></tr>
5181
5182
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005183<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005184<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5185
5186Given:
5187 class A { void func(); };
5188 class B { void member(); };
5189
5190cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5191A but not B.
5192</pre></td></tr>
5193
5194
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005195<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005196<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
5197a class matching Base.
5198
5199Note that a class is not considered to be derived from itself.
5200
5201Example matches Y, Z, C (Base == hasName("X"))
5202 class X;
Aaron Ballman94f3e742018-12-11 19:30:49 +00005203 class Y : public X {}; // directly derived
5204 class Z : public Y {}; // indirectly derived
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005205 typedef X A;
5206 typedef A B;
Aaron Ballman94f3e742018-12-11 19:30:49 +00005207 class C : public B {}; // derived from a typedef of X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005208
5209In the following example, Bar matches isDerivedFrom(hasName("X")):
5210 class Foo;
5211 typedef Foo X;
Aaron Ballman94f3e742018-12-11 19:30:49 +00005212 class Bar : public Foo {}; // derived from a type that X is a typedef of
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005213</pre></td></tr>
5214
5215
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005216<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005217<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5218match Base.
5219</pre></td></tr>
5220
5221
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005222<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Shuai Wang3b2a17b2018-08-12 23:30:05 +00005223<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5224expression, or an ObjC-message-send expression.
5225
5226Given
5227 void x(int, int, int) { int y; x(1, y, 42); }
5228callExpr(hasAnyArgument(declRefExpr()))
5229 matches x(1, y, 42)
5230with hasAnyArgument(...)
5231 matching y
5232
5233For ObjectiveC, given
5234 @interface I - (void) f:(int) y; @end
5235 void foo(I *i) { [i f:12]; }
5236objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5237 matches [i f:12]
5238</pre></td></tr>
5239
5240
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005241<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005242<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5243given matcher.
5244
5245Example matches y.x() (matcher = callExpr(callee(
5246 cxxMethodDecl(hasName("x")))))
5247 class Y { public: void x(); };
5248 void z() { Y y; y.x(); }
5249</pre></td></tr>
5250
5251
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005252<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005253<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5254
5255Given
5256 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5257 void f() { f(); }
5258callExpr(callee(expr()))
5259 matches this-&gt;x(), x(), y.x(), f()
5260with callee(...)
5261 matching this-&gt;x, x, y.x, f respectively
5262
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005263Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005264because this introduces ambiguous overloads with calls to Callee taking a
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005265internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005266implemented in terms of implicit casts.
5267</pre></td></tr>
5268
5269
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005270<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
Aaron Ballmand7b18b92016-01-18 20:28:57 +00005271<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5272
5273Given
5274 void f(int i);
5275 int y;
5276 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00005277callExpr(
5278 forEachArgumentWithParam(
5279 declRefExpr(to(varDecl(hasName("y")))),
5280 parmVarDecl(hasType(isInteger()))
5281))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00005282 matches f(y);
5283with declRefExpr(...)
5284 matching int y
5285and parmVarDecl(...)
5286 matching int i
5287</pre></td></tr>
5288
5289
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005290<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005291<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 +00005292expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005293
5294Given
5295 void x(int, int, int) { int y; x(1, y, 42); }
5296callExpr(hasAnyArgument(declRefExpr()))
5297 matches x(1, y, 42)
5298with hasAnyArgument(...)
5299 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00005300
5301For ObjectiveC, given
5302 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00005303 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00005304objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5305 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005306</pre></td></tr>
5307
5308
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005309<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005310<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5311call expression.
5312
5313Example matches y in x(y)
5314 (matcher = callExpr(hasArgument(0, declRefExpr())))
5315 void x(int) { int y; x(y); }
5316</pre></td></tr>
5317
5318
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005319<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00005320<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 +00005321matches the given matcher.
5322
5323The associated declaration is:
5324- for type nodes, the declaration of the underlying type
5325- for CallExpr, the declaration of the callee
5326- for MemberExpr, the declaration of the referenced member
5327- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005328- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005329- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005330
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005331For type nodes, hasDeclaration will generally match the declaration of the
5332sugared type. Given
5333 class X {};
5334 typedef X Y;
5335 Y y;
5336in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5337typedefDecl. A common use case is to match the underlying, desugared type.
5338This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5339 varDecl(hasType(hasUnqualifiedDesugaredType(
5340 recordType(hasDeclaration(decl())))))
5341In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005342
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005343Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5344 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5345 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5346 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5347 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5348 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5349 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005350</pre></td></tr>
5351
5352
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005353<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005354<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5355extension, matches the constant given in the statement.
5356
5357Given
5358 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5359caseStmt(hasCaseConstant(integerLiteral()))
5360 matches "case 1:"
5361</pre></td></tr>
5362
5363
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005364<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005365<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5366or opaque value's source expression matches the given matcher.
5367
5368Example 1: matches "a string"
5369(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5370class URL { URL(string); };
5371URL url = "a string";
5372
5373Example 2: matches 'b' (matcher =
5374opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5375int a = b ?: 1;
5376</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005377
5378
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005379<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
Haojian Wud898b092016-07-29 13:57:27 +00005380<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5381functionDecl that have at least one TemplateArgument matching the given
5382InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005383
5384Given
5385 template&lt;typename T&gt; class A {};
5386 template&lt;&gt; class A&lt;double&gt; {};
5387 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005388
Haojian Wu99e39a72016-07-29 17:30:13 +00005389 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005390 void func() { f&lt;int&gt;(); };
5391
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005392classTemplateSpecializationDecl(hasAnyTemplateArgument(
5393 refersToType(asString("int"))))
5394 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005395
5396functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5397 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005398</pre></td></tr>
5399
5400
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005401<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
Manuel Klimek696e5052017-08-02 13:04:44 +00005402<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5403
5404Given
Stephen Kelly9b8fa522018-10-09 08:24:11 +00005405 template&lt;typename T&gt; class A {}; #1
5406 template&lt;&gt; class A&lt;int&gt; {}; #2
Manuel Klimek696e5052017-08-02 13:04:44 +00005407classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
Stephen Kelly9b8fa522018-10-09 08:24:11 +00005408 matches '#2' with classTemplateDecl() matching the class template
5409 declaration of 'A' at #1.
Manuel Klimek696e5052017-08-02 13:04:44 +00005410</pre></td></tr>
5411
5412
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005413<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
Haojian Wud898b092016-07-29 13:57:27 +00005414<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5415functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005416
5417Given
5418 template&lt;typename T, typename U&gt; class A {};
5419 A&lt;bool, int&gt; b;
5420 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005421
Fangrui Song55942ab2018-01-22 22:34:15 +00005422 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005423 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005424classTemplateSpecializationDecl(hasTemplateArgument(
5425 1, refersToType(asString("int"))))
5426 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005427
5428functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5429 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005430</pre></td></tr>
5431
5432
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005433<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005434<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5435type.
5436
5437Given
5438 struct A {};
5439 A a[7];
5440 int b[7];
5441arrayType(hasElementType(builtinType()))
5442 matches "int b[7]"
5443
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005444Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005445</pre></td></tr>
5446
5447
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005448<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005449<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 +00005450a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005451
5452Given
5453 { {}; 1+2; }
5454hasAnySubstatement(compoundStmt())
5455 matches '{ {}; 1+2; }'
5456with compoundStmt()
5457 matching '{}'
5458</pre></td></tr>
5459
5460
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005461<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005462<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5463</pre></td></tr>
5464
5465
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005466<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005467<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 +00005468matches the given matcher.
5469
5470The associated declaration is:
5471- for type nodes, the declaration of the underlying type
5472- for CallExpr, the declaration of the callee
5473- for MemberExpr, the declaration of the referenced member
5474- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005475- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005476- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005477
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005478For type nodes, hasDeclaration will generally match the declaration of the
5479sugared type. Given
5480 class X {};
5481 typedef X Y;
5482 Y y;
5483in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5484typedefDecl. A common use case is to match the underlying, desugared type.
5485This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5486 varDecl(hasType(hasUnqualifiedDesugaredType(
5487 recordType(hasDeclaration(decl())))))
5488In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005489
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005490Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5491 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5492 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5493 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5494 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5495 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5496 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005497</pre></td></tr>
5498
5499
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005500<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005501<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5502specific using shadow declaration.
5503
5504Given
5505 namespace a { void f() {} }
5506 using a::f;
5507 void g() {
Aaron Ballman94f3e742018-12-11 19:30:49 +00005508 f(); // Matches this ..
5509 a::f(); // .. but not this.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005510 }
5511declRefExpr(throughUsingDecl(anything()))
5512 matches f()
5513</pre></td></tr>
5514
5515
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005516<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005517<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5518specified matcher.
5519
5520Example matches x in if(x)
5521 (matcher = declRefExpr(to(varDecl(hasName("x")))))
5522 bool x;
5523 if (x) {}
5524</pre></td></tr>
5525
5526
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005527<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005528<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5529
5530Note that this does not work for global declarations because the AST
5531breaks up multiple-declaration DeclStmt's into multiple single-declaration
5532DeclStmt's.
5533Example: Given non-global declarations
5534 int a, b = 0;
5535 int c;
5536 int d = 2, e;
5537declStmt(containsDeclaration(
5538 0, varDecl(hasInitializer(anything()))))
5539 matches only 'int d = 2, e;', and
5540declStmt(containsDeclaration(1, varDecl()))
5541 matches 'int a, b = 0' as well as 'int d = 2, e;'
5542 but 'int c;' is not matched.
5543</pre></td></tr>
5544
5545
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005546<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005547<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5548
5549Given
5550 int a, b;
5551 int c;
5552declStmt(hasSingleDecl(anything()))
5553 matches 'int c;' but not 'int a, b;'.
5554</pre></td></tr>
5555
5556
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005557<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005558<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5559the inner matcher.
5560
5561Given
5562 int x;
5563declaratorDecl(hasTypeLoc(loc(asString("int"))))
5564 matches int x
5565</pre></td></tr>
5566
5567
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005568<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005569<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5570Decl, matches InnerMatcher.
5571
5572Given
5573 namespace N {
5574 namespace M {
5575 class D {};
5576 }
5577 }
5578
5579cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5580declaration of class D.
5581</pre></td></tr>
5582
5583
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005584<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Jonas Tothacf83672018-07-26 13:02:05 +00005585<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5586
5587Given
5588 decltype(1) a = 1;
5589 decltype(2.0) b = 2.0;
5590decltypeType(hasUnderlyingType(isInteger()))
Stephen Kelly9b8fa522018-10-09 08:24:11 +00005591 matches the type of "a"
Jonas Tothacf83672018-07-26 13:02:05 +00005592
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005593Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
Jonas Tothacf83672018-07-26 13:02:05 +00005594</pre></td></tr>
5595
5596
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005597<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00005598<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5599definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005600
5601Given
5602 for (;;) {}
5603hasBody(compoundStmt())
5604 matches 'for (;;) {}'
5605with compoundStmt()
5606 matching '{}'
5607</pre></td></tr>
5608
5609
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005610<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005611<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 +00005612switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005613
5614Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5615 if (true) {}
5616</pre></td></tr>
5617
5618
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005619<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005620<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5621matches InnerMatcher if the qualifier exists.
5622
5623Given
5624 namespace N {
5625 namespace M {
5626 class D {};
5627 }
5628 }
5629 N::M::D d;
5630
5631elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5632matches the type of the variable declaration of d.
5633</pre></td></tr>
5634
5635
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005636<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005637<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5638
5639Given
5640 namespace N {
5641 namespace M {
5642 class D {};
5643 }
5644 }
5645 N::M::D d;
5646
5647elaboratedType(namesType(recordType(
5648hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5649declaration of d.
5650</pre></td></tr>
5651
5652
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005653<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00005654<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 +00005655matches the given matcher.
5656
5657The associated declaration is:
5658- for type nodes, the declaration of the underlying type
5659- for CallExpr, the declaration of the callee
5660- for MemberExpr, the declaration of the referenced member
5661- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005662- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005663- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005664
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005665For type nodes, hasDeclaration will generally match the declaration of the
5666sugared type. Given
5667 class X {};
5668 typedef X Y;
5669 Y y;
5670in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5671typedefDecl. A common use case is to match the underlying, desugared type.
5672This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5673 varDecl(hasType(hasUnqualifiedDesugaredType(
5674 recordType(hasDeclaration(decl())))))
5675In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005676
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005677Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5678 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5679 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5680 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5681 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5682 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5683 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005684</pre></td></tr>
5685
5686
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005687<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005688<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5689
5690(Note: Clang's AST refers to other conversions as "casts" too, and calls
5691actual casts "explicit" casts.)
5692</pre></td></tr>
5693
5694
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005695<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
George Karpenkovba02bc52018-07-06 21:36:04 +00005696<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 +00005697declaration's type.
5698
5699In case of a value declaration (for example a variable declaration),
5700this resolves one layer of indirection. For example, in the value
5701declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5702X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5703declaration of x.
5704
5705Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5706 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00005707 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005708 class X {};
5709 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00005710 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005711
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005712Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005713</pre></td></tr>
5714
5715
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005716<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005717<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5718matcher.
5719
5720Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5721 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005722 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00005723 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005724 class X {};
5725 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005726 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00005727 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005728</pre></td></tr>
5729
5730
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005731<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005732<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5733are stripped off.
5734
5735Parentheses and explicit casts are not discarded.
5736Given
5737 int arr[5];
5738 int a = 0;
5739 char b = 0;
5740 const int c = a;
5741 int *d = arr;
5742 long e = (long) 0l;
5743The matchers
5744 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5745 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5746would match the declarations for a, b, c, and d, but not e.
5747While
5748 varDecl(hasInitializer(integerLiteral()))
5749 varDecl(hasInitializer(declRefExpr()))
5750only match the declarations for b, c, and d.
5751</pre></td></tr>
5752
5753
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005754<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Cong Liu8a02efb2016-06-24 09:38:03 +00005755<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5756nodes are stripped off.
5757
5758Parentheses and explicit casts are not discarded.
5759Given
5760 class C {};
5761 C a = C();
5762 C b;
5763 C c = b;
5764The matchers
5765 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5766would match the declarations for a, b, and c.
5767While
5768 varDecl(hasInitializer(cxxConstructExpr()))
5769only match the declarations for b and c.
5770</pre></td></tr>
5771
5772
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005773<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005774<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5775casts are stripped off.
5776
5777Implicit and non-C Style casts are also discarded.
5778Given
5779 int a = 0;
5780 char b = (0);
5781 void* c = reinterpret_cast&lt;char*&gt;(0);
5782 char d = char(0);
5783The matcher
5784 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5785would match the declarations for a, b, c, and d.
5786while
5787 varDecl(hasInitializer(integerLiteral()))
5788only match the declaration for a.
5789</pre></td></tr>
5790
5791
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005792<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005793<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5794parentheses are stripped off.
5795
5796Explicit casts are not discarded.
5797Given
5798 int arr[5];
5799 int a = 0;
5800 char b = (0);
5801 const int c = a;
5802 int *d = (arr);
5803 long e = ((long) 0l);
5804The matchers
5805 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5806 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5807would match the declarations for a, b, c, and d, but not e.
5808while
5809 varDecl(hasInitializer(integerLiteral()))
5810 varDecl(hasInitializer(declRefExpr()))
5811would only match the declaration for a.
5812</pre></td></tr>
5813
5814
Jonas Toth295aa092018-11-09 20:54:06 +00005815<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5816<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
5817
5818Given
5819 const char* str = ("my-string");
5820The matcher
5821 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
5822would match the implicit cast resulting from the assignment.
5823</pre></td></tr>
5824
5825
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005826<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Malcolm Parsons4ca3d182016-12-24 13:35:14 +00005827<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5828
5829Given
5830 class C {
5831 int a = 2;
5832 int b = 3;
5833 int c;
5834 };
5835fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5836 matches 'int a;' but not 'int b;'.
5837fieldDecl(hasInClassInitializer(anything()))
5838 matches 'int a;' and 'int b;' but not 'int c;'.
5839</pre></td></tr>
5840
5841
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005842<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00005843<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5844definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005845
5846Given
5847 for (;;) {}
5848hasBody(compoundStmt())
5849 matches 'for (;;) {}'
5850with compoundStmt()
5851 matching '{}'
5852</pre></td></tr>
5853
5854
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005855<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005856<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 +00005857switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005858
5859Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5860 if (true) {}
5861</pre></td></tr>
5862
5863
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005864<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005865<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5866
5867Example:
5868 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5869matches '++x' in
5870 for (x; x &lt; N; ++x) { }
5871</pre></td></tr>
5872
5873
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005874<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005875<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5876
5877Example:
5878 forStmt(hasLoopInit(declStmt()))
5879matches 'int x = 0' in
5880 for (int x = 0; x &lt; N; ++x) { }
5881</pre></td></tr>
5882
5883
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005884<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
George Karpenkovba02bc52018-07-06 21:36:04 +00005885<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
5886declaration's type.
5887
5888In case of a value declaration (for example a variable declaration),
5889this resolves one layer of indirection. For example, in the value
5890declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5891X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5892declaration of x.
5893
5894Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5895 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5896 and friend class X (matcher = friendDecl(hasType("X"))
5897 class X {};
5898 void y(X &amp;x) { x; X z; }
5899 class Y { friend class X; };
5900
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005901Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
George Karpenkovba02bc52018-07-06 21:36:04 +00005902</pre></td></tr>
5903
5904
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005905<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
George Karpenkovba02bc52018-07-06 21:36:04 +00005906<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5907matcher.
5908
5909Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5910 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5911 and U (matcher = typedefDecl(hasType(asString("int")))
5912 and friend class X (matcher = friendDecl(hasType("X"))
5913 class X {};
5914 void y(X &amp;x) { x; X z; }
5915 typedef int U;
5916 class Y { friend class X; };
5917</pre></td></tr>
5918
5919
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005920<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005921<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
5922block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005923
5924Does not match the 'this' parameter of a method.
5925
5926Given
5927 class X { void f(int x, int y, int z) {} };
5928cxxMethodDecl(hasAnyParameter(hasName("y")))
5929 matches f(int x, int y, int z) {}
5930with hasAnyParameter(...)
5931 matching int y
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005932
5933For ObjectiveC, given
5934 @interface I - (void) f:(int) y; @end
5935
5936the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5937matches the declaration of method f with hasParameter
5938matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005939
5940For blocks, given
5941 b = ^(int y) { printf("%d", y) };
5942
5943the matcher blockDecl(hasAnyParameter(hasName("y")))
5944matches the declaration of the block b with hasParameter
5945matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005946</pre></td></tr>
5947
5948
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005949<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
Haojian Wud898b092016-07-29 13:57:27 +00005950<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5951functionDecl that have at least one TemplateArgument matching the given
5952InnerMatcher.
5953
5954Given
5955 template&lt;typename T&gt; class A {};
5956 template&lt;&gt; class A&lt;double&gt; {};
5957 A&lt;int&gt; a;
5958
Haojian Wu99e39a72016-07-29 17:30:13 +00005959 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005960 void func() { f&lt;int&gt;(); };
5961
5962classTemplateSpecializationDecl(hasAnyTemplateArgument(
5963 refersToType(asString("int"))))
5964 matches the specialization A&lt;int&gt;
5965
5966functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5967 matches the specialization f&lt;int&gt;
5968</pre></td></tr>
5969
5970
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005971<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00005972<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5973definition that has a given body.
5974
5975Given
5976 for (;;) {}
5977hasBody(compoundStmt())
5978 matches 'for (;;) {}'
5979with compoundStmt()
5980 matching '{}'
5981</pre></td></tr>
5982
5983
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005984<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005985<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 +00005986declaration or a block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005987
5988Given
5989 class X { void f(int x) {} };
5990cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5991 matches f(int x) {}
5992with hasParameter(...)
5993 matching int x
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005994
5995For ObjectiveC, given
5996 @interface I - (void) f:(int) y; @end
5997
5998the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5999matches the declaration of method f with hasParameter
6000matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006001</pre></td></tr>
6002
6003
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006004<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
Haojian Wud898b092016-07-29 13:57:27 +00006005<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6006functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6007
6008Given
6009 template&lt;typename T, typename U&gt; class A {};
6010 A&lt;bool, int&gt; b;
6011 A&lt;int, bool&gt; c;
6012
Fangrui Song55942ab2018-01-22 22:34:15 +00006013 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00006014 void func() { f&lt;int&gt;(); };
6015classTemplateSpecializationDecl(hasTemplateArgument(
6016 1, refersToType(asString("int"))))
6017 matches the specialization A&lt;bool, int&gt;
6018
6019functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6020 matches the specialization f&lt;int&gt;
6021</pre></td></tr>
6022
6023
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006024<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006025<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6026
6027Given:
6028 class X { int f() { return 1; } };
6029cxxMethodDecl(returns(asString("int")))
6030 matches int f() { return 1; }
6031</pre></td></tr>
6032
6033
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006034<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006035<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 +00006036switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006037
6038Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6039 if (true) {}
6040</pre></td></tr>
6041
6042
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006043<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006044<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6045
6046Given
6047 if (A* a = GetAPointer()) {}
6048hasConditionVariableStatement(...)
6049 matches 'A* a = GetAPointer()'.
6050</pre></td></tr>
6051
6052
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006053<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006054<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6055
6056Examples matches the if statement
6057 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6058 if (false) false; else true;
6059</pre></td></tr>
6060
6061
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006062<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006063<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6064
6065Examples matches the if statement
6066 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6067 if (false) true; else false;
6068</pre></td></tr>
6069
6070
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006071<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006072<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6073matcher.
6074
6075FIXME: Unit test this matcher
6076</pre></td></tr>
6077
6078
Hyrum Wright2cd40c02019-01-07 14:14:36 +00006079<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6080<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6081
6082Example matches y.
6083 (matcher = initListExpr(hasInit(0, expr())))
6084 int x{y}.
6085</pre></td></tr>
6086
6087
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006088<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006089<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6090(if expression have it).
6091</pre></td></tr>
6092
6093
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006094<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006095<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6096matches the given matcher.
6097
6098The associated declaration is:
6099- for type nodes, the declaration of the underlying type
6100- for CallExpr, the declaration of the callee
6101- for MemberExpr, the declaration of the referenced member
6102- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006103- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006104- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006105
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006106For type nodes, hasDeclaration will generally match the declaration of the
6107sugared type. Given
6108 class X {};
6109 typedef X Y;
6110 Y y;
6111in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6112typedefDecl. A common use case is to match the underlying, desugared type.
6113This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6114 varDecl(hasType(hasUnqualifiedDesugaredType(
6115 recordType(hasDeclaration(decl())))))
6116In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006117
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006118Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6119 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6120 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6121 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6122 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6123 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6124 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Manuel Klimeka37e1102016-12-01 15:45:06 +00006125</pre></td></tr>
6126
6127
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006128<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00006129<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6130matches the given matcher.
6131
6132The associated declaration is:
6133- for type nodes, the declaration of the underlying type
6134- for CallExpr, the declaration of the callee
6135- for MemberExpr, the declaration of the referenced member
6136- for CXXConstructExpr, the declaration of the constructor
6137- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006138- for ObjCIvarExpr, the declaration of the ivar
Manuel Klimeka37e1102016-12-01 15:45:06 +00006139
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006140For type nodes, hasDeclaration will generally match the declaration of the
6141sugared type. Given
6142 class X {};
6143 typedef X Y;
6144 Y y;
6145in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6146typedefDecl. A common use case is to match the underlying, desugared type.
6147This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6148 varDecl(hasType(hasUnqualifiedDesugaredType(
6149 recordType(hasDeclaration(decl())))))
6150In this matcher, the decl will match the CXXRecordDecl of class X.
Manuel Klimeka37e1102016-12-01 15:45:06 +00006151
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006152Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6153 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6154 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6155 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6156 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6157 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6158 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006159</pre></td></tr>
6160
6161
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006162<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006163<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6164matches the given matcher.
6165
6166The associated declaration is:
6167- for type nodes, the declaration of the underlying type
6168- for CallExpr, the declaration of the callee
6169- for MemberExpr, the declaration of the referenced member
6170- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006171- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006172- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006173
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006174For type nodes, hasDeclaration will generally match the declaration of the
6175sugared type. Given
6176 class X {};
6177 typedef X Y;
6178 Y y;
6179in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6180typedefDecl. A common use case is to match the underlying, desugared type.
6181This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6182 varDecl(hasType(hasUnqualifiedDesugaredType(
6183 recordType(hasDeclaration(decl())))))
6184In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006185
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006186Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6187 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6188 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6189 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6190 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6191 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6192 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006193</pre></td></tr>
6194
6195
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006196<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00006197<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6198given matcher. Implicit object expressions are included; that is, it matches
6199use of implicit `this`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006200
6201Given
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00006202 struct X {
6203 int m;
6204 int f(X x) { x.m; return m; }
6205 };
6206memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6207 matches `x.m`, but not `m`; however,
6208memberExpr(hasObjectExpression(hasType(pointsTo(
6209 cxxRecordDecl(hasName("X"))))))
6210 matches `m` (aka. `this-&gt;m`), but not `x.m`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006211</pre></td></tr>
6212
6213
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006214<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006215<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6216given matcher.
6217
6218Given
6219 struct { int first, second; } first, second;
6220 int i(second.first);
6221 int j(first.second);
6222memberExpr(member(hasName("first")))
6223 matches second.first
6224 but not first.second (because the member name there is "second").
6225</pre></td></tr>
6226
6227
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006228<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006229<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6230pointee matches a given matcher.
6231
6232Given
6233 int *a;
6234 int const *b;
6235 float const *f;
6236pointerType(pointee(isConstQualified(), isInteger()))
6237 matches "int const *b"
6238
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006239Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
6240 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006241</pre></td></tr>
6242
6243
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006244<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
Martin Bohme8cef2c22016-08-09 15:07:52 +00006245<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6246matcher.
6247
6248Given
6249 namespace N { template&lt;class T&gt; void f(T t); }
6250 template &lt;class T&gt; void g() { using N::f; f(T()); }
6251unresolvedLookupExpr(hasAnyDeclaration(
6252 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6253 matches the use of f in g() .
6254</pre></td></tr>
6255
6256
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006257<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006258<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6259
6260Given
6261 struct A { struct B { struct C {}; }; };
6262 A::B::C c;
6263nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6264 matches "A::"
6265</pre></td></tr>
6266
6267
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006268<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006269<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6270given TypeLoc.
6271
6272Given
6273 struct A { struct B { struct C {}; }; };
6274 A::B::C c;
6275nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6276 hasDeclaration(cxxRecordDecl(hasName("A")))))))
6277 matches "A::"
6278</pre></td></tr>
6279
6280
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006281<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006282<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6283
6284Given
6285 struct A { struct B { struct C {}; }; };
6286 A::B::C c;
6287nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6288 matches "A::"
6289</pre></td></tr>
6290
6291
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006292<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006293<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6294given namespace matcher.
6295
6296Given
6297 namespace ns { struct A {}; }
6298 ns::A a;
6299nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6300 matches "ns::"
6301</pre></td></tr>
6302
6303
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006304<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006305<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6306given QualType matcher without qualifiers.
6307
6308Given
6309 struct A { struct B { struct C {}; }; };
6310 A::B::C c;
6311nestedNameSpecifier(specifiesType(
6312 hasDeclaration(cxxRecordDecl(hasName("A")))
6313))
6314 matches "A::"
6315</pre></td></tr>
6316
6317
Roman Lebedev33ef20e2019-03-21 15:33:24 +00006318<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt; InnerMatcher</td></tr>
6319<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6320
6321Given
6322
6323 #pragma omp parallel
6324 #pragma omp parallel default(none)
6325
6326``ompExecutableDirective(hasAnyClause(anything()))`` matches
6327``omp parallel default(none)``.
6328</pre></td></tr>
6329
6330
Roman Lebedevc8161952019-03-21 15:33:35 +00006331<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
6332<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6333
6334Prerequisite: the executable directive must not be standalone directive.
6335If it is, it will never match.
6336
6337Given
6338
6339 #pragma omp parallel
6340 ;
6341 #pragma omp parallel
6342 {}
6343
6344``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6345</pre></td></tr>
6346
6347
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006348<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Shuai Wang3b2a17b2018-08-12 23:30:05 +00006349<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
George Karpenkova763fdf2018-03-07 02:32:44 +00006350expression, or an ObjC-message-send expression.
6351
6352Given
6353 void x(int, int, int) { int y; x(1, y, 42); }
6354callExpr(hasAnyArgument(declRefExpr()))
6355 matches x(1, y, 42)
6356with hasAnyArgument(...)
6357 matching y
6358
6359For ObjectiveC, given
6360 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00006361 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00006362objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6363 matches [i f:12]
6364</pre></td></tr>
6365
6366
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006367<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006368<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6369call expression.
6370
6371Example matches y in x(y)
6372 (matcher = callExpr(hasArgument(0, declRefExpr())))
6373 void x(int) { int y; x(y); }
6374</pre></td></tr>
6375
6376
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006377<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
George Karpenkovb5ea4df2018-07-16 20:22:12 +00006378<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
6379and the inner matcher matches on that instance.
6380
6381For example the method call in
6382 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00006383 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00006384is matched by
6385objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
6386</pre></td></tr>
6387
6388
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006389<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006390<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
6391
6392Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00006393matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006394matches the [webView ...] message invocation.
6395 NSString *webViewJavaScript = ...
6396 UIWebView *webView = ...
6397 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
6398</pre></td></tr>
6399
6400
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006401<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00006402<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
6403block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006404
6405Does not match the 'this' parameter of a method.
6406
6407Given
6408 class X { void f(int x, int y, int z) {} };
6409cxxMethodDecl(hasAnyParameter(hasName("y")))
6410 matches f(int x, int y, int z) {}
6411with hasAnyParameter(...)
6412 matching int y
6413
6414For ObjectiveC, given
6415 @interface I - (void) f:(int) y; @end
6416
6417the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6418matches the declaration of method f with hasParameter
6419matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00006420
6421For blocks, given
6422 b = ^(int y) { printf("%d", y) };
6423
6424the matcher blockDecl(hasAnyParameter(hasName("y")))
6425matches the declaration of the block b with hasParameter
6426matching y.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006427</pre></td></tr>
6428
6429
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006430<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006431<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 +00006432declaration or a block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006433
6434Given
6435 class X { void f(int x) {} };
6436cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6437 matches f(int x) {}
6438with hasParameter(...)
6439 matching int x
6440
6441For ObjectiveC, given
6442 @interface I - (void) f:(int) y; @end
6443
6444the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6445matches the declaration of method f with hasParameter
6446matching y.
6447</pre></td></tr>
6448
6449
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006450<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006451<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
6452or opaque value's source expression matches the given matcher.
6453
6454Example 1: matches "a string"
6455(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6456class URL { URL(string); };
6457URL url = "a string";
6458
6459Example 2: matches 'b' (matcher =
6460opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6461int a = b ?: 1;
6462</pre></td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006463
6464
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006465<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Martin Bohme8cef2c22016-08-09 15:07:52 +00006466<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6467overloads matches the given matcher.
6468
6469Given
6470 template &lt;typename T&gt; void foo(T);
6471 template &lt;typename T&gt; void bar(T);
6472 template &lt;typename T&gt; void baz(T t) {
6473 foo(t);
6474 bar(t);
6475 }
6476unresolvedLookupExpr(hasAnyDeclaration(
6477 functionTemplateDecl(hasName("foo"))))
6478 matches foo in foo(t); but not bar in bar(t);
6479</pre></td></tr>
6480
6481
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006482<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006483<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6484
6485Given
6486 int (*ptr_to_array)[4];
6487 int (*ptr_to_func)(int);
6488
6489varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6490ptr_to_func but not ptr_to_array.
6491
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006492Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006493</pre></td></tr>
6494
6495
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006496<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006497<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6498pointee matches a given matcher.
6499
6500Given
6501 int *a;
6502 int const *b;
6503 float const *f;
6504pointerType(pointee(isConstQualified(), isInteger()))
6505 matches "int const *b"
6506
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006507Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
6508 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006509</pre></td></tr>
6510
6511
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006512<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006513<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
6514
6515Given:
6516 typedef int &amp;int_ref;
6517 int a;
6518 int_ref b = a;
6519
6520varDecl(hasType(qualType(referenceType()))))) will not match the
6521declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
6522</pre></td></tr>
6523
6524
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006525<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006526<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
6527matches the given matcher.
6528
6529The associated declaration is:
6530- for type nodes, the declaration of the underlying type
6531- for CallExpr, the declaration of the callee
6532- for MemberExpr, the declaration of the referenced member
6533- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006534- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006535- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006536
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006537For type nodes, hasDeclaration will generally match the declaration of the
6538sugared type. Given
6539 class X {};
6540 typedef X Y;
6541 Y y;
6542in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6543typedefDecl. A common use case is to match the underlying, desugared type.
6544This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6545 varDecl(hasType(hasUnqualifiedDesugaredType(
6546 recordType(hasDeclaration(decl())))))
6547In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006548
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006549Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6550 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6551 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6552 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6553 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6554 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6555 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006556</pre></td></tr>
6557
6558
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006559<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00006560<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
6561
6562Given
6563 void (*fp)(void);
6564The matcher
6565 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
6566would match the declaration for fp.
6567</pre></td></tr>
6568
6569
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006570<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006571<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
6572</pre></td></tr>
6573
6574
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006575<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006576<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
6577matches the specified matcher.
6578
6579Example matches y-&gt;x()
6580 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
6581 cxxRecordDecl(hasName("Y")))))))
6582 class Y { public: void x(); };
6583 void z() { Y *y; y-&gt;x(); }
6584</pre></td></tr>
6585
6586
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006587<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006588<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
6589</pre></td></tr>
6590
6591
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006592<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006593<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
6594type matches the specified matcher.
6595
6596Example matches X &amp;x and const X &amp;y
6597 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
6598 class X {
6599 void a(X b) {
6600 X &amp;x = b;
6601 const X &amp;y = b;
6602 }
6603 };
6604</pre></td></tr>
6605
6606
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006607<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006608<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
6609matches the given matcher.
6610
6611The associated declaration is:
6612- for type nodes, the declaration of the underlying type
6613- for CallExpr, the declaration of the callee
6614- for MemberExpr, the declaration of the referenced member
6615- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006616- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006617- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006618
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006619For type nodes, hasDeclaration will generally match the declaration of the
6620sugared type. Given
6621 class X {};
6622 typedef X Y;
6623 Y y;
6624in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6625typedefDecl. A common use case is to match the underlying, desugared type.
6626This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6627 varDecl(hasType(hasUnqualifiedDesugaredType(
6628 recordType(hasDeclaration(decl())))))
6629In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006630
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006631Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6632 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6633 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6634 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6635 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6636 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6637 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006638</pre></td></tr>
6639
6640
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006641<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006642<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
6643pointee matches a given matcher.
6644
6645Given
6646 int *a;
6647 int const *b;
6648 float const *f;
6649pointerType(pointee(isConstQualified(), isInteger()))
6650 matches "int const *b"
6651
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006652Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
6653 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006654</pre></td></tr>
6655
6656
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006657<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Alexander Kornienko976921d2016-03-22 11:03:03 +00006658<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
6659
6660Given
6661 return a + b;
6662hasReturnValue(binaryOperator())
6663 matches 'return a + b'
6664with binaryOperator()
6665 matching 'a + b'
6666</pre></td></tr>
6667
6668
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006669<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006670<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
6671a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6672
6673Given
6674 { {}; 1+2; }
6675hasAnySubstatement(compoundStmt())
6676 matches '{ {}; 1+2; }'
6677with compoundStmt()
6678 matching '{}'
6679</pre></td></tr>
6680
6681
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006682<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006683<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6684alignof.
6685</pre></td></tr>
6686
6687
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006688<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
Malcolm Parsonsdef8f902017-01-20 09:54:26 +00006689<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 +00006690
6691Given:
6692F&amp; operator=(const F&amp; o) {
6693 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
6694 return *this;
6695}
6696returnStmt(forFunction(hasName("operator=")))
6697 matches 'return *this'
6698 but does match 'return &gt; 0'
6699</pre></td></tr>
6700
6701
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006702<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006703<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6704sizeof.
6705</pre></td></tr>
6706
6707
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006708<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
Malcolm Parsons77f039b2016-12-08 11:46:22 +00006709<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
6710type that matches the provided matcher.
6711
6712Given
6713 template &lt;typename T&gt;
6714 double F(T t);
6715 int i;
6716 double j = F(i);
6717
6718substTemplateTypeParmType(hasReplacementType(type())) matches int
6719</pre></td></tr>
6720
6721
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006722<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006723<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
6724statement. This matcher may produce multiple matches.
6725
6726Given
6727 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
6728switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
6729 matches four times, with "c" binding each of "case 1:", "case 2:",
6730"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
6731"switch (1)", "switch (2)" and "switch (2)".
6732</pre></td></tr>
6733
6734
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006735<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Etienne Bergeron5500f952016-05-30 15:25:25 +00006736<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
6737switch statement or conditional operator.
6738
6739Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6740 if (true) {}
6741</pre></td></tr>
6742
6743
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006744<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006745<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
6746matches the given matcher.
6747
6748The associated declaration is:
6749- for type nodes, the declaration of the underlying type
6750- for CallExpr, the declaration of the callee
6751- for MemberExpr, the declaration of the referenced member
6752- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006753- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006754- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006755
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006756For type nodes, hasDeclaration will generally match the declaration of the
6757sugared type. Given
6758 class X {};
6759 typedef X Y;
6760 Y y;
6761in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6762typedefDecl. A common use case is to match the underlying, desugared type.
6763This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6764 varDecl(hasType(hasUnqualifiedDesugaredType(
6765 recordType(hasDeclaration(decl())))))
6766In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006767
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006768Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6769 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6770 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6771 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6772 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6773 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6774 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006775</pre></td></tr>
6776
6777
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006778<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006779<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6780
6781Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006782 struct B { int next; };
6783 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006784 A&lt;&amp;B::next&gt; a;
6785templateSpecializationType(hasAnyTemplateArgument(
6786 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6787 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6788 B::next
6789</pre></td></tr>
6790
6791
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006792<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006793<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6794declaration.
6795
6796Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006797 struct B { int next; };
6798 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006799 A&lt;&amp;B::next&gt; a;
6800classTemplateSpecializationDecl(hasAnyTemplateArgument(
Fangrui Song55942ab2018-01-22 22:34:15 +00006801 refersToDeclaration(fieldDecl(hasName("next")))))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006802 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6803 B::next
6804</pre></td></tr>
6805
6806
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006807<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006808<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6809
6810Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006811 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006812 C&lt;42&gt; c;
6813classTemplateSpecializationDecl(
6814 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6815 matches the implicit instantiation of C in C&lt;42&gt;.
6816</pre></td></tr>
6817
6818
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006819<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
Haojian Wub33b02e2016-07-29 15:45:11 +00006820<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6821
6822Given
6823 template&lt;template &lt;typename&gt; class S&gt; class X {};
Stephen Kelly9b8fa522018-10-09 08:24:11 +00006824 template&lt;typename T&gt; class Y {};
Haojian Wub33b02e2016-07-29 15:45:11 +00006825 X&lt;Y&gt; xi;
6826classTemplateSpecializationDecl(hasAnyTemplateArgument(
6827 refersToTemplate(templateName())))
6828 matches the specialization X&lt;Y&gt;
6829</pre></td></tr>
6830
6831
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006832<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006833<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6834
6835Given
6836 struct X {};
6837 template&lt;typename T&gt; struct A {};
6838 A&lt;X&gt; a;
6839classTemplateSpecializationDecl(hasAnyTemplateArgument(
6840 refersToType(class(hasName("X")))))
6841 matches the specialization A&lt;X&gt;
6842</pre></td></tr>
6843
6844
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006845<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
Haojian Wud898b092016-07-29 13:57:27 +00006846<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6847functionDecl that have at least one TemplateArgument matching the given
6848InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006849
6850Given
6851 template&lt;typename T&gt; class A {};
6852 template&lt;&gt; class A&lt;double&gt; {};
6853 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00006854
Haojian Wu99e39a72016-07-29 17:30:13 +00006855 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00006856 void func() { f&lt;int&gt;(); };
6857
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006858classTemplateSpecializationDecl(hasAnyTemplateArgument(
6859 refersToType(asString("int"))))
6860 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006861
6862functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6863 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006864</pre></td></tr>
6865
6866
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006867<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006868<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6869matches the given matcher.
6870
6871The associated declaration is:
6872- for type nodes, the declaration of the underlying type
6873- for CallExpr, the declaration of the callee
6874- for MemberExpr, the declaration of the referenced member
6875- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006876- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006877- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006878
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006879For type nodes, hasDeclaration will generally match the declaration of the
6880sugared type. Given
6881 class X {};
6882 typedef X Y;
6883 Y y;
6884in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6885typedefDecl. A common use case is to match the underlying, desugared type.
6886This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6887 varDecl(hasType(hasUnqualifiedDesugaredType(
6888 recordType(hasDeclaration(decl())))))
6889In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006890
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006891Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6892 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6893 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6894 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6895 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6896 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6897 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006898</pre></td></tr>
6899
6900
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006901<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
Haojian Wud898b092016-07-29 13:57:27 +00006902<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6903functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006904
6905Given
6906 template&lt;typename T, typename U&gt; class A {};
6907 A&lt;bool, int&gt; b;
6908 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00006909
Fangrui Song55942ab2018-01-22 22:34:15 +00006910 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00006911 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006912classTemplateSpecializationDecl(hasTemplateArgument(
6913 1, refersToType(asString("int"))))
6914 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006915
6916functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6917 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006918</pre></td></tr>
6919
6920
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006921<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006922<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
6923matches the given matcher.
6924
6925The associated declaration is:
6926- for type nodes, the declaration of the underlying type
6927- for CallExpr, the declaration of the callee
6928- for MemberExpr, the declaration of the referenced member
6929- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006930- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006931- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006932
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006933For type nodes, hasDeclaration will generally match the declaration of the
6934sugared type. Given
6935 class X {};
6936 typedef X Y;
6937 Y y;
6938in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6939typedefDecl. A common use case is to match the underlying, desugared type.
6940This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6941 varDecl(hasType(hasUnqualifiedDesugaredType(
6942 recordType(hasDeclaration(decl())))))
6943In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006944
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006945Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6946 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6947 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6948 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6949 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6950 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6951 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006952</pre></td></tr>
6953
6954
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006955<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 +00006956<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
6957
6958Generates results for each match.
6959
6960For example, in:
6961 class A { class B {}; class C {}; };
6962The matcher:
6963 cxxRecordDecl(hasName("::A"),
6964 findAll(cxxRecordDecl(isDefinition()).bind("m")))
6965will generate results for A, B and C.
6966
6967Usable as: Any Matcher
6968</pre></td></tr>
6969
6970
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006971<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
George Karpenkovba02bc52018-07-06 21:36:04 +00006972<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 +00006973matcher.
6974
6975Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6976 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6977 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00006978 and friend class X (matcher = friendDecl(hasType("X"))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006979 class X {};
6980 void y(X &amp;x) { x; X z; }
6981 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00006982 class Y { friend class X; };
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006983</pre></td></tr>
6984
6985
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006986<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006987<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6988matches the given matcher.
6989
6990The associated declaration is:
6991- for type nodes, the declaration of the underlying type
6992- for CallExpr, the declaration of the callee
6993- for MemberExpr, the declaration of the referenced member
6994- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006995- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006996- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006997
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006998For type nodes, hasDeclaration will generally match the declaration of the
6999sugared type. Given
7000 class X {};
7001 typedef X Y;
7002 Y y;
7003in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7004typedefDecl. A common use case is to match the underlying, desugared type.
7005This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7006 varDecl(hasType(hasUnqualifiedDesugaredType(
7007 recordType(hasDeclaration(decl())))))
7008In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007009
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007010Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
7011 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
7012 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
7013 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
7014 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
7015 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
7016 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Manuel Klimeka37e1102016-12-01 15:45:06 +00007017</pre></td></tr>
7018
7019
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007020<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
Manuel Klimeka37e1102016-12-01 15:45:06 +00007021<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7022type of the matched node.
7023
7024For example, in:
7025 class A {};
7026 using B = A;
George Karpenkovdaac52c2018-07-23 22:29:10 +00007027The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
Manuel Klimeka37e1102016-12-01 15:45:06 +00007028both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007029</pre></td></tr>
7030
7031
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007032<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007033<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7034
7035Given
7036 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7037unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7038 matches sizeof(a) and alignof(c)
7039</pre></td></tr>
7040
7041
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007042<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007043<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7044
7045Example matches true (matcher = hasUnaryOperand(
7046 cxxBoolLiteral(equals(true))))
7047 !true
7048</pre></td></tr>
7049
7050
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007051<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00007052<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7053given matcher. Implicit object expressions are included; that is, it matches
7054use of implicit `this`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00007055
7056Given
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00007057 struct X {
7058 int m;
7059 int f(X x) { x.m; return m; }
7060 };
7061memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7062 matches `x.m`, but not `m`; however,
7063memberExpr(hasObjectExpression(hasType(pointsTo(
7064 cxxRecordDecl(hasName("X"))))))
7065 matches `m` (aka. `this-&gt;m`), but not `x.m`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00007066</pre></td></tr>
7067
7068
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007069<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007070<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7071matches the given matcher.
7072
7073The associated declaration is:
7074- for type nodes, the declaration of the underlying type
7075- for CallExpr, the declaration of the callee
7076- for MemberExpr, the declaration of the referenced member
7077- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00007078- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00007079- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007080
Benjamin Kramerae7ff382018-01-17 16:50:14 +00007081For type nodes, hasDeclaration will generally match the declaration of the
7082sugared type. Given
7083 class X {};
7084 typedef X Y;
7085 Y y;
7086in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7087typedefDecl. A common use case is to match the underlying, desugared type.
7088This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7089 varDecl(hasType(hasUnqualifiedDesugaredType(
7090 recordType(hasDeclaration(decl())))))
7091In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007092
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007093Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
7094 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
7095 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
7096 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
7097 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
7098 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
7099 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007100</pre></td></tr>
7101
7102
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007103<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007104<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7105
7106Given
7107 namespace X { void b(); }
7108 using X::b;
7109usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7110 matches using X::b </pre></td></tr>
7111
7112
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007113<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007114<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7115matched by the given matcher.
7116
7117Given
7118 namespace X { int a; void b(); }
7119 using X::a;
7120 using X::b;
7121usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7122 matches using X::b but not using X::a </pre></td></tr>
7123
7124
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007125<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
George Karpenkovba02bc52018-07-06 21:36:04 +00007126<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 +00007127declaration's type.
7128
7129In case of a value declaration (for example a variable declaration),
7130this resolves one layer of indirection. For example, in the value
7131declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7132X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7133declaration of x.
7134
7135Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7136 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00007137 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007138 class X {};
7139 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00007140 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007141
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007142Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007143</pre></td></tr>
7144
7145
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007146<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
George Karpenkovba02bc52018-07-06 21:36:04 +00007147<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 +00007148matcher.
7149
7150Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7151 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00007152 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00007153 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007154 class X {};
7155 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00007156 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00007157 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007158</pre></td></tr>
7159
7160
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007161<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007162<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7163that matches the given matcher.
7164
7165Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7166 bool y() { return true; }
7167 bool x = y();
7168</pre></td></tr>
7169
7170
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007171<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007172<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7173expression.
7174
7175Given
7176 void f(int b) {
7177 int a[b];
7178 }
7179variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7180 varDecl(hasName("b")))))))
7181 matches "int a[b]"
7182</pre></td></tr>
7183
7184
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007185<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00007186<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7187definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007188
7189Given
7190 for (;;) {}
7191hasBody(compoundStmt())
7192 matches 'for (;;) {}'
7193with compoundStmt()
7194 matching '{}'
7195</pre></td></tr>
7196
7197
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007198<tr><td>Matcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007199<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 +00007200switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007201
7202Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7203 if (true) {}
7204</pre></td></tr>
7205
7206
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007207<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007208<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7209NestedNameSpecifier-matcher matches.
7210</pre></td></tr>
7211
7212
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007213<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007214<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7215QualType-matcher matches.
7216</pre></td></tr>
7217
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00007218<!--END_TRAVERSAL_MATCHERS -->
7219</table>
7220
7221</div>
7222</body>
7223</html>
7224
7225