blob: 05f5c1fe486c2ae5974f7fada5dfa87b9c149580 [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;
2643</pre></td></tr>
2644
2645
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002646<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 +00002647<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2648
2649
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002650<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 +00002651<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 +00002652
Peter Wua9244b52017-06-08 22:00:58 +00002653Given
2654 f('false, 3.14, 42);
2655characterLiteral(equals(0))
2656 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2657 match false
2658floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2659 match 3.14
2660integerLiteral(equals(42))
2661 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002662
Clement Courbet43bdba42017-07-11 15:45:22 +00002663Note that you cannot directly match a negative numeric literal because the
2664minus sign is not part of the literal: It is a unary operator whose operand
2665is the positive numeric literal. Instead, you must use a unaryOperator()
2666matcher to match the minus sign:
2667
2668unaryOperator(hasOperatorName("-"),
2669 hasUnaryOperand(integerLiteral(equals(13))))
2670
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002671Usable 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;,
2672 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 +00002673</pre></td></tr>
2674
2675
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002676<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 +00002677<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2678
2679
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002680<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 +00002681<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2682
2683
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002684<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 +00002685<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2686
2687Given
2688 template&lt;typename T&gt; struct C {};
2689 C&lt;int&gt; c;
2690classTemplateSpecializationDecl(templateArgumentCountIs(1))
2691 matches C&lt;int&gt;.
2692</pre></td></tr>
2693
2694
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002695<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 +00002696<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2697child statements.
2698
2699Example: Given
2700 { for (;;) {} }
2701compoundStmt(statementCountIs(0)))
2702 matches '{}'
2703 but does not match the outer compound statement.
2704</pre></td></tr>
2705
2706
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002707<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 +00002708<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002709
2710Given
2711 int a[42];
2712 int b[2 * 21];
2713 int c[41], d[43];
Etienne Bergeron3588be72016-05-12 04:20:04 +00002714 char *s = "abcd";
2715 wchar_t *ws = L"abcd";
2716 char *w = "a";
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002717constantArrayType(hasSize(42))
2718 matches "int a[42]" and "int b[2 * 21]"
Etienne Bergeron3588be72016-05-12 04:20:04 +00002719stringLiteral(hasSize(4))
2720 matches "abcd", L"abcd"
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002721</pre></td></tr>
2722
2723
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002724<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 +00002725<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2726declarations.
2727
2728Example: Given
2729 int a, b;
2730 int c;
2731 int d = 2, e;
2732declCountIs(2)
2733 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2734</pre></td></tr>
2735
2736
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002737<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 +00002738<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2739
2740Matches a node if it equals the node previously bound to ID.
2741
2742Given
2743 class X { int a; int b; };
2744cxxRecordDecl(
2745 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2746 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2747 matches the class X, as a and b have the same type.
2748
2749Note that when multiple matches are involved via forEach* matchers,
2750equalsBoundNodes acts as a filter.
2751For example:
2752compoundStmt(
2753 forEachDescendant(varDecl().bind("d")),
2754 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2755will trigger a match for each combination of variable declaration
2756and reference to that variable declaration within a compound statement.
2757</pre></td></tr>
2758
2759
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002760<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 +00002761<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2762
2763Decl has pointer identity in the AST.
2764</pre></td></tr>
2765
2766
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002767<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 +00002768<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2769
2770Given
2771 __attribute__((device)) void f() { ... }
2772decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2773f. If the matcher is use from clang-query, attr::Kind parameter should be
2774passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2775</pre></td></tr>
2776
2777
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002778<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 +00002779<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2780partially matching a given regex.
2781
2782Example matches Y but not X
2783 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2784 #include "ASTMatcher.h"
2785 class X {};
2786ASTMatcher.h:
2787 class Y {};
2788
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002789Usable 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 +00002790</pre></td></tr>
2791
2792
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002793<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 +00002794<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2795
2796Example matches X but not Y
2797 (matcher = cxxRecordDecl(isExpansionInMainFile())
2798 #include &lt;Y.h&gt;
2799 class X {};
2800Y.h:
2801 class Y {};
2802
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002803Usable 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 +00002804</pre></td></tr>
2805
2806
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002807<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 +00002808<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2809
2810Example matches Y but not X
2811 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2812 #include &lt;SystemHeader.h&gt;
2813 class X {};
2814SystemHeader.h:
2815 class Y {};
2816
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002817Usable 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 +00002818</pre></td></tr>
2819
2820
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002821<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 +00002822<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
Aaron Ballman94f3e742018-12-11 19:30:49 +00002823by the compiler (eg. implicit default/copy constructors).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002824</pre></td></tr>
2825
2826
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002827<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 +00002828<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2829
2830Given
2831 class C {
2832 public: int a;
2833 protected: int b;
2834 private: int c;
2835 };
2836fieldDecl(isPrivate())
Cong Liu8a02efb2016-06-24 09:38:03 +00002837 matches 'int c;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002838</pre></td></tr>
2839
2840
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002841<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 +00002842<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2843
2844Given
2845 class C {
2846 public: int a;
2847 protected: int b;
2848 private: int c;
2849 };
2850fieldDecl(isProtected())
Cong Liu8a02efb2016-06-24 09:38:03 +00002851 matches 'int b;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002852</pre></td></tr>
2853
2854
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002855<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 +00002856<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2857
2858Given
2859 class C {
2860 public: int a;
2861 protected: int b;
2862 private: int c;
2863 };
2864fieldDecl(isPublic())
Cong Liu8a02efb2016-06-24 09:38:03 +00002865 matches 'int a;'
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002866</pre></td></tr>
2867
2868
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002869<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 +00002870<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2871a specific number of designators.
2872
2873Example: Given
2874 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2875 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2876designatorCountIs(2)
2877 matches '{ [2].y = 1.0, [0].x = 1.0 }',
2878 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2879</pre></td></tr>
2880
2881
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002882<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 +00002883<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2884
2885Example matches Y (matcher = enumDecl(isScoped()))
2886enum X {};
2887enum class Y {};
2888</pre></td></tr>
2889
2890
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002891<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 +00002892<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
2893neither type- nor value-dependent.
2894
2895In the following example, the expression sizeof(sizeof(T() + T()))
2896is instantiation-dependent (since it involves a template parameter T),
2897but is neither type- nor value-dependent, since the type of the inner
2898sizeof is known (std::size_t) and therefore the size of the outer
2899sizeof is known.
2900 template&lt;typename T&gt;
2901 void f(T x, T y) { sizeof(sizeof(T() + T()); }
2902expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
2903</pre></td></tr>
2904
2905
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002906<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 +00002907<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
2908is not yet instantiated.
2909
2910For example, the expressions "x" and "x + y" are type-dependent in
2911the following code, but "y" is not type-dependent:
2912 template&lt;typename T&gt;
2913 void add(T x, int y) {
2914 x + y;
2915 }
2916expr(isTypeDependent()) matches x + y
2917</pre></td></tr>
2918
2919
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002920<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 +00002921<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
2922non-type template parameter.
2923
2924For example, the array bound of "Chars" in the following example is
2925value-dependent.
2926 template&lt;int Size&gt; int f() { return Size; }
2927expr(isValueDependent()) matches return Size
2928</pre></td></tr>
2929
2930
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002931<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 +00002932<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2933bit width.
Aaron Ballman5c574342016-07-06 18:25:16 +00002934
2935Given
2936 class C {
2937 int a : 2;
2938 int b : 4;
2939 int c : 2;
2940 };
Malcolm Parsons81e48b22016-12-24 13:22:26 +00002941fieldDecl(hasBitWidth(2))
Aaron Ballman5c574342016-07-06 18:25:16 +00002942 matches 'int a;' and 'int c;' but not 'int b;'.
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_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 +00002947<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2948
2949Given
2950 class C {
2951 int a : 2;
2952 int b;
2953 };
2954fieldDecl(isBitField())
2955 matches 'int a;' but not 'int b;'.
2956</pre></td></tr>
2957
2958
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002959<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 +00002960<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 +00002961
Peter Wua9244b52017-06-08 22:00:58 +00002962Given
2963 f('false, 3.14, 42);
2964characterLiteral(equals(0))
2965 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2966 match false
2967floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2968 match 3.14
2969integerLiteral(equals(42))
2970 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002971
Clement Courbet43bdba42017-07-11 15:45:22 +00002972Note that you cannot directly match a negative numeric literal because the
2973minus sign is not part of the literal: It is a unary operator whose operand
2974is the positive numeric literal. Instead, you must use a unaryOperator()
2975matcher to match the minus sign:
2976
2977unaryOperator(hasOperatorName("-"),
2978 hasUnaryOperand(integerLiteral(equals(13))))
2979
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002980Usable 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;,
2981 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 +00002982</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('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00002986<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2987
2988
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00002989<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 +00002990<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2991
2992Given:
2993 void f();
2994 void g() noexcept;
2995 void h() noexcept(true);
2996 void i() noexcept(false);
2997 void j() throw();
2998 void k() throw(int);
2999 void l() throw(...);
Aaron Ballman230ad972016-06-07 17:34:45 +00003000functionDecl(hasDynamicExceptionSpec()) and
3001 functionProtoType(hasDynamicExceptionSpec())
3002 match the declarations of j, k, and l, but not f, g, h, or i.
Aaron Ballmanabdbbbc2016-05-16 16:49:01 +00003003</pre></td></tr>
3004
3005
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003006<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 +00003007<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3008
3009Matches overloaded operator names specified in strings without the
3010"operator" prefix: e.g. "&lt;&lt;".
3011
3012Given:
3013 class A { int operator*(); };
3014 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3015 A a;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003016 a &lt;&lt; a; // &lt;-- This matches
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003017
3018cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3019specified line and
3020cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3021matches the declaration of A.
3022
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003023Usable 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 +00003024</pre></td></tr>
3025
3026
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003027<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 +00003028<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3029
3030Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3031int X() {}
3032auto Y() -&gt; int {}
3033</pre></td></tr>
3034
3035
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003036<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 +00003037<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3038 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003039
3040Given:
3041 constexpr int foo = 42;
3042 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003043 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003044varDecl(isConstexpr())
3045 matches the declaration of foo.
3046functionDecl(isConstexpr())
3047 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00003048ifStmt(isConstexpr())
3049 matches the if statement in baz.
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('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
Aaron Ballmanc35724c2016-01-21 15:18:25 +00003054<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3055
3056Given:
3057 class A { ~A(); };
3058 class B { ~B() = default; };
3059functionDecl(isDefaulted())
3060 matches the declaration of ~B, but not ~A.
3061</pre></td></tr>
3062
3063
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003064<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 +00003065<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003066
3067Example matches A, va, fa
3068 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00003069 class B; // Doesn't match, as it has no body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003070 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003071 extern int vb; // Doesn't match, as it doesn't define the variable.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003072 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00003073 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003074 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00003075 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00003076 @end
3077 @implementation X
3078 - (void)ma {}
3079 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003080
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003081Usable 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;,
3082 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003083</pre></td></tr>
3084
3085
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003086<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 +00003087<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3088
3089Given:
3090 void Func();
3091 void DeletedFunc() = delete;
3092functionDecl(isDeleted())
3093 matches the declaration of DeletedFunc, but not Func.
3094</pre></td></tr>
3095
3096
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003097<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 +00003098<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3099static member variable template instantiations.
3100
3101Given
3102 template&lt;typename T&gt; void A(T t) { }
3103 template&lt;&gt; void A(int N) { }
3104functionDecl(isExplicitTemplateSpecialization())
3105 matches the specialization A&lt;int&gt;().
3106
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003107Usable 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 +00003108</pre></td></tr>
3109
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003110
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003111<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 +00003112<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003113
3114Given:
3115 extern "C" void f() {}
3116 extern "C" { void g() {} }
3117 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003118 extern "C" int x = 1;
3119 extern "C" int y = 2;
3120 int z = 3;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003121functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00003122 matches the declaration of f and g, but not the declaration of h.
3123varDecl(isExternC())
3124 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003125</pre></td></tr>
3126
Benjamin Kramerae7ff382018-01-17 16:50:14 +00003127
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003128<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 +00003129<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3130the inline keyword.
3131
3132Given
3133 inline void f();
3134 void g();
3135 namespace n {
3136 inline namespace m {}
3137 }
3138functionDecl(isInline()) will match ::f().
3139namespaceDecl(isInline()) will match n::m.
3140</pre></td></tr>
3141
3142
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003143<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 +00003144<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3145into an executable program.
3146</pre></td></tr>
3147
3148
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003149<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 +00003150<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3151
3152Given
3153 void nope();
3154 [[noreturn]] void a();
3155 __attribute__((noreturn)) void b();
3156 struct c { [[noreturn]] c(); };
3157functionDecl(isNoReturn())
3158 matches all of those except
3159 void nope();
3160</pre></td></tr>
3161
3162
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003163<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 +00003164<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3165
3166Given:
3167 void f();
3168 void g() noexcept;
3169 void h() throw();
3170 void i() throw(int);
3171 void j() noexcept(false);
Aaron Ballman230ad972016-06-07 17:34:45 +00003172functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3173 match the declarations of g, and h, but not f, i or j.
Aaron Ballmana60bcda2015-12-02 15:23:59 +00003174</pre></td></tr>
3175
3176
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003177<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 +00003178<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
Haojian Wu398a8ea2016-09-27 07:53:20 +00003179class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00003180
3181Given:
3182 static void f() {}
3183 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00003184 extern int j;
3185 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00003186functionDecl(isStaticStorageClass())
3187 matches the function declaration f.
3188varDecl(isStaticStorageClass())
3189 matches the variable declaration i.
3190</pre></td></tr>
3191
3192
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003193<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 +00003194<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3195member variable template instantiations.
3196
3197Given
3198 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3199or
3200 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00003201or
3202 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003203cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3204 matches the template instantiation of X&lt;A&gt;.
3205
3206But given
3207 template &lt;typename T&gt; class X {}; class A {};
3208 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3209cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3210 does not match, as X&lt;A&gt; is an explicit template specialization.
3211
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003212Usable 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 +00003213</pre></td></tr>
3214
3215
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003216<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 +00003217<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3218
3219Example matches f, but not g or h. The function i will not match, even when
3220compiled in C mode.
3221 void f(...);
3222 void g(int);
3223 template &lt;typename... Ts&gt; void h(Ts...);
3224 void i();
3225</pre></td></tr>
3226
3227
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003228<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 +00003229<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3230specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003231
3232Given
3233 void f(int i) {}
3234 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003235 void h(int i, int j);
3236 void j(int i);
3237 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003238functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003239 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003240functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003241 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003242functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003243 matches k
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003244</pre></td></tr>
3245
3246
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003247<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 +00003248<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3249
3250Given:
3251 void f();
3252 void g() noexcept;
3253 void h() noexcept(true);
3254 void i() noexcept(false);
3255 void j() throw();
3256 void k() throw(int);
3257 void l() throw(...);
3258functionDecl(hasDynamicExceptionSpec()) and
3259 functionProtoType(hasDynamicExceptionSpec())
3260 match the declarations of j, k, and l, but not f, g, h, or i.
3261</pre></td></tr>
3262
3263
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003264<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 +00003265<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3266
3267Given:
3268 void f();
3269 void g() noexcept;
3270 void h() throw();
3271 void i() throw(int);
3272 void j() noexcept(false);
3273functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3274 match the declarations of g, and h, but not f, i or j.
3275</pre></td></tr>
3276
3277
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003278<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 +00003279<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3280specific parameter count.
3281
3282Given
3283 void f(int i) {}
3284 void g(int i, int j) {}
3285 void h(int i, int j);
3286 void j(int i);
3287 void k(int x, int y, int z, ...);
3288functionDecl(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003289 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003290functionProtoType(parameterCountIs(2))
Fangrui Song55942ab2018-01-22 22:34:15 +00003291 matches g and h
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00003292functionProtoType(parameterCountIs(3))
Fangrui Song55942ab2018-01-22 22:34:15 +00003293 matches k
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003294</pre></td></tr>
3295
3296
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003297<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 +00003298<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3299 and if constexpr.
3300
3301Given:
3302 constexpr int foo = 42;
3303 constexpr int bar();
3304 void baz() { if constexpr(1 &gt; 0) {} }
3305varDecl(isConstexpr())
3306 matches the declaration of foo.
3307functionDecl(isConstexpr())
3308 matches the declaration of bar.
3309ifStmt(isConstexpr())
3310 matches the if statement in baz.
3311</pre></td></tr>
3312
3313
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003314<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 +00003315<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3316
3317
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003318<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 +00003319<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 +00003320
Peter Wua9244b52017-06-08 22:00:58 +00003321Given
3322 f('false, 3.14, 42);
3323characterLiteral(equals(0))
3324 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3325 match false
3326floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3327 match 3.14
3328integerLiteral(equals(42))
3329 matches 42
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003330
Clement Courbet43bdba42017-07-11 15:45:22 +00003331Note that you cannot directly match a negative numeric literal because the
3332minus sign is not part of the literal: It is a unary operator whose operand
3333is the positive numeric literal. Instead, you must use a unaryOperator()
3334matcher to match the minus sign:
3335
3336unaryOperator(hasOperatorName("-"),
3337 hasUnaryOperand(integerLiteral(equals(13))))
3338
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003339Usable 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;,
3340 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 +00003341</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('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
Peter Wua9244b52017-06-08 22:00:58 +00003345<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3346
3347
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003348<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 +00003349<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3350
3351
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003352<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 +00003353<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3354to '.'.
3355
3356Member calls on the implicit this pointer match as called with '-&gt;'.
3357
3358Given
3359 class Y {
3360 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
Shuai Wange0248ae2018-09-17 18:48:43 +00003361 template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003362 int a;
3363 static int b;
3364 };
Shuai Wange0248ae2018-09-17 18:48:43 +00003365 template &lt;class T&gt;
3366 class Z {
3367 void x() { this-&gt;m; }
3368 };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003369memberExpr(isArrow())
3370 matches this-&gt;x, x, y.x, a, this-&gt;b
Shuai Wange0248ae2018-09-17 18:48:43 +00003371cxxDependentScopeMemberExpr(isArrow())
3372 matches this-&gt;m
3373unresolvedMemberExpr(isArrow())
3374 matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003375</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_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 +00003379<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3380
3381Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3382void f() {
3383 int x;
3384 static int y;
3385}
3386int z;
3387
3388Example matches f() because it has external formal linkage despite being
3389unique to the translation unit as though it has internal likage
3390(matcher = functionDecl(hasExternalFormalLinkage()))
3391
3392namespace {
3393void f() {}
3394}
3395</pre></td></tr>
3396
3397
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003398<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 +00003399<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3400
3401Supports specifying enclosing namespaces or classes by prefixing the name
3402with '&lt;enclosing&gt;::'.
3403Does not match typedefs of an underlying type with the given name.
3404
3405Example matches X (Name == "X")
3406 class X;
3407
3408Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3409 namespace a { namespace b { class X; } }
3410</pre></td></tr>
3411
3412
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003413<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 +00003414<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3415a substring matched by the given RegExp.
3416
3417Supports specifying enclosing namespaces or classes by
3418prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
3419of an underlying type with the given name.
3420
3421Example matches X (regexp == "::X")
3422 class X;
3423
3424Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3425 namespace foo { namespace bar { class X; } }
3426</pre></td></tr>
3427
3428
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003429<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 +00003430<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3431
3432Given
3433 namespace n {
Aaron Ballman94f3e742018-12-11 19:30:49 +00003434 namespace {} // #1
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003435 }
3436namespaceDecl(isAnonymous()) will match #1 but not ::n.
3437</pre></td></tr>
3438
3439
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003440<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 +00003441<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3442the inline keyword.
3443
3444Given
3445 inline void f();
3446 void g();
3447 namespace n {
3448 inline namespace m {}
3449 }
3450functionDecl(isInline()) will match ::f().
3451namespaceDecl(isInline()) will match n::m.
3452</pre></td></tr>
3453
3454
Roman Lebedev33ef20e2019-03-21 15:33:24 +00003455<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>
3456<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3457
3458Given
3459
3460 #pragma omp parallel
3461 #pragma omp parallel default(none)
3462 #pragma omp parallel default(shared)
3463
3464``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3465</pre></td></tr>
3466
3467
3468<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>
3469<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3470
3471Given
3472
3473 #pragma omp parallel
3474 #pragma omp parallel default(none)
3475 #pragma omp parallel default(shared)
3476
3477``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3478</pre></td></tr>
3479
3480
3481<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>
3482<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3483clause kind.
3484
3485Given
3486
3487 #pragma omp parallel
3488 #pragma omp parallel for
3489 #pragma omp for
3490
3491`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3492``omp parallel`` and ``omp parallel for``.
3493
3494If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3495should be passed as a quoted string. e.g.,
3496``isAllowedToContainClauseKind("OMPC_default").``
3497</pre></td></tr>
3498
3499
Roman Lebedevc8161952019-03-21 15:33:35 +00003500<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>
3501<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3502i.e., directives that can't have a structured block.
3503
3504Given
3505
3506 #pragma omp parallel
3507 {}
3508 #pragma omp taskyield
3509
3510``ompExecutableDirective(isStandaloneDirective()))`` matches
3511``omp taskyield``.
3512</pre></td></tr>
3513
3514
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003515<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 +00003516<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3517a specific number of arguments (including absent default arguments).
3518
3519Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3520 void f(int x, int y);
3521 f(0, 0);
3522</pre></td></tr>
3523
3524
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003525<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 +00003526<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3527
3528objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3529message expression in
3530
3531 UIWebView *webView = ...;
3532 CGRect bodyFrame = webView.frame;
3533 bodyFrame.size.height = self.bodyContentHeight;
3534 webView.frame = bodyFrame;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003535 // ^---- matches here
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003536</pre></td></tr>
3537
3538
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003539<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 +00003540<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3541
3542Matches only when the selector of the objCMessageExpr is NULL. This may
3543represent an error condition in the tree!
3544</pre></td></tr>
3545
3546
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003547<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 +00003548<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3549
3550 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3551 matches the outer message expr in the code below, but NOT the message
3552 invocation for self.bodyView.
3553 [self.bodyView loadHTMLString:html baseURL:NULL];
3554</pre></td></tr>
3555
3556
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003557<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 +00003558<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3559
3560 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3561 matches self.bodyView in the code below, but NOT the outer message
3562 invocation of "loadHTMLString:baseURL:".
3563 [self.bodyView loadHTMLString:html baseURL:NULL];
3564</pre></td></tr>
3565
3566
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003567<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 +00003568<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3569
3570Example
3571matcher = objcMessagaeExpr(isInstanceMessage())
3572matches
3573 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00003574 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003575but not
George Karpenkovdaac52c2018-07-23 22:29:10 +00003576 [NSString stringWithFormat:@"format"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00003577</pre></td></tr>
3578
3579
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003580<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 +00003581<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3582a substring matched by the given RegExp.
3583 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3584 invocation for self.bodyView.
3585 [self.bodyView loadHTMLString:html baseURL:NULL];
3586</pre></td></tr>
3587
3588
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003589<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 +00003590<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3591
3592 matcher = objCMessageExpr(numSelectorArgs(0));
3593 matches self.bodyView in the code below
3594
3595 matcher = objCMessageExpr(numSelectorArgs(2));
3596 matches the invocation of "loadHTMLString:baseURL:" but not that
3597 of self.bodyView
3598 [self.bodyView loadHTMLString:html baseURL:NULL];
3599</pre></td></tr>
3600
3601
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003602<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 +00003603<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3604
3605Example matches A, va, fa
3606 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00003607 class B; // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003608 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003609 extern int vb; // Doesn't match, as it doesn't define the variable.
Dave Leebe398682017-11-14 14:17:26 +00003610 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00003611 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003612 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00003613 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00003614 @end
3615 @implementation X
3616 - (void)ma {}
3617 @end
3618
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003619Usable 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;,
3620 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Dave Leebe398682017-11-14 14:17:26 +00003621</pre></td></tr>
3622
3623
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003624<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 +00003625<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3626
3627Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3628void x(int val) {}
3629void y(int val = 0) {}
3630</pre></td></tr>
3631
3632
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003633<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 +00003634<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3635
3636Given
3637 class Y { public: void x(); };
3638 void z() { Y* y; y-&gt;x(); }
3639cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3640 matches y-&gt;x()
3641</pre></td></tr>
3642
3643
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003644<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 +00003645<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3646
3647Matches a node if it equals the node previously bound to ID.
3648
3649Given
3650 class X { int a; int b; };
3651cxxRecordDecl(
3652 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3653 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3654 matches the class X, as a and b have the same type.
3655
3656Note that when multiple matches are involved via forEach* matchers,
3657equalsBoundNodes acts as a filter.
3658For example:
3659compoundStmt(
3660 forEachDescendant(varDecl().bind("d")),
3661 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3662will trigger a match for each combination of variable declaration
3663and reference to that variable declaration within a compound statement.
3664</pre></td></tr>
3665
3666
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003667<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 +00003668<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3669the node, not hidden within a typedef.
3670
3671Given
3672 typedef const int const_int;
3673 const_int i;
3674 int *const j;
3675 int *volatile k;
3676 int m;
3677varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3678i is const-qualified but the qualifier is not local.
3679</pre></td></tr>
3680
3681
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003682<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 +00003683<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3684
3685Given
3686 void a(char);
3687 void b(wchar_t);
3688 void c(double);
3689functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3690matches "a(char)", "b(wchar_t)", but not "c(double)".
3691</pre></td></tr>
3692
3693
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003694<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 +00003695<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3696the Objective-C object pointer type, which is different despite being
3697syntactically similar.
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003698
3699Given
3700 int *i = nullptr;
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003701
3702 @interface Foo
3703 @end
3704 Foo *f;
3705
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003706 int j;
3707varDecl(hasType(isAnyPointer()))
Alexander Kornienko7d20a5a2016-04-13 11:13:08 +00003708 matches "int *i" and "Foo *f", but not "int j".
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003709</pre></td></tr>
3710
3711
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003712<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 +00003713<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3714include "top-level" const.
3715
3716Given
3717 void a(int);
3718 void b(int const);
3719 void c(const int);
3720 void d(const int*);
3721 void e(int const) {};
3722functionDecl(hasAnyParameter(hasType(isConstQualified())))
3723 matches "void b(int const)", "void c(const int)" and
3724 "void e(int const) {}". It does not match d as there
3725 is no top-level const on the parameter type "const int *".
3726</pre></td></tr>
3727
3728
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003729<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 +00003730<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3731
3732Given
3733 void a(int);
3734 void b(long);
3735 void c(double);
3736functionDecl(hasAnyParameter(hasType(isInteger())))
3737matches "a(int)", "b(long)", but not "c(double)".
3738</pre></td></tr>
3739
3740
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003741<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 +00003742<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3743
3744Given
3745 void a(int);
3746 void b(unsigned long);
3747 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003748functionDecl(hasAnyParameter(hasType(isSignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003749matches "a(int)", but not "b(unsigned long)" and "c(double)".
3750</pre></td></tr>
3751
3752
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003753<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 +00003754<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3755
3756Given
3757 void a(int);
3758 void b(unsigned long);
3759 void c(double);
Aaron Ballman75de7072016-08-18 12:26:17 +00003760functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
Clement Courbet42517592016-07-12 06:36:00 +00003761matches "b(unsigned long)", but not "a(int)" and "c(double)".
3762</pre></td></tr>
3763
3764
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003765<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 +00003766<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3767include "top-level" volatile.
3768
3769Given
3770 void a(int);
3771 void b(int volatile);
3772 void c(volatile int);
3773 void d(volatile int*);
3774 void e(int volatile) {};
3775functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3776 matches "void b(int volatile)", "void c(volatile int)" and
3777 "void e(int volatile) {}". It does not match d as there
3778 is no top-level volatile on the parameter type "volatile int *".
3779</pre></td></tr>
3780
3781
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003782<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 +00003783<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3784
3785Example matches C, but not S or U.
3786 struct S {};
3787 class C {};
3788 union U {};
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_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 +00003793<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3794
3795Example matches S, but not C or U.
3796 struct S {};
3797 class C {};
3798 union U {};
3799</pre></td></tr>
3800
3801
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003802<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 +00003803<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3804
3805Example matches U, but not C or S.
3806 struct S {};
3807 class C {};
3808 union U {};
3809</pre></td></tr>
3810
3811
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003812<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 +00003813<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3814
3815Matches a node if it equals the node previously bound to ID.
3816
3817Given
3818 class X { int a; int b; };
3819cxxRecordDecl(
3820 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3821 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3822 matches the class X, as a and b have the same type.
3823
3824Note that when multiple matches are involved via forEach* matchers,
3825equalsBoundNodes acts as a filter.
3826For example:
3827compoundStmt(
3828 forEachDescendant(varDecl().bind("d")),
3829 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3830will trigger a match for each combination of variable declaration
3831and reference to that variable declaration within a compound statement.
3832</pre></td></tr>
3833
3834
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003835<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 +00003836<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3837
3838Stmt has pointer identity in the AST.
3839</pre></td></tr>
3840
3841
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003842<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 +00003843<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3844partially matching a given regex.
3845
3846Example matches Y but not X
3847 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3848 #include "ASTMatcher.h"
3849 class X {};
3850ASTMatcher.h:
3851 class Y {};
3852
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003853Usable 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 +00003854</pre></td></tr>
3855
3856
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003857<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 +00003858<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3859
3860Example matches X but not Y
3861 (matcher = cxxRecordDecl(isExpansionInMainFile())
3862 #include &lt;Y.h&gt;
3863 class X {};
3864Y.h:
3865 class Y {};
3866
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003867Usable 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 +00003868</pre></td></tr>
3869
3870
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003871<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 +00003872<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3873
3874Example matches Y but not X
3875 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3876 #include &lt;SystemHeader.h&gt;
3877 class X {};
3878SystemHeader.h:
3879 class Y {};
3880
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003881Usable 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 +00003882</pre></td></tr>
3883
3884
Roman Lebedevc8161952019-03-21 15:33:35 +00003885<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>
3886<tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block
3887of an OpenMP executable directive.
3888
3889Given
3890
3891 #pragma omp parallel
3892 {}
3893
3894``stmt(isOMPStructuredBlock()))`` matches ``{}``.
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_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 +00003899<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3900
3901Given
3902 int a[42];
3903 int b[2 * 21];
3904 int c[41], d[43];
3905 char *s = "abcd";
3906 wchar_t *ws = L"abcd";
3907 char *w = "a";
3908constantArrayType(hasSize(42))
3909 matches "int a[42]" and "int b[2 * 21]"
3910stringLiteral(hasSize(4))
3911 matches "abcd", L"abcd"
3912</pre></td></tr>
3913
3914
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003915<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 +00003916<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3917
3918Example matches A, va, fa
3919 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00003920 class B; // Doesn't match, as it has no body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003921 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00003922 extern int vb; // Doesn't match, as it doesn't define the variable.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003923 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00003924 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00003925 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00003926 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00003927 @end
3928 @implementation X
3929 - (void)ma {}
3930 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003931
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003932Usable 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;,
3933 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003934</pre></td></tr>
3935
3936
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003937<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 +00003938<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3939
3940Note that 'Value' is a string as the template argument's value is
3941an arbitrary precision integer. 'Value' must be euqal to the canonical
3942representation of that integral value in base 10.
3943
3944Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003945 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003946 C&lt;42&gt; c;
3947classTemplateSpecializationDecl(
3948 hasAnyTemplateArgument(equalsIntegralValue("42")))
3949 matches the implicit instantiation of C in C&lt;42&gt;.
3950</pre></td></tr>
3951
3952
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003953<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 +00003954<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3955
3956Given
Fangrui Song55942ab2018-01-22 22:34:15 +00003957 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003958 C&lt;42&gt; c;
3959classTemplateSpecializationDecl(
3960 hasAnyTemplateArgument(isIntegral()))
3961 matches the implicit instantiation of C in C&lt;42&gt;
3962 with isIntegral() matching 42.
3963</pre></td></tr>
3964
3965
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003966<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 +00003967<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3968
3969Given
3970 template&lt;typename T&gt; struct C {};
3971 C&lt;int&gt; c;
3972classTemplateSpecializationDecl(templateArgumentCountIs(1))
3973 matches C&lt;int&gt;.
3974</pre></td></tr>
3975
3976
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003977<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 +00003978<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3979partially matching a given regex.
3980
3981Example matches Y but not X
3982 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3983 #include "ASTMatcher.h"
3984 class X {};
3985ASTMatcher.h:
3986 class Y {};
3987
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003988Usable 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 +00003989</pre></td></tr>
3990
3991
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00003992<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 +00003993<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3994
3995Example matches X but not Y
3996 (matcher = cxxRecordDecl(isExpansionInMainFile())
3997 #include &lt;Y.h&gt;
3998 class X {};
3999Y.h:
4000 class Y {};
4001
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004002Usable 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 +00004003</pre></td></tr>
4004
4005
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004006<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 +00004007<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4008
4009Example matches Y but not X
4010 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4011 #include &lt;SystemHeader.h&gt;
4012 class X {};
4013SystemHeader.h:
4014 class Y {};
4015
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004016Usable 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 +00004017</pre></td></tr>
4018
4019
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004020<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 +00004021<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4022
4023Given
4024 struct S { bool func(); };
4025functionDecl(returns(booleanType()))
4026 matches "bool func();"
4027</pre></td></tr>
4028
4029
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004030<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 +00004031<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4032
4033Matches a node if it equals the node previously bound to ID.
4034
4035Given
4036 class X { int a; int b; };
4037cxxRecordDecl(
4038 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4039 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4040 matches the class X, as a and b have the same type.
4041
4042Note that when multiple matches are involved via forEach* matchers,
4043equalsBoundNodes acts as a filter.
4044For example:
4045compoundStmt(
4046 forEachDescendant(varDecl().bind("d")),
4047 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4048will trigger a match for each combination of variable declaration
4049and reference to that variable declaration within a compound statement.
4050</pre></td></tr>
4051
4052
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004053<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 +00004054<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4055
4056Type has pointer identity in the AST.
4057</pre></td></tr>
4058
4059
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004060<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 +00004061<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4062
4063Given
4064 int i;
4065 float f;
4066realFloatingPointType()
4067 matches "float f" but not "int i"
4068</pre></td></tr>
4069
4070
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004071<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 +00004072<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4073
4074Given
4075 struct S { void func(); };
4076functionDecl(returns(voidType()))
4077 matches "void func();"
4078</pre></td></tr>
4079
4080
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004081<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 +00004082<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4083
4084Given
4085 int x;
4086 int s = sizeof(x) + alignof(x)
4087unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4088 matches sizeof(x)
4089</pre></td></tr>
4090
4091
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004092<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 +00004093<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4094unary).
4095
4096Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4097 !(a || b)
4098</pre></td></tr>
4099
4100
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004101<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 +00004102<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4103to '.'.
4104
4105Member calls on the implicit this pointer match as called with '-&gt;'.
4106
4107Given
4108 class Y {
4109 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4110 template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4111 int a;
4112 static int b;
4113 };
4114 template &lt;class T&gt;
4115 class Z {
4116 void x() { this-&gt;m; }
4117 };
4118memberExpr(isArrow())
4119 matches this-&gt;x, x, y.x, a, this-&gt;b
4120cxxDependentScopeMemberExpr(isArrow())
4121 matches this-&gt;m
4122unresolvedMemberExpr(isArrow())
4123 matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4124</pre></td></tr>
4125
4126
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004127<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 +00004128<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4129
4130Example matches x, but not y, z, or a.
4131(matcher = varDecl(hasAutomaticStorageDuration())
4132void f() {
4133 int x;
4134 static int y;
4135 thread_local int z;
4136}
4137int a;
4138</pre></td></tr>
4139
4140
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004141<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 +00004142<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4143
4144Example matches y and z (matcher = varDecl(hasGlobalStorage())
4145void f() {
4146 int x;
4147 static int y;
4148}
4149int z;
4150</pre></td></tr>
4151
4152
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004153<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 +00004154<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4155non-static local variable.
4156
4157Example matches x (matcher = varDecl(hasLocalStorage())
4158void f() {
4159 int x;
4160 static int y;
4161}
4162int z;
4163</pre></td></tr>
4164
4165
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004166<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 +00004167<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 +00004168It includes the variable declared at namespace scope and those declared
4169with "static" and "extern" storage class specifiers.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004170
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004171void f() {
4172 int x;
4173 static int y;
4174 thread_local int z;
4175}
4176int a;
Haojian Wu398a8ea2016-09-27 07:53:20 +00004177static int b;
4178extern int c;
4179varDecl(hasStaticStorageDuration())
4180 matches the function declaration y, a, b and c.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004181</pre></td></tr>
4182
4183
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004184<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 +00004185<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4186
4187Example matches z, but not x, z, or a.
4188(matcher = varDecl(hasThreadStorageDuration())
4189void f() {
4190 int x;
4191 static int y;
4192 thread_local int z;
4193}
4194int a;
4195</pre></td></tr>
4196
4197
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004198<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 +00004199<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4200 and if constexpr.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004201
4202Given:
4203 constexpr int foo = 42;
4204 constexpr int bar();
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00004205 void baz() { if constexpr(1 &gt; 0) {} }
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004206varDecl(isConstexpr())
4207 matches the declaration of foo.
4208functionDecl(isConstexpr())
4209 matches the declaration of bar.
Gabor Horvath3cd0aa32018-05-08 11:53:32 +00004210ifStmt(isConstexpr())
4211 matches the if statement in baz.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004212</pre></td></tr>
4213
4214
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004215<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 +00004216<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4217
4218Example matches A, va, fa
4219 class A {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00004220 class B; // Doesn't match, as it has no body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004221 int va;
Aaron Ballman94f3e742018-12-11 19:30:49 +00004222 extern int vb; // Doesn't match, as it doesn't define the variable.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004223 void fa() {}
Aaron Ballman94f3e742018-12-11 19:30:49 +00004224 void fb(); // Doesn't match, as it has no body.
Dave Leebe398682017-11-14 14:17:26 +00004225 @interface X
Aaron Ballman94f3e742018-12-11 19:30:49 +00004226 - (void)ma; // Doesn't match, interface is declaration.
Dave Leebe398682017-11-14 14:17:26 +00004227 @end
4228 @implementation X
4229 - (void)ma {}
4230 @end
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004231
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004232Usable 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;,
4233 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004234</pre></td></tr>
4235
4236
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004237<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 +00004238<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4239a C++ catch block, or an Objective-C statement.
4240
4241Example matches x (matcher = varDecl(isExceptionVariable())
4242void f(int y) {
4243 try {
4244 } catch (int x) {
4245 }
4246}
4247</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('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004251<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4252static member variable template instantiations.
4253
4254Given
4255 template&lt;typename T&gt; void A(T t) { }
4256 template&lt;&gt; void A(int N) { }
4257functionDecl(isExplicitTemplateSpecialization())
4258 matches the specialization A&lt;int&gt;().
4259
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004260Usable 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 +00004261</pre></td></tr>
4262
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004263
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('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00004265<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00004266
4267Given:
4268 extern "C" void f() {}
4269 extern "C" { void g() {} }
4270 void h() {}
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00004271 extern "C" int x = 1;
4272 extern "C" int y = 2;
4273 int z = 3;
Benjamin Kramer87e6d992016-08-04 10:02:03 +00004274functionDecl(isExternC())
Alexander Shaposhnikovf681c4e2017-09-22 19:29:38 +00004275 matches the declaration of f and g, but not the declaration of h.
4276varDecl(isExternC())
4277 matches the declaration of x and y, but not the declaration of z.
Benjamin Kramer87e6d992016-08-04 10:02:03 +00004278</pre></td></tr>
4279
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004280
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('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
Aaron Ballman31f48c52018-10-29 13:47:56 +00004282<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4283
4284Example matches y (matcher = varDecl(isStaticLocal()))
4285void f() {
4286 int x;
4287 static int y;
4288}
4289static int z;
4290</pre></td></tr>
4291
4292
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004293<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 +00004294<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
Haojian Wu398a8ea2016-09-27 07:53:20 +00004295class specifier ("static" keyword) written in the source.
Haojian Wub3d25462016-09-26 16:01:52 +00004296
4297Given:
4298 static void f() {}
4299 static int i = 0;
Haojian Wu398a8ea2016-09-27 07:53:20 +00004300 extern int j;
4301 int k;
Haojian Wub3d25462016-09-26 16:01:52 +00004302functionDecl(isStaticStorageClass())
4303 matches the function declaration f.
4304varDecl(isStaticStorageClass())
4305 matches the variable declaration i.
4306</pre></td></tr>
4307
4308
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004309<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 +00004310<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4311member variable template instantiations.
4312
4313Given
4314 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4315or
4316 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
Eric Liu09ee48e2018-02-21 14:22:42 +00004317or
4318 template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004319cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4320 matches the template instantiation of X&lt;A&gt;.
4321
4322But given
4323 template &lt;typename T&gt; class X {}; class A {};
4324 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4325cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4326 does not match, as X&lt;A&gt; is an explicit template specialization.
4327
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004328Usable 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 +00004329</pre></td></tr>
4330
4331
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004332<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 +00004333<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4334template instantiations.
4335
4336Given
4337 template&lt;typename T&gt; void A(T t) { T i; }
4338 A(0);
4339 A(0U);
4340functionDecl(isInstantiated())
4341 matches 'A(int) {...};' and 'A(unsigned) {...}'.
4342</pre></td></tr>
4343
4344
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004345<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 +00004346<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4347GNU's __null, C++11's nullptr, or C's NULL macro.
4348
4349Given:
4350 void *v1 = NULL;
4351 void *v2 = nullptr;
Aaron Ballman94f3e742018-12-11 19:30:49 +00004352 void *v3 = __null; // GNU extension
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00004353 char *cp = (char *)0;
4354 int *ip = 0;
4355 int i = 0;
4356expr(nullPointerConstant())
4357 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4358 initializer for i.
4359</pre></td></tr>
4360
4361
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004362<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 +00004363<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4364
4365This matcher is only provided as a performance optimization of hasName.
4366 hasAnyName(a, b, c)
4367 is equivalent to, but faster than
4368 anyOf(hasName(a), hasName(b), hasName(c))
4369</pre></td></tr>
4370
4371
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004372<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 +00004373<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4374Selector.getAsString()
4375
4376 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4377 matches both of the expressions below:
4378 [myObj methodA:argA];
4379 [myObj methodB:argB];
4380</pre></td></tr>
4381
4382
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004383<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 +00004384<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4385
4386Given
4387 int j;
4388 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4389 A(0);
4390 A(0U);
4391declStmt(isInTemplateInstantiation())
4392 matches 'int i;' and 'unsigned i'.
4393unless(stmt(isInTemplateInstantiation()))
4394 will NOT match j += 42; as it's shared between the template definition and
4395 instantiation.
4396</pre></td></tr>
4397
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00004398<!--END_NARROWING_MATCHERS -->
4399</table>
4400
4401<!-- ======================================================================= -->
4402<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4403<!-- ======================================================================= -->
4404
4405<p>Traversal matchers specify the relationship to other nodes that are
4406reachable from the current node.</p>
4407
4408<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4409forEachDescendant) which work on all nodes and allow users to write more generic
4410match expressions.</p>
4411
4412<table>
4413<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004414<!-- START_TRAVERSAL_MATCHERS -->
4415
4416<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>
4417<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4418
4419Unlike anyOf, eachOf will generate a match result for each
4420matching submatcher.
4421
4422For example, in:
4423 class A { int a; int b; };
4424The matcher:
4425 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4426 has(fieldDecl(hasName("b")).bind("v"))))
4427will generate two results binding "v", the first of which binds
4428the field declaration of a, the second the field declaration of
4429b.
4430
4431Usable as: Any Matcher
4432</pre></td></tr>
4433
4434
4435<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4436<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4437provided matcher.
4438
Fangrui Song55942ab2018-01-22 22:34:15 +00004439Example matches X, A, A::X, B, B::C, B::C::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004440 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
Fangrui Song55942ab2018-01-22 22:34:15 +00004441 class X {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00004442 class A { class X {}; }; // Matches A, because A::X is a class of name
4443 // X inside A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004444 class B { class C { class X {}; }; };
4445
4446DescendantT must be an AST base type.
4447
4448As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4449each result that matches instead of only on the first one.
4450
4451Note: Recursively combined ForEachDescendant can cause many matches:
4452 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4453 forEachDescendant(cxxRecordDecl())
4454 )))
4455will match 10 times (plus injected class name matches) on:
4456 class A { class B { class C { class D { class E {}; }; }; }; };
4457
4458Usable as: Any Matcher
4459</pre></td></tr>
4460
4461
4462<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4463<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4464provided matcher.
4465
Fangrui Song55942ab2018-01-22 22:34:15 +00004466Example matches X, Y, Y::X, Z::Y, Z::Y::X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004467 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
Fangrui Song55942ab2018-01-22 22:34:15 +00004468 class X {};
Aaron Ballman94f3e742018-12-11 19:30:49 +00004469 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
4470 // inside Y.
4471 class Z { class Y { class X {}; }; }; // Does not match Z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004472
4473ChildT must be an AST base type.
4474
4475As opposed to 'has', 'forEach' will cause a match for each result that
4476matches instead of only on the first one.
4477
4478Usable as: Any Matcher
4479</pre></td></tr>
4480
4481
4482<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4483<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4484matcher.
4485
4486Given
4487void f() { if (true) { int x = 42; } }
4488void g() { for (;;) { int x = 43; } }
4489expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4490
4491Usable as: Any Matcher
4492</pre></td></tr>
4493
4494
4495<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4496<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4497provided matcher.
4498
4499Example matches X, Y, Z
4500 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
Aaron Ballman94f3e742018-12-11 19:30:49 +00004501 class X {}; // Matches X, because X::X is a class of name X inside X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004502 class Y { class X {}; };
4503 class Z { class Y { class X {}; }; };
4504
4505DescendantT must be an AST base type.
4506
4507Usable as: Any Matcher
4508</pre></td></tr>
4509
4510
4511<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4512<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4513provided matcher.
4514
4515Example matches X, Y
4516 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
Aaron Ballman94f3e742018-12-11 19:30:49 +00004517 class X {}; // Matches X, because X::X is a class of name X inside X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004518 class Y { class X {}; };
Aaron Ballman94f3e742018-12-11 19:30:49 +00004519 class Z { class Y { class X {}; }; }; // Does not match Z.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004520
4521ChildT must be an AST base type.
4522
4523Usable as: Any Matcher
Aaron Ballmanba8dbbe2016-06-06 18:52:17 +00004524Note that has is direct matcher, so it also matches things like implicit
4525casts and paren casts. If you are matching with expr then you should
4526probably consider using ignoringParenImpCasts like:
4527has(ignoringParenImpCasts(expr())).
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004528</pre></td></tr>
4529
4530
4531<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4532<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4533matcher.
4534
4535Given
4536void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4537compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4538
4539Usable as: Any Matcher
4540</pre></td></tr>
4541
4542
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004543<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 +00004544<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4545switch statement or conditional operator.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004546
4547Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4548 if (true) {}
4549</pre></td></tr>
4550
4551
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004552<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 +00004553<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4554(binary or ternary).
4555
4556Example matches b
4557 condition ? a : b
4558 condition ?: b
4559</pre></td></tr>
4560
4561
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004562<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 +00004563<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4564
4565Example 1 (conditional ternary operator): matches a
4566 condition ? a : b
4567
4568Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4569 condition ?: b
4570</pre></td></tr>
4571
4572
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004573<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 +00004574<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 +00004575matches the given matcher.
4576
4577The associated declaration is:
4578- for type nodes, the declaration of the underlying type
4579- for CallExpr, the declaration of the callee
4580- for MemberExpr, the declaration of the referenced member
4581- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004582- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004583- for ObjCIvarExpr, the declaration of the ivar
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004584
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004585For type nodes, hasDeclaration will generally match the declaration of the
4586sugared type. Given
4587 class X {};
4588 typedef X Y;
4589 Y y;
4590in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4591typedefDecl. A common use case is to match the underlying, desugared type.
4592This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4593 varDecl(hasType(hasUnqualifiedDesugaredType(
4594 recordType(hasDeclaration(decl())))))
4595In this matcher, the decl will match the CXXRecordDecl of class X.
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004596
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004597Usable 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;,
4598 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;,
4599 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;,
4600 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;,
4601 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;,
4602 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;,
4603 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00004604</pre></td></tr>
4605
4606
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004607<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 +00004608<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4609
4610Given
4611 int i[5];
4612 void f() { i[1] = 42; }
4613arraySubscriptExpression(hasBase(implicitCastExpr(
4614 hasSourceExpression(declRefExpr()))))
4615 matches i[1] with the declRefExpr() matching i
4616</pre></td></tr>
4617
4618
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004619<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 +00004620<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4621
4622Given
4623 int i[5];
4624 void f() { i[1] = 42; }
4625arraySubscriptExpression(hasIndex(integerLiteral()))
4626 matches i[1] with the integerLiteral() matching 1
4627</pre></td></tr>
4628
4629
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004630<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 +00004631<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4632
4633Example matches a (matcher = binaryOperator(hasLHS()))
4634 a || b
4635</pre></td></tr>
4636
4637
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004638<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 +00004639<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4640
4641Example matches b (matcher = binaryOperator(hasRHS()))
4642 a || b
4643</pre></td></tr>
4644
4645
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004646<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 +00004647<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4648type.
4649
4650Given
4651 struct A {};
4652 A a[7];
4653 int b[7];
4654arrayType(hasElementType(builtinType()))
4655 matches "int b[7]"
4656
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004657Usable 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 +00004658</pre></td></tr>
4659
4660
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004661<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 +00004662<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4663
4664Given
4665 _Atomic(int) i;
4666 _Atomic(float) f;
4667atomicType(hasValueType(isInteger()))
4668 matches "_Atomic(int) i"
4669
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004670Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004671</pre></td></tr>
4672
4673
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004674<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 +00004675<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4676
4677Note: There is no TypeLoc for the deduced type and thus no
4678getDeducedLoc() matcher.
4679
4680Given
4681 auto a = 1;
4682 auto b = 2.0;
4683autoType(hasDeducedType(isInteger()))
4684 matches "auto a"
4685
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004686Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004687</pre></td></tr>
4688
4689
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004690<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 +00004691<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4692binary operator matches.
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_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 +00004697<tr><td colspan="4" class="doc" id="hasLHS0"><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_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 +00004705<tr><td colspan="4" class="doc" id="hasRHS0"><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_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 +00004713<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
4714block.
4715
4716Does not match the 'this' parameter of a method.
4717
4718Given
4719 class X { void f(int x, int y, int z) {} };
4720cxxMethodDecl(hasAnyParameter(hasName("y")))
4721 matches f(int x, int y, int z) {}
4722with hasAnyParameter(...)
4723 matching int y
4724
4725For ObjectiveC, given
4726 @interface I - (void) f:(int) y; @end
4727
4728the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
4729matches the declaration of method f with hasParameter
4730matching y.
4731
4732For blocks, given
4733 b = ^(int y) { printf("%d", y) };
4734
4735the matcher blockDecl(hasAnyParameter(hasName("y")))
4736matches the declaration of the block b with hasParameter
4737matching y.
4738</pre></td></tr>
4739
4740
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004741<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 +00004742<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
4743declaration or a block.
4744
4745Given
4746 class X { void f(int x) {} };
4747cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4748 matches f(int x) {}
4749with hasParameter(...)
4750 matching int x
4751
4752For ObjectiveC, given
4753 @interface I - (void) f:(int) y; @end
4754
4755the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4756matches the declaration of method f with hasParameter
4757matching y.
4758</pre></td></tr>
4759
4760
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004761<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 +00004762<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4763pointee matches a given matcher.
4764
4765Given
4766 int *a;
4767 int const *b;
4768 float const *f;
4769pointerType(pointee(isConstQualified(), isInteger()))
4770 matches "int const *b"
4771
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004772Usable 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;,
4773 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 +00004774</pre></td></tr>
4775
4776
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004777<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 +00004778<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4779
4780Given
4781 void f(int i);
4782 int y;
4783 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00004784callExpr(
4785 forEachArgumentWithParam(
4786 declRefExpr(to(varDecl(hasName("y")))),
4787 parmVarDecl(hasType(isInteger()))
4788))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00004789 matches f(y);
4790with declRefExpr(...)
4791 matching int y
4792and parmVarDecl(...)
4793 matching int i
4794</pre></td></tr>
4795
4796
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004797<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 +00004798<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 +00004799expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004800
4801Given
4802 void x(int, int, int) { int y; x(1, y, 42); }
4803callExpr(hasAnyArgument(declRefExpr()))
4804 matches x(1, y, 42)
4805with hasAnyArgument(...)
4806 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00004807
4808For ObjectiveC, given
4809 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00004810 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00004811objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4812 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004813</pre></td></tr>
4814
4815
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004816<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 +00004817<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4818call expression.
4819
4820Example matches y in x(y)
4821 (matcher = callExpr(hasArgument(0, declRefExpr())))
4822 void x(int) { int y; x(y); }
4823</pre></td></tr>
4824
4825
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004826<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 +00004827<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 +00004828matches the given matcher.
4829
4830The associated declaration is:
4831- for type nodes, the declaration of the underlying type
4832- for CallExpr, the declaration of the callee
4833- for MemberExpr, the declaration of the referenced member
4834- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00004835- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00004836- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004837
Benjamin Kramerae7ff382018-01-17 16:50:14 +00004838For type nodes, hasDeclaration will generally match the declaration of the
4839sugared type. Given
4840 class X {};
4841 typedef X Y;
4842 Y y;
4843in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4844typedefDecl. A common use case is to match the underlying, desugared type.
4845This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4846 varDecl(hasType(hasUnqualifiedDesugaredType(
4847 recordType(hasDeclaration(decl())))))
4848In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004849
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004850Usable 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;,
4851 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;,
4852 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;,
4853 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;,
4854 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;,
4855 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;,
4856 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004857</pre></td></tr>
4858
4859
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004860<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 +00004861<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4862
4863Given
4864 class A { A() : i(42), j(42) {} int i; int j; };
4865cxxConstructorDecl(forEachConstructorInitializer(
4866 forField(decl().bind("x"))
4867))
4868 will trigger two matches, binding for 'i' and 'j' respectively.
4869</pre></td></tr>
4870
4871
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004872<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 +00004873<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4874
4875Given
4876 struct Foo {
4877 Foo() : foo_(1) { }
4878 int foo_;
4879 };
4880cxxRecordDecl(has(cxxConstructorDecl(
4881 hasAnyConstructorInitializer(anything())
4882)))
4883 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4884</pre></td></tr>
4885
4886
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004887<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 +00004888<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4889
4890Given
4891 struct Foo {
4892 Foo() : foo_(1) { }
4893 int foo_;
4894 };
4895cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4896 forField(hasName("foo_"))))))
4897 matches Foo
4898with forField matching foo_
4899</pre></td></tr>
4900
4901
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004902<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 +00004903<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4904
4905Given
4906 struct Foo {
4907 Foo() : foo_(1) { }
4908 int foo_;
4909 };
4910cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4911 withInitializer(integerLiteral(equals(1)))))))
4912 matches Foo
4913with withInitializer matching (1)
4914</pre></td></tr>
4915
4916
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004917<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 +00004918<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
4919given matcher. Implicit object expressions are included; that is, it matches
4920use of implicit `this`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00004921
4922Given
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00004923 struct X {
4924 int m;
4925 int f(X x) { x.m; return m; }
4926 };
4927memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
4928 matches `x.m`, but not `m`; however,
4929memberExpr(hasObjectExpression(hasType(pointsTo(
4930 cxxRecordDecl(hasName("X"))))))
4931 matches `m` (aka. `this-&gt;m`), but not `x.m`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00004932</pre></td></tr>
4933
4934
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004935<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 +00004936<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4937definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004938
4939Given
4940 for (;;) {}
4941hasBody(compoundStmt())
4942 matches 'for (;;) {}'
4943with compoundStmt()
4944 matching '{}'
4945</pre></td></tr>
4946
4947
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004948<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 +00004949<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4950
4951Example:
4952 forStmt(hasLoopVariable(anything()))
4953matches 'int x' in
4954 for (int x : a) { }
4955</pre></td></tr>
4956
4957
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004958<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 +00004959<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4960
4961Example:
4962 forStmt(hasRangeInit(anything()))
4963matches 'a' in
4964 for (int x : a) { }
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_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 +00004969<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
4970`on`, matches the argument directly without stripping away anything.
4971
4972Given
4973 class Y { public: void m(); };
4974 Y g();
4975 class X : public Y { void g(); };
4976 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
4977cxxMemberCallExpr(onImplicitObjectArgument(hasType(
4978 cxxRecordDecl(hasName("Y")))))
4979 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
4980cxxMemberCallExpr(on(callExpr()))
4981 does not match `(g()).m()`, because the parens are not ignored.
4982
4983FIXME: Overload to allow directly matching types?
4984</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004985
4986
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00004987<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 +00004988<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
4989stripping off any parentheses or implicit casts.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004990
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00004991Given
4992 class Y { public: void m(); };
4993 Y g();
4994 class X : public Y {};
4995 void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
4996cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
4997 matches `y.m()` and `(g()).m()`.
4998cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
4999 matches `x.m()`.
5000cxxMemberCallExpr(on(callExpr()))
5001 matches `(g()).m()`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005002
5003FIXME: Overload to allow directly matching types?
5004</pre></td></tr>
5005
5006
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005007<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 +00005008<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5009</pre></td></tr>
5010
5011
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005012<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 +00005013<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5014matches the InnerMatcher, or is a pointer to a type that matches the
5015InnerMatcher.
5016
5017Given
5018 class Y { public: void m(); };
5019 class X : public Y { void g(); };
5020 void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5021cxxMemberCallExpr(thisPointerType(hasDeclaration(
5022 cxxRecordDecl(hasName("Y")))))
5023 matches `y.m()`, `p-&gt;m()` and `x.m()`.
5024cxxMemberCallExpr(thisPointerType(hasDeclaration(
5025 cxxRecordDecl(hasName("X")))))
5026 matches `x.g()`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005027</pre></td></tr>
5028
5029
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005030<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 +00005031<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 +00005032produce multiple matches.
5033
5034Given
5035 class A { virtual void f(); };
5036 class B : public A { void f(); };
5037 class C : public B { void f(); };
5038cxxMethodDecl(ofClass(hasName("C")),
5039 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5040 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5041 that B::f is not overridden by C::f).
5042
5043The check can produce multiple matches in case of multiple inheritance, e.g.
5044 class A1 { virtual void f(); };
5045 class A2 { virtual void f(); };
5046 class C : public A1, public A2 { void f(); };
5047cxxMethodDecl(ofClass(hasName("C")),
5048 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5049 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5050 once with "b" binding "A2::f" and "d" binding "C::f".
5051</pre></td></tr>
5052
5053
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005054<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 +00005055<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5056belongs to.
5057
5058FIXME: Generalize this for other kinds of declarations.
5059FIXME: What other kind of declarations would we need to generalize
5060this to?
5061
5062Example matches A() in the last line
5063 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5064 ofClass(hasName("A"))))))
5065 class A {
5066 public:
5067 A();
5068 };
5069 A a = A();
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_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 +00005074<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5075
5076Given:
5077 MyClass *p1 = new MyClass[10];
5078cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
5079 matches the expression 'new MyClass[10]'.
5080</pre></td></tr>
5081
5082
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005083<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 +00005084<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 +00005085matches the given matcher.
5086
5087The associated declaration is:
5088- for type nodes, the declaration of the underlying type
5089- for CallExpr, the declaration of the callee
5090- for MemberExpr, the declaration of the referenced member
5091- for CXXConstructExpr, the declaration of the constructor
5092- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005093- for ObjCIvarExpr, the declaration of the ivar
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005094
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005095For type nodes, hasDeclaration will generally match the declaration of the
5096sugared type. Given
5097 class X {};
5098 typedef X Y;
5099 Y y;
5100in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5101typedefDecl. A common use case is to match the underlying, desugared type.
5102This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5103 varDecl(hasType(hasUnqualifiedDesugaredType(
5104 recordType(hasDeclaration(decl())))))
5105In this matcher, the decl will match the CXXRecordDecl of class X.
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005106
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005107Usable 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;,
5108 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;,
5109 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;,
5110 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;,
5111 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;,
5112 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;,
5113 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005114</pre></td></tr>
5115
5116
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005117<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 +00005118<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5119
5120Given:
5121 class A { void func(); };
5122 class B { void member(); };
5123
5124cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5125A but not B.
5126</pre></td></tr>
5127
5128
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005129<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 +00005130<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
5131a class matching Base.
5132
5133Note that a class is not considered to be derived from itself.
5134
5135Example matches Y, Z, C (Base == hasName("X"))
5136 class X;
Aaron Ballman94f3e742018-12-11 19:30:49 +00005137 class Y : public X {}; // directly derived
5138 class Z : public Y {}; // indirectly derived
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005139 typedef X A;
5140 typedef A B;
Aaron Ballman94f3e742018-12-11 19:30:49 +00005141 class C : public B {}; // derived from a typedef of X
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005142
5143In the following example, Bar matches isDerivedFrom(hasName("X")):
5144 class Foo;
5145 typedef Foo X;
Aaron Ballman94f3e742018-12-11 19:30:49 +00005146 class Bar : public Foo {}; // derived from a type that X is a typedef of
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005147</pre></td></tr>
5148
5149
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005150<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 +00005151<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5152match Base.
5153</pre></td></tr>
5154
5155
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005156<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 +00005157<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5158expression, or an ObjC-message-send expression.
5159
5160Given
5161 void x(int, int, int) { int y; x(1, y, 42); }
5162callExpr(hasAnyArgument(declRefExpr()))
5163 matches x(1, y, 42)
5164with hasAnyArgument(...)
5165 matching y
5166
5167For ObjectiveC, given
5168 @interface I - (void) f:(int) y; @end
5169 void foo(I *i) { [i f:12]; }
5170objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5171 matches [i f:12]
5172</pre></td></tr>
5173
5174
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005175<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 +00005176<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5177given matcher.
5178
5179Example matches y.x() (matcher = callExpr(callee(
5180 cxxMethodDecl(hasName("x")))))
5181 class Y { public: void x(); };
5182 void z() { Y y; y.x(); }
5183</pre></td></tr>
5184
5185
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005186<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 +00005187<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5188
5189Given
5190 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5191 void f() { f(); }
5192callExpr(callee(expr()))
5193 matches this-&gt;x(), x(), y.x(), f()
5194with callee(...)
5195 matching this-&gt;x, x, y.x, f respectively
5196
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005197Note: 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 +00005198because this introduces ambiguous overloads with calls to Callee taking a
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005199internal::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 +00005200implemented in terms of implicit casts.
5201</pre></td></tr>
5202
5203
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005204<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 +00005205<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5206
5207Given
5208 void f(int i);
5209 int y;
5210 f(y);
Clement Courbet42517592016-07-12 06:36:00 +00005211callExpr(
5212 forEachArgumentWithParam(
5213 declRefExpr(to(varDecl(hasName("y")))),
5214 parmVarDecl(hasType(isInteger()))
5215))
Aaron Ballmand7b18b92016-01-18 20:28:57 +00005216 matches f(y);
5217with declRefExpr(...)
5218 matching int y
5219and parmVarDecl(...)
5220 matching int i
5221</pre></td></tr>
5222
5223
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005224<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 +00005225<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 +00005226expression, or an ObjC-message-send expression.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005227
5228Given
5229 void x(int, int, int) { int y; x(1, y, 42); }
5230callExpr(hasAnyArgument(declRefExpr()))
5231 matches x(1, y, 42)
5232with hasAnyArgument(...)
5233 matching y
George Karpenkova763fdf2018-03-07 02:32:44 +00005234
5235For ObjectiveC, given
5236 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00005237 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00005238objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5239 matches [i f:12]
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005240</pre></td></tr>
5241
5242
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005243<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 +00005244<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5245call expression.
5246
5247Example matches y in x(y)
5248 (matcher = callExpr(hasArgument(0, declRefExpr())))
5249 void x(int) { int y; x(y); }
5250</pre></td></tr>
5251
5252
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005253<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 +00005254<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 +00005255matches the given matcher.
5256
5257The associated declaration is:
5258- for type nodes, the declaration of the underlying type
5259- for CallExpr, the declaration of the callee
5260- for MemberExpr, the declaration of the referenced member
5261- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005262- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005263- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005264
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005265For type nodes, hasDeclaration will generally match the declaration of the
5266sugared type. Given
5267 class X {};
5268 typedef X Y;
5269 Y y;
5270in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5271typedefDecl. A common use case is to match the underlying, desugared type.
5272This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5273 varDecl(hasType(hasUnqualifiedDesugaredType(
5274 recordType(hasDeclaration(decl())))))
5275In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005276
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005277Usable 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;,
5278 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;,
5279 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;,
5280 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;,
5281 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;,
5282 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;,
5283 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005284</pre></td></tr>
5285
5286
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005287<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 +00005288<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5289extension, matches the constant given in the statement.
5290
5291Given
5292 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5293caseStmt(hasCaseConstant(integerLiteral()))
5294 matches "case 1:"
5295</pre></td></tr>
5296
5297
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005298<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 +00005299<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5300or opaque value's source expression matches the given matcher.
5301
5302Example 1: matches "a string"
5303(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5304class URL { URL(string); };
5305URL url = "a string";
5306
5307Example 2: matches 'b' (matcher =
5308opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5309int a = b ?: 1;
5310</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005311
5312
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005313<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 +00005314<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5315functionDecl that have at least one TemplateArgument matching the given
5316InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005317
5318Given
5319 template&lt;typename T&gt; class A {};
5320 template&lt;&gt; class A&lt;double&gt; {};
5321 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00005322
Haojian Wu99e39a72016-07-29 17:30:13 +00005323 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005324 void func() { f&lt;int&gt;(); };
5325
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005326classTemplateSpecializationDecl(hasAnyTemplateArgument(
5327 refersToType(asString("int"))))
5328 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005329
5330functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5331 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005332</pre></td></tr>
5333
5334
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005335<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 +00005336<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5337
5338Given
Stephen Kelly9b8fa522018-10-09 08:24:11 +00005339 template&lt;typename T&gt; class A {}; #1
5340 template&lt;&gt; class A&lt;int&gt; {}; #2
Manuel Klimek696e5052017-08-02 13:04:44 +00005341classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
Stephen Kelly9b8fa522018-10-09 08:24:11 +00005342 matches '#2' with classTemplateDecl() matching the class template
5343 declaration of 'A' at #1.
Manuel Klimek696e5052017-08-02 13:04:44 +00005344</pre></td></tr>
5345
5346
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005347<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 +00005348<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5349functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005350
5351Given
5352 template&lt;typename T, typename U&gt; class A {};
5353 A&lt;bool, int&gt; b;
5354 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00005355
Fangrui Song55942ab2018-01-22 22:34:15 +00005356 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005357 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005358classTemplateSpecializationDecl(hasTemplateArgument(
5359 1, refersToType(asString("int"))))
5360 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00005361
5362functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5363 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005364</pre></td></tr>
5365
5366
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005367<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 +00005368<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5369type.
5370
5371Given
5372 struct A {};
5373 A a[7];
5374 int b[7];
5375arrayType(hasElementType(builtinType()))
5376 matches "int b[7]"
5377
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005378Usable 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 +00005379</pre></td></tr>
5380
5381
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005382<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 +00005383<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 +00005384a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005385
5386Given
5387 { {}; 1+2; }
5388hasAnySubstatement(compoundStmt())
5389 matches '{ {}; 1+2; }'
5390with compoundStmt()
5391 matching '{}'
5392</pre></td></tr>
5393
5394
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005395<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 +00005396<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5397</pre></td></tr>
5398
5399
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005400<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 +00005401<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 +00005402matches the given matcher.
5403
5404The associated declaration is:
5405- for type nodes, the declaration of the underlying type
5406- for CallExpr, the declaration of the callee
5407- for MemberExpr, the declaration of the referenced member
5408- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005409- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005410- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005411
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005412For type nodes, hasDeclaration will generally match the declaration of the
5413sugared type. Given
5414 class X {};
5415 typedef X Y;
5416 Y y;
5417in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5418typedefDecl. A common use case is to match the underlying, desugared type.
5419This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5420 varDecl(hasType(hasUnqualifiedDesugaredType(
5421 recordType(hasDeclaration(decl())))))
5422In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005423
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005424Usable 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;,
5425 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;,
5426 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;,
5427 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;,
5428 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;,
5429 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;,
5430 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005431</pre></td></tr>
5432
5433
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005434<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 +00005435<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5436specific using shadow declaration.
5437
5438Given
5439 namespace a { void f() {} }
5440 using a::f;
5441 void g() {
Aaron Ballman94f3e742018-12-11 19:30:49 +00005442 f(); // Matches this ..
5443 a::f(); // .. but not this.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005444 }
5445declRefExpr(throughUsingDecl(anything()))
5446 matches f()
5447</pre></td></tr>
5448
5449
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005450<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 +00005451<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5452specified matcher.
5453
5454Example matches x in if(x)
5455 (matcher = declRefExpr(to(varDecl(hasName("x")))))
5456 bool x;
5457 if (x) {}
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_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 +00005462<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5463
5464Note that this does not work for global declarations because the AST
5465breaks up multiple-declaration DeclStmt's into multiple single-declaration
5466DeclStmt's.
5467Example: Given non-global declarations
5468 int a, b = 0;
5469 int c;
5470 int d = 2, e;
5471declStmt(containsDeclaration(
5472 0, varDecl(hasInitializer(anything()))))
5473 matches only 'int d = 2, e;', and
5474declStmt(containsDeclaration(1, varDecl()))
5475 matches 'int a, b = 0' as well as 'int d = 2, e;'
5476 but 'int c;' is not matched.
5477</pre></td></tr>
5478
5479
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005480<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 +00005481<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5482
5483Given
5484 int a, b;
5485 int c;
5486declStmt(hasSingleDecl(anything()))
5487 matches 'int c;' but not 'int a, b;'.
5488</pre></td></tr>
5489
5490
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005491<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 +00005492<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5493the inner matcher.
5494
5495Given
5496 int x;
5497declaratorDecl(hasTypeLoc(loc(asString("int"))))
5498 matches int x
5499</pre></td></tr>
5500
5501
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005502<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 +00005503<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5504Decl, matches InnerMatcher.
5505
5506Given
5507 namespace N {
5508 namespace M {
5509 class D {};
5510 }
5511 }
5512
5513cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5514declaration of class D.
5515</pre></td></tr>
5516
5517
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005518<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 +00005519<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5520
5521Given
5522 decltype(1) a = 1;
5523 decltype(2.0) b = 2.0;
5524decltypeType(hasUnderlyingType(isInteger()))
Stephen Kelly9b8fa522018-10-09 08:24:11 +00005525 matches the type of "a"
Jonas Tothacf83672018-07-26 13:02:05 +00005526
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005527Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
Jonas Tothacf83672018-07-26 13:02:05 +00005528</pre></td></tr>
5529
5530
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005531<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 +00005532<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5533definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005534
5535Given
5536 for (;;) {}
5537hasBody(compoundStmt())
5538 matches 'for (;;) {}'
5539with compoundStmt()
5540 matching '{}'
5541</pre></td></tr>
5542
5543
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005544<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 +00005545<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 +00005546switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005547
5548Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5549 if (true) {}
5550</pre></td></tr>
5551
5552
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005553<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 +00005554<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5555matches InnerMatcher if the qualifier exists.
5556
5557Given
5558 namespace N {
5559 namespace M {
5560 class D {};
5561 }
5562 }
5563 N::M::D d;
5564
5565elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5566matches the type of the variable declaration of d.
5567</pre></td></tr>
5568
5569
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005570<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 +00005571<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5572
5573Given
5574 namespace N {
5575 namespace M {
5576 class D {};
5577 }
5578 }
5579 N::M::D d;
5580
5581elaboratedType(namesType(recordType(
5582hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5583declaration of d.
5584</pre></td></tr>
5585
5586
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005587<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 +00005588<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 +00005589matches the given matcher.
5590
5591The associated declaration is:
5592- for type nodes, the declaration of the underlying type
5593- for CallExpr, the declaration of the callee
5594- for MemberExpr, the declaration of the referenced member
5595- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00005596- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00005597- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005598
Benjamin Kramerae7ff382018-01-17 16:50:14 +00005599For type nodes, hasDeclaration will generally match the declaration of the
5600sugared type. Given
5601 class X {};
5602 typedef X Y;
5603 Y y;
5604in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5605typedefDecl. A common use case is to match the underlying, desugared type.
5606This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5607 varDecl(hasType(hasUnqualifiedDesugaredType(
5608 recordType(hasDeclaration(decl())))))
5609In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005610
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005611Usable 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;,
5612 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;,
5613 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;,
5614 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;,
5615 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;,
5616 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;,
5617 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005618</pre></td></tr>
5619
5620
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005621<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 +00005622<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5623
5624(Note: Clang's AST refers to other conversions as "casts" too, and calls
5625actual casts "explicit" casts.)
5626</pre></td></tr>
5627
5628
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005629<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 +00005630<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 +00005631declaration's type.
5632
5633In case of a value declaration (for example a variable declaration),
5634this resolves one layer of indirection. For example, in the value
5635declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5636X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5637declaration of x.
5638
5639Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5640 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00005641 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005642 class X {};
5643 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00005644 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005645
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005646Usable 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 +00005647</pre></td></tr>
5648
5649
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005650<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 +00005651<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5652matcher.
5653
5654Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5655 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005656 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00005657 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005658 class X {};
5659 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005660 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00005661 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005662</pre></td></tr>
5663
5664
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005665<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 +00005666<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5667are stripped off.
5668
5669Parentheses and explicit casts are not discarded.
5670Given
5671 int arr[5];
5672 int a = 0;
5673 char b = 0;
5674 const int c = a;
5675 int *d = arr;
5676 long e = (long) 0l;
5677The matchers
5678 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5679 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5680would match the declarations for a, b, c, and d, but not e.
5681While
5682 varDecl(hasInitializer(integerLiteral()))
5683 varDecl(hasInitializer(declRefExpr()))
5684only match the declarations for b, c, and d.
5685</pre></td></tr>
5686
5687
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005688<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 +00005689<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5690nodes are stripped off.
5691
5692Parentheses and explicit casts are not discarded.
5693Given
5694 class C {};
5695 C a = C();
5696 C b;
5697 C c = b;
5698The matchers
5699 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5700would match the declarations for a, b, and c.
5701While
5702 varDecl(hasInitializer(cxxConstructExpr()))
5703only match the declarations for b and c.
5704</pre></td></tr>
5705
5706
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005707<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 +00005708<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5709casts are stripped off.
5710
5711Implicit and non-C Style casts are also discarded.
5712Given
5713 int a = 0;
5714 char b = (0);
5715 void* c = reinterpret_cast&lt;char*&gt;(0);
5716 char d = char(0);
5717The matcher
5718 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5719would match the declarations for a, b, c, and d.
5720while
5721 varDecl(hasInitializer(integerLiteral()))
5722only match the declaration for a.
5723</pre></td></tr>
5724
5725
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005726<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 +00005727<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5728parentheses are stripped off.
5729
5730Explicit casts are not discarded.
5731Given
5732 int arr[5];
5733 int a = 0;
5734 char b = (0);
5735 const int c = a;
5736 int *d = (arr);
5737 long e = ((long) 0l);
5738The matchers
5739 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5740 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5741would match the declarations for a, b, c, and d, but not e.
5742while
5743 varDecl(hasInitializer(integerLiteral()))
5744 varDecl(hasInitializer(declRefExpr()))
5745would only match the declaration for a.
5746</pre></td></tr>
5747
5748
Jonas Toth295aa092018-11-09 20:54:06 +00005749<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>
5750<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
5751
5752Given
5753 const char* str = ("my-string");
5754The matcher
5755 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
5756would match the implicit cast resulting from the assignment.
5757</pre></td></tr>
5758
5759
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005760<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 +00005761<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5762
5763Given
5764 class C {
5765 int a = 2;
5766 int b = 3;
5767 int c;
5768 };
5769fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5770 matches 'int a;' but not 'int b;'.
5771fieldDecl(hasInClassInitializer(anything()))
5772 matches 'int a;' and 'int b;' but not 'int c;'.
5773</pre></td></tr>
5774
5775
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005776<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 +00005777<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5778definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005779
5780Given
5781 for (;;) {}
5782hasBody(compoundStmt())
5783 matches 'for (;;) {}'
5784with compoundStmt()
5785 matching '{}'
5786</pre></td></tr>
5787
5788
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005789<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 +00005790<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 +00005791switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005792
5793Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5794 if (true) {}
5795</pre></td></tr>
5796
5797
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005798<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 +00005799<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5800
5801Example:
5802 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5803matches '++x' in
5804 for (x; x &lt; N; ++x) { }
5805</pre></td></tr>
5806
5807
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005808<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 +00005809<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5810
5811Example:
5812 forStmt(hasLoopInit(declStmt()))
5813matches 'int x = 0' in
5814 for (int x = 0; x &lt; N; ++x) { }
5815</pre></td></tr>
5816
5817
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005818<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 +00005819<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
5820declaration's type.
5821
5822In case of a value declaration (for example a variable declaration),
5823this resolves one layer of indirection. For example, in the value
5824declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5825X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5826declaration of x.
5827
5828Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5829 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5830 and friend class X (matcher = friendDecl(hasType("X"))
5831 class X {};
5832 void y(X &amp;x) { x; X z; }
5833 class Y { friend class X; };
5834
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005835Usable 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 +00005836</pre></td></tr>
5837
5838
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005839<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 +00005840<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5841matcher.
5842
5843Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5844 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5845 and U (matcher = typedefDecl(hasType(asString("int")))
5846 and friend class X (matcher = friendDecl(hasType("X"))
5847 class X {};
5848 void y(X &amp;x) { x; X z; }
5849 typedef int U;
5850 class Y { friend class X; };
5851</pre></td></tr>
5852
5853
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005854<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 +00005855<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
5856block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005857
5858Does not match the 'this' parameter of a method.
5859
5860Given
5861 class X { void f(int x, int y, int z) {} };
5862cxxMethodDecl(hasAnyParameter(hasName("y")))
5863 matches f(int x, int y, int z) {}
5864with hasAnyParameter(...)
5865 matching int y
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005866
5867For ObjectiveC, given
5868 @interface I - (void) f:(int) y; @end
5869
5870the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5871matches the declaration of method f with hasParameter
5872matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00005873
5874For blocks, given
5875 b = ^(int y) { printf("%d", y) };
5876
5877the matcher blockDecl(hasAnyParameter(hasName("y")))
5878matches the declaration of the block b with hasParameter
5879matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005880</pre></td></tr>
5881
5882
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005883<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 +00005884<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5885functionDecl that have at least one TemplateArgument matching the given
5886InnerMatcher.
5887
5888Given
5889 template&lt;typename T&gt; class A {};
5890 template&lt;&gt; class A&lt;double&gt; {};
5891 A&lt;int&gt; a;
5892
Haojian Wu99e39a72016-07-29 17:30:13 +00005893 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00005894 void func() { f&lt;int&gt;(); };
5895
5896classTemplateSpecializationDecl(hasAnyTemplateArgument(
5897 refersToType(asString("int"))))
5898 matches the specialization A&lt;int&gt;
5899
5900functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5901 matches the specialization f&lt;int&gt;
5902</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_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 +00005906<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5907definition that has a given body.
5908
5909Given
5910 for (;;) {}
5911hasBody(compoundStmt())
5912 matches 'for (;;) {}'
5913with compoundStmt()
5914 matching '{}'
5915</pre></td></tr>
5916
5917
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005918<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 +00005919<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 +00005920declaration or a block.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005921
5922Given
5923 class X { void f(int x) {} };
5924cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5925 matches f(int x) {}
5926with hasParameter(...)
5927 matching int x
George Karpenkov9d1d0c42018-03-29 00:51:11 +00005928
5929For ObjectiveC, given
5930 @interface I - (void) f:(int) y; @end
5931
5932the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5933matches the declaration of method f with hasParameter
5934matching y.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005935</pre></td></tr>
5936
5937
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005938<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 +00005939<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5940functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5941
5942Given
5943 template&lt;typename T, typename U&gt; class A {};
5944 A&lt;bool, int&gt; b;
5945 A&lt;int, bool&gt; c;
5946
Fangrui Song55942ab2018-01-22 22:34:15 +00005947 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00005948 void func() { f&lt;int&gt;(); };
5949classTemplateSpecializationDecl(hasTemplateArgument(
5950 1, refersToType(asString("int"))))
5951 matches the specialization A&lt;bool, int&gt;
5952
5953functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5954 matches the specialization f&lt;int&gt;
5955</pre></td></tr>
5956
5957
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005958<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 +00005959<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5960
5961Given:
5962 class X { int f() { return 1; } };
5963cxxMethodDecl(returns(asString("int")))
5964 matches int f() { return 1; }
5965</pre></td></tr>
5966
5967
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005968<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 +00005969<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 +00005970switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005971
5972Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5973 if (true) {}
5974</pre></td></tr>
5975
5976
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005977<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 +00005978<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5979
5980Given
5981 if (A* a = GetAPointer()) {}
5982hasConditionVariableStatement(...)
5983 matches 'A* a = GetAPointer()'.
5984</pre></td></tr>
5985
5986
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005987<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 +00005988<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5989
5990Examples matches the if statement
5991 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5992 if (false) false; else true;
5993</pre></td></tr>
5994
5995
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00005996<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 +00005997<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5998
5999Examples matches the if statement
6000 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6001 if (false) true; else false;
6002</pre></td></tr>
6003
6004
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006005<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 +00006006<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6007matcher.
6008
6009FIXME: Unit test this matcher
6010</pre></td></tr>
6011
6012
Hyrum Wright2cd40c02019-01-07 14:14:36 +00006013<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>
6014<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6015
6016Example matches y.
6017 (matcher = initListExpr(hasInit(0, expr())))
6018 int x{y}.
6019</pre></td></tr>
6020
6021
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006022<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 +00006023<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6024(if expression have it).
6025</pre></td></tr>
6026
6027
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006028<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 +00006029<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6030matches the given matcher.
6031
6032The associated declaration is:
6033- for type nodes, the declaration of the underlying type
6034- for CallExpr, the declaration of the callee
6035- for MemberExpr, the declaration of the referenced member
6036- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006037- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006038- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006039
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006040For type nodes, hasDeclaration will generally match the declaration of the
6041sugared type. Given
6042 class X {};
6043 typedef X Y;
6044 Y y;
6045in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6046typedefDecl. A common use case is to match the underlying, desugared type.
6047This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6048 varDecl(hasType(hasUnqualifiedDesugaredType(
6049 recordType(hasDeclaration(decl())))))
6050In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006051
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006052Usable 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;,
6053 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;,
6054 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;,
6055 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;,
6056 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;,
6057 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;,
6058 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Manuel Klimeka37e1102016-12-01 15:45:06 +00006059</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_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 +00006063<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6064matches the given matcher.
6065
6066The associated declaration is:
6067- for type nodes, the declaration of the underlying type
6068- for CallExpr, the declaration of the callee
6069- for MemberExpr, the declaration of the referenced member
6070- for CXXConstructExpr, the declaration of the constructor
6071- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006072- for ObjCIvarExpr, the declaration of the ivar
Manuel Klimeka37e1102016-12-01 15:45:06 +00006073
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006074For type nodes, hasDeclaration will generally match the declaration of the
6075sugared type. Given
6076 class X {};
6077 typedef X Y;
6078 Y y;
6079in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6080typedefDecl. A common use case is to match the underlying, desugared type.
6081This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6082 varDecl(hasType(hasUnqualifiedDesugaredType(
6083 recordType(hasDeclaration(decl())))))
6084In this matcher, the decl will match the CXXRecordDecl of class X.
Manuel Klimeka37e1102016-12-01 15:45:06 +00006085
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006086Usable 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;,
6087 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;,
6088 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;,
6089 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;,
6090 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;,
6091 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;,
6092 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006093</pre></td></tr>
6094
6095
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006096<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 +00006097<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6098matches the given matcher.
6099
6100The associated declaration is:
6101- for type nodes, the declaration of the underlying type
6102- for CallExpr, the declaration of the callee
6103- for MemberExpr, the declaration of the referenced member
6104- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006105- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006106- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006107
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006108For type nodes, hasDeclaration will generally match the declaration of the
6109sugared type. Given
6110 class X {};
6111 typedef X Y;
6112 Y y;
6113in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6114typedefDecl. A common use case is to match the underlying, desugared type.
6115This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6116 varDecl(hasType(hasUnqualifiedDesugaredType(
6117 recordType(hasDeclaration(decl())))))
6118In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006119
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006120Usable 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;,
6121 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;,
6122 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;,
6123 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;,
6124 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;,
6125 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;,
6126 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006127</pre></td></tr>
6128
6129
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006130<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 +00006131<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6132given matcher. Implicit object expressions are included; that is, it matches
6133use of implicit `this`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006134
6135Given
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00006136 struct X {
6137 int m;
6138 int f(X x) { x.m; return m; }
6139 };
6140memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6141 matches `x.m`, but not `m`; however,
6142memberExpr(hasObjectExpression(hasType(pointsTo(
6143 cxxRecordDecl(hasName("X"))))))
6144 matches `m` (aka. `this-&gt;m`), but not `x.m`.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006145</pre></td></tr>
6146
6147
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006148<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 +00006149<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6150given matcher.
6151
6152Given
6153 struct { int first, second; } first, second;
6154 int i(second.first);
6155 int j(first.second);
6156memberExpr(member(hasName("first")))
6157 matches second.first
6158 but not first.second (because the member name there is "second").
6159</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_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 +00006163<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6164pointee matches a given matcher.
6165
6166Given
6167 int *a;
6168 int const *b;
6169 float const *f;
6170pointerType(pointee(isConstQualified(), isInteger()))
6171 matches "int const *b"
6172
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006173Usable 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;,
6174 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 +00006175</pre></td></tr>
6176
6177
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006178<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 +00006179<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6180matcher.
6181
6182Given
6183 namespace N { template&lt;class T&gt; void f(T t); }
6184 template &lt;class T&gt; void g() { using N::f; f(T()); }
6185unresolvedLookupExpr(hasAnyDeclaration(
6186 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6187 matches the use of f in g() .
6188</pre></td></tr>
6189
6190
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006191<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 +00006192<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6193
6194Given
6195 struct A { struct B { struct C {}; }; };
6196 A::B::C c;
6197nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6198 matches "A::"
6199</pre></td></tr>
6200
6201
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006202<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 +00006203<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6204given TypeLoc.
6205
6206Given
6207 struct A { struct B { struct C {}; }; };
6208 A::B::C c;
6209nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6210 hasDeclaration(cxxRecordDecl(hasName("A")))))))
6211 matches "A::"
6212</pre></td></tr>
6213
6214
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006215<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 +00006216<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6217
6218Given
6219 struct A { struct B { struct C {}; }; };
6220 A::B::C c;
6221nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6222 matches "A::"
6223</pre></td></tr>
6224
6225
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006226<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 +00006227<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6228given namespace matcher.
6229
6230Given
6231 namespace ns { struct A {}; }
6232 ns::A a;
6233nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6234 matches "ns::"
6235</pre></td></tr>
6236
6237
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006238<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 +00006239<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6240given QualType matcher without qualifiers.
6241
6242Given
6243 struct A { struct B { struct C {}; }; };
6244 A::B::C c;
6245nestedNameSpecifier(specifiesType(
6246 hasDeclaration(cxxRecordDecl(hasName("A")))
6247))
6248 matches "A::"
6249</pre></td></tr>
6250
6251
Roman Lebedev33ef20e2019-03-21 15:33:24 +00006252<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>
6253<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6254
6255Given
6256
6257 #pragma omp parallel
6258 #pragma omp parallel default(none)
6259
6260``ompExecutableDirective(hasAnyClause(anything()))`` matches
6261``omp parallel default(none)``.
6262</pre></td></tr>
6263
6264
Roman Lebedevc8161952019-03-21 15:33:35 +00006265<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>
6266<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6267
6268Prerequisite: the executable directive must not be standalone directive.
6269If it is, it will never match.
6270
6271Given
6272
6273 #pragma omp parallel
6274 ;
6275 #pragma omp parallel
6276 {}
6277
6278``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6279</pre></td></tr>
6280
6281
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006282<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 +00006283<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 +00006284expression, or an ObjC-message-send expression.
6285
6286Given
6287 void x(int, int, int) { int y; x(1, y, 42); }
6288callExpr(hasAnyArgument(declRefExpr()))
6289 matches x(1, y, 42)
6290with hasAnyArgument(...)
6291 matching y
6292
6293For ObjectiveC, given
6294 @interface I - (void) f:(int) y; @end
Clement Courbet2513aa02018-03-21 10:48:00 +00006295 void foo(I *i) { [i f:12]; }
George Karpenkova763fdf2018-03-07 02:32:44 +00006296objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6297 matches [i f:12]
6298</pre></td></tr>
6299
6300
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006301<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 +00006302<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6303call expression.
6304
6305Example matches y in x(y)
6306 (matcher = callExpr(hasArgument(0, declRefExpr())))
6307 void x(int) { int y; x(y); }
6308</pre></td></tr>
6309
6310
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006311<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 +00006312<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
6313and the inner matcher matches on that instance.
6314
6315For example the method call in
6316 NSString *x = @"hello";
George Karpenkovdaac52c2018-07-23 22:29:10 +00006317 [x containsString:@"h"];
George Karpenkovb5ea4df2018-07-16 20:22:12 +00006318is matched by
6319objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
6320</pre></td></tr>
6321
6322
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006323<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 +00006324<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
6325
6326Example
Jakub Kuderski64b6c782017-05-05 21:01:12 +00006327matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006328matches the [webView ...] message invocation.
6329 NSString *webViewJavaScript = ...
6330 UIWebView *webView = ...
6331 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
6332</pre></td></tr>
6333
6334
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006335<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 +00006336<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
6337block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006338
6339Does not match the 'this' parameter of a method.
6340
6341Given
6342 class X { void f(int x, int y, int z) {} };
6343cxxMethodDecl(hasAnyParameter(hasName("y")))
6344 matches f(int x, int y, int z) {}
6345with hasAnyParameter(...)
6346 matching int y
6347
6348For ObjectiveC, given
6349 @interface I - (void) f:(int) y; @end
6350
6351the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6352matches the declaration of method f with hasParameter
6353matching y.
George Karpenkovb4c0cbd2018-05-16 22:47:03 +00006354
6355For blocks, given
6356 b = ^(int y) { printf("%d", y) };
6357
6358the matcher blockDecl(hasAnyParameter(hasName("y")))
6359matches the declaration of the block b with hasParameter
6360matching y.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006361</pre></td></tr>
6362
6363
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006364<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 +00006365<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 +00006366declaration or a block.
George Karpenkov9d1d0c42018-03-29 00:51:11 +00006367
6368Given
6369 class X { void f(int x) {} };
6370cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6371 matches f(int x) {}
6372with hasParameter(...)
6373 matching int x
6374
6375For ObjectiveC, given
6376 @interface I - (void) f:(int) y; @end
6377
6378the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6379matches the declaration of method f with hasParameter
6380matching y.
6381</pre></td></tr>
6382
6383
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006384<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 +00006385<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
6386or opaque value's source expression matches the given matcher.
6387
6388Example 1: matches "a string"
6389(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6390class URL { URL(string); };
6391URL url = "a string";
6392
6393Example 2: matches 'b' (matcher =
6394opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6395int a = b ?: 1;
6396</pre></td></tr>
Aaron Ballmana35b8fc2016-03-09 17:11:51 +00006397
6398
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006399<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 +00006400<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6401overloads matches the given matcher.
6402
6403Given
6404 template &lt;typename T&gt; void foo(T);
6405 template &lt;typename T&gt; void bar(T);
6406 template &lt;typename T&gt; void baz(T t) {
6407 foo(t);
6408 bar(t);
6409 }
6410unresolvedLookupExpr(hasAnyDeclaration(
6411 functionTemplateDecl(hasName("foo"))))
6412 matches foo in foo(t); but not bar in bar(t);
6413</pre></td></tr>
6414
6415
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006416<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 +00006417<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6418
6419Given
6420 int (*ptr_to_array)[4];
6421 int (*ptr_to_func)(int);
6422
6423varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6424ptr_to_func but not ptr_to_array.
6425
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006426Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +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_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 +00006431<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6432pointee matches a given matcher.
6433
6434Given
6435 int *a;
6436 int const *b;
6437 float const *f;
6438pointerType(pointee(isConstQualified(), isInteger()))
6439 matches "int const *b"
6440
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006441Usable 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;,
6442 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 +00006443</pre></td></tr>
6444
6445
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006446<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 +00006447<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
6448
6449Given:
6450 typedef int &amp;int_ref;
6451 int a;
6452 int_ref b = a;
6453
6454varDecl(hasType(qualType(referenceType()))))) will not match the
6455declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
6456</pre></td></tr>
6457
6458
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006459<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 +00006460<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
6461matches the given matcher.
6462
6463The associated declaration is:
6464- for type nodes, the declaration of the underlying type
6465- for CallExpr, the declaration of the callee
6466- for MemberExpr, the declaration of the referenced member
6467- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006468- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006469- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006470
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006471For type nodes, hasDeclaration will generally match the declaration of the
6472sugared type. Given
6473 class X {};
6474 typedef X Y;
6475 Y y;
6476in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6477typedefDecl. A common use case is to match the underlying, desugared type.
6478This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6479 varDecl(hasType(hasUnqualifiedDesugaredType(
6480 recordType(hasDeclaration(decl())))))
6481In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006482
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006483Usable 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;,
6484 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;,
6485 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;,
6486 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;,
6487 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;,
6488 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;,
6489 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006490</pre></td></tr>
6491
6492
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006493<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 +00006494<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
6495
6496Given
6497 void (*fp)(void);
6498The matcher
6499 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
6500would match the declaration for fp.
6501</pre></td></tr>
6502
6503
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006504<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 +00006505<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
6506</pre></td></tr>
6507
6508
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006509<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 +00006510<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
6511matches the specified matcher.
6512
6513Example matches y-&gt;x()
6514 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
6515 cxxRecordDecl(hasName("Y")))))))
6516 class Y { public: void x(); };
6517 void z() { Y *y; y-&gt;x(); }
6518</pre></td></tr>
6519
6520
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006521<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 +00006522<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
6523</pre></td></tr>
6524
6525
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006526<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 +00006527<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
6528type matches the specified matcher.
6529
6530Example matches X &amp;x and const X &amp;y
6531 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
6532 class X {
6533 void a(X b) {
6534 X &amp;x = b;
6535 const X &amp;y = b;
6536 }
6537 };
6538</pre></td></tr>
6539
6540
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006541<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 +00006542<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
6543matches the given matcher.
6544
6545The associated declaration is:
6546- for type nodes, the declaration of the underlying type
6547- for CallExpr, the declaration of the callee
6548- for MemberExpr, the declaration of the referenced member
6549- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006550- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006551- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006552
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006553For type nodes, hasDeclaration will generally match the declaration of the
6554sugared type. Given
6555 class X {};
6556 typedef X Y;
6557 Y y;
6558in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6559typedefDecl. A common use case is to match the underlying, desugared type.
6560This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6561 varDecl(hasType(hasUnqualifiedDesugaredType(
6562 recordType(hasDeclaration(decl())))))
6563In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006564
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006565Usable 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;,
6566 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;,
6567 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;,
6568 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;,
6569 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;,
6570 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;,
6571 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006572</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_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 +00006576<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
6577pointee matches a given matcher.
6578
6579Given
6580 int *a;
6581 int const *b;
6582 float const *f;
6583pointerType(pointee(isConstQualified(), isInteger()))
6584 matches "int const *b"
6585
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006586Usable 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;,
6587 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 +00006588</pre></td></tr>
6589
6590
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006591<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 +00006592<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
6593
6594Given
6595 return a + b;
6596hasReturnValue(binaryOperator())
6597 matches 'return a + b'
6598with binaryOperator()
6599 matching 'a + b'
6600</pre></td></tr>
6601
6602
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006603<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 +00006604<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
6605a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6606
6607Given
6608 { {}; 1+2; }
6609hasAnySubstatement(compoundStmt())
6610 matches '{ {}; 1+2; }'
6611with compoundStmt()
6612 matching '{}'
6613</pre></td></tr>
6614
6615
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006616<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 +00006617<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6618alignof.
6619</pre></td></tr>
6620
6621
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006622<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 +00006623<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 +00006624
6625Given:
6626F&amp; operator=(const F&amp; o) {
6627 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
6628 return *this;
6629}
6630returnStmt(forFunction(hasName("operator=")))
6631 matches 'return *this'
6632 but does match 'return &gt; 0'
6633</pre></td></tr>
6634
6635
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006636<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 +00006637<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6638sizeof.
6639</pre></td></tr>
6640
6641
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006642<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 +00006643<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
6644type that matches the provided matcher.
6645
6646Given
6647 template &lt;typename T&gt;
6648 double F(T t);
6649 int i;
6650 double j = F(i);
6651
6652substTemplateTypeParmType(hasReplacementType(type())) matches int
6653</pre></td></tr>
6654
6655
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006656<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 +00006657<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
6658statement. This matcher may produce multiple matches.
6659
6660Given
6661 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
6662switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
6663 matches four times, with "c" binding each of "case 1:", "case 2:",
6664"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
6665"switch (1)", "switch (2)" and "switch (2)".
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_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 +00006670<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
6671switch statement or conditional operator.
6672
6673Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6674 if (true) {}
6675</pre></td></tr>
6676
6677
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006678<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 +00006679<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
6680matches the given matcher.
6681
6682The associated declaration is:
6683- for type nodes, the declaration of the underlying type
6684- for CallExpr, the declaration of the callee
6685- for MemberExpr, the declaration of the referenced member
6686- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006687- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006688- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006689
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006690For type nodes, hasDeclaration will generally match the declaration of the
6691sugared type. Given
6692 class X {};
6693 typedef X Y;
6694 Y y;
6695in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6696typedefDecl. A common use case is to match the underlying, desugared type.
6697This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6698 varDecl(hasType(hasUnqualifiedDesugaredType(
6699 recordType(hasDeclaration(decl())))))
6700In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006701
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006702Usable 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;,
6703 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;,
6704 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;,
6705 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;,
6706 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;,
6707 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;,
6708 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006709</pre></td></tr>
6710
6711
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006712<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 +00006713<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6714
6715Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006716 struct B { int next; };
6717 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006718 A&lt;&amp;B::next&gt; a;
6719templateSpecializationType(hasAnyTemplateArgument(
6720 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6721 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6722 B::next
6723</pre></td></tr>
6724
6725
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006726<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 +00006727<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6728declaration.
6729
6730Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006731 struct B { int next; };
6732 template&lt;int(B::*next_ptr)&gt; struct A {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006733 A&lt;&amp;B::next&gt; a;
6734classTemplateSpecializationDecl(hasAnyTemplateArgument(
Fangrui Song55942ab2018-01-22 22:34:15 +00006735 refersToDeclaration(fieldDecl(hasName("next")))))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006736 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6737 B::next
6738</pre></td></tr>
6739
6740
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006741<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 +00006742<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6743
6744Given
Fangrui Song55942ab2018-01-22 22:34:15 +00006745 template&lt;int T&gt; struct C {};
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006746 C&lt;42&gt; c;
6747classTemplateSpecializationDecl(
6748 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6749 matches the implicit instantiation of C in C&lt;42&gt;.
6750</pre></td></tr>
6751
6752
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006753<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 +00006754<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6755
6756Given
6757 template&lt;template &lt;typename&gt; class S&gt; class X {};
Stephen Kelly9b8fa522018-10-09 08:24:11 +00006758 template&lt;typename T&gt; class Y {};
Haojian Wub33b02e2016-07-29 15:45:11 +00006759 X&lt;Y&gt; xi;
6760classTemplateSpecializationDecl(hasAnyTemplateArgument(
6761 refersToTemplate(templateName())))
6762 matches the specialization X&lt;Y&gt;
6763</pre></td></tr>
6764
6765
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006766<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 +00006767<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6768
6769Given
6770 struct X {};
6771 template&lt;typename T&gt; struct A {};
6772 A&lt;X&gt; a;
6773classTemplateSpecializationDecl(hasAnyTemplateArgument(
6774 refersToType(class(hasName("X")))))
6775 matches the specialization A&lt;X&gt;
6776</pre></td></tr>
6777
6778
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006779<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 +00006780<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6781functionDecl that have at least one TemplateArgument matching the given
6782InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006783
6784Given
6785 template&lt;typename T&gt; class A {};
6786 template&lt;&gt; class A&lt;double&gt; {};
6787 A&lt;int&gt; a;
Haojian Wud898b092016-07-29 13:57:27 +00006788
Haojian Wu99e39a72016-07-29 17:30:13 +00006789 template&lt;typename T&gt; f() {};
Haojian Wud898b092016-07-29 13:57:27 +00006790 void func() { f&lt;int&gt;(); };
6791
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006792classTemplateSpecializationDecl(hasAnyTemplateArgument(
6793 refersToType(asString("int"))))
6794 matches the specialization A&lt;int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006795
6796functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6797 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006798</pre></td></tr>
6799
6800
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006801<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 +00006802<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6803matches the given matcher.
6804
6805The associated declaration is:
6806- for type nodes, the declaration of the underlying type
6807- for CallExpr, the declaration of the callee
6808- for MemberExpr, the declaration of the referenced member
6809- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006810- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006811- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006812
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006813For type nodes, hasDeclaration will generally match the declaration of the
6814sugared type. Given
6815 class X {};
6816 typedef X Y;
6817 Y y;
6818in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6819typedefDecl. A common use case is to match the underlying, desugared type.
6820This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6821 varDecl(hasType(hasUnqualifiedDesugaredType(
6822 recordType(hasDeclaration(decl())))))
6823In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006824
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006825Usable 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;,
6826 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;,
6827 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;,
6828 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;,
6829 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;,
6830 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;,
6831 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006832</pre></td></tr>
6833
6834
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006835<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 +00006836<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6837functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006838
6839Given
6840 template&lt;typename T, typename U&gt; class A {};
6841 A&lt;bool, int&gt; b;
6842 A&lt;int, bool&gt; c;
Haojian Wud898b092016-07-29 13:57:27 +00006843
Fangrui Song55942ab2018-01-22 22:34:15 +00006844 template&lt;typename T&gt; void f() {}
Haojian Wud898b092016-07-29 13:57:27 +00006845 void func() { f&lt;int&gt;(); };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006846classTemplateSpecializationDecl(hasTemplateArgument(
6847 1, refersToType(asString("int"))))
6848 matches the specialization A&lt;bool, int&gt;
Haojian Wud898b092016-07-29 13:57:27 +00006849
6850functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6851 matches the specialization f&lt;int&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006852</pre></td></tr>
6853
6854
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006855<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 +00006856<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
6857matches the given matcher.
6858
6859The associated declaration is:
6860- for type nodes, the declaration of the underlying type
6861- for CallExpr, the declaration of the callee
6862- for MemberExpr, the declaration of the referenced member
6863- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006864- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006865- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006866
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006867For type nodes, hasDeclaration will generally match the declaration of the
6868sugared type. Given
6869 class X {};
6870 typedef X Y;
6871 Y y;
6872in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6873typedefDecl. A common use case is to match the underlying, desugared type.
6874This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6875 varDecl(hasType(hasUnqualifiedDesugaredType(
6876 recordType(hasDeclaration(decl())))))
6877In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006878
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006879Usable 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;,
6880 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;,
6881 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;,
6882 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;,
6883 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;,
6884 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;,
6885 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006886</pre></td></tr>
6887
6888
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006889<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 +00006890<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
6891
6892Generates results for each match.
6893
6894For example, in:
6895 class A { class B {}; class C {}; };
6896The matcher:
6897 cxxRecordDecl(hasName("::A"),
6898 findAll(cxxRecordDecl(isDefinition()).bind("m")))
6899will generate results for A, B and C.
6900
6901Usable as: Any Matcher
6902</pre></td></tr>
6903
6904
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006905<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 +00006906<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 +00006907matcher.
6908
6909Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6910 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6911 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00006912 and friend class X (matcher = friendDecl(hasType("X"))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006913 class X {};
6914 void y(X &amp;x) { x; X z; }
6915 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00006916 class Y { friend class X; };
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00006917</pre></td></tr>
6918
6919
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006920<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 +00006921<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6922matches the given matcher.
6923
6924The associated declaration is:
6925- for type nodes, the declaration of the underlying type
6926- for CallExpr, the declaration of the callee
6927- for MemberExpr, the declaration of the referenced member
6928- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00006929- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00006930- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006931
Benjamin Kramerae7ff382018-01-17 16:50:14 +00006932For type nodes, hasDeclaration will generally match the declaration of the
6933sugared type. Given
6934 class X {};
6935 typedef X Y;
6936 Y y;
6937in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6938typedefDecl. A common use case is to match the underlying, desugared type.
6939This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6940 varDecl(hasType(hasUnqualifiedDesugaredType(
6941 recordType(hasDeclaration(decl())))))
6942In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006943
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006944Usable 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;,
6945 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;,
6946 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;,
6947 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;,
6948 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;,
6949 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;,
6950 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Manuel Klimeka37e1102016-12-01 15:45:06 +00006951</pre></td></tr>
6952
6953
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006954<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 +00006955<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
6956type of the matched node.
6957
6958For example, in:
6959 class A {};
6960 using B = A;
George Karpenkovdaac52c2018-07-23 22:29:10 +00006961The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
Manuel Klimeka37e1102016-12-01 15:45:06 +00006962both B and A.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00006963</pre></td></tr>
6964
6965
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006966<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 +00006967<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
6968
6969Given
6970 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
6971unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
6972 matches sizeof(a) and alignof(c)
6973</pre></td></tr>
6974
6975
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006976<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 +00006977<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
6978
6979Example matches true (matcher = hasUnaryOperand(
6980 cxxBoolLiteral(equals(true))))
6981 !true
6982</pre></td></tr>
6983
6984
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00006985<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 +00006986<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
6987given matcher. Implicit object expressions are included; that is, it matches
6988use of implicit `this`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00006989
6990Given
Yitzhak Mandelbaum8a436802019-02-08 16:00:44 +00006991 struct X {
6992 int m;
6993 int f(X x) { x.m; return m; }
6994 };
6995memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6996 matches `x.m`, but not `m`; however,
6997memberExpr(hasObjectExpression(hasType(pointsTo(
6998 cxxRecordDecl(hasName("X"))))))
6999 matches `m` (aka. `this-&gt;m`), but not `x.m`.
Shuai Wang92f9d1b2018-08-23 17:16:06 +00007000</pre></td></tr>
7001
7002
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007003<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 +00007004<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7005matches the given matcher.
7006
7007The associated declaration is:
7008- for type nodes, the declaration of the underlying type
7009- for CallExpr, the declaration of the callee
7010- for MemberExpr, the declaration of the referenced member
7011- for CXXConstructExpr, the declaration of the constructor
Malcolm Parsons7d96c332016-10-31 22:04:07 +00007012- for CXXNewExpr, the declaration of the operator new
George Karpenkov079275b2018-07-27 17:26:11 +00007013- for ObjCIvarExpr, the declaration of the ivar
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007014
Benjamin Kramerae7ff382018-01-17 16:50:14 +00007015For type nodes, hasDeclaration will generally match the declaration of the
7016sugared type. Given
7017 class X {};
7018 typedef X Y;
7019 Y y;
7020in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7021typedefDecl. A common use case is to match the underlying, desugared type.
7022This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7023 varDecl(hasType(hasUnqualifiedDesugaredType(
7024 recordType(hasDeclaration(decl())))))
7025In this matcher, the decl will match the CXXRecordDecl of class X.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007026
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007027Usable 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;,
7028 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;,
7029 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;,
7030 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;,
7031 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;,
7032 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;,
7033 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007034</pre></td></tr>
7035
7036
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007037<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 +00007038<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7039
7040Given
7041 namespace X { void b(); }
7042 using X::b;
7043usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7044 matches using X::b </pre></td></tr>
7045
7046
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007047<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 +00007048<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7049matched by the given matcher.
7050
7051Given
7052 namespace X { int a; void b(); }
7053 using X::a;
7054 using X::b;
7055usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7056 matches using X::b but not using X::a </pre></td></tr>
7057
7058
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007059<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 +00007060<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 +00007061declaration's type.
7062
7063In case of a value declaration (for example a variable declaration),
7064this resolves one layer of indirection. For example, in the value
7065declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7066X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7067declaration of x.
7068
7069Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7070 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
George Karpenkovba02bc52018-07-06 21:36:04 +00007071 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007072 class X {};
7073 void y(X &amp;x) { x; X z; }
George Karpenkovba02bc52018-07-06 21:36:04 +00007074 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007075
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007076Usable 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 +00007077</pre></td></tr>
7078
7079
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007080<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 +00007081<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 +00007082matcher.
7083
7084Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7085 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00007086 and U (matcher = typedefDecl(hasType(asString("int")))
George Karpenkovba02bc52018-07-06 21:36:04 +00007087 and friend class X (matcher = friendDecl(hasType("X"))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007088 class X {};
7089 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00007090 typedef int U;
George Karpenkovba02bc52018-07-06 21:36:04 +00007091 class Y { friend class X; };
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007092</pre></td></tr>
7093
7094
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007095<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 +00007096<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7097that matches the given matcher.
7098
7099Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7100 bool y() { return true; }
7101 bool x = y();
7102</pre></td></tr>
7103
7104
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007105<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 +00007106<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7107expression.
7108
7109Given
7110 void f(int b) {
7111 int a[b];
7112 }
7113variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7114 varDecl(hasName("b")))))))
7115 matches "int a[b]"
7116</pre></td></tr>
7117
7118
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007119<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 +00007120<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7121definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007122
7123Given
7124 for (;;) {}
7125hasBody(compoundStmt())
7126 matches 'for (;;) {}'
7127with compoundStmt()
7128 matching '{}'
7129</pre></td></tr>
7130
7131
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007132<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 +00007133<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 +00007134switch statement or conditional operator.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00007135
7136Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7137 if (true) {}
7138</pre></td></tr>
7139
7140
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007141<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 +00007142<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7143NestedNameSpecifier-matcher matches.
7144</pre></td></tr>
7145
7146
Sylvestre Ledrubc5c3f52018-11-04 17:02:00 +00007147<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 +00007148<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7149QualType-matcher matches.
7150</pre></td></tr>
7151
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00007152<!--END_TRAVERSAL_MATCHERS -->
7153</table>
7154
7155</div>
7156</body>
7157</html>
7158
7159