LibASTMatchersReference.html revision 1.1.1.2 1 1.1 joerg <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 1.1 joerg "http://www.w3.org/TR/html4/strict.dtd">
3 1.1 joerg <html>
4 1.1 joerg <head>
5 1.1 joerg <title>AST Matcher Reference</title>
6 1.1 joerg <link type="text/css" rel="stylesheet" href="../menu.css" />
7 1.1 joerg <link type="text/css" rel="stylesheet" href="../content.css" />
8 1.1 joerg <style type="text/css">
9 1.1 joerg td {
10 1.1 joerg padding: .33em;
11 1.1 joerg }
12 1.1 joerg td.doc {
13 1.1 joerg display: none;
14 1.1 joerg border-bottom: 1px solid black;
15 1.1 joerg }
16 1.1 joerg td.name:hover {
17 1.1 joerg color: blue;
18 1.1 joerg cursor: pointer;
19 1.1 joerg }
20 1.1.1.2 joerg span.mono { font-family: monospace; }
21 1.1.1.2 joerg
22 1.1.1.2 joerg .traverse_compare, .traverse_compare td, .traverse_compare th {
23 1.1.1.2 joerg border: 1px solid black;
24 1.1.1.2 joerg border-collapse: collapse;
25 1.1.1.2 joerg }
26 1.1 joerg </style>
27 1.1 joerg <script type="text/javascript">
28 1.1 joerg function toggle(id) {
29 1.1 joerg if (!id) return;
30 1.1 joerg row = document.getElementById(id);
31 1.1 joerg if (row.style.display != 'table-cell')
32 1.1 joerg row.style.display = 'table-cell';
33 1.1 joerg else
34 1.1 joerg row.style.display = 'none';
35 1.1 joerg }
36 1.1 joerg </script>
37 1.1 joerg </head>
38 1.1 joerg <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39 1.1 joerg
40 1.1 joerg <!--#include virtual="../menu.html.incl"-->
41 1.1 joerg
42 1.1 joerg <div id="content">
43 1.1 joerg
44 1.1 joerg <h1>AST Matcher Reference</h1>
45 1.1 joerg
46 1.1 joerg <p>This document shows all currently implemented matchers. The matchers are grouped
47 1.1 joerg by category and node type they match. You can click on matcher names to show the
48 1.1 joerg matcher's source documentation.</p>
49 1.1 joerg
50 1.1 joerg <p>There are three different basic categories of matchers:
51 1.1 joerg <ul>
52 1.1 joerg <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53 1.1 joerg <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54 1.1 joerg <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55 1.1 joerg </ul>
56 1.1 joerg </p>
57 1.1 joerg
58 1.1 joerg <p>Within each category the matchers are ordered by node type they match on.
59 1.1.1.2 joerg Note that if a matcher can match multiple node types, it will appear
60 1.1 joerg multiple times. This means that by searching for Matcher<Stmt> you can
61 1.1 joerg find all matchers that can be used to match on Stmt nodes.</p>
62 1.1 joerg
63 1.1 joerg <p>The exception to that rule are matchers that can match on any node. Those
64 1.1 joerg are marked with a * and are listed in the beginning of each category.</p>
65 1.1 joerg
66 1.1 joerg <p>Note that the categorization of matchers is a great help when you combine
67 1.1 joerg them into matcher expressions. You will usually want to form matcher expressions
68 1.1 joerg that read like english sentences by alternating between node matchers and
69 1.1 joerg narrowing or traversal matchers, like this:
70 1.1 joerg <pre>
71 1.1 joerg recordDecl(hasDescendant(
72 1.1 joerg ifStmt(hasTrueExpression(
73 1.1 joerg expr(hasDescendant(
74 1.1 joerg ifStmt()))))))
75 1.1 joerg </pre>
76 1.1 joerg </p>
77 1.1 joerg
78 1.1 joerg <!-- ======================================================================= -->
79 1.1.1.2 joerg <h2 id="traverse-mode">Traverse Mode</h2>
80 1.1.1.2 joerg <!-- ======================================================================= -->
81 1.1.1.2 joerg
82 1.1.1.2 joerg <p>The default mode of operation of AST Matchers visits all nodes in the AST,
83 1.1.1.2 joerg even if they are not spelled in the source. This is
84 1.1.1.2 joerg <span class="mono">AsIs</span> mode. This mode requires writing AST matchers
85 1.1.1.2 joerg that explicitly traverse or ignore implicit nodes, such as parentheses
86 1.1.1.2 joerg surrounding an expression or expressions with cleanups. These implicit
87 1.1.1.2 joerg nodes are not always obvious from the syntax of the source code, and so this
88 1.1.1.2 joerg mode requires careful consideration and testing to get the desired behavior
89 1.1.1.2 joerg from an AST matcher.
90 1.1.1.2 joerg </p>
91 1.1.1.2 joerg
92 1.1.1.2 joerg <p>In addition, because template instantiations are matched in the default mode,
93 1.1.1.2 joerg transformations can be accidentally made to template declarations. Finally,
94 1.1.1.2 joerg because implicit nodes are matched by default, transformations can be made on
95 1.1.1.2 joerg entirely incorrect places in the code.</p>
96 1.1.1.2 joerg
97 1.1.1.2 joerg <p>For these reasons, it is possible to ignore AST nodes which are not spelled
98 1.1.1.2 joerg in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99 1.1.1.2 joerg mode. This is likely to be far less error-prone for users who are not already
100 1.1.1.2 joerg very familiar with where implicit nodes appear in the AST. It is also likely
101 1.1.1.2 joerg to be less error-prone for experienced AST users, as difficult cases do not
102 1.1.1.2 joerg need to be encountered and matcher expressions adjusted for these cases.</p>
103 1.1.1.2 joerg
104 1.1.1.2 joerg <p>In clang-query, the mode can be changed with
105 1.1.1.2 joerg <pre>
106 1.1.1.2 joerg set traversal IgnoreUnlessSpelledInSource
107 1.1.1.2 joerg </pre>
108 1.1.1.2 joerg </p>
109 1.1.1.2 joerg This affects both matchers and AST dump output in results.
110 1.1.1.2 joerg
111 1.1.1.2 joerg <p>When using the C++ API such as in clang-tidy checks, the
112 1.1.1.2 joerg <span class="mono">traverse()</span> matcher is used to set the mode:
113 1.1.1.2 joerg <pre>
114 1.1.1.2 joerg Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115 1.1.1.2 joerg returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116 1.1.1.2 joerg ), this);
117 1.1.1.2 joerg </pre>
118 1.1.1.2 joerg </p>
119 1.1.1.2 joerg <p>The following table compares the <span class="mono">AsIs</span> mode with
120 1.1.1.2 joerg the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121 1.1.1.2 joerg
122 1.1.1.2 joerg <table class="traverse_compare">
123 1.1.1.2 joerg <tr>
124 1.1.1.2 joerg <th></th>
125 1.1.1.2 joerg <th><span class="mono">AsIs</span></th>
126 1.1.1.2 joerg <th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127 1.1.1.2 joerg </tr>
128 1.1.1.2 joerg <tr>
129 1.1.1.2 joerg <td>AST dump of <span class="mono">func1</span>:
130 1.1.1.2 joerg <pre>
131 1.1.1.2 joerg struct B {
132 1.1.1.2 joerg B(int);
133 1.1.1.2 joerg };
134 1.1.1.2 joerg
135 1.1.1.2 joerg B func1() { return 42; }
136 1.1.1.2 joerg </pre>
137 1.1.1.2 joerg
138 1.1.1.2 joerg </td>
139 1.1.1.2 joerg <td>
140 1.1.1.2 joerg C++98 dialect:
141 1.1.1.2 joerg <pre>
142 1.1.1.2 joerg FunctionDecl
143 1.1.1.2 joerg `-CompoundStmt
144 1.1.1.2 joerg `-ReturnStmt
145 1.1.1.2 joerg `-ExprWithCleanups
146 1.1.1.2 joerg `-CXXConstructExpr
147 1.1.1.2 joerg `-MaterializeTemporaryExpr
148 1.1.1.2 joerg `-ImplicitCastExpr
149 1.1.1.2 joerg `-ImplicitCastExpr
150 1.1.1.2 joerg `-CXXConstructExpr
151 1.1.1.2 joerg `-IntegerLiteral 'int' 42
152 1.1.1.2 joerg </pre>
153 1.1.1.2 joerg C++11, C++14 dialect:
154 1.1.1.2 joerg <pre>
155 1.1.1.2 joerg FunctionDecl
156 1.1.1.2 joerg `-CompoundStmt
157 1.1.1.2 joerg `-ReturnStmt
158 1.1.1.2 joerg `-ExprWithCleanups
159 1.1.1.2 joerg `-CXXConstructExpr
160 1.1.1.2 joerg `-MaterializeTemporaryExpr
161 1.1.1.2 joerg `-ImplicitCastExpr
162 1.1.1.2 joerg `-CXXConstructExpr
163 1.1.1.2 joerg `-IntegerLiteral 'int' 42
164 1.1.1.2 joerg </pre>
165 1.1.1.2 joerg C++17, C++20 dialect:
166 1.1.1.2 joerg <pre>
167 1.1.1.2 joerg FunctionDecl
168 1.1.1.2 joerg `-CompoundStmt
169 1.1.1.2 joerg `-ReturnStmt
170 1.1.1.2 joerg `-ImplicitCastExpr
171 1.1.1.2 joerg `-CXXConstructExpr
172 1.1.1.2 joerg `-IntegerLiteral 'int' 42
173 1.1.1.2 joerg </pre>
174 1.1.1.2 joerg </td>
175 1.1.1.2 joerg <td>
176 1.1.1.2 joerg All dialects:
177 1.1.1.2 joerg <pre>
178 1.1.1.2 joerg FunctionDecl
179 1.1.1.2 joerg `-CompoundStmt
180 1.1.1.2 joerg `-ReturnStmt
181 1.1.1.2 joerg `-IntegerLiteral 'int' 42
182 1.1.1.2 joerg </pre></td>
183 1.1.1.2 joerg </tr>
184 1.1.1.2 joerg
185 1.1.1.2 joerg <tr>
186 1.1.1.2 joerg <td>Matcher for returned <span class="mono">42</span>:
187 1.1.1.2 joerg <pre>
188 1.1.1.2 joerg struct B {
189 1.1.1.2 joerg B(int);
190 1.1.1.2 joerg };
191 1.1.1.2 joerg
192 1.1.1.2 joerg B func1() { return 42; }
193 1.1.1.2 joerg </pre>
194 1.1.1.2 joerg
195 1.1.1.2 joerg </td>
196 1.1.1.2 joerg <td>
197 1.1.1.2 joerg All dialects:
198 1.1.1.2 joerg <pre>
199 1.1.1.2 joerg returnStmt(hasReturnValue(
200 1.1.1.2 joerg ignoringImplicit(
201 1.1.1.2 joerg ignoringElidableConstructorCall(
202 1.1.1.2 joerg ignoringImplicit(
203 1.1.1.2 joerg cxxConstructExpr(hasArgument(0,
204 1.1.1.2 joerg ignoringImplicit(
205 1.1.1.2 joerg integerLiteral().bind("returnVal")
206 1.1.1.2 joerg )
207 1.1.1.2 joerg ))
208 1.1.1.2 joerg )
209 1.1.1.2 joerg )
210 1.1.1.2 joerg )
211 1.1.1.2 joerg ))
212 1.1.1.2 joerg </pre></td>
213 1.1.1.2 joerg <td>
214 1.1.1.2 joerg All dialects:
215 1.1.1.2 joerg <pre>
216 1.1.1.2 joerg returnStmt(hasReturnValue(
217 1.1.1.2 joerg integerLiteral().bind("returnVal")
218 1.1.1.2 joerg ))
219 1.1.1.2 joerg </pre></td>
220 1.1.1.2 joerg </tr>
221 1.1.1.2 joerg <tr>
222 1.1.1.2 joerg <td>Match result for
223 1.1.1.2 joerg <pre>implicitCastExpr()</pre>
224 1.1.1.2 joerg given:
225 1.1.1.2 joerg <pre>
226 1.1.1.2 joerg struct B {
227 1.1.1.2 joerg B(int);
228 1.1.1.2 joerg };
229 1.1.1.2 joerg
230 1.1.1.2 joerg B func1() { return 42; }
231 1.1.1.2 joerg </pre>
232 1.1.1.2 joerg
233 1.1.1.2 joerg </td>
234 1.1.1.2 joerg <td>
235 1.1.1.2 joerg Match found.</td>
236 1.1.1.2 joerg <td>
237 1.1.1.2 joerg No match.</td>
238 1.1.1.2 joerg </tr>
239 1.1.1.2 joerg <tr>
240 1.1.1.2 joerg <td>Match result for:
241 1.1.1.2 joerg <pre>
242 1.1.1.2 joerg cxxConstructorDecl(
243 1.1.1.2 joerg isCopyConstructor()
244 1.1.1.2 joerg ).bind("prepend_explicit")
245 1.1.1.2 joerg </pre>
246 1.1.1.2 joerg given:
247 1.1.1.2 joerg <pre>
248 1.1.1.2 joerg struct Other {};
249 1.1.1.2 joerg struct Copyable {
250 1.1.1.2 joerg Other m_o;
251 1.1.1.2 joerg Copyable();
252 1.1.1.2 joerg };
253 1.1.1.2 joerg </pre>
254 1.1.1.2 joerg </td>
255 1.1.1.2 joerg <td>
256 1.1.1.2 joerg Match found. Insertion produces incorrect output:
257 1.1.1.2 joerg <pre>
258 1.1.1.2 joerg struct Other {};
259 1.1.1.2 joerg struct explicit Copyable {
260 1.1.1.2 joerg Other m_o;
261 1.1.1.2 joerg Copyable();
262 1.1.1.2 joerg };
263 1.1.1.2 joerg </pre>
264 1.1.1.2 joerg </td>
265 1.1.1.2 joerg <td>
266 1.1.1.2 joerg No match found. Incorrect replacement not possible.
267 1.1.1.2 joerg </td>
268 1.1.1.2 joerg </tr>
269 1.1.1.2 joerg <tr>
270 1.1.1.2 joerg <td>Replacement of <span class="mono">begin()</span>
271 1.1.1.2 joerg with <span class="mono">cbegin()</span>:
272 1.1.1.2 joerg <pre>
273 1.1.1.2 joerg cxxMemberCallExpr(
274 1.1.1.2 joerg on(ConstContainerExpr),
275 1.1.1.2 joerg callee(cxxMethodDecl(hasName("begin")))
276 1.1.1.2 joerg ).bind("replace_with_cbegin")
277 1.1.1.2 joerg </pre>
278 1.1.1.2 joerg given:
279 1.1.1.2 joerg <pre>
280 1.1.1.2 joerg void foo() {
281 1.1.1.2 joerg const Container c;
282 1.1.1.2 joerg c.begin();
283 1.1.1.2 joerg
284 1.1.1.2 joerg for (auto i : c) {
285 1.1.1.2 joerg }
286 1.1.1.2 joerg }
287 1.1.1.2 joerg </pre>
288 1.1.1.2 joerg </td>
289 1.1.1.2 joerg <td>
290 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output:
291 1.1.1.2 joerg <pre>
292 1.1.1.2 joerg void foo() {
293 1.1.1.2 joerg const Container c;
294 1.1.1.2 joerg c.cbegin();
295 1.1.1.2 joerg
296 1.1.1.2 joerg for (auto i :.cbegin() c) {
297 1.1.1.2 joerg }
298 1.1.1.2 joerg }
299 1.1.1.2 joerg </pre>
300 1.1.1.2 joerg </td>
301 1.1.1.2 joerg <td>
302 1.1.1.2 joerg 1 match found. Replacement produces correct output:
303 1.1.1.2 joerg <pre>
304 1.1.1.2 joerg void foo() {
305 1.1.1.2 joerg const Container c;
306 1.1.1.2 joerg c.cbegin();
307 1.1.1.2 joerg
308 1.1.1.2 joerg for (auto i : c) {
309 1.1.1.2 joerg }
310 1.1.1.2 joerg }
311 1.1.1.2 joerg </pre>
312 1.1.1.2 joerg </td>
313 1.1.1.2 joerg </tr>
314 1.1.1.2 joerg <tr>
315 1.1.1.2 joerg <td>Replacement of <span class="mono">int</span> member
316 1.1.1.2 joerg with <span class="mono">safe_int</span>:
317 1.1.1.2 joerg <pre>
318 1.1.1.2 joerg fieldDecl(
319 1.1.1.2 joerg hasType(asString("int"))
320 1.1.1.2 joerg ).bind("use_safe_int")
321 1.1.1.2 joerg </pre>
322 1.1.1.2 joerg given:
323 1.1.1.2 joerg <pre>
324 1.1.1.2 joerg struct S {
325 1.1.1.2 joerg int m_i;
326 1.1.1.2 joerg };
327 1.1.1.2 joerg
328 1.1.1.2 joerg template <typename T> struct TemplStruct {
329 1.1.1.2 joerg TemplStruct() {}
330 1.1.1.2 joerg ~TemplStruct() {}
331 1.1.1.2 joerg
332 1.1.1.2 joerg private:
333 1.1.1.2 joerg T m_t;
334 1.1.1.2 joerg };
335 1.1.1.2 joerg
336 1.1.1.2 joerg void instantiate() { TemplStruct<int> ti; }
337 1.1.1.2 joerg </pre>
338 1.1.1.2 joerg </td>
339 1.1.1.2 joerg <td>
340 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output:
341 1.1.1.2 joerg <pre>
342 1.1.1.2 joerg struct S {
343 1.1.1.2 joerg safe_int m_i;
344 1.1.1.2 joerg };
345 1.1.1.2 joerg
346 1.1.1.2 joerg template <typename T> struct TemplStruct {
347 1.1.1.2 joerg TemplStruct() {}
348 1.1.1.2 joerg ~TemplStruct() {}
349 1.1.1.2 joerg
350 1.1.1.2 joerg private:
351 1.1.1.2 joerg safe_int m_t;
352 1.1.1.2 joerg };
353 1.1.1.2 joerg
354 1.1.1.2 joerg void instantiate() { TemplStruct<int> ti; }
355 1.1.1.2 joerg </pre>
356 1.1.1.2 joerg </td>
357 1.1.1.2 joerg <td>
358 1.1.1.2 joerg 1 match found. Replacement produces correct output:
359 1.1.1.2 joerg <pre>
360 1.1.1.2 joerg struct S {
361 1.1.1.2 joerg safe_int m_i;
362 1.1.1.2 joerg };
363 1.1.1.2 joerg
364 1.1.1.2 joerg template <typename T> struct TemplStruct {
365 1.1.1.2 joerg TemplStruct() {}
366 1.1.1.2 joerg ~TemplStruct() {}
367 1.1.1.2 joerg
368 1.1.1.2 joerg private:
369 1.1.1.2 joerg T m_t;
370 1.1.1.2 joerg };
371 1.1.1.2 joerg
372 1.1.1.2 joerg void instantiate() { TemplStruct<int> ti; }
373 1.1.1.2 joerg </pre>
374 1.1.1.2 joerg </td>
375 1.1.1.2 joerg </tr>
376 1.1.1.2 joerg <tr>
377 1.1.1.2 joerg <td>Add prefix to member initializer
378 1.1.1.2 joerg <pre>
379 1.1.1.2 joerg cxxCtorInitializer(
380 1.1.1.2 joerg forField(fieldDecl())
381 1.1.1.2 joerg ).bind("add_prefix")
382 1.1.1.2 joerg </pre>
383 1.1.1.2 joerg given:
384 1.1.1.2 joerg <pre>
385 1.1.1.2 joerg struct Simple {};
386 1.1.1.2 joerg
387 1.1.1.2 joerg struct Record {
388 1.1.1.2 joerg Record() : i(42) {}
389 1.1.1.2 joerg private:
390 1.1.1.2 joerg int i;
391 1.1.1.2 joerg Simple s;
392 1.1.1.2 joerg };
393 1.1.1.2 joerg </pre>
394 1.1.1.2 joerg </td>
395 1.1.1.2 joerg <td>
396 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output:
397 1.1.1.2 joerg <pre>
398 1.1.1.2 joerg struct Simple {};
399 1.1.1.2 joerg
400 1.1.1.2 joerg struct Record {
401 1.1.1.2 joerg m_Record() : m_i(42) {}
402 1.1.1.2 joerg private:
403 1.1.1.2 joerg int i;
404 1.1.1.2 joerg Simple s;
405 1.1.1.2 joerg };
406 1.1.1.2 joerg </pre>
407 1.1.1.2 joerg </td>
408 1.1.1.2 joerg <td>
409 1.1.1.2 joerg 1 match found. Replacement produces correct output:
410 1.1.1.2 joerg <pre>
411 1.1.1.2 joerg struct Simple {};
412 1.1.1.2 joerg
413 1.1.1.2 joerg struct Record {
414 1.1.1.2 joerg Record() : m_i(42) {}
415 1.1.1.2 joerg private:
416 1.1.1.2 joerg int i;
417 1.1.1.2 joerg Simple s;
418 1.1.1.2 joerg };
419 1.1.1.2 joerg </pre>
420 1.1.1.2 joerg </td>
421 1.1.1.2 joerg </tr>
422 1.1.1.2 joerg <tr>
423 1.1.1.2 joerg <td>Ignored default arguments
424 1.1.1.2 joerg <pre>
425 1.1.1.2 joerg callExpr(
426 1.1.1.2 joerg callee(functionDecl(
427 1.1.1.2 joerg hasName("hasDefaultArg")
428 1.1.1.2 joerg )),
429 1.1.1.2 joerg argumentCountIs(1)
430 1.1.1.2 joerg ).bind("add_prefix")
431 1.1.1.2 joerg </pre>
432 1.1.1.2 joerg given:
433 1.1.1.2 joerg <pre>
434 1.1.1.2 joerg void hasDefaultArg(int i, int j = 0) {}
435 1.1.1.2 joerg void callDefaultArg() { hasDefaultArg(42); }
436 1.1.1.2 joerg </pre>
437 1.1.1.2 joerg </td>
438 1.1.1.2 joerg <td>
439 1.1.1.2 joerg No match.
440 1.1.1.2 joerg </td>
441 1.1.1.2 joerg <td>
442 1.1.1.2 joerg 1 match found.
443 1.1.1.2 joerg </td>
444 1.1.1.2 joerg </tr>
445 1.1.1.2 joerg <tr>
446 1.1.1.2 joerg <td>Lambda fields
447 1.1.1.2 joerg <pre>
448 1.1.1.2 joerg fieldDecl(
449 1.1.1.2 joerg hasType(asString("int"))
450 1.1.1.2 joerg ).bind("make_safe")
451 1.1.1.2 joerg </pre>
452 1.1.1.2 joerg given:
453 1.1.1.2 joerg <pre>
454 1.1.1.2 joerg struct S {
455 1.1.1.2 joerg int m_i;
456 1.1.1.2 joerg };
457 1.1.1.2 joerg
458 1.1.1.2 joerg void func() {
459 1.1.1.2 joerg int a = 0;
460 1.1.1.2 joerg int c = 0;
461 1.1.1.2 joerg
462 1.1.1.2 joerg auto l = [a, b = c](int d) { int e = d; };
463 1.1.1.2 joerg l(43);
464 1.1.1.2 joerg }
465 1.1.1.2 joerg </pre>
466 1.1.1.2 joerg </td>
467 1.1.1.2 joerg <td>
468 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output:
469 1.1.1.2 joerg <pre>
470 1.1.1.2 joerg struct S {
471 1.1.1.2 joerg safe_int m_i;
472 1.1.1.2 joerg };
473 1.1.1.2 joerg
474 1.1.1.2 joerg void func() {
475 1.1.1.2 joerg int a = 0;
476 1.1.1.2 joerg int c = 0;
477 1.1.1.2 joerg
478 1.1.1.2 joerg auto l = [safe_a, safe_b = c](int d) { int e = d; };
479 1.1.1.2 joerg l(43);
480 1.1.1.2 joerg }
481 1.1.1.2 joerg </pre>
482 1.1.1.2 joerg </td>
483 1.1.1.2 joerg <td>
484 1.1.1.2 joerg 1 match found. Replacement produces correct output:
485 1.1.1.2 joerg <pre>
486 1.1.1.2 joerg struct S {
487 1.1.1.2 joerg safe_int m_i;
488 1.1.1.2 joerg };
489 1.1.1.2 joerg
490 1.1.1.2 joerg void func() {
491 1.1.1.2 joerg int a = 0;
492 1.1.1.2 joerg int c = 0;
493 1.1.1.2 joerg
494 1.1.1.2 joerg auto l = [a, b = c](int d) { int e = d; };
495 1.1.1.2 joerg l(43);
496 1.1.1.2 joerg }
497 1.1.1.2 joerg </pre>
498 1.1.1.2 joerg </td>
499 1.1.1.2 joerg
500 1.1.1.2 joerg </tr>
501 1.1.1.2 joerg
502 1.1.1.2 joerg
503 1.1.1.2 joerg
504 1.1.1.2 joerg
505 1.1.1.2 joerg
506 1.1.1.2 joerg <tr>
507 1.1.1.2 joerg <td>Rewritten binary operators
508 1.1.1.2 joerg <pre>
509 1.1.1.2 joerg binaryOperator(
510 1.1.1.2 joerg hasOperatorName("<"),
511 1.1.1.2 joerg hasRHS(hasDescendant(integerLiteral(equals(0))))
512 1.1.1.2 joerg )
513 1.1.1.2 joerg </pre>
514 1.1.1.2 joerg given:
515 1.1.1.2 joerg <pre>
516 1.1.1.2 joerg #include <compare>
517 1.1.1.2 joerg
518 1.1.1.2 joerg class HasSpaceship {
519 1.1.1.2 joerg public:
520 1.1.1.2 joerg int x;
521 1.1.1.2 joerg bool operator==(const HasSpaceship&) const = default;
522 1.1.1.2 joerg std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523 1.1.1.2 joerg };
524 1.1.1.2 joerg
525 1.1.1.2 joerg bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526 1.1.1.2 joerg return a < b;
527 1.1.1.2 joerg }
528 1.1.1.2 joerg </pre>
529 1.1.1.2 joerg </td>
530 1.1.1.2 joerg <td>
531 1.1.1.2 joerg 1 match found.
532 1.1.1.2 joerg
533 1.1.1.2 joerg <pre>
534 1.1.1.2 joerg return a < b;
535 1.1.1.2 joerg ^~~~~
536 1.1.1.2 joerg </pre>
537 1.1.1.2 joerg
538 1.1.1.2 joerg </td>
539 1.1.1.2 joerg <td>
540 1.1.1.2 joerg No match found.
541 1.1.1.2 joerg </td>
542 1.1.1.2 joerg </tr>
543 1.1.1.2 joerg </table>
544 1.1.1.2 joerg
545 1.1.1.2 joerg <!-- ======================================================================= -->
546 1.1 joerg <h2 id="decl-matchers">Node Matchers</h2>
547 1.1 joerg <!-- ======================================================================= -->
548 1.1 joerg
549 1.1 joerg <p>Node matchers are at the core of matcher expressions - they specify the type
550 1.1 joerg of node that is expected. Every match expression starts with a node matcher,
551 1.1 joerg which can then be further refined with a narrowing or traversal matcher. All
552 1.1 joerg traversal matchers take node matchers as their arguments.</p>
553 1.1 joerg
554 1.1 joerg <p>For convenience, all node matchers take an arbitrary number of arguments
555 1.1 joerg and implicitly act as allOf matchers.</p>
556 1.1 joerg
557 1.1 joerg <p>Node matchers are the only matchers that support the bind("id") call to
558 1.1 joerg bind the matched node to the given string, to be later retrieved from the
559 1.1 joerg match callback.</p>
560 1.1 joerg
561 1.1 joerg <p>It is important to remember that the arguments to node matchers are
562 1.1 joerg predicates on the same node, just with additional information about the type.
563 1.1 joerg This is often useful to make matcher expression more readable by inlining bind
564 1.1 joerg calls into redundant node matchers inside another node matcher:
565 1.1 joerg <pre>
566 1.1 joerg // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567 1.1 joerg // the same node.
568 1.1 joerg recordDecl(decl().bind("id"), hasName("::MyClass"))
569 1.1 joerg </pre>
570 1.1 joerg </p>
571 1.1 joerg
572 1.1 joerg <table>
573 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574 1.1 joerg <!-- START_DECL_MATCHERS -->
575 1.1 joerg
576 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>...</td></tr>
577 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
578 1.1.1.2 joerg
579 1.1.1.2 joerg Examples matches public virtual B.
580 1.1.1.2 joerg class B {};
581 1.1.1.2 joerg class C : public virtual B {};
582 1.1.1.2 joerg </pre></td></tr>
583 1.1.1.2 joerg
584 1.1.1.2 joerg
585 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr>
586 1.1 joerg <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
587 1.1 joerg
588 1.1 joerg Examples matches i(42).
589 1.1 joerg class C {
590 1.1 joerg C() : i(42) {}
591 1.1 joerg int i;
592 1.1 joerg };
593 1.1 joerg </pre></td></tr>
594 1.1 joerg
595 1.1 joerg
596 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr>
597 1.1 joerg <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
598 1.1 joerg
599 1.1 joerg Given
600 1.1 joerg class C {
601 1.1 joerg public:
602 1.1 joerg int a;
603 1.1 joerg };
604 1.1 joerg accessSpecDecl()
605 1.1 joerg matches 'public:'
606 1.1 joerg </pre></td></tr>
607 1.1 joerg
608 1.1 joerg
609 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>>...</td></tr>
610 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
611 1.1.1.2 joerg Example matches foo and bar
612 1.1.1.2 joerg (matcher = bindingDecl()
613 1.1.1.2 joerg
614 1.1.1.2 joerg auto [foo, bar] = std::make_pair{42, 42};
615 1.1.1.2 joerg </pre></td></tr>
616 1.1.1.2 joerg
617 1.1.1.2 joerg
618 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr>
619 1.1 joerg <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
620 1.1 joerg
621 1.1 joerg Example matches the declaration of the nameless block printing an input
622 1.1 joerg integer.
623 1.1 joerg
624 1.1 joerg myFunc(^(int p) {
625 1.1 joerg printf("%d", p);
626 1.1 joerg })
627 1.1 joerg </pre></td></tr>
628 1.1 joerg
629 1.1 joerg
630 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr>
631 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
632 1.1 joerg
633 1.1 joerg Example matches Z
634 1.1 joerg template<class T> class Z {};
635 1.1 joerg </pre></td></tr>
636 1.1 joerg
637 1.1 joerg
638 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr>
639 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
640 1.1 joerg
641 1.1 joerg Given
642 1.1 joerg template<class T1, class T2, int I>
643 1.1 joerg class A {};
644 1.1 joerg
645 1.1 joerg template<class T, int I>
646 1.1 joerg class A<T, T*, I> {};
647 1.1 joerg
648 1.1 joerg template<>
649 1.1 joerg class A<int, int, 1> {};
650 1.1 joerg classTemplatePartialSpecializationDecl()
651 1.1 joerg matches the specialization A<T,T*,I> but not A<int,int,1>
652 1.1 joerg </pre></td></tr>
653 1.1 joerg
654 1.1 joerg
655 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr>
656 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
657 1.1 joerg
658 1.1 joerg Given
659 1.1 joerg template<typename T> class A {};
660 1.1 joerg template<> class A<double> {};
661 1.1 joerg A<int> a;
662 1.1 joerg classTemplateSpecializationDecl()
663 1.1 joerg matches the specializations A<int> and A<double>
664 1.1 joerg </pre></td></tr>
665 1.1 joerg
666 1.1 joerg
667 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr>
668 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
669 1.1 joerg
670 1.1 joerg Example matches Foo::Foo() and Foo::Foo(int)
671 1.1 joerg class Foo {
672 1.1 joerg public:
673 1.1 joerg Foo();
674 1.1 joerg Foo(int);
675 1.1 joerg int DoSomething();
676 1.1 joerg };
677 1.1 joerg </pre></td></tr>
678 1.1 joerg
679 1.1 joerg
680 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr>
681 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
682 1.1 joerg
683 1.1 joerg Example matches the operator.
684 1.1 joerg class X { operator int() const; };
685 1.1 joerg </pre></td></tr>
686 1.1 joerg
687 1.1 joerg
688 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr>
689 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
690 1.1 joerg
691 1.1 joerg Example matches the deduction guide.
692 1.1 joerg template<typename T>
693 1.1 joerg class X { X(int) };
694 1.1 joerg X(int) -> X<int>;
695 1.1 joerg </pre></td></tr>
696 1.1 joerg
697 1.1 joerg
698 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr>
699 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
700 1.1 joerg
701 1.1 joerg Example matches Foo::~Foo()
702 1.1 joerg class Foo {
703 1.1 joerg public:
704 1.1 joerg virtual ~Foo();
705 1.1 joerg };
706 1.1 joerg </pre></td></tr>
707 1.1 joerg
708 1.1 joerg
709 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr>
710 1.1 joerg <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
711 1.1 joerg
712 1.1 joerg Example matches y
713 1.1 joerg class X { void y(); };
714 1.1 joerg </pre></td></tr>
715 1.1 joerg
716 1.1 joerg
717 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr>
718 1.1 joerg <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
719 1.1 joerg
720 1.1 joerg Example matches X, Z
721 1.1 joerg class X;
722 1.1 joerg template<class T> class Z {};
723 1.1 joerg </pre></td></tr>
724 1.1 joerg
725 1.1 joerg
726 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr>
727 1.1 joerg <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
728 1.1 joerg
729 1.1 joerg Examples matches X, C, and the friend declaration inside C;
730 1.1 joerg void X();
731 1.1 joerg class C {
732 1.1 joerg friend X;
733 1.1 joerg };
734 1.1 joerg </pre></td></tr>
735 1.1 joerg
736 1.1 joerg
737 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr>
738 1.1 joerg <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
739 1.1 joerg and non-type template parameter declarations).
740 1.1 joerg
741 1.1 joerg Given
742 1.1 joerg class X { int y; };
743 1.1 joerg declaratorDecl()
744 1.1 joerg matches int y.
745 1.1 joerg </pre></td></tr>
746 1.1 joerg
747 1.1 joerg
748 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr>
749 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
750 1.1.1.2 joerg
751 1.1.1.2 joerg Examples matches the declaration node with foo and bar, but not
752 1.1.1.2 joerg number.
753 1.1.1.2 joerg (matcher = declStmt(has(decompositionDecl())))
754 1.1.1.2 joerg
755 1.1.1.2 joerg int number = 42;
756 1.1.1.2 joerg auto [foo, bar] = std::make_pair{42, 42};
757 1.1.1.2 joerg </pre></td></tr>
758 1.1.1.2 joerg
759 1.1.1.2 joerg
760 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr>
761 1.1 joerg <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
762 1.1 joerg
763 1.1 joerg Example matches A, B, C
764 1.1 joerg enum X {
765 1.1 joerg A, B, C
766 1.1 joerg };
767 1.1 joerg </pre></td></tr>
768 1.1 joerg
769 1.1 joerg
770 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr>
771 1.1 joerg <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
772 1.1 joerg
773 1.1 joerg Example matches X
774 1.1 joerg enum X {
775 1.1 joerg A, B, C
776 1.1 joerg };
777 1.1 joerg </pre></td></tr>
778 1.1 joerg
779 1.1 joerg
780 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr>
781 1.1 joerg <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
782 1.1 joerg
783 1.1 joerg Given
784 1.1 joerg class X { int m; };
785 1.1 joerg fieldDecl()
786 1.1 joerg matches 'm'.
787 1.1 joerg </pre></td></tr>
788 1.1 joerg
789 1.1 joerg
790 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr>
791 1.1 joerg <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
792 1.1 joerg
793 1.1 joerg Given
794 1.1 joerg class X { friend void foo(); };
795 1.1 joerg friendDecl()
796 1.1 joerg matches 'friend void foo()'.
797 1.1 joerg </pre></td></tr>
798 1.1 joerg
799 1.1 joerg
800 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr>
801 1.1 joerg <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
802 1.1 joerg
803 1.1 joerg Example matches f
804 1.1 joerg void f();
805 1.1 joerg </pre></td></tr>
806 1.1 joerg
807 1.1 joerg
808 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr>
809 1.1 joerg <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
810 1.1 joerg
811 1.1 joerg Example matches f
812 1.1 joerg template<class T> void f(T t) {}
813 1.1 joerg </pre></td></tr>
814 1.1 joerg
815 1.1 joerg
816 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr>
817 1.1 joerg <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
818 1.1 joerg
819 1.1 joerg Given
820 1.1 joerg struct X { struct { int a; }; };
821 1.1 joerg indirectFieldDecl()
822 1.1 joerg matches 'a'.
823 1.1 joerg </pre></td></tr>
824 1.1 joerg
825 1.1 joerg
826 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr>
827 1.1 joerg <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
828 1.1 joerg
829 1.1 joerg Given
830 1.1 joerg goto FOO;
831 1.1 joerg FOO: bar();
832 1.1 joerg labelDecl()
833 1.1 joerg matches 'FOO:'
834 1.1 joerg </pre></td></tr>
835 1.1 joerg
836 1.1 joerg
837 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr>
838 1.1 joerg <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
839 1.1 joerg
840 1.1 joerg Given
841 1.1 joerg extern "C" {}
842 1.1 joerg linkageSpecDecl()
843 1.1 joerg matches "extern "C" {}"
844 1.1 joerg </pre></td></tr>
845 1.1 joerg
846 1.1 joerg
847 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr>
848 1.1 joerg <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
849 1.1 joerg
850 1.1 joerg Example matches X, S, the anonymous union type, i, and U;
851 1.1 joerg typedef int X;
852 1.1 joerg struct S {
853 1.1 joerg union {
854 1.1 joerg int i;
855 1.1 joerg } U;
856 1.1 joerg };
857 1.1 joerg </pre></td></tr>
858 1.1 joerg
859 1.1 joerg
860 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr>
861 1.1 joerg <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
862 1.1 joerg
863 1.1 joerg Given
864 1.1 joerg namespace test {}
865 1.1 joerg namespace alias = ::test;
866 1.1 joerg namespaceAliasDecl()
867 1.1 joerg matches "namespace alias" but not "namespace test"
868 1.1 joerg </pre></td></tr>
869 1.1 joerg
870 1.1 joerg
871 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr>
872 1.1 joerg <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
873 1.1 joerg
874 1.1 joerg Given
875 1.1 joerg namespace {}
876 1.1 joerg namespace test {}
877 1.1 joerg namespaceDecl()
878 1.1 joerg matches "namespace {}" and "namespace test {}"
879 1.1 joerg </pre></td></tr>
880 1.1 joerg
881 1.1 joerg
882 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr>
883 1.1 joerg <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
884 1.1 joerg
885 1.1 joerg Given
886 1.1 joerg template <typename T, int N> struct C {};
887 1.1 joerg nonTypeTemplateParmDecl()
888 1.1 joerg matches 'N', but not 'T'.
889 1.1 joerg </pre></td></tr>
890 1.1 joerg
891 1.1 joerg
892 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr>
893 1.1 joerg <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
894 1.1 joerg
895 1.1 joerg Example matches Foo (Additions)
896 1.1 joerg @interface Foo (Additions)
897 1.1 joerg @end
898 1.1 joerg </pre></td></tr>
899 1.1 joerg
900 1.1 joerg
901 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr>
902 1.1 joerg <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
903 1.1 joerg
904 1.1 joerg Example matches Foo (Additions)
905 1.1 joerg @implementation Foo (Additions)
906 1.1 joerg @end
907 1.1 joerg </pre></td></tr>
908 1.1 joerg
909 1.1 joerg
910 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr>
911 1.1 joerg <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
912 1.1 joerg
913 1.1 joerg Example matches Foo
914 1.1 joerg @implementation Foo
915 1.1 joerg @end
916 1.1 joerg </pre></td></tr>
917 1.1 joerg
918 1.1 joerg
919 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr>
920 1.1 joerg <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
921 1.1 joerg
922 1.1 joerg Example matches Foo
923 1.1 joerg @interface Foo
924 1.1 joerg @end
925 1.1 joerg </pre></td></tr>
926 1.1 joerg
927 1.1 joerg
928 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr>
929 1.1 joerg <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
930 1.1 joerg
931 1.1 joerg Example matches _enabled
932 1.1 joerg @implementation Foo {
933 1.1 joerg BOOL _enabled;
934 1.1 joerg }
935 1.1 joerg @end
936 1.1 joerg </pre></td></tr>
937 1.1 joerg
938 1.1 joerg
939 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr>
940 1.1 joerg <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
941 1.1 joerg
942 1.1 joerg Example matches both declaration and definition of -[Foo method]
943 1.1 joerg @interface Foo
944 1.1 joerg - (void)method;
945 1.1 joerg @end
946 1.1 joerg
947 1.1 joerg @implementation Foo
948 1.1 joerg - (void)method {}
949 1.1 joerg @end
950 1.1 joerg </pre></td></tr>
951 1.1 joerg
952 1.1 joerg
953 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr>
954 1.1 joerg <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
955 1.1 joerg
956 1.1 joerg Example matches enabled
957 1.1 joerg @interface Foo
958 1.1 joerg @property BOOL enabled;
959 1.1 joerg @end
960 1.1 joerg </pre></td></tr>
961 1.1 joerg
962 1.1 joerg
963 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr>
964 1.1 joerg <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
965 1.1 joerg
966 1.1 joerg Example matches FooDelegate
967 1.1 joerg @protocol FooDelegate
968 1.1 joerg @end
969 1.1 joerg </pre></td></tr>
970 1.1 joerg
971 1.1 joerg
972 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr>
973 1.1 joerg <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
974 1.1 joerg
975 1.1 joerg Given
976 1.1 joerg void f(int x);
977 1.1 joerg parmVarDecl()
978 1.1 joerg matches int x.
979 1.1 joerg </pre></td></tr>
980 1.1 joerg
981 1.1 joerg
982 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr>
983 1.1 joerg <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
984 1.1 joerg
985 1.1 joerg Example matches X, Z, U, and S
986 1.1 joerg class X;
987 1.1 joerg template<class T> class Z {};
988 1.1 joerg struct S {};
989 1.1 joerg union U {};
990 1.1 joerg </pre></td></tr>
991 1.1 joerg
992 1.1 joerg
993 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr>
994 1.1 joerg <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
995 1.1 joerg
996 1.1 joerg Example:
997 1.1 joerg staticAssertExpr()
998 1.1 joerg matches
999 1.1 joerg static_assert(sizeof(S) == sizeof(int))
1000 1.1 joerg in
1001 1.1 joerg struct S {
1002 1.1 joerg int x;
1003 1.1 joerg };
1004 1.1 joerg static_assert(sizeof(S) == sizeof(int));
1005 1.1 joerg </pre></td></tr>
1006 1.1 joerg
1007 1.1 joerg
1008 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr>
1009 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1010 1.1.1.2 joerg
1011 1.1.1.2 joerg Example matches X, Z, U, S, E
1012 1.1.1.2 joerg class X;
1013 1.1.1.2 joerg template<class T> class Z {};
1014 1.1.1.2 joerg struct S {};
1015 1.1.1.2 joerg union U {};
1016 1.1.1.2 joerg enum E {
1017 1.1.1.2 joerg A, B, C
1018 1.1.1.2 joerg };
1019 1.1.1.2 joerg </pre></td></tr>
1020 1.1.1.2 joerg
1021 1.1.1.2 joerg
1022 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr>
1023 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1024 1.1.1.2 joerg
1025 1.1.1.2 joerg Given
1026 1.1.1.2 joerg template <template <typename> class Z, int N> struct C {};
1027 1.1.1.2 joerg templateTypeParmDecl()
1028 1.1.1.2 joerg matches 'Z', but not 'N'.
1029 1.1.1.2 joerg </pre></td></tr>
1030 1.1.1.2 joerg
1031 1.1.1.2 joerg
1032 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr>
1033 1.1 joerg <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1034 1.1 joerg
1035 1.1 joerg Given
1036 1.1 joerg template <typename T, int N> struct C {};
1037 1.1 joerg templateTypeParmDecl()
1038 1.1 joerg matches 'T', but not 'N'.
1039 1.1 joerg </pre></td></tr>
1040 1.1 joerg
1041 1.1 joerg
1042 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr>
1043 1.1 joerg <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1044 1.1 joerg
1045 1.1 joerg Given
1046 1.1 joerg int X;
1047 1.1 joerg namespace NS {
1048 1.1 joerg int Y;
1049 1.1 joerg } // namespace NS
1050 1.1 joerg decl(hasDeclContext(translationUnitDecl()))
1051 1.1 joerg matches "int X", but not "int Y".
1052 1.1 joerg </pre></td></tr>
1053 1.1 joerg
1054 1.1 joerg
1055 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr>
1056 1.1 joerg <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1057 1.1 joerg
1058 1.1 joerg Given
1059 1.1 joerg typedef int X;
1060 1.1 joerg using Y = int;
1061 1.1 joerg typeAliasDecl()
1062 1.1 joerg matches "using Y = int", but not "typedef int X"
1063 1.1 joerg </pre></td></tr>
1064 1.1 joerg
1065 1.1 joerg
1066 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr>
1067 1.1 joerg <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1068 1.1 joerg
1069 1.1 joerg typeAliasTemplateDecl() matches
1070 1.1 joerg template <typename T>
1071 1.1 joerg using Y = X<T>;
1072 1.1 joerg </pre></td></tr>
1073 1.1 joerg
1074 1.1 joerg
1075 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr>
1076 1.1 joerg <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1077 1.1 joerg
1078 1.1 joerg Given
1079 1.1 joerg typedef int X;
1080 1.1 joerg using Y = int;
1081 1.1 joerg typedefDecl()
1082 1.1 joerg matches "typedef int X", but not "using Y = int"
1083 1.1 joerg </pre></td></tr>
1084 1.1 joerg
1085 1.1 joerg
1086 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr>
1087 1.1 joerg <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1088 1.1 joerg
1089 1.1 joerg Given
1090 1.1 joerg typedef int X;
1091 1.1 joerg using Y = int;
1092 1.1 joerg typedefNameDecl()
1093 1.1 joerg matches "typedef int X" and "using Y = int"
1094 1.1 joerg </pre></td></tr>
1095 1.1 joerg
1096 1.1 joerg
1097 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr>
1098 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1099 1.1 joerg typename.
1100 1.1 joerg
1101 1.1 joerg Given
1102 1.1 joerg template <typename T>
1103 1.1 joerg struct Base { typedef T Foo; };
1104 1.1 joerg
1105 1.1 joerg template<typename T>
1106 1.1 joerg struct S : private Base<T> {
1107 1.1 joerg using typename Base<T>::Foo;
1108 1.1 joerg };
1109 1.1 joerg unresolvedUsingTypenameDecl()
1110 1.1 joerg matches using Base<T>::Foo </pre></td></tr>
1111 1.1 joerg
1112 1.1 joerg
1113 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr>
1114 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1115 1.1 joerg
1116 1.1 joerg Given
1117 1.1 joerg template<typename X>
1118 1.1 joerg class C : private X {
1119 1.1 joerg using X::x;
1120 1.1 joerg };
1121 1.1 joerg unresolvedUsingValueDecl()
1122 1.1 joerg matches using X::x </pre></td></tr>
1123 1.1 joerg
1124 1.1 joerg
1125 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr>
1126 1.1 joerg <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1127 1.1 joerg
1128 1.1 joerg Given
1129 1.1 joerg namespace X { int x; }
1130 1.1 joerg using X::x;
1131 1.1 joerg usingDecl()
1132 1.1 joerg matches using X::x </pre></td></tr>
1133 1.1 joerg
1134 1.1 joerg
1135 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr>
1136 1.1 joerg <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1137 1.1 joerg
1138 1.1 joerg Given
1139 1.1 joerg namespace X { int x; }
1140 1.1 joerg using namespace X;
1141 1.1 joerg usingDirectiveDecl()
1142 1.1 joerg matches using namespace X </pre></td></tr>
1143 1.1 joerg
1144 1.1 joerg
1145 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr>
1146 1.1 joerg <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1147 1.1 joerg
1148 1.1 joerg Example matches A, B, C and F
1149 1.1 joerg enum X { A, B, C };
1150 1.1 joerg void F();
1151 1.1 joerg </pre></td></tr>
1152 1.1 joerg
1153 1.1 joerg
1154 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr>
1155 1.1 joerg <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1156 1.1 joerg
1157 1.1 joerg Note: this does not match declarations of member variables, which are
1158 1.1 joerg "field" declarations in Clang parlance.
1159 1.1 joerg
1160 1.1 joerg Example matches a
1161 1.1 joerg int a;
1162 1.1 joerg </pre></td></tr>
1163 1.1 joerg
1164 1.1 joerg
1165 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr>
1166 1.1 joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1167 1.1 joerg </pre></td></tr>
1168 1.1 joerg
1169 1.1 joerg
1170 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr>
1171 1.1 joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1172 1.1 joerg
1173 1.1 joerg Given
1174 1.1 joerg namespace ns {
1175 1.1 joerg struct A { static void f(); };
1176 1.1 joerg void A::f() {}
1177 1.1 joerg void g() { A::f(); }
1178 1.1 joerg }
1179 1.1 joerg ns::A a;
1180 1.1 joerg nestedNameSpecifier()
1181 1.1 joerg matches "ns::" and both "A::"
1182 1.1 joerg </pre></td></tr>
1183 1.1 joerg
1184 1.1 joerg
1185 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr>
1186 1.1 joerg <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1187 1.1 joerg
1188 1.1 joerg Given
1189 1.1 joerg
1190 1.1 joerg #pragma omp parallel default(none)
1191 1.1 joerg #pragma omp parallel default(shared)
1192 1.1.1.2 joerg #pragma omp parallel default(firstprivate)
1193 1.1 joerg #pragma omp parallel
1194 1.1 joerg
1195 1.1.1.2 joerg ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1196 1.1.1.2 joerg ``default(firstprivate)``
1197 1.1 joerg </pre></td></tr>
1198 1.1 joerg
1199 1.1 joerg
1200 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr>
1201 1.1 joerg <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1202 1.1 joerg </pre></td></tr>
1203 1.1 joerg
1204 1.1 joerg
1205 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr>
1206 1.1 joerg <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1207 1.1 joerg
1208 1.1 joerg Given
1209 1.1 joerg FOO: bar();
1210 1.1 joerg void *ptr = &&FOO;
1211 1.1 joerg goto *bar;
1212 1.1 joerg addrLabelExpr()
1213 1.1 joerg matches '&&FOO'
1214 1.1 joerg </pre></td></tr>
1215 1.1 joerg
1216 1.1 joerg
1217 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr>
1218 1.1 joerg <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1219 1.1 joerg
1220 1.1 joerg Given
1221 1.1 joerg int i = a[1];
1222 1.1 joerg arraySubscriptExpr()
1223 1.1 joerg matches "a[1]"
1224 1.1 joerg </pre></td></tr>
1225 1.1 joerg
1226 1.1 joerg
1227 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr>
1228 1.1 joerg <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1229 1.1 joerg
1230 1.1 joerg int i = 100;
1231 1.1 joerg __asm("mov al, 2");
1232 1.1 joerg asmStmt()
1233 1.1 joerg matches '__asm("mov al, 2")'
1234 1.1 joerg </pre></td></tr>
1235 1.1 joerg
1236 1.1 joerg
1237 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr>
1238 1.1 joerg <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1239 1.1 joerg Example matches __atomic_load_n(ptr, 1)
1240 1.1 joerg void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1241 1.1 joerg </pre></td></tr>
1242 1.1 joerg
1243 1.1 joerg
1244 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr>
1245 1.1 joerg <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1246 1.1 joerg
1247 1.1 joerg Given
1248 1.1 joerg @autoreleasepool {
1249 1.1 joerg int x = 0;
1250 1.1 joerg }
1251 1.1 joerg autoreleasePoolStmt(stmt()) matches the declaration of "x"
1252 1.1 joerg inside the autorelease pool.
1253 1.1 joerg </pre></td></tr>
1254 1.1 joerg
1255 1.1 joerg
1256 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr>
1257 1.1 joerg <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1258 1.1 joerg
1259 1.1 joerg Example matches a ?: b
1260 1.1 joerg (a ?: b) + 42;
1261 1.1 joerg </pre></td></tr>
1262 1.1 joerg
1263 1.1 joerg
1264 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr>
1265 1.1 joerg <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1266 1.1 joerg
1267 1.1 joerg Example matches a || b
1268 1.1 joerg !(a || b)
1269 1.1.1.2 joerg See also the binaryOperation() matcher for more-general matching.
1270 1.1 joerg </pre></td></tr>
1271 1.1 joerg
1272 1.1 joerg
1273 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr>
1274 1.1 joerg <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1275 1.1 joerg
1276 1.1 joerg Example: matches "^{}":
1277 1.1 joerg void f() { ^{}(); }
1278 1.1 joerg </pre></td></tr>
1279 1.1 joerg
1280 1.1 joerg
1281 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr>
1282 1.1 joerg <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1283 1.1 joerg
1284 1.1 joerg Given
1285 1.1 joerg while (true) { break; }
1286 1.1 joerg breakStmt()
1287 1.1 joerg matches 'break'
1288 1.1 joerg </pre></td></tr>
1289 1.1 joerg
1290 1.1 joerg
1291 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr>
1292 1.1 joerg <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1293 1.1 joerg
1294 1.1 joerg Example: Matches (int) 2.2f in
1295 1.1 joerg int i = (int) 2.2f;
1296 1.1 joerg </pre></td></tr>
1297 1.1 joerg
1298 1.1 joerg
1299 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr>
1300 1.1 joerg <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1301 1.1 joerg
1302 1.1 joerg Example matches x.y() and y()
1303 1.1 joerg X x;
1304 1.1 joerg x.y();
1305 1.1 joerg y();
1306 1.1 joerg </pre></td></tr>
1307 1.1 joerg
1308 1.1 joerg
1309 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr>
1310 1.1 joerg <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1311 1.1 joerg
1312 1.1 joerg Given
1313 1.1 joerg switch(a) { case 42: break; default: break; }
1314 1.1 joerg caseStmt()
1315 1.1 joerg matches 'case 42:'.
1316 1.1 joerg </pre></td></tr>
1317 1.1 joerg
1318 1.1 joerg
1319 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr>
1320 1.1 joerg <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1321 1.1 joerg
1322 1.1 joerg Example: castExpr() matches each of the following:
1323 1.1 joerg (int) 3;
1324 1.1 joerg const_cast<Expr *>(SubExpr);
1325 1.1 joerg char c = 0;
1326 1.1 joerg but does not match
1327 1.1 joerg int i = (0);
1328 1.1 joerg int k = 0;
1329 1.1 joerg </pre></td></tr>
1330 1.1 joerg
1331 1.1 joerg
1332 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr>
1333 1.1 joerg <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1334 1.1 joerg
1335 1.1 joerg Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1336 1.1 joerg though.
1337 1.1 joerg
1338 1.1 joerg Example matches 'a', L'a'
1339 1.1 joerg char ch = 'a';
1340 1.1 joerg wchar_t chw = L'a';
1341 1.1 joerg </pre></td></tr>
1342 1.1 joerg
1343 1.1 joerg
1344 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr>
1345 1.1 joerg <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1346 1.1 joerg </pre></td></tr>
1347 1.1 joerg
1348 1.1 joerg
1349 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>>...</td></tr>
1350 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1351 1.1.1.2 joerg
1352 1.1.1.2 joerg Given
1353 1.1.1.2 joerg co_await 1;
1354 1.1.1.2 joerg coawaitExpr()
1355 1.1.1.2 joerg matches 'co_await 1'
1356 1.1.1.2 joerg </pre></td></tr>
1357 1.1.1.2 joerg
1358 1.1.1.2 joerg
1359 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr>
1360 1.1 joerg <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1361 1.1 joerg
1362 1.1 joerg Example match: {1}, (1, 2)
1363 1.1 joerg int array[4] = {1};
1364 1.1 joerg vector int myvec = (vector int)(1, 2);
1365 1.1 joerg </pre></td></tr>
1366 1.1 joerg
1367 1.1 joerg
1368 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr>
1369 1.1 joerg <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1370 1.1 joerg
1371 1.1 joerg Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1372 1.1 joerg for (;;) {{}}
1373 1.1 joerg </pre></td></tr>
1374 1.1 joerg
1375 1.1 joerg
1376 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr>
1377 1.1 joerg <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1378 1.1 joerg
1379 1.1 joerg Example matches a ? b : c
1380 1.1 joerg (a ? b : c) + 42
1381 1.1 joerg </pre></td></tr>
1382 1.1 joerg
1383 1.1 joerg
1384 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr>
1385 1.1 joerg <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1386 1.1 joerg
1387 1.1 joerg Example matches the constant in the case statement:
1388 1.1 joerg (matcher = constantExpr())
1389 1.1 joerg switch (a) {
1390 1.1 joerg case 37: break;
1391 1.1 joerg }
1392 1.1 joerg </pre></td></tr>
1393 1.1 joerg
1394 1.1 joerg
1395 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr>
1396 1.1 joerg <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1397 1.1 joerg
1398 1.1 joerg Given
1399 1.1 joerg while (true) { continue; }
1400 1.1 joerg continueStmt()
1401 1.1 joerg matches 'continue'
1402 1.1 joerg </pre></td></tr>
1403 1.1 joerg
1404 1.1 joerg
1405 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>>...</td></tr>
1406 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1407 1.1.1.2 joerg
1408 1.1.1.2 joerg Given
1409 1.1.1.2 joerg while (true) { co_return; }
1410 1.1.1.2 joerg coreturnStmt()
1411 1.1.1.2 joerg matches 'co_return'
1412 1.1.1.2 joerg </pre></td></tr>
1413 1.1.1.2 joerg
1414 1.1.1.2 joerg
1415 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>>...</td></tr>
1416 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1417 1.1.1.2 joerg
1418 1.1.1.2 joerg Given
1419 1.1.1.2 joerg co_yield 1;
1420 1.1.1.2 joerg coyieldExpr()
1421 1.1.1.2 joerg matches 'co_yield 1'
1422 1.1.1.2 joerg </pre></td></tr>
1423 1.1.1.2 joerg
1424 1.1.1.2 joerg
1425 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr>
1426 1.1 joerg <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1427 1.1 joerg
1428 1.1 joerg Example matches,
1429 1.1 joerg kernel<<<i,j>>>();
1430 1.1 joerg </pre></td></tr>
1431 1.1 joerg
1432 1.1 joerg
1433 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr>
1434 1.1 joerg <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1435 1.1 joerg
1436 1.1 joerg Example matches FunctionTakesString(GetStringByValue())
1437 1.1 joerg (matcher = cxxBindTemporaryExpr())
1438 1.1 joerg FunctionTakesString(GetStringByValue());
1439 1.1 joerg FunctionTakesStringByPointer(GetStringPointer());
1440 1.1 joerg </pre></td></tr>
1441 1.1 joerg
1442 1.1 joerg
1443 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr>
1444 1.1 joerg <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1445 1.1 joerg
1446 1.1 joerg Example matches true
1447 1.1 joerg true
1448 1.1 joerg </pre></td></tr>
1449 1.1 joerg
1450 1.1 joerg
1451 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr>
1452 1.1 joerg <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1453 1.1 joerg
1454 1.1 joerg try {} catch(int i) {}
1455 1.1 joerg cxxCatchStmt()
1456 1.1 joerg matches 'catch(int i)'
1457 1.1 joerg </pre></td></tr>
1458 1.1 joerg
1459 1.1 joerg
1460 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr>
1461 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1462 1.1 joerg
1463 1.1 joerg Example: Matches const_cast<int*>(&r) in
1464 1.1 joerg int n = 42;
1465 1.1 joerg const int &r(n);
1466 1.1 joerg int* p = const_cast<int*>(&r);
1467 1.1 joerg </pre></td></tr>
1468 1.1 joerg
1469 1.1 joerg
1470 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr>
1471 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1472 1.1 joerg
1473 1.1 joerg Example matches string(ptr, n) and ptr within arguments of f
1474 1.1 joerg (matcher = cxxConstructExpr())
1475 1.1 joerg void f(const string &a, const string &b);
1476 1.1 joerg char *ptr;
1477 1.1 joerg int n;
1478 1.1 joerg f(string(ptr, n), ptr);
1479 1.1 joerg </pre></td></tr>
1480 1.1 joerg
1481 1.1 joerg
1482 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr>
1483 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1484 1.1 joerg
1485 1.1 joerg Example matches the CXXDefaultArgExpr placeholder inserted for the
1486 1.1 joerg default value of the second parameter in the call expression f(42)
1487 1.1 joerg (matcher = cxxDefaultArgExpr())
1488 1.1 joerg void f(int x, int y = 0);
1489 1.1 joerg f(42);
1490 1.1 joerg </pre></td></tr>
1491 1.1 joerg
1492 1.1 joerg
1493 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr>
1494 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1495 1.1 joerg
1496 1.1 joerg Given
1497 1.1 joerg delete X;
1498 1.1 joerg cxxDeleteExpr()
1499 1.1 joerg matches 'delete X'.
1500 1.1 joerg </pre></td></tr>
1501 1.1 joerg
1502 1.1 joerg
1503 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr>
1504 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1505 1.1 joerg resolved because the base expression or the member name was dependent.
1506 1.1 joerg
1507 1.1 joerg Given
1508 1.1 joerg template <class T> void f() { T t; t.g(); }
1509 1.1 joerg cxxDependentScopeMemberExpr()
1510 1.1 joerg matches t.g
1511 1.1 joerg </pre></td></tr>
1512 1.1 joerg
1513 1.1 joerg
1514 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr>
1515 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1516 1.1 joerg
1517 1.1 joerg Example:
1518 1.1 joerg cxxDynamicCastExpr()
1519 1.1 joerg matches
1520 1.1 joerg dynamic_cast<D*>(&b);
1521 1.1 joerg in
1522 1.1 joerg struct B { virtual ~B() {} }; struct D : B {};
1523 1.1 joerg B b;
1524 1.1 joerg D* p = dynamic_cast<D*>(&b);
1525 1.1 joerg </pre></td></tr>
1526 1.1 joerg
1527 1.1 joerg
1528 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr>
1529 1.1 joerg <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1530 1.1 joerg
1531 1.1 joerg cxxForRangeStmt() matches 'for (auto a : i)'
1532 1.1 joerg int i[] = {1, 2, 3}; for (auto a : i);
1533 1.1 joerg for(int j = 0; j < 5; ++j);
1534 1.1 joerg </pre></td></tr>
1535 1.1 joerg
1536 1.1 joerg
1537 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr>
1538 1.1 joerg <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1539 1.1 joerg
1540 1.1 joerg Example: Matches Foo(bar);
1541 1.1 joerg Foo f = bar;
1542 1.1 joerg Foo g = (Foo) bar;
1543 1.1 joerg Foo h = Foo(bar);
1544 1.1 joerg </pre></td></tr>
1545 1.1 joerg
1546 1.1 joerg
1547 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr>
1548 1.1 joerg <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1549 1.1 joerg
1550 1.1 joerg Example matches x.y()
1551 1.1 joerg X x;
1552 1.1 joerg x.y();
1553 1.1 joerg </pre></td></tr>
1554 1.1 joerg
1555 1.1 joerg
1556 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr>
1557 1.1 joerg <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1558 1.1 joerg
1559 1.1 joerg Given
1560 1.1 joerg new X;
1561 1.1 joerg cxxNewExpr()
1562 1.1 joerg matches 'new X'.
1563 1.1 joerg </pre></td></tr>
1564 1.1 joerg
1565 1.1 joerg
1566 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr>
1567 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1568 1.1.1.2 joerg
1569 1.1.1.2 joerg Given
1570 1.1.1.2 joerg bool a() noexcept;
1571 1.1.1.2 joerg bool b() noexcept(true);
1572 1.1.1.2 joerg bool c() noexcept(false);
1573 1.1.1.2 joerg bool d() noexcept(noexcept(a()));
1574 1.1.1.2 joerg bool e = noexcept(b()) || noexcept(c());
1575 1.1.1.2 joerg cxxNoexceptExpr()
1576 1.1.1.2 joerg matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1577 1.1.1.2 joerg doesn't match the noexcept specifier in the declarations a, b, c or d.
1578 1.1.1.2 joerg </pre></td></tr>
1579 1.1.1.2 joerg
1580 1.1.1.2 joerg
1581 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr>
1582 1.1 joerg <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1583 1.1 joerg </pre></td></tr>
1584 1.1 joerg
1585 1.1 joerg
1586 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr>
1587 1.1 joerg <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1588 1.1 joerg
1589 1.1 joerg Note that if an operator isn't overloaded, it won't match. Instead, use
1590 1.1 joerg binaryOperator matcher.
1591 1.1 joerg Currently it does not match operators such as new delete.
1592 1.1 joerg FIXME: figure out why these do not match?
1593 1.1 joerg
1594 1.1 joerg Example matches both operator<<((o << b), c) and operator<<(o, b)
1595 1.1 joerg (matcher = cxxOperatorCallExpr())
1596 1.1 joerg ostream &operator<< (ostream &out, int i) { };
1597 1.1 joerg ostream &o; int b = 1, c = 1;
1598 1.1 joerg o << b << c;
1599 1.1.1.2 joerg See also the binaryOperation() matcher for more-general matching of binary
1600 1.1.1.2 joerg uses of this AST node.
1601 1.1 joerg </pre></td></tr>
1602 1.1 joerg
1603 1.1 joerg
1604 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr>
1605 1.1 joerg <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1606 1.1 joerg
1607 1.1 joerg Either the source expression or the destination type can be matched
1608 1.1 joerg using has(), but hasDestinationType() is more specific and can be
1609 1.1 joerg more readable.
1610 1.1 joerg
1611 1.1 joerg Example matches reinterpret_cast<char*>(&p) in
1612 1.1 joerg void* p = reinterpret_cast<char*>(&p);
1613 1.1 joerg </pre></td></tr>
1614 1.1 joerg
1615 1.1 joerg
1616 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>>...</td></tr>
1617 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1618 1.1.1.2 joerg
1619 1.1.1.2 joerg Example matches use of "<":
1620 1.1.1.2 joerg #include <compare>
1621 1.1.1.2 joerg struct HasSpaceshipMem {
1622 1.1.1.2 joerg int a;
1623 1.1.1.2 joerg constexpr auto operator<=>(const HasSpaceshipMem&) const = default;
1624 1.1.1.2 joerg };
1625 1.1.1.2 joerg void compare() {
1626 1.1.1.2 joerg HasSpaceshipMem hs1, hs2;
1627 1.1.1.2 joerg if (hs1 < hs2)
1628 1.1.1.2 joerg return;
1629 1.1.1.2 joerg }
1630 1.1.1.2 joerg See also the binaryOperation() matcher for more-general matching
1631 1.1.1.2 joerg of this AST node.
1632 1.1.1.2 joerg </pre></td></tr>
1633 1.1.1.2 joerg
1634 1.1.1.2 joerg
1635 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr>
1636 1.1 joerg <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1637 1.1 joerg
1638 1.1 joerg See also: hasDestinationType
1639 1.1 joerg See also: reinterpretCast
1640 1.1 joerg
1641 1.1 joerg Example:
1642 1.1 joerg cxxStaticCastExpr()
1643 1.1 joerg matches
1644 1.1 joerg static_cast<long>(8)
1645 1.1 joerg in
1646 1.1 joerg long eight(static_cast<long>(8));
1647 1.1 joerg </pre></td></tr>
1648 1.1 joerg
1649 1.1 joerg
1650 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr>
1651 1.1 joerg <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1652 1.1 joerg
1653 1.1 joerg Given
1654 1.1 joerg std::vector<int> a({ 1, 2, 3 });
1655 1.1 joerg std::vector<int> b = { 4, 5 };
1656 1.1 joerg int c[] = { 6, 7 };
1657 1.1 joerg std::pair<int, int> d = { 8, 9 };
1658 1.1 joerg cxxStdInitializerListExpr()
1659 1.1 joerg matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1660 1.1 joerg </pre></td></tr>
1661 1.1 joerg
1662 1.1 joerg
1663 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr>
1664 1.1 joerg <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1665 1.1 joerg
1666 1.1 joerg Example: Matches Foo(bar, bar)
1667 1.1 joerg Foo h = Foo(bar, bar);
1668 1.1 joerg </pre></td></tr>
1669 1.1 joerg
1670 1.1 joerg
1671 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr>
1672 1.1 joerg <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1673 1.1 joerg
1674 1.1 joerg Example matches the implicit this expression in "return i".
1675 1.1 joerg (matcher = cxxThisExpr())
1676 1.1 joerg struct foo {
1677 1.1 joerg int i;
1678 1.1 joerg int f() { return i; }
1679 1.1 joerg };
1680 1.1 joerg </pre></td></tr>
1681 1.1 joerg
1682 1.1 joerg
1683 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr>
1684 1.1 joerg <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1685 1.1 joerg
1686 1.1 joerg try { throw 5; } catch(int i) {}
1687 1.1 joerg cxxThrowExpr()
1688 1.1 joerg matches 'throw 5'
1689 1.1 joerg </pre></td></tr>
1690 1.1 joerg
1691 1.1 joerg
1692 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr>
1693 1.1 joerg <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1694 1.1 joerg
1695 1.1 joerg try {} catch(int i) {}
1696 1.1 joerg cxxTryStmt()
1697 1.1 joerg matches 'try {}'
1698 1.1 joerg </pre></td></tr>
1699 1.1 joerg
1700 1.1 joerg
1701 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr>
1702 1.1 joerg <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1703 1.1 joerg
1704 1.1 joerg Example matches T(t) in return statement of f
1705 1.1 joerg (matcher = cxxUnresolvedConstructExpr())
1706 1.1 joerg template <typename T>
1707 1.1 joerg void f(const T& t) { return T(t); }
1708 1.1 joerg </pre></td></tr>
1709 1.1 joerg
1710 1.1 joerg
1711 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr>
1712 1.1 joerg <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1713 1.1 joerg
1714 1.1 joerg Example matches x in if (x)
1715 1.1 joerg bool x;
1716 1.1 joerg if (x) {}
1717 1.1 joerg </pre></td></tr>
1718 1.1 joerg
1719 1.1 joerg
1720 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr>
1721 1.1 joerg <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1722 1.1 joerg
1723 1.1 joerg Given
1724 1.1 joerg int a;
1725 1.1 joerg declStmt()
1726 1.1 joerg matches 'int a'.
1727 1.1 joerg </pre></td></tr>
1728 1.1 joerg
1729 1.1 joerg
1730 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr>
1731 1.1 joerg <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1732 1.1 joerg
1733 1.1 joerg Given
1734 1.1 joerg switch(a) { case 42: break; default: break; }
1735 1.1 joerg defaultStmt()
1736 1.1 joerg matches 'default:'.
1737 1.1 joerg </pre></td></tr>
1738 1.1 joerg
1739 1.1 joerg
1740 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>>...</td></tr>
1741 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1742 1.1.1.2 joerg </pre></td></tr>
1743 1.1.1.2 joerg
1744 1.1.1.2 joerg
1745 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr>
1746 1.1 joerg <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1747 1.1 joerg
1748 1.1 joerg Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1749 1.1 joerg point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1750 1.1 joerg </pre></td></tr>
1751 1.1 joerg
1752 1.1 joerg
1753 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr>
1754 1.1 joerg <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1755 1.1 joerg
1756 1.1 joerg Given
1757 1.1 joerg do {} while (true);
1758 1.1 joerg doStmt()
1759 1.1 joerg matches 'do {} while(true)'
1760 1.1 joerg </pre></td></tr>
1761 1.1 joerg
1762 1.1 joerg
1763 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr>
1764 1.1 joerg <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1765 1.1 joerg
1766 1.1 joerg Matches any cast expression written in user code, whether it be a
1767 1.1 joerg C-style cast, a functional-style cast, or a keyword cast.
1768 1.1 joerg
1769 1.1 joerg Does not match implicit conversions.
1770 1.1 joerg
1771 1.1 joerg Note: the name "explicitCast" is chosen to match Clang's terminology, as
1772 1.1 joerg Clang uses the term "cast" to apply to implicit conversions as well as to
1773 1.1 joerg actual cast expressions.
1774 1.1 joerg
1775 1.1 joerg See also: hasDestinationType.
1776 1.1 joerg
1777 1.1 joerg Example: matches all five of the casts in
1778 1.1 joerg int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42)))))
1779 1.1 joerg but does not match the implicit conversion in
1780 1.1 joerg long ell = 42;
1781 1.1 joerg </pre></td></tr>
1782 1.1 joerg
1783 1.1 joerg
1784 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr>
1785 1.1 joerg <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1786 1.1 joerg
1787 1.1 joerg Example matches x()
1788 1.1 joerg void f() { x(); }
1789 1.1 joerg </pre></td></tr>
1790 1.1 joerg
1791 1.1 joerg
1792 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr>
1793 1.1 joerg <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1794 1.1 joerg of the sub-expression's evaluation.
1795 1.1 joerg
1796 1.1 joerg Example matches std::string()
1797 1.1 joerg const std::string str = std::string();
1798 1.1 joerg </pre></td></tr>
1799 1.1 joerg
1800 1.1 joerg
1801 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr>
1802 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1803 1.1.1.2 joerg </pre></td></tr>
1804 1.1.1.2 joerg
1805 1.1.1.2 joerg
1806 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr>
1807 1.1 joerg <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
1808 1.1 joerg 1.0, 1.0f, 1.0L and 1e10.
1809 1.1 joerg
1810 1.1 joerg Does not match implicit conversions such as
1811 1.1 joerg float a = 10;
1812 1.1 joerg </pre></td></tr>
1813 1.1 joerg
1814 1.1 joerg
1815 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr>
1816 1.1 joerg <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1817 1.1 joerg
1818 1.1 joerg Example matches 'for (;;) {}'
1819 1.1 joerg for (;;) {}
1820 1.1 joerg int i[] = {1, 2, 3}; for (auto a : i);
1821 1.1 joerg </pre></td></tr>
1822 1.1 joerg
1823 1.1 joerg
1824 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>>...</td></tr>
1825 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1826 1.1.1.2 joerg </pre></td></tr>
1827 1.1.1.2 joerg
1828 1.1.1.2 joerg
1829 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr>
1830 1.1 joerg <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1831 1.1 joerg </pre></td></tr>
1832 1.1 joerg
1833 1.1 joerg
1834 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr>
1835 1.1 joerg <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1836 1.1 joerg
1837 1.1 joerg Given
1838 1.1 joerg goto FOO;
1839 1.1 joerg FOO: bar();
1840 1.1 joerg gotoStmt()
1841 1.1 joerg matches 'goto FOO'
1842 1.1 joerg </pre></td></tr>
1843 1.1 joerg
1844 1.1 joerg
1845 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr>
1846 1.1 joerg <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1847 1.1 joerg
1848 1.1 joerg Example matches 'if (x) {}'
1849 1.1 joerg if (x) {}
1850 1.1 joerg </pre></td></tr>
1851 1.1 joerg
1852 1.1 joerg
1853 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr>
1854 1.1 joerg <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1855 1.1 joerg point literals e.g.: 1i, 1.0i
1856 1.1 joerg </pre></td></tr>
1857 1.1 joerg
1858 1.1 joerg
1859 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr>
1860 1.1 joerg <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1861 1.1 joerg
1862 1.1 joerg This matches many different places, including function call return value
1863 1.1 joerg eliding, as well as any type conversions.
1864 1.1 joerg </pre></td></tr>
1865 1.1 joerg
1866 1.1 joerg
1867 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr>
1868 1.1 joerg <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1869 1.1 joerg
1870 1.1 joerg Given
1871 1.1 joerg point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1872 1.1 joerg implicitValueInitExpr()
1873 1.1 joerg matches "[0].y" (implicitly)
1874 1.1 joerg </pre></td></tr>
1875 1.1 joerg
1876 1.1 joerg
1877 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr>
1878 1.1 joerg <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1879 1.1 joerg
1880 1.1 joerg Given
1881 1.1 joerg int a[] = { 1, 2 };
1882 1.1 joerg struct B { int x, y; };
1883 1.1 joerg B b = { 5, 6 };
1884 1.1 joerg initListExpr()
1885 1.1 joerg matches "{ 1, 2 }" and "{ 5, 6 }"
1886 1.1 joerg </pre></td></tr>
1887 1.1 joerg
1888 1.1 joerg
1889 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr>
1890 1.1 joerg <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
1891 1.1 joerg 1, 1L, 0x1 and 1U.
1892 1.1 joerg
1893 1.1 joerg Does not match character-encoded integers such as L'a'.
1894 1.1 joerg </pre></td></tr>
1895 1.1 joerg
1896 1.1 joerg
1897 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr>
1898 1.1 joerg <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1899 1.1 joerg
1900 1.1 joerg Given
1901 1.1 joerg goto FOO;
1902 1.1 joerg FOO: bar();
1903 1.1 joerg labelStmt()
1904 1.1 joerg matches 'FOO:'
1905 1.1 joerg </pre></td></tr>
1906 1.1 joerg
1907 1.1 joerg
1908 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr>
1909 1.1 joerg <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1910 1.1 joerg
1911 1.1 joerg Example matches [&](){return 5;}
1912 1.1 joerg [&](){return 5;}
1913 1.1 joerg </pre></td></tr>
1914 1.1 joerg
1915 1.1 joerg
1916 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr>
1917 1.1 joerg <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1918 1.1 joerg
1919 1.1 joerg Example: Given
1920 1.1 joerg struct T {void func();};
1921 1.1 joerg T f();
1922 1.1 joerg void g(T);
1923 1.1 joerg materializeTemporaryExpr() matches 'f()' in these statements
1924 1.1 joerg T u(f());
1925 1.1 joerg g(f());
1926 1.1 joerg f().func();
1927 1.1 joerg but does not match
1928 1.1 joerg f();
1929 1.1 joerg </pre></td></tr>
1930 1.1 joerg
1931 1.1 joerg
1932 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr>
1933 1.1 joerg <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1934 1.1 joerg
1935 1.1 joerg Given
1936 1.1 joerg class Y {
1937 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
1938 1.1 joerg int a; static int b;
1939 1.1 joerg };
1940 1.1 joerg memberExpr()
1941 1.1 joerg matches this->x, x, y.x, a, this->b
1942 1.1 joerg </pre></td></tr>
1943 1.1 joerg
1944 1.1 joerg
1945 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr>
1946 1.1 joerg <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1947 1.1 joerg
1948 1.1 joerg foo();;
1949 1.1 joerg nullStmt()
1950 1.1 joerg matches the second ';'
1951 1.1 joerg </pre></td></tr>
1952 1.1 joerg
1953 1.1 joerg
1954 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr>
1955 1.1 joerg <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1956 1.1 joerg
1957 1.1 joerg Example matches @catch
1958 1.1 joerg @try {}
1959 1.1 joerg @catch (...) {}
1960 1.1 joerg </pre></td></tr>
1961 1.1 joerg
1962 1.1 joerg
1963 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr>
1964 1.1 joerg <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1965 1.1 joerg
1966 1.1 joerg Example matches @finally
1967 1.1 joerg @try {}
1968 1.1 joerg @finally {}
1969 1.1 joerg </pre></td></tr>
1970 1.1 joerg
1971 1.1 joerg
1972 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr>
1973 1.1 joerg <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1974 1.1 joerg
1975 1.1 joerg Example: matches "a" in "init" method:
1976 1.1 joerg @implementation A {
1977 1.1 joerg NSString *a;
1978 1.1 joerg }
1979 1.1 joerg - (void) init {
1980 1.1 joerg a = @"hello";
1981 1.1 joerg }
1982 1.1 joerg </pre></td></tr>
1983 1.1 joerg
1984 1.1 joerg
1985 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr>
1986 1.1 joerg <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1987 1.1 joerg
1988 1.1 joerg The innermost message send invokes the "alloc" class method on the
1989 1.1 joerg NSString class, while the outermost message send invokes the
1990 1.1 joerg "initWithString" instance method on the object returned from
1991 1.1 joerg NSString's "alloc". This matcher should match both message sends.
1992 1.1 joerg [[NSString alloc] initWithString:@"Hello"]
1993 1.1 joerg </pre></td></tr>
1994 1.1 joerg
1995 1.1 joerg
1996 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr>
1997 1.1 joerg <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1998 1.1 joerg
1999 1.1 joerg Example matches @throw obj;
2000 1.1 joerg </pre></td></tr>
2001 1.1 joerg
2002 1.1 joerg
2003 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr>
2004 1.1 joerg <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2005 1.1 joerg
2006 1.1 joerg Example matches @try
2007 1.1 joerg @try {}
2008 1.1 joerg @catch (...) {}
2009 1.1 joerg </pre></td></tr>
2010 1.1 joerg
2011 1.1 joerg
2012 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr>
2013 1.1 joerg <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2014 1.1 joerg
2015 1.1 joerg Given
2016 1.1 joerg
2017 1.1 joerg #pragma omp parallel
2018 1.1 joerg #pragma omp parallel default(none)
2019 1.1 joerg #pragma omp taskyield
2020 1.1 joerg
2021 1.1 joerg ``ompExecutableDirective()`` matches ``omp parallel``,
2022 1.1 joerg ``omp parallel default(none)`` and ``omp taskyield``.
2023 1.1 joerg </pre></td></tr>
2024 1.1 joerg
2025 1.1 joerg
2026 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr>
2027 1.1 joerg <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2028 1.1 joerg to reference another expressions and can be met
2029 1.1 joerg in BinaryConditionalOperators, for example.
2030 1.1 joerg
2031 1.1 joerg Example matches 'a'
2032 1.1 joerg (a ?: c) + 42;
2033 1.1 joerg </pre></td></tr>
2034 1.1 joerg
2035 1.1 joerg
2036 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr>
2037 1.1 joerg <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2038 1.1 joerg
2039 1.1 joerg Example matches (foo() + 1)
2040 1.1 joerg int foo() { return 1; }
2041 1.1 joerg int a = (foo() + 1);
2042 1.1 joerg </pre></td></tr>
2043 1.1 joerg
2044 1.1 joerg
2045 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr>
2046 1.1 joerg <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2047 1.1 joerg ParenListExprs don't have a predefined type and are used for late parsing.
2048 1.1 joerg In the final AST, they can be met in template declarations.
2049 1.1 joerg
2050 1.1 joerg Given
2051 1.1 joerg template<typename T> class X {
2052 1.1 joerg void f() {
2053 1.1 joerg X x(*this);
2054 1.1 joerg int a = 0, b = 1; int i = (a, b);
2055 1.1 joerg }
2056 1.1 joerg };
2057 1.1 joerg parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2058 1.1 joerg has a predefined type and is a ParenExpr, not a ParenListExpr.
2059 1.1 joerg </pre></td></tr>
2060 1.1 joerg
2061 1.1 joerg
2062 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr>
2063 1.1 joerg <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2064 1.1 joerg
2065 1.1 joerg Example: Matches __func__
2066 1.1 joerg printf("%s", __func__);
2067 1.1 joerg </pre></td></tr>
2068 1.1 joerg
2069 1.1 joerg
2070 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr>
2071 1.1 joerg <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2072 1.1 joerg
2073 1.1 joerg Given
2074 1.1 joerg return 1;
2075 1.1 joerg returnStmt()
2076 1.1 joerg matches 'return 1'
2077 1.1 joerg </pre></td></tr>
2078 1.1 joerg
2079 1.1 joerg
2080 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr>
2081 1.1 joerg <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2082 1.1 joerg
2083 1.1 joerg Given
2084 1.1 joerg { ++a; }
2085 1.1 joerg stmt()
2086 1.1 joerg matches both the compound statement '{ ++a; }' and '++a'.
2087 1.1 joerg </pre></td></tr>
2088 1.1 joerg
2089 1.1 joerg
2090 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr>
2091 1.1 joerg <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2092 1.1 joerg
2093 1.1 joerg Example match: ({ int X = 4; X; })
2094 1.1 joerg int C = ({ int X = 4; X; });
2095 1.1 joerg </pre></td></tr>
2096 1.1 joerg
2097 1.1 joerg
2098 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr>
2099 1.1 joerg <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2100 1.1 joerg
2101 1.1 joerg Example matches "abcd", L"abcd"
2102 1.1 joerg char *s = "abcd";
2103 1.1 joerg wchar_t *ws = L"abcd";
2104 1.1 joerg </pre></td></tr>
2105 1.1 joerg
2106 1.1 joerg
2107 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr>
2108 1.1 joerg <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2109 1.1 joerg
2110 1.1 joerg Given
2111 1.1 joerg template <int N>
2112 1.1 joerg struct A { static const int n = N; };
2113 1.1 joerg struct B : public A<42> {};
2114 1.1 joerg substNonTypeTemplateParmExpr()
2115 1.1 joerg matches "N" in the right-hand side of "static const int n = N;"
2116 1.1 joerg </pre></td></tr>
2117 1.1 joerg
2118 1.1 joerg
2119 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr>
2120 1.1 joerg <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2121 1.1 joerg
2122 1.1 joerg Given
2123 1.1 joerg switch(a) { case 42: break; default: break; }
2124 1.1 joerg switchCase()
2125 1.1 joerg matches 'case 42:' and 'default:'.
2126 1.1 joerg </pre></td></tr>
2127 1.1 joerg
2128 1.1 joerg
2129 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr>
2130 1.1 joerg <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2131 1.1 joerg
2132 1.1 joerg Given
2133 1.1 joerg switch(a) { case 42: break; default: break; }
2134 1.1 joerg switchStmt()
2135 1.1 joerg matches 'switch(a)'.
2136 1.1 joerg </pre></td></tr>
2137 1.1 joerg
2138 1.1 joerg
2139 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr>
2140 1.1 joerg <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2141 1.1 joerg
2142 1.1 joerg Given
2143 1.1 joerg Foo x = bar;
2144 1.1 joerg int y = sizeof(x) + alignof(x);
2145 1.1 joerg unaryExprOrTypeTraitExpr()
2146 1.1 joerg matches sizeof(x) and alignof(x)
2147 1.1 joerg </pre></td></tr>
2148 1.1 joerg
2149 1.1 joerg
2150 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr>
2151 1.1 joerg <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2152 1.1 joerg
2153 1.1 joerg Example matches !a
2154 1.1 joerg !a || b
2155 1.1 joerg </pre></td></tr>
2156 1.1 joerg
2157 1.1 joerg
2158 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr>
2159 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2160 1.1 joerg but could not be resolved to a specific declaration.
2161 1.1 joerg
2162 1.1 joerg Given
2163 1.1 joerg template<typename T>
2164 1.1 joerg T foo() { T a; return a; }
2165 1.1 joerg template<typename T>
2166 1.1 joerg void bar() {
2167 1.1 joerg foo<T>();
2168 1.1 joerg }
2169 1.1 joerg unresolvedLookupExpr()
2170 1.1 joerg matches foo<T>() </pre></td></tr>
2171 1.1 joerg
2172 1.1 joerg
2173 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr>
2174 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2175 1.1 joerg
2176 1.1 joerg Given
2177 1.1 joerg struct X {
2178 1.1 joerg template <class T> void f();
2179 1.1 joerg void g();
2180 1.1 joerg };
2181 1.1 joerg template <class T> void h() { X x; x.f<T>(); x.g(); }
2182 1.1 joerg unresolvedMemberExpr()
2183 1.1 joerg matches x.f<T>
2184 1.1 joerg </pre></td></tr>
2185 1.1 joerg
2186 1.1 joerg
2187 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr>
2188 1.1 joerg <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2189 1.1 joerg
2190 1.1 joerg Example match: "foo"_suffix
2191 1.1 joerg </pre></td></tr>
2192 1.1 joerg
2193 1.1 joerg
2194 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr>
2195 1.1 joerg <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2196 1.1 joerg
2197 1.1 joerg Given
2198 1.1 joerg while (true) {}
2199 1.1 joerg whileStmt()
2200 1.1 joerg matches 'while (true) {}'.
2201 1.1 joerg </pre></td></tr>
2202 1.1 joerg
2203 1.1 joerg
2204 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr>
2205 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2206 1.1.1.2 joerg
2207 1.1.1.2 joerg Given
2208 1.1.1.2 joerg template <typename T> struct C {};
2209 1.1.1.2 joerg C<int> c;
2210 1.1.1.2 joerg templateArgumentLoc()
2211 1.1.1.2 joerg matches 'int' in C<int>.
2212 1.1.1.2 joerg </pre></td></tr>
2213 1.1.1.2 joerg
2214 1.1.1.2 joerg
2215 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr>
2216 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2217 1.1 joerg
2218 1.1 joerg Given
2219 1.1 joerg template <typename T> struct C {};
2220 1.1 joerg C<int> c;
2221 1.1 joerg templateArgument()
2222 1.1 joerg matches 'int' in C<int>.
2223 1.1 joerg </pre></td></tr>
2224 1.1 joerg
2225 1.1 joerg
2226 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr>
2227 1.1 joerg <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2228 1.1 joerg
2229 1.1 joerg Given
2230 1.1 joerg template <typename T> class X { };
2231 1.1 joerg X<int> xi;
2232 1.1 joerg templateName()
2233 1.1 joerg matches 'X' in X<int>.
2234 1.1 joerg </pre></td></tr>
2235 1.1 joerg
2236 1.1 joerg
2237 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr>
2238 1.1 joerg <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2239 1.1 joerg </pre></td></tr>
2240 1.1 joerg
2241 1.1 joerg
2242 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr>
2243 1.1 joerg <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2244 1.1 joerg
2245 1.1 joerg Given
2246 1.1 joerg int a[] = { 2, 3 };
2247 1.1 joerg int b[4];
2248 1.1 joerg void f() { int c[a[0]]; }
2249 1.1 joerg arrayType()
2250 1.1 joerg matches "int a[]", "int b[4]" and "int c[a[0]]";
2251 1.1 joerg </pre></td></tr>
2252 1.1 joerg
2253 1.1 joerg
2254 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr>
2255 1.1 joerg <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2256 1.1 joerg
2257 1.1 joerg Given
2258 1.1 joerg _Atomic(int) i;
2259 1.1 joerg atomicType()
2260 1.1 joerg matches "_Atomic(int) i"
2261 1.1 joerg </pre></td></tr>
2262 1.1 joerg
2263 1.1 joerg
2264 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr>
2265 1.1 joerg <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2266 1.1 joerg
2267 1.1 joerg Given:
2268 1.1 joerg auto n = 4;
2269 1.1 joerg int v[] = { 2, 3 }
2270 1.1 joerg for (auto i : v) { }
2271 1.1 joerg autoType()
2272 1.1 joerg matches "auto n" and "auto i"
2273 1.1 joerg </pre></td></tr>
2274 1.1 joerg
2275 1.1 joerg
2276 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr>
2277 1.1 joerg <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2278 1.1 joerg "void (^)(int)".
2279 1.1 joerg
2280 1.1 joerg The pointee is always required to be a FunctionType.
2281 1.1 joerg </pre></td></tr>
2282 1.1 joerg
2283 1.1 joerg
2284 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr>
2285 1.1 joerg <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2286 1.1 joerg
2287 1.1 joerg Given
2288 1.1 joerg struct A {};
2289 1.1 joerg A a;
2290 1.1 joerg int b;
2291 1.1 joerg float c;
2292 1.1 joerg bool d;
2293 1.1 joerg builtinType()
2294 1.1 joerg matches "int b", "float c" and "bool d"
2295 1.1 joerg </pre></td></tr>
2296 1.1 joerg
2297 1.1 joerg
2298 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr>
2299 1.1 joerg <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2300 1.1 joerg
2301 1.1 joerg Given
2302 1.1 joerg _Complex float f;
2303 1.1 joerg complexType()
2304 1.1 joerg matches "_Complex float f"
2305 1.1 joerg </pre></td></tr>
2306 1.1 joerg
2307 1.1 joerg
2308 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr>
2309 1.1 joerg <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2310 1.1 joerg
2311 1.1 joerg Given
2312 1.1 joerg void() {
2313 1.1 joerg int a[2];
2314 1.1 joerg int b[] = { 2, 3 };
2315 1.1 joerg int c[b[0]];
2316 1.1 joerg }
2317 1.1 joerg constantArrayType()
2318 1.1 joerg matches "int a[2]"
2319 1.1 joerg </pre></td></tr>
2320 1.1 joerg
2321 1.1 joerg
2322 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr>
2323 1.1 joerg <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2324 1.1 joerg Example matches i[] in declaration of f.
2325 1.1 joerg (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2326 1.1 joerg Example matches i[1].
2327 1.1 joerg (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2328 1.1 joerg void f(int i[]) {
2329 1.1 joerg i[1] = 0;
2330 1.1 joerg }
2331 1.1 joerg </pre></td></tr>
2332 1.1 joerg
2333 1.1 joerg
2334 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr>
2335 1.1 joerg <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types.
2336 1.1 joerg
2337 1.1 joerg Given:
2338 1.1 joerg short i = 1;
2339 1.1 joerg int j = 42;
2340 1.1 joerg decltype(i + j) result = i + j;
2341 1.1 joerg decltypeType()
2342 1.1 joerg matches "decltype(i + j)"
2343 1.1 joerg </pre></td></tr>
2344 1.1 joerg
2345 1.1 joerg
2346 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr>
2347 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2348 1.1.1.2 joerg template types.
2349 1.1.1.2 joerg
2350 1.1.1.2 joerg Given
2351 1.1.1.2 joerg template <typename T>
2352 1.1.1.2 joerg class C { public: C(T); };
2353 1.1.1.2 joerg
2354 1.1.1.2 joerg C c(123);
2355 1.1.1.2 joerg deducedTemplateSpecializationType() matches the type in the declaration
2356 1.1.1.2 joerg of the variable c.
2357 1.1.1.2 joerg </pre></td></tr>
2358 1.1.1.2 joerg
2359 1.1.1.2 joerg
2360 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr>
2361 1.1 joerg <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2362 1.1 joerg
2363 1.1 joerg Given
2364 1.1 joerg template<typename T, int Size>
2365 1.1 joerg class array {
2366 1.1 joerg T data[Size];
2367 1.1 joerg };
2368 1.1 joerg dependentSizedArrayType
2369 1.1 joerg matches "T data[Size]"
2370 1.1 joerg </pre></td></tr>
2371 1.1 joerg
2372 1.1 joerg
2373 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr>
2374 1.1 joerg <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2375 1.1 joerg qualified name.
2376 1.1 joerg
2377 1.1 joerg Given
2378 1.1 joerg namespace N {
2379 1.1 joerg namespace M {
2380 1.1 joerg class D {};
2381 1.1 joerg }
2382 1.1 joerg }
2383 1.1 joerg class C {};
2384 1.1 joerg
2385 1.1 joerg class C c;
2386 1.1 joerg N::M::D d;
2387 1.1 joerg
2388 1.1 joerg elaboratedType() matches the type of the variable declarations of both
2389 1.1 joerg c and d.
2390 1.1 joerg </pre></td></tr>
2391 1.1 joerg
2392 1.1 joerg
2393 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr>
2394 1.1 joerg <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2395 1.1 joerg
2396 1.1 joerg Given
2397 1.1 joerg enum C { Green };
2398 1.1 joerg enum class S { Red };
2399 1.1 joerg
2400 1.1 joerg C c;
2401 1.1 joerg S s;
2402 1.1 joerg
2403 1.1 joerg enumType() matches the type of the variable declarations of both c and
2404 1.1 joerg s.
2405 1.1 joerg </pre></td></tr>
2406 1.1 joerg
2407 1.1 joerg
2408 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr>
2409 1.1 joerg <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2410 1.1 joerg
2411 1.1 joerg Given
2412 1.1 joerg int (*f)(int);
2413 1.1 joerg void g();
2414 1.1 joerg functionProtoType()
2415 1.1 joerg matches "int (*f)(int)" and the type of "g" in C++ mode.
2416 1.1 joerg In C mode, "g" is not matched because it does not contain a prototype.
2417 1.1 joerg </pre></td></tr>
2418 1.1 joerg
2419 1.1 joerg
2420 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr>
2421 1.1 joerg <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2422 1.1 joerg
2423 1.1 joerg Given
2424 1.1 joerg int (*f)(int);
2425 1.1 joerg void g();
2426 1.1 joerg functionType()
2427 1.1 joerg matches "int (*f)(int)" and the type of "g".
2428 1.1 joerg </pre></td></tr>
2429 1.1 joerg
2430 1.1 joerg
2431 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr>
2432 1.1 joerg <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2433 1.1 joerg
2434 1.1 joerg Given
2435 1.1 joerg int a[] = { 2, 3 };
2436 1.1 joerg int b[42];
2437 1.1 joerg void f(int c[]) { int d[a[0]]; };
2438 1.1 joerg incompleteArrayType()
2439 1.1 joerg matches "int a[]" and "int c[]"
2440 1.1 joerg </pre></td></tr>
2441 1.1 joerg
2442 1.1 joerg
2443 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr>
2444 1.1 joerg <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2445 1.1 joerg
2446 1.1 joerg Example matches S s, but not S<T> s.
2447 1.1 joerg (matcher = parmVarDecl(hasType(injectedClassNameType())))
2448 1.1 joerg template <typename T> struct S {
2449 1.1 joerg void f(S s);
2450 1.1 joerg void g(S<T> s);
2451 1.1 joerg };
2452 1.1 joerg </pre></td></tr>
2453 1.1 joerg
2454 1.1 joerg
2455 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr>
2456 1.1 joerg <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2457 1.1 joerg
2458 1.1 joerg Given:
2459 1.1 joerg int *a;
2460 1.1 joerg int &b = *a;
2461 1.1 joerg int &&c = 1;
2462 1.1 joerg auto &d = b;
2463 1.1 joerg auto &&e = c;
2464 1.1 joerg auto &&f = 2;
2465 1.1 joerg int g = 5;
2466 1.1 joerg
2467 1.1 joerg lValueReferenceType() matches the types of b, d, and e. e is
2468 1.1 joerg matched since the type is deduced as int& by reference collapsing rules.
2469 1.1 joerg </pre></td></tr>
2470 1.1 joerg
2471 1.1 joerg
2472 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr>
2473 1.1 joerg <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2474 1.1 joerg Given
2475 1.1 joerg struct A { int i; }
2476 1.1 joerg A::* ptr = A::i;
2477 1.1 joerg memberPointerType()
2478 1.1 joerg matches "A::* ptr"
2479 1.1 joerg </pre></td></tr>
2480 1.1 joerg
2481 1.1 joerg
2482 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr>
2483 1.1 joerg <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2484 1.1 joerg a pointer type, despite being syntactically similar.
2485 1.1 joerg
2486 1.1 joerg Given
2487 1.1 joerg int *a;
2488 1.1 joerg
2489 1.1 joerg @interface Foo
2490 1.1 joerg @end
2491 1.1 joerg Foo *f;
2492 1.1 joerg pointerType()
2493 1.1 joerg matches "Foo *f", but does not match "int *a".
2494 1.1 joerg </pre></td></tr>
2495 1.1 joerg
2496 1.1 joerg
2497 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr>
2498 1.1 joerg <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2499 1.1 joerg
2500 1.1 joerg Given
2501 1.1 joerg int (*ptr_to_array)[4];
2502 1.1 joerg int *array_of_ptrs[4];
2503 1.1 joerg
2504 1.1 joerg varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2505 1.1 joerg array_of_ptrs.
2506 1.1 joerg </pre></td></tr>
2507 1.1 joerg
2508 1.1 joerg
2509 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr>
2510 1.1 joerg <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2511 1.1 joerg types.
2512 1.1 joerg
2513 1.1 joerg Given
2514 1.1 joerg int *a;
2515 1.1 joerg int &b = *a;
2516 1.1 joerg int c = 5;
2517 1.1 joerg
2518 1.1 joerg @interface Foo
2519 1.1 joerg @end
2520 1.1 joerg Foo *f;
2521 1.1 joerg pointerType()
2522 1.1 joerg matches "int *a", but does not match "Foo *f".
2523 1.1 joerg </pre></td></tr>
2524 1.1 joerg
2525 1.1 joerg
2526 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr>
2527 1.1 joerg <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2528 1.1 joerg
2529 1.1 joerg Given:
2530 1.1 joerg int *a;
2531 1.1 joerg int &b = *a;
2532 1.1 joerg int &&c = 1;
2533 1.1 joerg auto &d = b;
2534 1.1 joerg auto &&e = c;
2535 1.1 joerg auto &&f = 2;
2536 1.1 joerg int g = 5;
2537 1.1 joerg
2538 1.1 joerg rValueReferenceType() matches the types of c and f. e is not
2539 1.1 joerg matched as it is deduced to int& by reference collapsing rules.
2540 1.1 joerg </pre></td></tr>
2541 1.1 joerg
2542 1.1 joerg
2543 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr>
2544 1.1 joerg <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2545 1.1 joerg
2546 1.1 joerg Given
2547 1.1 joerg class C {};
2548 1.1 joerg struct S {};
2549 1.1 joerg
2550 1.1 joerg C c;
2551 1.1 joerg S s;
2552 1.1 joerg
2553 1.1 joerg recordType() matches the type of the variable declarations of both c
2554 1.1 joerg and s.
2555 1.1 joerg </pre></td></tr>
2556 1.1 joerg
2557 1.1 joerg
2558 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr>
2559 1.1 joerg <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2560 1.1 joerg
2561 1.1 joerg Given
2562 1.1 joerg int *a;
2563 1.1 joerg int &b = *a;
2564 1.1 joerg int &&c = 1;
2565 1.1 joerg auto &d = b;
2566 1.1 joerg auto &&e = c;
2567 1.1 joerg auto &&f = 2;
2568 1.1 joerg int g = 5;
2569 1.1 joerg
2570 1.1 joerg referenceType() matches the types of b, c, d, e, and f.
2571 1.1 joerg </pre></td></tr>
2572 1.1 joerg
2573 1.1 joerg
2574 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr>
2575 1.1 joerg <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2576 1.1 joerg template type parameter.
2577 1.1 joerg
2578 1.1 joerg Given
2579 1.1 joerg template <typename T>
2580 1.1 joerg void F(T t) {
2581 1.1 joerg int i = 1 + t;
2582 1.1 joerg }
2583 1.1 joerg
2584 1.1 joerg substTemplateTypeParmType() matches the type of 't' but not '1'
2585 1.1 joerg </pre></td></tr>
2586 1.1 joerg
2587 1.1 joerg
2588 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr>
2589 1.1 joerg <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2590 1.1 joerg
2591 1.1 joerg Given
2592 1.1 joerg enum E {};
2593 1.1 joerg class C {};
2594 1.1 joerg
2595 1.1 joerg E e;
2596 1.1 joerg C c;
2597 1.1 joerg
2598 1.1 joerg tagType() matches the type of the variable declarations of both e
2599 1.1 joerg and c.
2600 1.1 joerg </pre></td></tr>
2601 1.1 joerg
2602 1.1 joerg
2603 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr>
2604 1.1 joerg <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2605 1.1 joerg
2606 1.1 joerg Given
2607 1.1 joerg template <typename T>
2608 1.1 joerg class C { };
2609 1.1 joerg
2610 1.1 joerg template class C<int>; // A
2611 1.1 joerg C<char> var; // B
2612 1.1 joerg
2613 1.1 joerg templateSpecializationType() matches the type of the explicit
2614 1.1 joerg instantiation in A and the type of the variable declaration in B.
2615 1.1 joerg </pre></td></tr>
2616 1.1 joerg
2617 1.1 joerg
2618 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr>
2619 1.1 joerg <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2620 1.1 joerg
2621 1.1 joerg Example matches T, but not int.
2622 1.1 joerg (matcher = templateTypeParmType())
2623 1.1 joerg template <typename T> void f(int i);
2624 1.1 joerg </pre></td></tr>
2625 1.1 joerg
2626 1.1 joerg
2627 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr>
2628 1.1 joerg <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2629 1.1 joerg </pre></td></tr>
2630 1.1 joerg
2631 1.1 joerg
2632 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr>
2633 1.1 joerg <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2634 1.1 joerg
2635 1.1 joerg Given
2636 1.1 joerg typedef int X;
2637 1.1 joerg typedefType()
2638 1.1 joerg matches "typedef int X"
2639 1.1 joerg </pre></td></tr>
2640 1.1 joerg
2641 1.1 joerg
2642 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr>
2643 1.1 joerg <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2644 1.1 joerg
2645 1.1 joerg Given:
2646 1.1 joerg typedef __underlying_type(T) type;
2647 1.1 joerg unaryTransformType()
2648 1.1 joerg matches "__underlying_type(T)"
2649 1.1 joerg </pre></td></tr>
2650 1.1 joerg
2651 1.1 joerg
2652 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr>
2653 1.1 joerg <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2654 1.1 joerg integer-constant-expression.
2655 1.1 joerg
2656 1.1 joerg Given
2657 1.1 joerg void f() {
2658 1.1 joerg int a[] = { 2, 3 }
2659 1.1 joerg int b[42];
2660 1.1 joerg int c[a[0]];
2661 1.1 joerg }
2662 1.1 joerg variableArrayType()
2663 1.1 joerg matches "int c[a[0]]"
2664 1.1 joerg </pre></td></tr>
2665 1.1 joerg
2666 1.1 joerg <!--END_DECL_MATCHERS -->
2667 1.1 joerg </table>
2668 1.1 joerg
2669 1.1 joerg <!-- ======================================================================= -->
2670 1.1 joerg <h2 id="narrowing-matchers">Narrowing Matchers</h2>
2671 1.1 joerg <!-- ======================================================================= -->
2672 1.1 joerg
2673 1.1 joerg <p>Narrowing matchers match certain attributes on the current node, thus
2674 1.1 joerg narrowing down the set of nodes of the current type to match on.</p>
2675 1.1 joerg
2676 1.1 joerg <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2677 1.1 joerg which allow users to create more powerful match expressions.</p>
2678 1.1 joerg
2679 1.1 joerg <table>
2680 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2681 1.1 joerg <!-- START_NARROWING_MATCHERS -->
2682 1.1 joerg
2683 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
2684 1.1 joerg <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2685 1.1 joerg
2686 1.1 joerg Usable as: Any Matcher
2687 1.1 joerg </pre></td></tr>
2688 1.1 joerg
2689 1.1 joerg
2690 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
2691 1.1 joerg <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2692 1.1 joerg
2693 1.1 joerg Usable as: Any Matcher
2694 1.1 joerg </pre></td></tr>
2695 1.1 joerg
2696 1.1 joerg
2697 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2698 1.1 joerg <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2699 1.1 joerg
2700 1.1 joerg Useful when another matcher requires a child matcher, but there's no
2701 1.1 joerg additional constraint. This will often be used with an explicit conversion
2702 1.1 joerg to an internal::Matcher<> type such as TypeMatcher.
2703 1.1 joerg
2704 1.1 joerg Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2705 1.1 joerg "int* p" and "void f()" in
2706 1.1 joerg int* p;
2707 1.1 joerg void f();
2708 1.1 joerg
2709 1.1 joerg Usable as: Any Matcher
2710 1.1 joerg </pre></td></tr>
2711 1.1 joerg
2712 1.1 joerg
2713 1.1.1.2 joerg <tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2714 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2715 1.1.1.2 joerg
2716 1.1.1.2 joerg Given
2717 1.1.1.2 joerg if (true);
2718 1.1.1.2 joerg for (; true; );
2719 1.1.1.2 joerg with the matcher
2720 1.1.1.2 joerg mapAnyOf(ifStmt, forStmt).with(
2721 1.1.1.2 joerg hasCondition(cxxBoolLiteralExpr(equals(true)))
2722 1.1.1.2 joerg ).bind("trueCond")
2723 1.1.1.2 joerg matches the if and the for. It is equivalent to:
2724 1.1.1.2 joerg auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2725 1.1.1.2 joerg anyOf(
2726 1.1.1.2 joerg ifStmt(trueCond).bind("trueCond"),
2727 1.1.1.2 joerg forStmt(trueCond).bind("trueCond")
2728 1.1.1.2 joerg );
2729 1.1.1.2 joerg
2730 1.1.1.2 joerg The with() chain-call accepts zero or more matchers which are combined
2731 1.1.1.2 joerg as-if with allOf() in each of the node matchers.
2732 1.1.1.2 joerg Usable as: Any Matcher
2733 1.1.1.2 joerg </pre></td></tr>
2734 1.1.1.2 joerg
2735 1.1.1.2 joerg
2736 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr>
2737 1.1 joerg <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2738 1.1 joerg
2739 1.1 joerg Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2740 1.1 joerg class X {};
2741 1.1 joerg class Y {};
2742 1.1 joerg
2743 1.1 joerg Usable as: Any Matcher
2744 1.1 joerg </pre></td></tr>
2745 1.1 joerg
2746 1.1 joerg
2747 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2748 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2749 1.1.1.2 joerg specified names.
2750 1.1.1.2 joerg
2751 1.1.1.2 joerg hasAnyOperatorName("+", "-")
2752 1.1.1.2 joerg Is equivalent to
2753 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-"))
2754 1.1.1.2 joerg </pre></td></tr>
2755 1.1.1.2 joerg
2756 1.1.1.2 joerg
2757 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2758 1.1 joerg <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2759 1.1 joerg unary).
2760 1.1 joerg
2761 1.1 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2762 1.1 joerg !(a || b)
2763 1.1 joerg </pre></td></tr>
2764 1.1 joerg
2765 1.1 joerg
2766 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2767 1.1 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2768 1.1 joerg
2769 1.1 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2770 1.1 joerg if (a == b)
2771 1.1 joerg a += b;
2772 1.1 joerg
2773 1.1 joerg Example 2: matches s1 = s2
2774 1.1 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2775 1.1 joerg struct S { S& operator=(const S&); };
2776 1.1.1.2 joerg void x() { S s1, s2; s1 = s2; }
2777 1.1 joerg </pre></td></tr>
2778 1.1 joerg
2779 1.1 joerg
2780 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2781 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2782 1.1 joerg
2783 1.1.1.2 joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2784 1.1.1.2 joerg if (a == b)
2785 1.1.1.2 joerg a += b;
2786 1.1 joerg
2787 1.1.1.2 joerg Example 2: matches s1 < s2
2788 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2789 1.1.1.2 joerg struct S { bool operator<(const S& other); };
2790 1.1.1.2 joerg void x(S s1, S s2) { bool b1 = s1 < s2; }
2791 1.1.1.2 joerg </pre></td></tr>
2792 1.1 joerg
2793 1.1.1.2 joerg
2794 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
2795 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2796 1.1.1.2 joerg inheritance.
2797 1.1.1.2 joerg
2798 1.1.1.2 joerg Examples:
2799 1.1.1.2 joerg class C {
2800 1.1.1.2 joerg public: int a;
2801 1.1.1.2 joerg protected: int b;
2802 1.1.1.2 joerg private: int c; // fieldDecl(isPrivate()) matches 'c'
2803 1.1.1.2 joerg };
2804 1.1.1.2 joerg
2805 1.1.1.2 joerg struct Base {};
2806 1.1.1.2 joerg struct Derived1 : private Base {}; // matches 'Base'
2807 1.1.1.2 joerg class Derived2 : Base {}; // matches 'Base'
2808 1.1.1.2 joerg </pre></td></tr>
2809 1.1.1.2 joerg
2810 1.1.1.2 joerg
2811 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
2812 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2813 1.1.1.2 joerg protected inheritance.
2814 1.1.1.2 joerg
2815 1.1.1.2 joerg Examples:
2816 1.1.1.2 joerg class C {
2817 1.1.1.2 joerg public: int a;
2818 1.1.1.2 joerg protected: int b; // fieldDecl(isProtected()) matches 'b'
2819 1.1.1.2 joerg private: int c;
2820 1.1.1.2 joerg };
2821 1.1.1.2 joerg
2822 1.1.1.2 joerg class Base {};
2823 1.1.1.2 joerg class Derived : protected Base {}; // matches 'Base'
2824 1.1.1.2 joerg </pre></td></tr>
2825 1.1.1.2 joerg
2826 1.1.1.2 joerg
2827 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
2828 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2829 1.1.1.2 joerg inheritance.
2830 1.1.1.2 joerg
2831 1.1.1.2 joerg Examples:
2832 1.1.1.2 joerg class C {
2833 1.1.1.2 joerg public: int a; // fieldDecl(isPublic()) matches 'a'
2834 1.1.1.2 joerg protected: int b;
2835 1.1.1.2 joerg private: int c;
2836 1.1.1.2 joerg };
2837 1.1.1.2 joerg
2838 1.1.1.2 joerg class Base {};
2839 1.1.1.2 joerg class Derived1 : public Base {}; // matches 'Base'
2840 1.1.1.2 joerg struct Derived2 : Base {}; // matches 'Base'
2841 1.1.1.2 joerg </pre></td></tr>
2842 1.1.1.2 joerg
2843 1.1.1.2 joerg
2844 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
2845 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2846 1.1.1.2 joerg virtual inheritance.
2847 1.1.1.2 joerg
2848 1.1.1.2 joerg Example:
2849 1.1.1.2 joerg class A {
2850 1.1.1.2 joerg public:
2851 1.1.1.2 joerg virtual void x(); // matches x
2852 1.1.1.2 joerg };
2853 1.1.1.2 joerg
2854 1.1.1.2 joerg Example:
2855 1.1.1.2 joerg class Base {};
2856 1.1.1.2 joerg class DirectlyDerived : virtual Base {}; // matches Base
2857 1.1.1.2 joerg class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2858 1.1.1.2 joerg
2859 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
2860 1.1.1.2 joerg </pre></td></tr>
2861 1.1.1.2 joerg
2862 1.1.1.2 joerg
2863 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2864 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2865 1.1.1.2 joerg
2866 1.1.1.2 joerg
2867 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr>
2868 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2869 1.1.1.2 joerg
2870 1.1.1.2 joerg Given
2871 1.1.1.2 joerg f('false, 3.14, 42);
2872 1.1 joerg characterLiteral(equals(0))
2873 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2874 1.1 joerg match false
2875 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2876 1.1 joerg match 3.14
2877 1.1 joerg integerLiteral(equals(42))
2878 1.1 joerg matches 42
2879 1.1 joerg
2880 1.1 joerg Note that you cannot directly match a negative numeric literal because the
2881 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
2882 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
2883 1.1 joerg matcher to match the minus sign:
2884 1.1 joerg
2885 1.1 joerg unaryOperator(hasOperatorName("-"),
2886 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
2887 1.1 joerg
2888 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
2889 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
2890 1.1 joerg </pre></td></tr>
2891 1.1 joerg
2892 1.1 joerg
2893 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2894 1.1 joerg <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2895 1.1 joerg
2896 1.1 joerg
2897 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2898 1.1 joerg <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2899 1.1 joerg
2900 1.1 joerg
2901 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
2902 1.1 joerg <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2903 1.1 joerg
2904 1.1 joerg Given
2905 1.1 joerg try {
2906 1.1 joerg // ...
2907 1.1 joerg } catch (int) {
2908 1.1 joerg // ...
2909 1.1 joerg } catch (...) {
2910 1.1 joerg // ...
2911 1.1 joerg }
2912 1.1 joerg cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2913 1.1 joerg </pre></td></tr>
2914 1.1 joerg
2915 1.1 joerg
2916 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2917 1.1 joerg <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2918 1.1 joerg a specific number of arguments (including absent default arguments).
2919 1.1 joerg
2920 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2921 1.1 joerg void f(int x, int y);
2922 1.1 joerg f(0, 0);
2923 1.1 joerg </pre></td></tr>
2924 1.1 joerg
2925 1.1 joerg
2926 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
2927 1.1 joerg <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2928 1.1 joerg </pre></td></tr>
2929 1.1 joerg
2930 1.1 joerg
2931 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
2932 1.1 joerg <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2933 1.1 joerg zero initialization.
2934 1.1 joerg
2935 1.1 joerg Given
2936 1.1 joerg void foo() {
2937 1.1 joerg struct point { double x; double y; };
2938 1.1 joerg point pt[2] = { { 1.0, 2.0 } };
2939 1.1 joerg }
2940 1.1 joerg initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2941 1.1 joerg will match the implicit array filler for pt[1].
2942 1.1 joerg </pre></td></tr>
2943 1.1 joerg
2944 1.1 joerg
2945 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2946 1.1 joerg <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2947 1.1 joerg
2948 1.1 joerg Given
2949 1.1 joerg struct S {
2950 1.1 joerg S(); // #1
2951 1.1 joerg S(const S &); // #2
2952 1.1 joerg S(S &&); // #3
2953 1.1 joerg };
2954 1.1 joerg cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2955 1.1 joerg </pre></td></tr>
2956 1.1 joerg
2957 1.1 joerg
2958 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2959 1.1 joerg <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2960 1.1 joerg
2961 1.1 joerg Given
2962 1.1 joerg struct S {
2963 1.1 joerg S(); // #1
2964 1.1 joerg S(const S &); // #2
2965 1.1 joerg S(S &&); // #3
2966 1.1 joerg };
2967 1.1 joerg cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2968 1.1 joerg </pre></td></tr>
2969 1.1 joerg
2970 1.1 joerg
2971 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2972 1.1 joerg <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2973 1.1 joerg
2974 1.1 joerg Given
2975 1.1 joerg struct S {
2976 1.1 joerg S(); // #1
2977 1.1 joerg S(int) {} // #2
2978 1.1 joerg S(S &&) : S() {} // #3
2979 1.1 joerg };
2980 1.1 joerg S::S() : S(0) {} // #4
2981 1.1 joerg cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2982 1.1 joerg #1 or #2.
2983 1.1 joerg </pre></td></tr>
2984 1.1 joerg
2985 1.1 joerg
2986 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2987 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2988 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to
2989 1.1 joerg true.
2990 1.1 joerg
2991 1.1 joerg Given
2992 1.1 joerg template<bool b>
2993 1.1 joerg struct S {
2994 1.1 joerg S(int); // #1
2995 1.1 joerg explicit S(double); // #2
2996 1.1 joerg operator int(); // #3
2997 1.1 joerg explicit operator bool(); // #4
2998 1.1 joerg explicit(false) S(bool) // # 7
2999 1.1 joerg explicit(true) S(char) // # 8
3000 1.1 joerg explicit(b) S(S) // # 9
3001 1.1 joerg };
3002 1.1 joerg S(int) -> S<true> // #5
3003 1.1 joerg explicit S(double) -> S<false> // #6
3004 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3005 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
3006 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3007 1.1 joerg </pre></td></tr>
3008 1.1 joerg
3009 1.1 joerg
3010 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
3011 1.1 joerg <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3012 1.1 joerg
3013 1.1 joerg Given
3014 1.1 joerg struct S {
3015 1.1 joerg S(); // #1
3016 1.1 joerg S(const S &); // #2
3017 1.1 joerg S(S &&); // #3
3018 1.1 joerg };
3019 1.1 joerg cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3020 1.1 joerg </pre></td></tr>
3021 1.1 joerg
3022 1.1 joerg
3023 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
3024 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3025 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to
3026 1.1 joerg true.
3027 1.1 joerg
3028 1.1 joerg Given
3029 1.1 joerg template<bool b>
3030 1.1 joerg struct S {
3031 1.1 joerg S(int); // #1
3032 1.1 joerg explicit S(double); // #2
3033 1.1 joerg operator int(); // #3
3034 1.1 joerg explicit operator bool(); // #4
3035 1.1 joerg explicit(false) S(bool) // # 7
3036 1.1 joerg explicit(true) S(char) // # 8
3037 1.1 joerg explicit(b) S(S) // # 9
3038 1.1 joerg };
3039 1.1 joerg S(int) -> S<true> // #5
3040 1.1 joerg explicit S(double) -> S<false> // #6
3041 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3042 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
3043 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3044 1.1 joerg </pre></td></tr>
3045 1.1 joerg
3046 1.1 joerg
3047 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
3048 1.1 joerg <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3049 1.1 joerg opposed to a member.
3050 1.1 joerg
3051 1.1 joerg Given
3052 1.1 joerg struct B {};
3053 1.1 joerg struct D : B {
3054 1.1 joerg int I;
3055 1.1 joerg D(int i) : I(i) {}
3056 1.1 joerg };
3057 1.1 joerg struct E : B {
3058 1.1 joerg E() : B() {}
3059 1.1 joerg };
3060 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3061 1.1 joerg will match E(), but not match D(int).
3062 1.1 joerg </pre></td></tr>
3063 1.1 joerg
3064 1.1 joerg
3065 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
3066 1.1 joerg <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3067 1.1 joerg opposed to a base.
3068 1.1 joerg
3069 1.1 joerg Given
3070 1.1 joerg struct B {};
3071 1.1 joerg struct D : B {
3072 1.1 joerg int I;
3073 1.1 joerg D(int i) : I(i) {}
3074 1.1 joerg };
3075 1.1 joerg struct E : B {
3076 1.1 joerg E() : B() {}
3077 1.1 joerg };
3078 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3079 1.1 joerg will match D(int), but not match E().
3080 1.1 joerg </pre></td></tr>
3081 1.1 joerg
3082 1.1 joerg
3083 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
3084 1.1 joerg <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3085 1.1 joerg code (as opposed to implicitly added by the compiler).
3086 1.1 joerg
3087 1.1 joerg Given
3088 1.1 joerg struct Foo {
3089 1.1 joerg Foo() { }
3090 1.1 joerg Foo(int) : foo_("A") { }
3091 1.1 joerg string foo_;
3092 1.1 joerg };
3093 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3094 1.1 joerg will match Foo(int), but not Foo()
3095 1.1 joerg </pre></td></tr>
3096 1.1 joerg
3097 1.1 joerg
3098 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
3099 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3100 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to
3101 1.1 joerg true.
3102 1.1 joerg
3103 1.1 joerg Given
3104 1.1 joerg template<bool b>
3105 1.1 joerg struct S {
3106 1.1 joerg S(int); // #1
3107 1.1 joerg explicit S(double); // #2
3108 1.1 joerg operator int(); // #3
3109 1.1 joerg explicit operator bool(); // #4
3110 1.1 joerg explicit(false) S(bool) // # 7
3111 1.1 joerg explicit(true) S(char) // # 8
3112 1.1 joerg explicit(b) S(S) // # 9
3113 1.1 joerg };
3114 1.1 joerg S(int) -> S<true> // #5
3115 1.1 joerg explicit S(double) -> S<false> // #6
3116 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3117 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
3118 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3119 1.1 joerg </pre></td></tr>
3120 1.1 joerg
3121 1.1 joerg
3122 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr>
3123 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3124 1.1.1.2 joerg
3125 1.1.1.2 joerg In template declarations, dependent members are not resolved and so can
3126 1.1.1.2 joerg not be matched to particular named declarations.
3127 1.1.1.2 joerg
3128 1.1.1.2 joerg This matcher allows to match on the known name of members.
3129 1.1.1.2 joerg
3130 1.1.1.2 joerg Given
3131 1.1.1.2 joerg template <typename T>
3132 1.1.1.2 joerg struct S {
3133 1.1.1.2 joerg void mem();
3134 1.1.1.2 joerg };
3135 1.1.1.2 joerg template <typename T>
3136 1.1.1.2 joerg void x() {
3137 1.1.1.2 joerg S<T> s;
3138 1.1.1.2 joerg s.mem();
3139 1.1.1.2 joerg }
3140 1.1.1.2 joerg cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3141 1.1.1.2 joerg </pre></td></tr>
3142 1.1.1.2 joerg
3143 1.1.1.2 joerg
3144 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
3145 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed
3146 1.1 joerg to '.'.
3147 1.1 joerg
3148 1.1 joerg Member calls on the implicit this pointer match as called with '->'.
3149 1.1 joerg
3150 1.1 joerg Given
3151 1.1 joerg class Y {
3152 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
3153 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); }
3154 1.1 joerg int a;
3155 1.1 joerg static int b;
3156 1.1 joerg };
3157 1.1 joerg template <class T>
3158 1.1 joerg class Z {
3159 1.1 joerg void x() { this->m; }
3160 1.1 joerg };
3161 1.1 joerg memberExpr(isArrow())
3162 1.1 joerg matches this->x, x, y.x, a, this->b
3163 1.1 joerg cxxDependentScopeMemberExpr(isArrow())
3164 1.1 joerg matches this->m
3165 1.1 joerg unresolvedMemberExpr(isArrow())
3166 1.1 joerg matches this->f<T>, f<T>
3167 1.1 joerg </pre></td></tr>
3168 1.1 joerg
3169 1.1 joerg
3170 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr>
3171 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3172 1.1.1.2 joerg node
3173 1.1.1.2 joerg
3174 1.1.1.2 joerg In template declarations, dependent members are not resolved and so can
3175 1.1.1.2 joerg not be matched to particular named declarations.
3176 1.1.1.2 joerg
3177 1.1.1.2 joerg This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3178 1.1.1.2 joerg and CXXMethodDecl nodes.
3179 1.1.1.2 joerg
3180 1.1.1.2 joerg Given
3181 1.1.1.2 joerg template <typename T>
3182 1.1.1.2 joerg struct S {
3183 1.1.1.2 joerg void mem();
3184 1.1.1.2 joerg };
3185 1.1.1.2 joerg template <typename T>
3186 1.1.1.2 joerg void x() {
3187 1.1.1.2 joerg S<T> s;
3188 1.1.1.2 joerg s.mem();
3189 1.1.1.2 joerg }
3190 1.1.1.2 joerg The matcher
3191 1.1.1.2 joerg @code
3192 1.1.1.2 joerg cxxDependentScopeMemberExpr(
3193 1.1.1.2 joerg hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3194 1.1.1.2 joerg hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3195 1.1.1.2 joerg cxxMethodDecl(hasName("mem")).bind("templMem")
3196 1.1.1.2 joerg )))))
3197 1.1.1.2 joerg )))),
3198 1.1.1.2 joerg memberHasSameNameAsBoundNode("templMem")
3199 1.1.1.2 joerg )
3200 1.1.1.2 joerg @endcode
3201 1.1.1.2 joerg first matches and binds the @c mem member of the @c S template, then
3202 1.1.1.2 joerg compares its name to the usage in @c s.mem() in the @c x function template
3203 1.1.1.2 joerg </pre></td></tr>
3204 1.1.1.2 joerg
3205 1.1.1.2 joerg
3206 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
3207 1.1 joerg <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3208 1.1 joerg
3209 1.1 joerg Given
3210 1.1 joerg struct A {
3211 1.1 joerg void foo() const;
3212 1.1 joerg void bar();
3213 1.1 joerg };
3214 1.1 joerg
3215 1.1 joerg cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3216 1.1 joerg </pre></td></tr>
3217 1.1 joerg
3218 1.1 joerg
3219 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
3220 1.1 joerg <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3221 1.1 joerg operator.
3222 1.1 joerg
3223 1.1 joerg Given
3224 1.1 joerg struct A {
3225 1.1 joerg A &operator=(const A &);
3226 1.1 joerg A &operator=(A &&);
3227 1.1 joerg };
3228 1.1 joerg
3229 1.1 joerg cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3230 1.1 joerg the second one.
3231 1.1 joerg </pre></td></tr>
3232 1.1 joerg
3233 1.1 joerg
3234 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
3235 1.1 joerg <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3236 1.1 joerg
3237 1.1 joerg Given:
3238 1.1 joerg class A final {};
3239 1.1 joerg
3240 1.1 joerg struct B {
3241 1.1 joerg virtual void f();
3242 1.1 joerg };
3243 1.1 joerg
3244 1.1 joerg struct C : B {
3245 1.1 joerg void f() final;
3246 1.1 joerg };
3247 1.1 joerg matches A and C::f, but not B, C, or B::f
3248 1.1 joerg </pre></td></tr>
3249 1.1 joerg
3250 1.1 joerg
3251 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
3252 1.1 joerg <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3253 1.1 joerg operator.
3254 1.1 joerg
3255 1.1 joerg Given
3256 1.1 joerg struct A {
3257 1.1 joerg A &operator=(const A &);
3258 1.1 joerg A &operator=(A &&);
3259 1.1 joerg };
3260 1.1 joerg
3261 1.1 joerg cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3262 1.1 joerg the first one.
3263 1.1 joerg </pre></td></tr>
3264 1.1 joerg
3265 1.1 joerg
3266 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
3267 1.1 joerg <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3268 1.1 joerg
3269 1.1 joerg Given
3270 1.1 joerg class A {
3271 1.1 joerg public:
3272 1.1 joerg virtual void x();
3273 1.1 joerg };
3274 1.1 joerg class B : public A {
3275 1.1 joerg public:
3276 1.1 joerg virtual void x();
3277 1.1 joerg };
3278 1.1 joerg matches B::x
3279 1.1 joerg </pre></td></tr>
3280 1.1 joerg
3281 1.1 joerg
3282 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
3283 1.1 joerg <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3284 1.1 joerg
3285 1.1 joerg Given
3286 1.1 joerg class A {
3287 1.1 joerg public:
3288 1.1 joerg virtual void x() = 0;
3289 1.1 joerg };
3290 1.1 joerg matches A::x
3291 1.1 joerg </pre></td></tr>
3292 1.1 joerg
3293 1.1 joerg
3294 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
3295 1.1 joerg <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3296 1.1 joerg
3297 1.1 joerg Given
3298 1.1 joerg struct S {
3299 1.1 joerg S(); // #1
3300 1.1 joerg S(const S &) = default; // #2
3301 1.1 joerg S(S &&) = delete; // #3
3302 1.1 joerg };
3303 1.1 joerg cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3304 1.1 joerg </pre></td></tr>
3305 1.1 joerg
3306 1.1 joerg
3307 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
3308 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3309 1.1.1.2 joerg virtual inheritance.
3310 1.1 joerg
3311 1.1.1.2 joerg Example:
3312 1.1 joerg class A {
3313 1.1 joerg public:
3314 1.1.1.2 joerg virtual void x(); // matches x
3315 1.1 joerg };
3316 1.1.1.2 joerg
3317 1.1.1.2 joerg Example:
3318 1.1.1.2 joerg class Base {};
3319 1.1.1.2 joerg class DirectlyDerived : virtual Base {}; // matches Base
3320 1.1.1.2 joerg class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3321 1.1.1.2 joerg
3322 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
3323 1.1 joerg </pre></td></tr>
3324 1.1 joerg
3325 1.1 joerg
3326 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
3327 1.1 joerg <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3328 1.1 joerg
3329 1.1 joerg Given
3330 1.1 joerg class A {
3331 1.1 joerg public:
3332 1.1 joerg virtual void x();
3333 1.1 joerg };
3334 1.1 joerg class B : public A {
3335 1.1 joerg public:
3336 1.1 joerg void x();
3337 1.1 joerg };
3338 1.1 joerg matches A::x but not B::x
3339 1.1 joerg </pre></td></tr>
3340 1.1 joerg
3341 1.1 joerg
3342 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
3343 1.1 joerg <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3344 1.1 joerg
3345 1.1 joerg Given:
3346 1.1 joerg MyClass *p1 = new MyClass[10];
3347 1.1 joerg cxxNewExpr(isArray())
3348 1.1 joerg matches the expression 'new MyClass[10]'.
3349 1.1 joerg </pre></td></tr>
3350 1.1 joerg
3351 1.1 joerg
3352 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3353 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3354 1.1.1.2 joerg specified names.
3355 1.1.1.2 joerg
3356 1.1.1.2 joerg hasAnyOperatorName("+", "-")
3357 1.1.1.2 joerg Is equivalent to
3358 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-"))
3359 1.1.1.2 joerg </pre></td></tr>
3360 1.1.1.2 joerg
3361 1.1.1.2 joerg
3362 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3363 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3364 1.1.1.2 joerg
3365 1.1.1.2 joerg Matches overloaded operator names specified in strings without the
3366 1.1.1.2 joerg "operator" prefix: e.g. "<<".
3367 1.1.1.2 joerg
3368 1.1.1.2 joerg hasAnyOverloadedOperatorName("+", "-")
3369 1.1.1.2 joerg Is equivalent to
3370 1.1.1.2 joerg anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3371 1.1.1.2 joerg </pre></td></tr>
3372 1.1.1.2 joerg
3373 1.1.1.2 joerg
3374 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3375 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3376 1.1.1.2 joerg unary).
3377 1.1.1.2 joerg
3378 1.1.1.2 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3379 1.1.1.2 joerg !(a || b)
3380 1.1.1.2 joerg </pre></td></tr>
3381 1.1.1.2 joerg
3382 1.1.1.2 joerg
3383 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3384 1.1 joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3385 1.1 joerg
3386 1.1 joerg Matches overloaded operator names specified in strings without the
3387 1.1 joerg "operator" prefix: e.g. "<<".
3388 1.1 joerg
3389 1.1 joerg Given:
3390 1.1 joerg class A { int operator*(); };
3391 1.1 joerg const A &operator<<(const A &a, const A &b);
3392 1.1 joerg A a;
3393 1.1 joerg a << a; // <-- This matches
3394 1.1 joerg
3395 1.1 joerg cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the
3396 1.1 joerg specified line and
3397 1.1 joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3398 1.1 joerg matches the declaration of A.
3399 1.1 joerg
3400 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>
3401 1.1 joerg </pre></td></tr>
3402 1.1 joerg
3403 1.1 joerg
3404 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
3405 1.1 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3406 1.1 joerg
3407 1.1 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3408 1.1 joerg if (a == b)
3409 1.1 joerg a += b;
3410 1.1 joerg
3411 1.1 joerg Example 2: matches s1 = s2
3412 1.1 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3413 1.1 joerg struct S { S& operator=(const S&); };
3414 1.1.1.2 joerg void x() { S s1, s2; s1 = s2; }
3415 1.1.1.2 joerg </pre></td></tr>
3416 1.1.1.2 joerg
3417 1.1.1.2 joerg
3418 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
3419 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3420 1.1.1.2 joerg
3421 1.1.1.2 joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3422 1.1.1.2 joerg if (a == b)
3423 1.1.1.2 joerg a += b;
3424 1.1.1.2 joerg
3425 1.1.1.2 joerg Example 2: matches s1 < s2
3426 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3427 1.1.1.2 joerg struct S { bool operator<(const S& other); };
3428 1.1.1.2 joerg void x(S s1, S s2) { bool b1 = s1 < s2; }
3429 1.1 joerg </pre></td></tr>
3430 1.1 joerg
3431 1.1 joerg
3432 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
3433 1.1 joerg <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3434 1.1 joerg
3435 1.1 joerg Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3436 1.1 joerg class x {};
3437 1.1 joerg class y;
3438 1.1 joerg </pre></td></tr>
3439 1.1 joerg
3440 1.1 joerg
3441 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
3442 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3443 1.1 joerg </pre></td></tr>
3444 1.1 joerg
3445 1.1 joerg
3446 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
3447 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3448 1.1 joerg </pre></td></tr>
3449 1.1 joerg
3450 1.1 joerg
3451 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
3452 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3453 1.1 joerg static member variable template instantiations.
3454 1.1 joerg
3455 1.1 joerg Given
3456 1.1 joerg template<typename T> void A(T t) { }
3457 1.1 joerg template<> void A(int N) { }
3458 1.1 joerg functionDecl(isExplicitTemplateSpecialization())
3459 1.1 joerg matches the specialization A<int>().
3460 1.1 joerg
3461 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
3462 1.1 joerg </pre></td></tr>
3463 1.1 joerg
3464 1.1 joerg
3465 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
3466 1.1 joerg <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3467 1.1 joerg
3468 1.1 joerg Given:
3469 1.1 joerg class A final {};
3470 1.1 joerg
3471 1.1 joerg struct B {
3472 1.1 joerg virtual void f();
3473 1.1 joerg };
3474 1.1 joerg
3475 1.1 joerg struct C : B {
3476 1.1 joerg void f() final;
3477 1.1 joerg };
3478 1.1 joerg matches A and C::f, but not B, C, or B::f
3479 1.1 joerg </pre></td></tr>
3480 1.1 joerg
3481 1.1 joerg
3482 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
3483 1.1 joerg <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3484 1.1 joerg
3485 1.1 joerg Given:
3486 1.1 joerg auto x = []{};
3487 1.1 joerg
3488 1.1 joerg cxxRecordDecl(isLambda()) matches the implicit class declaration of
3489 1.1 joerg decltype(x)
3490 1.1 joerg </pre></td></tr>
3491 1.1 joerg
3492 1.1 joerg
3493 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
3494 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3495 1.1 joerg isSameOrDerivedFrom(hasName(...)).
3496 1.1 joerg </pre></td></tr>
3497 1.1 joerg
3498 1.1 joerg
3499 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
3500 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3501 1.1 joerg member variable template instantiations.
3502 1.1 joerg
3503 1.1 joerg Given
3504 1.1 joerg template <typename T> class X {}; class A {}; X<A> x;
3505 1.1 joerg or
3506 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>;
3507 1.1 joerg or
3508 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>;
3509 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3510 1.1 joerg matches the template instantiation of X<A>.
3511 1.1 joerg
3512 1.1 joerg But given
3513 1.1 joerg template <typename T> class X {}; class A {};
3514 1.1 joerg template <> class X<A> {}; X<A> x;
3515 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3516 1.1 joerg does not match, as X<A> is an explicit template specialization.
3517 1.1 joerg
3518 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
3519 1.1 joerg </pre></td></tr>
3520 1.1 joerg
3521 1.1 joerg
3522 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3523 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3524 1.1.1.2 joerg specified names.
3525 1.1.1.2 joerg
3526 1.1.1.2 joerg hasAnyOperatorName("+", "-")
3527 1.1.1.2 joerg Is equivalent to
3528 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-"))
3529 1.1.1.2 joerg </pre></td></tr>
3530 1.1.1.2 joerg
3531 1.1.1.2 joerg
3532 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3533 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3534 1.1.1.2 joerg unary).
3535 1.1.1.2 joerg
3536 1.1.1.2 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3537 1.1.1.2 joerg !(a || b)
3538 1.1.1.2 joerg </pre></td></tr>
3539 1.1.1.2 joerg
3540 1.1.1.2 joerg
3541 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr>
3542 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3543 1.1.1.2 joerg
3544 1.1.1.2 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3545 1.1.1.2 joerg if (a == b)
3546 1.1.1.2 joerg a += b;
3547 1.1.1.2 joerg
3548 1.1.1.2 joerg Example 2: matches s1 = s2
3549 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3550 1.1.1.2 joerg struct S { S& operator=(const S&); };
3551 1.1.1.2 joerg void x() { S s1, s2; s1 = s2; }
3552 1.1.1.2 joerg </pre></td></tr>
3553 1.1.1.2 joerg
3554 1.1.1.2 joerg
3555 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
3556 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3557 1.1.1.2 joerg
3558 1.1.1.2 joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3559 1.1.1.2 joerg if (a == b)
3560 1.1.1.2 joerg a += b;
3561 1.1.1.2 joerg
3562 1.1.1.2 joerg Example 2: matches s1 < s2
3563 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3564 1.1.1.2 joerg struct S { bool operator<(const S& other); };
3565 1.1.1.2 joerg void x(S s1, S s2) { bool b1 = s1 < s2; }
3566 1.1.1.2 joerg </pre></td></tr>
3567 1.1.1.2 joerg
3568 1.1.1.2 joerg
3569 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3570 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3571 1.1.1.2 joerg a specific number of arguments (including absent default arguments).
3572 1.1.1.2 joerg
3573 1.1.1.2 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3574 1.1.1.2 joerg void f(int x, int y);
3575 1.1.1.2 joerg f(0, 0);
3576 1.1.1.2 joerg </pre></td></tr>
3577 1.1.1.2 joerg
3578 1.1.1.2 joerg
3579 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3580 1.1 joerg <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3581 1.1 joerg a specific number of arguments (including absent default arguments).
3582 1.1 joerg
3583 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3584 1.1 joerg void f(int x, int y);
3585 1.1 joerg f(0, 0);
3586 1.1 joerg </pre></td></tr>
3587 1.1 joerg
3588 1.1 joerg
3589 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
3590 1.1 joerg <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3591 1.1 joerg
3592 1.1 joerg Example matches y(x) but not y(42) or NS::y(x).
3593 1.1 joerg namespace NS {
3594 1.1 joerg struct X {};
3595 1.1 joerg void y(X);
3596 1.1 joerg }
3597 1.1 joerg
3598 1.1 joerg void y(...);
3599 1.1 joerg
3600 1.1 joerg void test() {
3601 1.1 joerg NS::X x;
3602 1.1 joerg y(x); // Matches
3603 1.1 joerg NS::y(x); // Doesn't match
3604 1.1 joerg y(42); // Doesn't match
3605 1.1 joerg using NS::y;
3606 1.1 joerg y(x); // Found by both unqualified lookup and ADL, doesn't match
3607 1.1 joerg }
3608 1.1 joerg </pre></td></tr>
3609 1.1 joerg
3610 1.1 joerg
3611 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
3612 1.1 joerg <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3613 1.1 joerg
3614 1.1 joerg Example: matches the implicit cast around 0
3615 1.1 joerg (matcher = castExpr(hasCastKind(CK_NullToPointer)))
3616 1.1 joerg int *p = 0;
3617 1.1 joerg
3618 1.1 joerg If the matcher is use from clang-query, CastKind parameter
3619 1.1.1.2 joerg should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3620 1.1 joerg </pre></td></tr>
3621 1.1 joerg
3622 1.1 joerg
3623 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
3624 1.1 joerg <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3625 1.1 joerg
3626 1.1 joerg
3627 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr>
3628 1.1 joerg <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3629 1.1 joerg
3630 1.1 joerg Given
3631 1.1 joerg f('false, 3.14, 42);
3632 1.1 joerg characterLiteral(equals(0))
3633 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3634 1.1 joerg match false
3635 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3636 1.1 joerg match 3.14
3637 1.1 joerg integerLiteral(equals(42))
3638 1.1 joerg matches 42
3639 1.1 joerg
3640 1.1 joerg Note that you cannot directly match a negative numeric literal because the
3641 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
3642 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
3643 1.1 joerg matcher to match the minus sign:
3644 1.1 joerg
3645 1.1 joerg unaryOperator(hasOperatorName("-"),
3646 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
3647 1.1 joerg
3648 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
3649 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
3650 1.1 joerg </pre></td></tr>
3651 1.1 joerg
3652 1.1 joerg
3653 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
3654 1.1 joerg <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3655 1.1 joerg
3656 1.1 joerg
3657 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
3658 1.1 joerg <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3659 1.1 joerg
3660 1.1 joerg
3661 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
3662 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3663 1.1 joerg
3664 1.1 joerg Given
3665 1.1 joerg template<typename T> struct C {};
3666 1.1 joerg C<int> c;
3667 1.1 joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
3668 1.1 joerg matches C<int>.
3669 1.1 joerg </pre></td></tr>
3670 1.1 joerg
3671 1.1 joerg
3672 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
3673 1.1 joerg <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3674 1.1 joerg child statements.
3675 1.1 joerg
3676 1.1 joerg Example: Given
3677 1.1 joerg { for (;;) {} }
3678 1.1 joerg compoundStmt(statementCountIs(0)))
3679 1.1 joerg matches '{}'
3680 1.1 joerg but does not match the outer compound statement.
3681 1.1 joerg </pre></td></tr>
3682 1.1 joerg
3683 1.1 joerg
3684 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
3685 1.1 joerg <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3686 1.1 joerg
3687 1.1 joerg Given
3688 1.1 joerg int a[42];
3689 1.1 joerg int b[2 * 21];
3690 1.1 joerg int c[41], d[43];
3691 1.1 joerg char *s = "abcd";
3692 1.1 joerg wchar_t *ws = L"abcd";
3693 1.1 joerg char *w = "a";
3694 1.1 joerg constantArrayType(hasSize(42))
3695 1.1 joerg matches "int a[42]" and "int b[2 * 21]"
3696 1.1 joerg stringLiteral(hasSize(4))
3697 1.1 joerg matches "abcd", L"abcd"
3698 1.1 joerg </pre></td></tr>
3699 1.1 joerg
3700 1.1 joerg
3701 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
3702 1.1 joerg <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3703 1.1 joerg declarations.
3704 1.1 joerg
3705 1.1 joerg Example: Given
3706 1.1 joerg int a, b;
3707 1.1 joerg int c;
3708 1.1 joerg int d = 2, e;
3709 1.1 joerg declCountIs(2)
3710 1.1 joerg matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3711 1.1 joerg </pre></td></tr>
3712 1.1 joerg
3713 1.1 joerg
3714 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3715 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3716 1.1 joerg
3717 1.1 joerg Matches a node if it equals the node previously bound to ID.
3718 1.1 joerg
3719 1.1 joerg Given
3720 1.1 joerg class X { int a; int b; };
3721 1.1 joerg cxxRecordDecl(
3722 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3723 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3724 1.1 joerg matches the class X, as a and b have the same type.
3725 1.1 joerg
3726 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
3727 1.1 joerg equalsBoundNodes acts as a filter.
3728 1.1 joerg For example:
3729 1.1 joerg compoundStmt(
3730 1.1 joerg forEachDescendant(varDecl().bind("d")),
3731 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3732 1.1 joerg will trigger a match for each combination of variable declaration
3733 1.1 joerg and reference to that variable declaration within a compound statement.
3734 1.1 joerg </pre></td></tr>
3735 1.1 joerg
3736 1.1 joerg
3737 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
3738 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3739 1.1 joerg
3740 1.1 joerg Decl has pointer identity in the AST.
3741 1.1 joerg </pre></td></tr>
3742 1.1 joerg
3743 1.1 joerg
3744 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
3745 1.1 joerg <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3746 1.1 joerg
3747 1.1 joerg Given
3748 1.1 joerg __attribute__((device)) void f() { ... }
3749 1.1 joerg decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3750 1.1 joerg f. If the matcher is used from clang-query, attr::Kind parameter should be
3751 1.1 joerg passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3752 1.1 joerg </pre></td></tr>
3753 1.1 joerg
3754 1.1 joerg
3755 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
3756 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3757 1.1.1.2 joerg Does not match if only part of the statement is expanded from that macro or
3758 1.1.1.2 joerg if different parts of the the statement are expanded from different
3759 1.1.1.2 joerg appearances of the macro.
3760 1.1.1.2 joerg </pre></td></tr>
3761 1.1.1.2 joerg
3762 1.1.1.2 joerg
3763 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
3764 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3765 1.1 joerg partially matching a given regex.
3766 1.1 joerg
3767 1.1 joerg Example matches Y but not X
3768 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3769 1.1 joerg #include "ASTMatcher.h"
3770 1.1 joerg class X {};
3771 1.1 joerg ASTMatcher.h:
3772 1.1 joerg class Y {};
3773 1.1 joerg
3774 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
3775 1.1.1.2 joerg
3776 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter
3777 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags".
3778 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3779 1.1 joerg </pre></td></tr>
3780 1.1 joerg
3781 1.1 joerg
3782 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
3783 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3784 1.1 joerg
3785 1.1 joerg Example matches X but not Y
3786 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile())
3787 1.1 joerg #include <Y.h>
3788 1.1 joerg class X {};
3789 1.1 joerg Y.h:
3790 1.1 joerg class Y {};
3791 1.1 joerg
3792 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
3793 1.1 joerg </pre></td></tr>
3794 1.1 joerg
3795 1.1 joerg
3796 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3797 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3798 1.1 joerg
3799 1.1 joerg Example matches Y but not X
3800 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3801 1.1 joerg #include <SystemHeader.h>
3802 1.1 joerg class X {};
3803 1.1 joerg SystemHeader.h:
3804 1.1 joerg class Y {};
3805 1.1 joerg
3806 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
3807 1.1 joerg </pre></td></tr>
3808 1.1 joerg
3809 1.1 joerg
3810 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3811 1.1 joerg <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3812 1.1 joerg by the compiler (eg. implicit default/copy constructors).
3813 1.1 joerg </pre></td></tr>
3814 1.1 joerg
3815 1.1 joerg
3816 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
3817 1.1 joerg <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3818 1.1 joerg
3819 1.1 joerg Given
3820 1.1 joerg class vector {};
3821 1.1 joerg namespace foo {
3822 1.1 joerg class vector {};
3823 1.1 joerg namespace std {
3824 1.1 joerg class vector {};
3825 1.1 joerg }
3826 1.1 joerg }
3827 1.1 joerg namespace std {
3828 1.1 joerg inline namespace __1 {
3829 1.1 joerg class vector {}; // #1
3830 1.1 joerg namespace experimental {
3831 1.1 joerg class vector {};
3832 1.1 joerg }
3833 1.1 joerg }
3834 1.1 joerg }
3835 1.1 joerg cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3836 1.1 joerg </pre></td></tr>
3837 1.1 joerg
3838 1.1 joerg
3839 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
3840 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3841 1.1.1.2 joerg template instantiations.
3842 1.1 joerg
3843 1.1 joerg Given
3844 1.1.1.2 joerg template<typename T> void A(T t) { T i; }
3845 1.1.1.2 joerg A(0);
3846 1.1.1.2 joerg A(0U);
3847 1.1.1.2 joerg functionDecl(isInstantiated())
3848 1.1.1.2 joerg matches 'A(int) {...};' and 'A(unsigned) {...}'.
3849 1.1.1.2 joerg </pre></td></tr>
3850 1.1.1.2 joerg
3851 1.1.1.2 joerg
3852 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
3853 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3854 1.1.1.2 joerg inheritance.
3855 1.1.1.2 joerg
3856 1.1.1.2 joerg Examples:
3857 1.1 joerg class C {
3858 1.1 joerg public: int a;
3859 1.1 joerg protected: int b;
3860 1.1.1.2 joerg private: int c; // fieldDecl(isPrivate()) matches 'c'
3861 1.1 joerg };
3862 1.1.1.2 joerg
3863 1.1.1.2 joerg struct Base {};
3864 1.1.1.2 joerg struct Derived1 : private Base {}; // matches 'Base'
3865 1.1.1.2 joerg class Derived2 : Base {}; // matches 'Base'
3866 1.1 joerg </pre></td></tr>
3867 1.1 joerg
3868 1.1 joerg
3869 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
3870 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3871 1.1.1.2 joerg protected inheritance.
3872 1.1 joerg
3873 1.1.1.2 joerg Examples:
3874 1.1 joerg class C {
3875 1.1 joerg public: int a;
3876 1.1.1.2 joerg protected: int b; // fieldDecl(isProtected()) matches 'b'
3877 1.1 joerg private: int c;
3878 1.1 joerg };
3879 1.1.1.2 joerg
3880 1.1.1.2 joerg class Base {};
3881 1.1.1.2 joerg class Derived : protected Base {}; // matches 'Base'
3882 1.1 joerg </pre></td></tr>
3883 1.1 joerg
3884 1.1 joerg
3885 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
3886 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3887 1.1.1.2 joerg inheritance.
3888 1.1 joerg
3889 1.1.1.2 joerg Examples:
3890 1.1 joerg class C {
3891 1.1.1.2 joerg public: int a; // fieldDecl(isPublic()) matches 'a'
3892 1.1 joerg protected: int b;
3893 1.1 joerg private: int c;
3894 1.1 joerg };
3895 1.1.1.2 joerg
3896 1.1.1.2 joerg class Base {};
3897 1.1.1.2 joerg class Derived1 : public Base {}; // matches 'Base'
3898 1.1.1.2 joerg struct Derived2 : Base {}; // matches 'Base'
3899 1.1 joerg </pre></td></tr>
3900 1.1 joerg
3901 1.1 joerg
3902 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
3903 1.1 joerg <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3904 1.1 joerg a specific number of designators.
3905 1.1 joerg
3906 1.1 joerg Example: Given
3907 1.1 joerg point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3908 1.1 joerg point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3909 1.1 joerg designatorCountIs(2)
3910 1.1 joerg matches '{ [2].y = 1.0, [0].x = 1.0 }',
3911 1.1 joerg but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3912 1.1 joerg </pre></td></tr>
3913 1.1 joerg
3914 1.1 joerg
3915 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
3916 1.1 joerg <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3917 1.1 joerg
3918 1.1 joerg Example matches Y (matcher = enumDecl(isScoped()))
3919 1.1 joerg enum X {};
3920 1.1 joerg enum class Y {};
3921 1.1 joerg </pre></td></tr>
3922 1.1 joerg
3923 1.1 joerg
3924 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
3925 1.1 joerg <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3926 1.1 joerg neither type- nor value-dependent.
3927 1.1 joerg
3928 1.1 joerg In the following example, the expression sizeof(sizeof(T() + T()))
3929 1.1 joerg is instantiation-dependent (since it involves a template parameter T),
3930 1.1 joerg but is neither type- nor value-dependent, since the type of the inner
3931 1.1 joerg sizeof is known (std::size_t) and therefore the size of the outer
3932 1.1 joerg sizeof is known.
3933 1.1 joerg template<typename T>
3934 1.1 joerg void f(T x, T y) { sizeof(sizeof(T() + T()); }
3935 1.1 joerg expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3936 1.1 joerg </pre></td></tr>
3937 1.1 joerg
3938 1.1 joerg
3939 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
3940 1.1 joerg <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3941 1.1 joerg is not yet instantiated.
3942 1.1 joerg
3943 1.1 joerg For example, the expressions "x" and "x + y" are type-dependent in
3944 1.1 joerg the following code, but "y" is not type-dependent:
3945 1.1 joerg template<typename T>
3946 1.1 joerg void add(T x, int y) {
3947 1.1 joerg x + y;
3948 1.1 joerg }
3949 1.1 joerg expr(isTypeDependent()) matches x + y
3950 1.1 joerg </pre></td></tr>
3951 1.1 joerg
3952 1.1 joerg
3953 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
3954 1.1 joerg <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3955 1.1 joerg non-type template parameter.
3956 1.1 joerg
3957 1.1 joerg For example, the array bound of "Chars" in the following example is
3958 1.1 joerg value-dependent.
3959 1.1 joerg template<int Size> int f() { return Size; }
3960 1.1 joerg expr(isValueDependent()) matches return Size
3961 1.1 joerg </pre></td></tr>
3962 1.1 joerg
3963 1.1 joerg
3964 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3965 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3966 1.1.1.2 joerg GNU's __null, C++11's nullptr, or C's NULL macro.
3967 1.1.1.2 joerg
3968 1.1.1.2 joerg Given:
3969 1.1.1.2 joerg void *v1 = NULL;
3970 1.1.1.2 joerg void *v2 = nullptr;
3971 1.1.1.2 joerg void *v3 = __null; // GNU extension
3972 1.1.1.2 joerg char *cp = (char *)0;
3973 1.1.1.2 joerg int *ip = 0;
3974 1.1.1.2 joerg int i = 0;
3975 1.1.1.2 joerg expr(nullPointerConstant())
3976 1.1.1.2 joerg matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3977 1.1.1.2 joerg initializer for i.
3978 1.1.1.2 joerg </pre></td></tr>
3979 1.1.1.2 joerg
3980 1.1.1.2 joerg
3981 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
3982 1.1 joerg <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3983 1.1 joerg bit width.
3984 1.1 joerg
3985 1.1 joerg Given
3986 1.1 joerg class C {
3987 1.1 joerg int a : 2;
3988 1.1 joerg int b : 4;
3989 1.1 joerg int c : 2;
3990 1.1 joerg };
3991 1.1 joerg fieldDecl(hasBitWidth(2))
3992 1.1 joerg matches 'int a;' and 'int c;' but not 'int b;'.
3993 1.1 joerg </pre></td></tr>
3994 1.1 joerg
3995 1.1 joerg
3996 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
3997 1.1 joerg <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3998 1.1 joerg
3999 1.1 joerg Given
4000 1.1 joerg class C {
4001 1.1 joerg int a : 2;
4002 1.1 joerg int b;
4003 1.1 joerg };
4004 1.1 joerg fieldDecl(isBitField())
4005 1.1 joerg matches 'int a;' but not 'int b;'.
4006 1.1 joerg </pre></td></tr>
4007 1.1 joerg
4008 1.1 joerg
4009 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr>
4010 1.1 joerg <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4011 1.1 joerg
4012 1.1 joerg Given
4013 1.1 joerg f('false, 3.14, 42);
4014 1.1 joerg characterLiteral(equals(0))
4015 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4016 1.1 joerg match false
4017 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4018 1.1 joerg match 3.14
4019 1.1 joerg integerLiteral(equals(42))
4020 1.1 joerg matches 42
4021 1.1 joerg
4022 1.1 joerg Note that you cannot directly match a negative numeric literal because the
4023 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
4024 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
4025 1.1 joerg matcher to match the minus sign:
4026 1.1 joerg
4027 1.1 joerg unaryOperator(hasOperatorName("-"),
4028 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
4029 1.1 joerg
4030 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
4031 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
4032 1.1 joerg </pre></td></tr>
4033 1.1 joerg
4034 1.1 joerg
4035 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
4036 1.1 joerg <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4037 1.1 joerg
4038 1.1 joerg
4039 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
4040 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4041 1.1.1.2 joerg
4042 1.1.1.2 joerg Matches overloaded operator names specified in strings without the
4043 1.1.1.2 joerg "operator" prefix: e.g. "<<".
4044 1.1.1.2 joerg
4045 1.1.1.2 joerg hasAnyOverloadedOperatorName("+", "-")
4046 1.1.1.2 joerg Is equivalent to
4047 1.1.1.2 joerg anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4048 1.1.1.2 joerg </pre></td></tr>
4049 1.1.1.2 joerg
4050 1.1.1.2 joerg
4051 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4052 1.1 joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4053 1.1 joerg
4054 1.1 joerg Given:
4055 1.1 joerg void f();
4056 1.1 joerg void g() noexcept;
4057 1.1 joerg void h() noexcept(true);
4058 1.1 joerg void i() noexcept(false);
4059 1.1 joerg void j() throw();
4060 1.1 joerg void k() throw(int);
4061 1.1 joerg void l() throw(...);
4062 1.1 joerg functionDecl(hasDynamicExceptionSpec()) and
4063 1.1 joerg functionProtoType(hasDynamicExceptionSpec())
4064 1.1 joerg match the declarations of j, k, and l, but not f, g, h, or i.
4065 1.1 joerg </pre></td></tr>
4066 1.1 joerg
4067 1.1 joerg
4068 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
4069 1.1 joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4070 1.1 joerg
4071 1.1 joerg Matches overloaded operator names specified in strings without the
4072 1.1 joerg "operator" prefix: e.g. "<<".
4073 1.1 joerg
4074 1.1 joerg Given:
4075 1.1 joerg class A { int operator*(); };
4076 1.1 joerg const A &operator<<(const A &a, const A &b);
4077 1.1 joerg A a;
4078 1.1 joerg a << a; // <-- This matches
4079 1.1 joerg
4080 1.1 joerg cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the
4081 1.1 joerg specified line and
4082 1.1 joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4083 1.1 joerg matches the declaration of A.
4084 1.1 joerg
4085 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>
4086 1.1 joerg </pre></td></tr>
4087 1.1 joerg
4088 1.1 joerg
4089 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
4090 1.1 joerg <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4091 1.1 joerg
4092 1.1 joerg Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4093 1.1 joerg int X() {}
4094 1.1 joerg auto Y() -> int {}
4095 1.1 joerg </pre></td></tr>
4096 1.1 joerg
4097 1.1 joerg
4098 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
4099 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4100 1.1 joerg and if constexpr.
4101 1.1 joerg
4102 1.1 joerg Given:
4103 1.1 joerg constexpr int foo = 42;
4104 1.1 joerg constexpr int bar();
4105 1.1 joerg void baz() { if constexpr(1 > 0) {} }
4106 1.1 joerg varDecl(isConstexpr())
4107 1.1 joerg matches the declaration of foo.
4108 1.1 joerg functionDecl(isConstexpr())
4109 1.1 joerg matches the declaration of bar.
4110 1.1 joerg ifStmt(isConstexpr())
4111 1.1 joerg matches the if statement in baz.
4112 1.1 joerg </pre></td></tr>
4113 1.1 joerg
4114 1.1 joerg
4115 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
4116 1.1 joerg <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4117 1.1 joerg
4118 1.1 joerg Given:
4119 1.1 joerg class A { ~A(); };
4120 1.1 joerg class B { ~B() = default; };
4121 1.1 joerg functionDecl(isDefaulted())
4122 1.1 joerg matches the declaration of ~B, but not ~A.
4123 1.1 joerg </pre></td></tr>
4124 1.1 joerg
4125 1.1 joerg
4126 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
4127 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4128 1.1 joerg
4129 1.1 joerg Example matches A, va, fa
4130 1.1 joerg class A {};
4131 1.1 joerg class B; // Doesn't match, as it has no body.
4132 1.1 joerg int va;
4133 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
4134 1.1 joerg void fa() {}
4135 1.1 joerg void fb(); // Doesn't match, as it has no body.
4136 1.1 joerg @interface X
4137 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
4138 1.1 joerg @end
4139 1.1 joerg @implementation X
4140 1.1 joerg - (void)ma {}
4141 1.1 joerg @end
4142 1.1 joerg
4143 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
4144 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
4145 1.1 joerg </pre></td></tr>
4146 1.1 joerg
4147 1.1 joerg
4148 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
4149 1.1 joerg <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4150 1.1 joerg
4151 1.1 joerg Given:
4152 1.1 joerg void Func();
4153 1.1 joerg void DeletedFunc() = delete;
4154 1.1 joerg functionDecl(isDeleted())
4155 1.1 joerg matches the declaration of DeletedFunc, but not Func.
4156 1.1 joerg </pre></td></tr>
4157 1.1 joerg
4158 1.1 joerg
4159 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
4160 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4161 1.1 joerg static member variable template instantiations.
4162 1.1 joerg
4163 1.1 joerg Given
4164 1.1 joerg template<typename T> void A(T t) { }
4165 1.1 joerg template<> void A(int N) { }
4166 1.1 joerg functionDecl(isExplicitTemplateSpecialization())
4167 1.1 joerg matches the specialization A<int>().
4168 1.1 joerg
4169 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
4170 1.1 joerg </pre></td></tr>
4171 1.1 joerg
4172 1.1 joerg
4173 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
4174 1.1 joerg <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4175 1.1 joerg
4176 1.1 joerg Given:
4177 1.1 joerg extern "C" void f() {}
4178 1.1 joerg extern "C" { void g() {} }
4179 1.1 joerg void h() {}
4180 1.1 joerg extern "C" int x = 1;
4181 1.1 joerg extern "C" int y = 2;
4182 1.1 joerg int z = 3;
4183 1.1 joerg functionDecl(isExternC())
4184 1.1 joerg matches the declaration of f and g, but not the declaration of h.
4185 1.1 joerg varDecl(isExternC())
4186 1.1 joerg matches the declaration of x and y, but not the declaration of z.
4187 1.1 joerg </pre></td></tr>
4188 1.1 joerg
4189 1.1 joerg
4190 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
4191 1.1 joerg <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4192 1.1 joerg the inline keyword.
4193 1.1 joerg
4194 1.1 joerg Given
4195 1.1 joerg inline void f();
4196 1.1 joerg void g();
4197 1.1 joerg namespace n {
4198 1.1 joerg inline namespace m {}
4199 1.1 joerg }
4200 1.1 joerg functionDecl(isInline()) will match ::f().
4201 1.1 joerg namespaceDecl(isInline()) will match n::m.
4202 1.1 joerg </pre></td></tr>
4203 1.1 joerg
4204 1.1 joerg
4205 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
4206 1.1 joerg <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4207 1.1 joerg into an executable program.
4208 1.1 joerg </pre></td></tr>
4209 1.1 joerg
4210 1.1 joerg
4211 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
4212 1.1 joerg <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4213 1.1 joerg
4214 1.1 joerg Given
4215 1.1 joerg void nope();
4216 1.1 joerg [[noreturn]] void a();
4217 1.1 joerg __attribute__((noreturn)) void b();
4218 1.1 joerg struct c { [[noreturn]] c(); };
4219 1.1 joerg functionDecl(isNoReturn())
4220 1.1 joerg matches all of those except
4221 1.1 joerg void nope();
4222 1.1 joerg </pre></td></tr>
4223 1.1 joerg
4224 1.1 joerg
4225 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
4226 1.1 joerg <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4227 1.1 joerg
4228 1.1 joerg Given:
4229 1.1 joerg void f();
4230 1.1 joerg void g() noexcept;
4231 1.1 joerg void h() throw();
4232 1.1 joerg void i() throw(int);
4233 1.1 joerg void j() noexcept(false);
4234 1.1 joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4235 1.1 joerg match the declarations of g, and h, but not f, i or j.
4236 1.1 joerg </pre></td></tr>
4237 1.1 joerg
4238 1.1 joerg
4239 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
4240 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4241 1.1 joerg class specifier ("static" keyword) written in the source.
4242 1.1 joerg
4243 1.1 joerg Given:
4244 1.1 joerg static void f() {}
4245 1.1 joerg static int i = 0;
4246 1.1 joerg extern int j;
4247 1.1 joerg int k;
4248 1.1 joerg functionDecl(isStaticStorageClass())
4249 1.1 joerg matches the function declaration f.
4250 1.1 joerg varDecl(isStaticStorageClass())
4251 1.1 joerg matches the variable declaration i.
4252 1.1 joerg </pre></td></tr>
4253 1.1 joerg
4254 1.1 joerg
4255 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
4256 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4257 1.1 joerg member variable template instantiations.
4258 1.1 joerg
4259 1.1 joerg Given
4260 1.1 joerg template <typename T> class X {}; class A {}; X<A> x;
4261 1.1 joerg or
4262 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>;
4263 1.1 joerg or
4264 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>;
4265 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4266 1.1 joerg matches the template instantiation of X<A>.
4267 1.1 joerg
4268 1.1 joerg But given
4269 1.1 joerg template <typename T> class X {}; class A {};
4270 1.1 joerg template <> class X<A> {}; X<A> x;
4271 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4272 1.1 joerg does not match, as X<A> is an explicit template specialization.
4273 1.1 joerg
4274 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
4275 1.1 joerg </pre></td></tr>
4276 1.1 joerg
4277 1.1 joerg
4278 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
4279 1.1 joerg <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4280 1.1 joerg
4281 1.1 joerg Example matches f, but not g or h. The function i will not match, even when
4282 1.1 joerg compiled in C mode.
4283 1.1 joerg void f(...);
4284 1.1 joerg void g(int);
4285 1.1 joerg template <typename... Ts> void h(Ts...);
4286 1.1 joerg void i();
4287 1.1 joerg </pre></td></tr>
4288 1.1 joerg
4289 1.1 joerg
4290 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr>
4291 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4292 1.1.1.2 joerg
4293 1.1.1.2 joerg Given:
4294 1.1.1.2 joerg void foo() __attribute__((__weakref__("__foo")));
4295 1.1.1.2 joerg void bar();
4296 1.1.1.2 joerg functionDecl(isWeak())
4297 1.1.1.2 joerg matches the weak declaration "foo", but not "bar".
4298 1.1.1.2 joerg </pre></td></tr>
4299 1.1.1.2 joerg
4300 1.1.1.2 joerg
4301 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4302 1.1 joerg <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4303 1.1 joerg specific parameter count.
4304 1.1 joerg
4305 1.1 joerg Given
4306 1.1 joerg void f(int i) {}
4307 1.1 joerg void g(int i, int j) {}
4308 1.1 joerg void h(int i, int j);
4309 1.1 joerg void j(int i);
4310 1.1 joerg void k(int x, int y, int z, ...);
4311 1.1 joerg functionDecl(parameterCountIs(2))
4312 1.1 joerg matches g and h
4313 1.1 joerg functionProtoType(parameterCountIs(2))
4314 1.1 joerg matches g and h
4315 1.1 joerg functionProtoType(parameterCountIs(3))
4316 1.1 joerg matches k
4317 1.1 joerg </pre></td></tr>
4318 1.1 joerg
4319 1.1 joerg
4320 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4321 1.1 joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4322 1.1 joerg
4323 1.1 joerg Given:
4324 1.1 joerg void f();
4325 1.1 joerg void g() noexcept;
4326 1.1 joerg void h() noexcept(true);
4327 1.1 joerg void i() noexcept(false);
4328 1.1 joerg void j() throw();
4329 1.1 joerg void k() throw(int);
4330 1.1 joerg void l() throw(...);
4331 1.1 joerg functionDecl(hasDynamicExceptionSpec()) and
4332 1.1 joerg functionProtoType(hasDynamicExceptionSpec())
4333 1.1 joerg match the declarations of j, k, and l, but not f, g, h, or i.
4334 1.1 joerg </pre></td></tr>
4335 1.1 joerg
4336 1.1 joerg
4337 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
4338 1.1 joerg <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4339 1.1 joerg
4340 1.1 joerg Given:
4341 1.1 joerg void f();
4342 1.1 joerg void g() noexcept;
4343 1.1 joerg void h() throw();
4344 1.1 joerg void i() throw(int);
4345 1.1 joerg void j() noexcept(false);
4346 1.1 joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4347 1.1 joerg match the declarations of g, and h, but not f, i or j.
4348 1.1 joerg </pre></td></tr>
4349 1.1 joerg
4350 1.1 joerg
4351 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4352 1.1 joerg <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4353 1.1 joerg specific parameter count.
4354 1.1 joerg
4355 1.1 joerg Given
4356 1.1 joerg void f(int i) {}
4357 1.1 joerg void g(int i, int j) {}
4358 1.1 joerg void h(int i, int j);
4359 1.1 joerg void j(int i);
4360 1.1 joerg void k(int x, int y, int z, ...);
4361 1.1 joerg functionDecl(parameterCountIs(2))
4362 1.1 joerg matches g and h
4363 1.1 joerg functionProtoType(parameterCountIs(2))
4364 1.1 joerg matches g and h
4365 1.1 joerg functionProtoType(parameterCountIs(3))
4366 1.1 joerg matches k
4367 1.1 joerg </pre></td></tr>
4368 1.1 joerg
4369 1.1 joerg
4370 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
4371 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4372 1.1 joerg and if constexpr.
4373 1.1 joerg
4374 1.1 joerg Given:
4375 1.1 joerg constexpr int foo = 42;
4376 1.1 joerg constexpr int bar();
4377 1.1 joerg void baz() { if constexpr(1 > 0) {} }
4378 1.1 joerg varDecl(isConstexpr())
4379 1.1 joerg matches the declaration of foo.
4380 1.1 joerg functionDecl(isConstexpr())
4381 1.1 joerg matches the declaration of bar.
4382 1.1 joerg ifStmt(isConstexpr())
4383 1.1 joerg matches the if statement in baz.
4384 1.1 joerg </pre></td></tr>
4385 1.1 joerg
4386 1.1 joerg
4387 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
4388 1.1 joerg <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4389 1.1 joerg
4390 1.1 joerg
4391 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr>
4392 1.1 joerg <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4393 1.1 joerg
4394 1.1 joerg Given
4395 1.1 joerg f('false, 3.14, 42);
4396 1.1 joerg characterLiteral(equals(0))
4397 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4398 1.1 joerg match false
4399 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4400 1.1 joerg match 3.14
4401 1.1 joerg integerLiteral(equals(42))
4402 1.1 joerg matches 42
4403 1.1 joerg
4404 1.1 joerg Note that you cannot directly match a negative numeric literal because the
4405 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
4406 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
4407 1.1 joerg matcher to match the minus sign:
4408 1.1 joerg
4409 1.1 joerg unaryOperator(hasOperatorName("-"),
4410 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
4411 1.1 joerg
4412 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
4413 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
4414 1.1 joerg </pre></td></tr>
4415 1.1 joerg
4416 1.1 joerg
4417 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
4418 1.1 joerg <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4419 1.1 joerg
4420 1.1 joerg
4421 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
4422 1.1 joerg <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4423 1.1 joerg
4424 1.1 joerg
4425 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
4426 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed
4427 1.1 joerg to '.'.
4428 1.1 joerg
4429 1.1 joerg Member calls on the implicit this pointer match as called with '->'.
4430 1.1 joerg
4431 1.1 joerg Given
4432 1.1 joerg class Y {
4433 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
4434 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); }
4435 1.1 joerg int a;
4436 1.1 joerg static int b;
4437 1.1 joerg };
4438 1.1 joerg template <class T>
4439 1.1 joerg class Z {
4440 1.1 joerg void x() { this->m; }
4441 1.1 joerg };
4442 1.1 joerg memberExpr(isArrow())
4443 1.1 joerg matches this->x, x, y.x, a, this->b
4444 1.1 joerg cxxDependentScopeMemberExpr(isArrow())
4445 1.1 joerg matches this->m
4446 1.1 joerg unresolvedMemberExpr(isArrow())
4447 1.1 joerg matches this->f<T>, f<T>
4448 1.1 joerg </pre></td></tr>
4449 1.1 joerg
4450 1.1 joerg
4451 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
4452 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4453 1.1.1.2 joerg
4454 1.1.1.2 joerg This matcher is only provided as a performance optimization of hasName.
4455 1.1.1.2 joerg hasAnyName(a, b, c)
4456 1.1.1.2 joerg is equivalent to, but faster than
4457 1.1.1.2 joerg anyOf(hasName(a), hasName(b), hasName(c))
4458 1.1.1.2 joerg </pre></td></tr>
4459 1.1.1.2 joerg
4460 1.1.1.2 joerg
4461 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
4462 1.1 joerg <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4463 1.1 joerg
4464 1.1 joerg Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4465 1.1 joerg void f() {
4466 1.1 joerg int x;
4467 1.1 joerg static int y;
4468 1.1 joerg }
4469 1.1 joerg int z;
4470 1.1 joerg
4471 1.1 joerg Example matches f() because it has external formal linkage despite being
4472 1.1 joerg unique to the translation unit as though it has internal likage
4473 1.1 joerg (matcher = functionDecl(hasExternalFormalLinkage()))
4474 1.1 joerg
4475 1.1 joerg namespace {
4476 1.1 joerg void f() {}
4477 1.1 joerg }
4478 1.1 joerg </pre></td></tr>
4479 1.1 joerg
4480 1.1 joerg
4481 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr>
4482 1.1 joerg <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4483 1.1 joerg
4484 1.1 joerg Supports specifying enclosing namespaces or classes by prefixing the name
4485 1.1 joerg with '<enclosing>::'.
4486 1.1 joerg Does not match typedefs of an underlying type with the given name.
4487 1.1 joerg
4488 1.1 joerg Example matches X (Name == "X")
4489 1.1 joerg class X;
4490 1.1 joerg
4491 1.1 joerg Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4492 1.1 joerg namespace a { namespace b { class X; } }
4493 1.1 joerg </pre></td></tr>
4494 1.1 joerg
4495 1.1 joerg
4496 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4497 1.1 joerg <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4498 1.1 joerg a substring matched by the given RegExp.
4499 1.1 joerg
4500 1.1 joerg Supports specifying enclosing namespaces or classes by
4501 1.1 joerg prefixing the name with '<enclosing>::'. Does not match typedefs
4502 1.1 joerg of an underlying type with the given name.
4503 1.1 joerg
4504 1.1 joerg Example matches X (regexp == "::X")
4505 1.1 joerg class X;
4506 1.1 joerg
4507 1.1 joerg Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4508 1.1 joerg namespace foo { namespace bar { class X; } }
4509 1.1.1.2 joerg
4510 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter
4511 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags".
4512 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4513 1.1 joerg </pre></td></tr>
4514 1.1 joerg
4515 1.1 joerg
4516 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
4517 1.1 joerg <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4518 1.1 joerg
4519 1.1 joerg Given
4520 1.1 joerg namespace n {
4521 1.1 joerg namespace {} // #1
4522 1.1 joerg }
4523 1.1 joerg namespaceDecl(isAnonymous()) will match #1 but not ::n.
4524 1.1 joerg </pre></td></tr>
4525 1.1 joerg
4526 1.1 joerg
4527 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
4528 1.1 joerg <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4529 1.1 joerg the inline keyword.
4530 1.1 joerg
4531 1.1 joerg Given
4532 1.1 joerg inline void f();
4533 1.1 joerg void g();
4534 1.1 joerg namespace n {
4535 1.1 joerg inline namespace m {}
4536 1.1 joerg }
4537 1.1 joerg functionDecl(isInline()) will match ::f().
4538 1.1 joerg namespaceDecl(isInline()) will match n::m.
4539 1.1 joerg </pre></td></tr>
4540 1.1 joerg
4541 1.1 joerg
4542 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr>
4543 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4544 1.1.1.2 joerg specified.
4545 1.1.1.2 joerg
4546 1.1.1.2 joerg Given
4547 1.1.1.2 joerg
4548 1.1.1.2 joerg #pragma omp parallel
4549 1.1.1.2 joerg #pragma omp parallel default(none)
4550 1.1.1.2 joerg #pragma omp parallel default(shared)
4551 1.1.1.2 joerg #pragma omp parallel default(firstprivate)
4552 1.1.1.2 joerg
4553 1.1.1.2 joerg ``ompDefaultClause(isFirstPrivateKind())`` matches only
4554 1.1.1.2 joerg ``default(firstprivate)``.
4555 1.1.1.2 joerg </pre></td></tr>
4556 1.1.1.2 joerg
4557 1.1.1.2 joerg
4558 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
4559 1.1 joerg <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4560 1.1 joerg
4561 1.1 joerg Given
4562 1.1 joerg
4563 1.1 joerg #pragma omp parallel
4564 1.1 joerg #pragma omp parallel default(none)
4565 1.1 joerg #pragma omp parallel default(shared)
4566 1.1.1.2 joerg #pragma omp parallel default(firstprivate)
4567 1.1 joerg
4568 1.1 joerg ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4569 1.1 joerg </pre></td></tr>
4570 1.1 joerg
4571 1.1 joerg
4572 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
4573 1.1 joerg <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4574 1.1 joerg
4575 1.1 joerg Given
4576 1.1 joerg
4577 1.1 joerg #pragma omp parallel
4578 1.1 joerg #pragma omp parallel default(none)
4579 1.1 joerg #pragma omp parallel default(shared)
4580 1.1.1.2 joerg #pragma omp parallel default(firstprivate)
4581 1.1 joerg
4582 1.1 joerg ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4583 1.1 joerg </pre></td></tr>
4584 1.1 joerg
4585 1.1 joerg
4586 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
4587 1.1 joerg <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4588 1.1 joerg clause kind.
4589 1.1 joerg
4590 1.1 joerg Given
4591 1.1 joerg
4592 1.1 joerg #pragma omp parallel
4593 1.1 joerg #pragma omp parallel for
4594 1.1 joerg #pragma omp for
4595 1.1 joerg
4596 1.1 joerg `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4597 1.1 joerg ``omp parallel`` and ``omp parallel for``.
4598 1.1 joerg
4599 1.1 joerg If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4600 1.1 joerg should be passed as a quoted string. e.g.,
4601 1.1 joerg ``isAllowedToContainClauseKind("OMPC_default").``
4602 1.1 joerg </pre></td></tr>
4603 1.1 joerg
4604 1.1 joerg
4605 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
4606 1.1 joerg <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4607 1.1 joerg i.e., directives that can't have a structured block.
4608 1.1 joerg
4609 1.1 joerg Given
4610 1.1 joerg
4611 1.1 joerg #pragma omp parallel
4612 1.1 joerg {}
4613 1.1 joerg #pragma omp taskyield
4614 1.1 joerg
4615 1.1 joerg ``ompExecutableDirective(isStandaloneDirective()))`` matches
4616 1.1 joerg ``omp taskyield``.
4617 1.1 joerg </pre></td></tr>
4618 1.1 joerg
4619 1.1 joerg
4620 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
4621 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4622 1.1 joerg </pre></td></tr>
4623 1.1 joerg
4624 1.1 joerg
4625 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
4626 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4627 1.1 joerg </pre></td></tr>
4628 1.1 joerg
4629 1.1 joerg
4630 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
4631 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4632 1.1 joerg isSameOrDerivedFrom(hasName(...)).
4633 1.1 joerg </pre></td></tr>
4634 1.1 joerg
4635 1.1 joerg
4636 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
4637 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4638 1.1 joerg a specific number of arguments (including absent default arguments).
4639 1.1 joerg
4640 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4641 1.1 joerg void f(int x, int y);
4642 1.1 joerg f(0, 0);
4643 1.1 joerg </pre></td></tr>
4644 1.1 joerg
4645 1.1 joerg
4646 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
4647 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4648 1.1.1.2 joerg Selector.getAsString()
4649 1.1.1.2 joerg
4650 1.1.1.2 joerg matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4651 1.1.1.2 joerg matches both of the expressions below:
4652 1.1.1.2 joerg [myObj methodA:argA];
4653 1.1.1.2 joerg [myObj methodB:argB];
4654 1.1.1.2 joerg </pre></td></tr>
4655 1.1.1.2 joerg
4656 1.1.1.2 joerg
4657 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
4658 1.1 joerg <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4659 1.1 joerg
4660 1.1 joerg objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4661 1.1 joerg message expression in
4662 1.1 joerg
4663 1.1 joerg UIWebView *webView = ...;
4664 1.1 joerg CGRect bodyFrame = webView.frame;
4665 1.1 joerg bodyFrame.size.height = self.bodyContentHeight;
4666 1.1 joerg webView.frame = bodyFrame;
4667 1.1 joerg // ^---- matches here
4668 1.1 joerg </pre></td></tr>
4669 1.1 joerg
4670 1.1 joerg
4671 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
4672 1.1 joerg <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4673 1.1 joerg
4674 1.1 joerg Matches only when the selector of the objCMessageExpr is NULL. This may
4675 1.1 joerg represent an error condition in the tree!
4676 1.1 joerg </pre></td></tr>
4677 1.1 joerg
4678 1.1 joerg
4679 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
4680 1.1 joerg <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4681 1.1 joerg
4682 1.1 joerg matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4683 1.1 joerg matches the outer message expr in the code below, but NOT the message
4684 1.1 joerg invocation for self.bodyView.
4685 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
4686 1.1 joerg </pre></td></tr>
4687 1.1 joerg
4688 1.1 joerg
4689 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
4690 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4691 1.1 joerg
4692 1.1 joerg matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4693 1.1 joerg matches self.bodyView in the code below, but NOT the outer message
4694 1.1 joerg invocation of "loadHTMLString:baseURL:".
4695 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
4696 1.1 joerg </pre></td></tr>
4697 1.1 joerg
4698 1.1 joerg
4699 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
4700 1.1 joerg <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4701 1.1 joerg
4702 1.1 joerg Example
4703 1.1 joerg matcher = objcMessageExpr(isClassMessage())
4704 1.1 joerg matches
4705 1.1 joerg [NSString stringWithFormat:@"format"];
4706 1.1 joerg but not
4707 1.1 joerg NSString *x = @"hello";
4708 1.1 joerg [x containsString:@"h"];
4709 1.1 joerg </pre></td></tr>
4710 1.1 joerg
4711 1.1 joerg
4712 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
4713 1.1 joerg <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4714 1.1 joerg
4715 1.1 joerg Example
4716 1.1 joerg matcher = objcMessageExpr(isInstanceMessage())
4717 1.1 joerg matches
4718 1.1 joerg NSString *x = @"hello";
4719 1.1 joerg [x containsString:@"h"];
4720 1.1 joerg but not
4721 1.1 joerg [NSString stringWithFormat:@"format"];
4722 1.1 joerg </pre></td></tr>
4723 1.1 joerg
4724 1.1 joerg
4725 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4726 1.1 joerg <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4727 1.1 joerg a substring matched by the given RegExp.
4728 1.1 joerg matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4729 1.1 joerg invocation for self.bodyView.
4730 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
4731 1.1.1.2 joerg
4732 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter
4733 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags".
4734 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4735 1.1 joerg </pre></td></tr>
4736 1.1 joerg
4737 1.1 joerg
4738 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
4739 1.1 joerg <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4740 1.1 joerg
4741 1.1 joerg matcher = objCMessageExpr(numSelectorArgs(0));
4742 1.1 joerg matches self.bodyView in the code below
4743 1.1 joerg
4744 1.1 joerg matcher = objCMessageExpr(numSelectorArgs(2));
4745 1.1 joerg matches the invocation of "loadHTMLString:baseURL:" but not that
4746 1.1 joerg of self.bodyView
4747 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
4748 1.1 joerg </pre></td></tr>
4749 1.1 joerg
4750 1.1 joerg
4751 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
4752 1.1 joerg <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4753 1.1 joerg
4754 1.1 joerg Example
4755 1.1 joerg matcher = objcMethodDecl(isClassMethod())
4756 1.1 joerg matches
4757 1.1 joerg @interface I + (void)foo; @end
4758 1.1 joerg but not
4759 1.1 joerg @interface I - (void)bar; @end
4760 1.1 joerg </pre></td></tr>
4761 1.1 joerg
4762 1.1 joerg
4763 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
4764 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4765 1.1 joerg
4766 1.1 joerg Example matches A, va, fa
4767 1.1 joerg class A {};
4768 1.1 joerg class B; // Doesn't match, as it has no body.
4769 1.1 joerg int va;
4770 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
4771 1.1 joerg void fa() {}
4772 1.1 joerg void fb(); // Doesn't match, as it has no body.
4773 1.1 joerg @interface X
4774 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
4775 1.1 joerg @end
4776 1.1 joerg @implementation X
4777 1.1 joerg - (void)ma {}
4778 1.1 joerg @end
4779 1.1 joerg
4780 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
4781 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
4782 1.1 joerg </pre></td></tr>
4783 1.1 joerg
4784 1.1 joerg
4785 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr>
4786 1.1 joerg <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4787 1.1 joerg
4788 1.1 joerg Example
4789 1.1 joerg matcher = objcMethodDecl(isInstanceMethod())
4790 1.1 joerg matches
4791 1.1 joerg @interface I - (void)bar; @end
4792 1.1 joerg but not
4793 1.1 joerg @interface I + (void)foo; @end
4794 1.1 joerg </pre></td></tr>
4795 1.1 joerg
4796 1.1 joerg
4797 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
4798 1.1 joerg <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4799 1.1 joerg
4800 1.1 joerg Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4801 1.1 joerg void x(int val) {}
4802 1.1 joerg void y(int val = 0) {}
4803 1.1.1.2 joerg
4804 1.1.1.2 joerg Deprecated. Use hasInitializer() instead to be able to
4805 1.1.1.2 joerg match on the contents of the default argument. For example:
4806 1.1.1.2 joerg
4807 1.1.1.2 joerg void x(int val = 7) {}
4808 1.1.1.2 joerg void y(int val = 42) {}
4809 1.1.1.2 joerg parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4810 1.1.1.2 joerg matches the parameter of y
4811 1.1.1.2 joerg
4812 1.1.1.2 joerg A matcher such as
4813 1.1.1.2 joerg parmVarDecl(hasInitializer(anything()))
4814 1.1.1.2 joerg is equivalent to parmVarDecl(hasDefaultArgument()).
4815 1.1.1.2 joerg </pre></td></tr>
4816 1.1.1.2 joerg
4817 1.1.1.2 joerg
4818 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr>
4819 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4820 1.1.1.2 joerg list. The parameter list could be that of either a block, function, or
4821 1.1.1.2 joerg objc-method.
4822 1.1.1.2 joerg
4823 1.1.1.2 joerg
4824 1.1.1.2 joerg Given
4825 1.1.1.2 joerg
4826 1.1.1.2 joerg void f(int a, int b, int c) {
4827 1.1.1.2 joerg }
4828 1.1.1.2 joerg
4829 1.1.1.2 joerg ``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4830 1.1.1.2 joerg
4831 1.1.1.2 joerg ``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4832 1.1 joerg </pre></td></tr>
4833 1.1 joerg
4834 1.1 joerg
4835 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
4836 1.1 joerg <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4837 1.1 joerg
4838 1.1 joerg Given
4839 1.1 joerg class Y { public: void x(); };
4840 1.1 joerg void z() { Y* y; y->x(); }
4841 1.1 joerg cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4842 1.1 joerg matches y->x()
4843 1.1 joerg </pre></td></tr>
4844 1.1 joerg
4845 1.1 joerg
4846 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4847 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4848 1.1 joerg
4849 1.1 joerg Matches a node if it equals the node previously bound to ID.
4850 1.1 joerg
4851 1.1 joerg Given
4852 1.1 joerg class X { int a; int b; };
4853 1.1 joerg cxxRecordDecl(
4854 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4855 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4856 1.1 joerg matches the class X, as a and b have the same type.
4857 1.1 joerg
4858 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
4859 1.1 joerg equalsBoundNodes acts as a filter.
4860 1.1 joerg For example:
4861 1.1 joerg compoundStmt(
4862 1.1 joerg forEachDescendant(varDecl().bind("d")),
4863 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4864 1.1 joerg will trigger a match for each combination of variable declaration
4865 1.1 joerg and reference to that variable declaration within a compound statement.
4866 1.1 joerg </pre></td></tr>
4867 1.1 joerg
4868 1.1 joerg
4869 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
4870 1.1 joerg <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4871 1.1 joerg the node, not hidden within a typedef.
4872 1.1 joerg
4873 1.1 joerg Given
4874 1.1 joerg typedef const int const_int;
4875 1.1 joerg const_int i;
4876 1.1 joerg int *const j;
4877 1.1 joerg int *volatile k;
4878 1.1 joerg int m;
4879 1.1 joerg varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4880 1.1 joerg i is const-qualified but the qualifier is not local.
4881 1.1 joerg </pre></td></tr>
4882 1.1 joerg
4883 1.1 joerg
4884 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
4885 1.1 joerg <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4886 1.1 joerg
4887 1.1 joerg Given
4888 1.1 joerg void a(char);
4889 1.1 joerg void b(wchar_t);
4890 1.1 joerg void c(double);
4891 1.1 joerg functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4892 1.1 joerg matches "a(char)", "b(wchar_t)", but not "c(double)".
4893 1.1 joerg </pre></td></tr>
4894 1.1 joerg
4895 1.1 joerg
4896 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
4897 1.1 joerg <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4898 1.1 joerg the Objective-C object pointer type, which is different despite being
4899 1.1 joerg syntactically similar.
4900 1.1 joerg
4901 1.1 joerg Given
4902 1.1 joerg int *i = nullptr;
4903 1.1 joerg
4904 1.1 joerg @interface Foo
4905 1.1 joerg @end
4906 1.1 joerg Foo *f;
4907 1.1 joerg
4908 1.1 joerg int j;
4909 1.1 joerg varDecl(hasType(isAnyPointer()))
4910 1.1 joerg matches "int *i" and "Foo *f", but not "int j".
4911 1.1 joerg </pre></td></tr>
4912 1.1 joerg
4913 1.1 joerg
4914 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
4915 1.1 joerg <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4916 1.1 joerg include "top-level" const.
4917 1.1 joerg
4918 1.1 joerg Given
4919 1.1 joerg void a(int);
4920 1.1 joerg void b(int const);
4921 1.1 joerg void c(const int);
4922 1.1 joerg void d(const int*);
4923 1.1 joerg void e(int const) {};
4924 1.1 joerg functionDecl(hasAnyParameter(hasType(isConstQualified())))
4925 1.1 joerg matches "void b(int const)", "void c(const int)" and
4926 1.1 joerg "void e(int const) {}". It does not match d as there
4927 1.1 joerg is no top-level const on the parameter type "const int *".
4928 1.1 joerg </pre></td></tr>
4929 1.1 joerg
4930 1.1 joerg
4931 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
4932 1.1 joerg <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4933 1.1 joerg
4934 1.1 joerg Given
4935 1.1 joerg void a(int);
4936 1.1 joerg void b(long);
4937 1.1 joerg void c(double);
4938 1.1 joerg functionDecl(hasAnyParameter(hasType(isInteger())))
4939 1.1 joerg matches "a(int)", "b(long)", but not "c(double)".
4940 1.1 joerg </pre></td></tr>
4941 1.1 joerg
4942 1.1 joerg
4943 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
4944 1.1 joerg <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4945 1.1 joerg
4946 1.1 joerg Given
4947 1.1 joerg void a(int);
4948 1.1 joerg void b(unsigned long);
4949 1.1 joerg void c(double);
4950 1.1 joerg functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4951 1.1 joerg matches "a(int)", but not "b(unsigned long)" and "c(double)".
4952 1.1 joerg </pre></td></tr>
4953 1.1 joerg
4954 1.1 joerg
4955 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
4956 1.1 joerg <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4957 1.1 joerg
4958 1.1 joerg Given
4959 1.1 joerg void a(int);
4960 1.1 joerg void b(unsigned long);
4961 1.1 joerg void c(double);
4962 1.1 joerg functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4963 1.1 joerg matches "b(unsigned long)", but not "a(int)" and "c(double)".
4964 1.1 joerg </pre></td></tr>
4965 1.1 joerg
4966 1.1 joerg
4967 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
4968 1.1 joerg <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4969 1.1 joerg include "top-level" volatile.
4970 1.1 joerg
4971 1.1 joerg Given
4972 1.1 joerg void a(int);
4973 1.1 joerg void b(int volatile);
4974 1.1 joerg void c(volatile int);
4975 1.1 joerg void d(volatile int*);
4976 1.1 joerg void e(int volatile) {};
4977 1.1 joerg functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4978 1.1 joerg matches "void b(int volatile)", "void c(volatile int)" and
4979 1.1 joerg "void e(int volatile) {}". It does not match d as there
4980 1.1 joerg is no top-level volatile on the parameter type "volatile int *".
4981 1.1 joerg </pre></td></tr>
4982 1.1 joerg
4983 1.1 joerg
4984 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4985 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4986 1.1 joerg
4987 1.1.1.2 joerg Matches a node if it equals the node previously bound to ID.
4988 1.1 joerg
4989 1.1.1.2 joerg Given
4990 1.1.1.2 joerg class X { int a; int b; };
4991 1.1.1.2 joerg cxxRecordDecl(
4992 1.1.1.2 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4993 1.1.1.2 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4994 1.1.1.2 joerg matches the class X, as a and b have the same type.
4995 1.1 joerg
4996 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
4997 1.1 joerg equalsBoundNodes acts as a filter.
4998 1.1 joerg For example:
4999 1.1 joerg compoundStmt(
5000 1.1 joerg forEachDescendant(varDecl().bind("d")),
5001 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5002 1.1 joerg will trigger a match for each combination of variable declaration
5003 1.1 joerg and reference to that variable declaration within a compound statement.
5004 1.1 joerg </pre></td></tr>
5005 1.1 joerg
5006 1.1 joerg
5007 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
5008 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5009 1.1 joerg
5010 1.1 joerg Stmt has pointer identity in the AST.
5011 1.1 joerg </pre></td></tr>
5012 1.1 joerg
5013 1.1 joerg
5014 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5015 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5016 1.1.1.2 joerg Does not match if only part of the statement is expanded from that macro or
5017 1.1.1.2 joerg if different parts of the the statement are expanded from different
5018 1.1.1.2 joerg appearances of the macro.
5019 1.1.1.2 joerg </pre></td></tr>
5020 1.1.1.2 joerg
5021 1.1.1.2 joerg
5022 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5023 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5024 1.1 joerg partially matching a given regex.
5025 1.1 joerg
5026 1.1 joerg Example matches Y but not X
5027 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5028 1.1 joerg #include "ASTMatcher.h"
5029 1.1 joerg class X {};
5030 1.1 joerg ASTMatcher.h:
5031 1.1 joerg class Y {};
5032 1.1 joerg
5033 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
5034 1.1.1.2 joerg
5035 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter
5036 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags".
5037 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5038 1.1 joerg </pre></td></tr>
5039 1.1 joerg
5040 1.1 joerg
5041 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
5042 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5043 1.1 joerg
5044 1.1 joerg Example matches X but not Y
5045 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile())
5046 1.1 joerg #include <Y.h>
5047 1.1 joerg class X {};
5048 1.1 joerg Y.h:
5049 1.1 joerg class Y {};
5050 1.1 joerg
5051 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
5052 1.1 joerg </pre></td></tr>
5053 1.1 joerg
5054 1.1 joerg
5055 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5056 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5057 1.1 joerg
5058 1.1 joerg Example matches Y but not X
5059 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5060 1.1 joerg #include <SystemHeader.h>
5061 1.1 joerg class X {};
5062 1.1 joerg SystemHeader.h:
5063 1.1 joerg class Y {};
5064 1.1 joerg
5065 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
5066 1.1 joerg </pre></td></tr>
5067 1.1 joerg
5068 1.1 joerg
5069 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
5070 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5071 1.1 joerg
5072 1.1 joerg Given
5073 1.1.1.2 joerg int j;
5074 1.1.1.2 joerg template<typename T> void A(T t) { T i; j += 42;}
5075 1.1.1.2 joerg A(0);
5076 1.1.1.2 joerg A(0U);
5077 1.1.1.2 joerg declStmt(isInTemplateInstantiation())
5078 1.1.1.2 joerg matches 'int i;' and 'unsigned i'.
5079 1.1.1.2 joerg unless(stmt(isInTemplateInstantiation()))
5080 1.1.1.2 joerg will NOT match j += 42; as it's shared between the template definition and
5081 1.1.1.2 joerg instantiation.
5082 1.1 joerg </pre></td></tr>
5083 1.1 joerg
5084 1.1 joerg
5085 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
5086 1.1 joerg <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5087 1.1 joerg
5088 1.1 joerg Given
5089 1.1 joerg int a[42];
5090 1.1 joerg int b[2 * 21];
5091 1.1 joerg int c[41], d[43];
5092 1.1 joerg char *s = "abcd";
5093 1.1 joerg wchar_t *ws = L"abcd";
5094 1.1 joerg char *w = "a";
5095 1.1 joerg constantArrayType(hasSize(42))
5096 1.1 joerg matches "int a[42]" and "int b[2 * 21]"
5097 1.1 joerg stringLiteral(hasSize(4))
5098 1.1 joerg matches "abcd", L"abcd"
5099 1.1 joerg </pre></td></tr>
5100 1.1 joerg
5101 1.1 joerg
5102 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
5103 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5104 1.1.1.2 joerg
5105 1.1.1.2 joerg Example matches C, but not S, U or E.
5106 1.1.1.2 joerg struct S {};
5107 1.1.1.2 joerg class C {};
5108 1.1.1.2 joerg union U {};
5109 1.1.1.2 joerg enum E {};
5110 1.1.1.2 joerg </pre></td></tr>
5111 1.1.1.2 joerg
5112 1.1.1.2 joerg
5113 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
5114 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5115 1.1 joerg
5116 1.1 joerg Example matches A, va, fa
5117 1.1 joerg class A {};
5118 1.1 joerg class B; // Doesn't match, as it has no body.
5119 1.1 joerg int va;
5120 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
5121 1.1 joerg void fa() {}
5122 1.1 joerg void fb(); // Doesn't match, as it has no body.
5123 1.1 joerg @interface X
5124 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
5125 1.1 joerg @end
5126 1.1 joerg @implementation X
5127 1.1 joerg - (void)ma {}
5128 1.1 joerg @end
5129 1.1 joerg
5130 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
5131 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
5132 1.1 joerg </pre></td></tr>
5133 1.1 joerg
5134 1.1 joerg
5135 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr>
5136 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5137 1.1.1.2 joerg
5138 1.1.1.2 joerg Example matches E, but not C, S or U.
5139 1.1.1.2 joerg struct S {};
5140 1.1.1.2 joerg class C {};
5141 1.1.1.2 joerg union U {};
5142 1.1.1.2 joerg enum E {};
5143 1.1.1.2 joerg </pre></td></tr>
5144 1.1.1.2 joerg
5145 1.1.1.2 joerg
5146 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
5147 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5148 1.1.1.2 joerg
5149 1.1.1.2 joerg Example matches S, but not C, U or E.
5150 1.1.1.2 joerg struct S {};
5151 1.1.1.2 joerg class C {};
5152 1.1.1.2 joerg union U {};
5153 1.1.1.2 joerg enum E {};
5154 1.1.1.2 joerg </pre></td></tr>
5155 1.1.1.2 joerg
5156 1.1.1.2 joerg
5157 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
5158 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5159 1.1.1.2 joerg
5160 1.1.1.2 joerg Example matches U, but not C, S or E.
5161 1.1.1.2 joerg struct S {};
5162 1.1.1.2 joerg class C {};
5163 1.1.1.2 joerg union U {};
5164 1.1.1.2 joerg enum E {};
5165 1.1.1.2 joerg </pre></td></tr>
5166 1.1.1.2 joerg
5167 1.1.1.2 joerg
5168 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
5169 1.1 joerg <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5170 1.1 joerg
5171 1.1 joerg Note that 'Value' is a string as the template argument's value is
5172 1.1 joerg an arbitrary precision integer. 'Value' must be euqal to the canonical
5173 1.1 joerg representation of that integral value in base 10.
5174 1.1 joerg
5175 1.1 joerg Given
5176 1.1 joerg template<int T> struct C {};
5177 1.1 joerg C<42> c;
5178 1.1 joerg classTemplateSpecializationDecl(
5179 1.1 joerg hasAnyTemplateArgument(equalsIntegralValue("42")))
5180 1.1 joerg matches the implicit instantiation of C in C<42>.
5181 1.1 joerg </pre></td></tr>
5182 1.1 joerg
5183 1.1 joerg
5184 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
5185 1.1 joerg <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5186 1.1 joerg
5187 1.1 joerg Given
5188 1.1 joerg template<int T> struct C {};
5189 1.1 joerg C<42> c;
5190 1.1 joerg classTemplateSpecializationDecl(
5191 1.1 joerg hasAnyTemplateArgument(isIntegral()))
5192 1.1 joerg matches the implicit instantiation of C in C<42>
5193 1.1 joerg with isIntegral() matching 42.
5194 1.1 joerg </pre></td></tr>
5195 1.1 joerg
5196 1.1 joerg
5197 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
5198 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5199 1.1 joerg
5200 1.1 joerg Given
5201 1.1 joerg template<typename T> struct C {};
5202 1.1 joerg C<int> c;
5203 1.1 joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
5204 1.1 joerg matches C<int>.
5205 1.1 joerg </pre></td></tr>
5206 1.1 joerg
5207 1.1 joerg
5208 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5209 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5210 1.1.1.2 joerg Does not match if only part of the statement is expanded from that macro or
5211 1.1.1.2 joerg if different parts of the the statement are expanded from different
5212 1.1.1.2 joerg appearances of the macro.
5213 1.1.1.2 joerg </pre></td></tr>
5214 1.1.1.2 joerg
5215 1.1.1.2 joerg
5216 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5217 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5218 1.1 joerg partially matching a given regex.
5219 1.1 joerg
5220 1.1 joerg Example matches Y but not X
5221 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5222 1.1 joerg #include "ASTMatcher.h"
5223 1.1 joerg class X {};
5224 1.1 joerg ASTMatcher.h:
5225 1.1 joerg class Y {};
5226 1.1 joerg
5227 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
5228 1.1.1.2 joerg
5229 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter
5230 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags".
5231 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5232 1.1 joerg </pre></td></tr>
5233 1.1 joerg
5234 1.1 joerg
5235 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
5236 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5237 1.1 joerg
5238 1.1 joerg Example matches X but not Y
5239 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile())
5240 1.1 joerg #include <Y.h>
5241 1.1 joerg class X {};
5242 1.1 joerg Y.h:
5243 1.1 joerg class Y {};
5244 1.1 joerg
5245 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
5246 1.1 joerg </pre></td></tr>
5247 1.1 joerg
5248 1.1 joerg
5249 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5250 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5251 1.1 joerg
5252 1.1 joerg Example matches Y but not X
5253 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5254 1.1 joerg #include <SystemHeader.h>
5255 1.1 joerg class X {};
5256 1.1 joerg SystemHeader.h:
5257 1.1 joerg class Y {};
5258 1.1 joerg
5259 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
5260 1.1 joerg </pre></td></tr>
5261 1.1 joerg
5262 1.1 joerg
5263 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
5264 1.1 joerg <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5265 1.1 joerg
5266 1.1 joerg Given
5267 1.1 joerg struct S { bool func(); };
5268 1.1 joerg functionDecl(returns(booleanType()))
5269 1.1 joerg matches "bool func();"
5270 1.1 joerg </pre></td></tr>
5271 1.1 joerg
5272 1.1 joerg
5273 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
5274 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5275 1.1 joerg
5276 1.1 joerg Matches a node if it equals the node previously bound to ID.
5277 1.1 joerg
5278 1.1 joerg Given
5279 1.1 joerg class X { int a; int b; };
5280 1.1 joerg cxxRecordDecl(
5281 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5282 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5283 1.1 joerg matches the class X, as a and b have the same type.
5284 1.1 joerg
5285 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
5286 1.1 joerg equalsBoundNodes acts as a filter.
5287 1.1 joerg For example:
5288 1.1 joerg compoundStmt(
5289 1.1 joerg forEachDescendant(varDecl().bind("d")),
5290 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5291 1.1 joerg will trigger a match for each combination of variable declaration
5292 1.1 joerg and reference to that variable declaration within a compound statement.
5293 1.1 joerg </pre></td></tr>
5294 1.1 joerg
5295 1.1 joerg
5296 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
5297 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5298 1.1 joerg
5299 1.1 joerg Type has pointer identity in the AST.
5300 1.1 joerg </pre></td></tr>
5301 1.1 joerg
5302 1.1 joerg
5303 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
5304 1.1 joerg <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5305 1.1 joerg
5306 1.1 joerg Given
5307 1.1 joerg int i;
5308 1.1 joerg float f;
5309 1.1 joerg realFloatingPointType()
5310 1.1 joerg matches "float f" but not "int i"
5311 1.1 joerg </pre></td></tr>
5312 1.1 joerg
5313 1.1 joerg
5314 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
5315 1.1 joerg <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5316 1.1 joerg
5317 1.1 joerg Given
5318 1.1 joerg struct S { void func(); };
5319 1.1 joerg functionDecl(returns(voidType()))
5320 1.1 joerg matches "void func();"
5321 1.1 joerg </pre></td></tr>
5322 1.1 joerg
5323 1.1 joerg
5324 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
5325 1.1 joerg <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5326 1.1 joerg
5327 1.1 joerg Given
5328 1.1 joerg int x;
5329 1.1 joerg int s = sizeof(x) + alignof(x)
5330 1.1 joerg unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5331 1.1 joerg matches sizeof(x)
5332 1.1 joerg
5333 1.1 joerg If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5334 1.1 joerg should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5335 1.1 joerg </pre></td></tr>
5336 1.1 joerg
5337 1.1 joerg
5338 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
5339 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5340 1.1.1.2 joerg specified names.
5341 1.1.1.2 joerg
5342 1.1.1.2 joerg hasAnyOperatorName("+", "-")
5343 1.1.1.2 joerg Is equivalent to
5344 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-"))
5345 1.1.1.2 joerg </pre></td></tr>
5346 1.1.1.2 joerg
5347 1.1.1.2 joerg
5348 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
5349 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5350 1.1 joerg unary).
5351 1.1 joerg
5352 1.1 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5353 1.1 joerg !(a || b)
5354 1.1 joerg </pre></td></tr>
5355 1.1 joerg
5356 1.1 joerg
5357 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
5358 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed
5359 1.1 joerg to '.'.
5360 1.1 joerg
5361 1.1 joerg Member calls on the implicit this pointer match as called with '->'.
5362 1.1 joerg
5363 1.1 joerg Given
5364 1.1 joerg class Y {
5365 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
5366 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); }
5367 1.1 joerg int a;
5368 1.1 joerg static int b;
5369 1.1 joerg };
5370 1.1 joerg template <class T>
5371 1.1 joerg class Z {
5372 1.1 joerg void x() { this->m; }
5373 1.1 joerg };
5374 1.1 joerg memberExpr(isArrow())
5375 1.1 joerg matches this->x, x, y.x, a, this->b
5376 1.1 joerg cxxDependentScopeMemberExpr(isArrow())
5377 1.1 joerg matches this->m
5378 1.1 joerg unresolvedMemberExpr(isArrow())
5379 1.1 joerg matches this->f<T>, f<T>
5380 1.1 joerg </pre></td></tr>
5381 1.1 joerg
5382 1.1 joerg
5383 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
5384 1.1 joerg <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5385 1.1 joerg
5386 1.1 joerg Example matches x, but not y, z, or a.
5387 1.1 joerg (matcher = varDecl(hasAutomaticStorageDuration())
5388 1.1 joerg void f() {
5389 1.1 joerg int x;
5390 1.1 joerg static int y;
5391 1.1 joerg thread_local int z;
5392 1.1 joerg }
5393 1.1 joerg int a;
5394 1.1 joerg </pre></td></tr>
5395 1.1 joerg
5396 1.1 joerg
5397 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
5398 1.1 joerg <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5399 1.1 joerg
5400 1.1 joerg Example matches y and z (matcher = varDecl(hasGlobalStorage())
5401 1.1 joerg void f() {
5402 1.1 joerg int x;
5403 1.1 joerg static int y;
5404 1.1 joerg }
5405 1.1 joerg int z;
5406 1.1 joerg </pre></td></tr>
5407 1.1 joerg
5408 1.1 joerg
5409 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
5410 1.1 joerg <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5411 1.1 joerg non-static local variable.
5412 1.1 joerg
5413 1.1 joerg Example matches x (matcher = varDecl(hasLocalStorage())
5414 1.1 joerg void f() {
5415 1.1 joerg int x;
5416 1.1 joerg static int y;
5417 1.1 joerg }
5418 1.1 joerg int z;
5419 1.1 joerg </pre></td></tr>
5420 1.1 joerg
5421 1.1 joerg
5422 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
5423 1.1 joerg <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5424 1.1 joerg It includes the variable declared at namespace scope and those declared
5425 1.1 joerg with "static" and "extern" storage class specifiers.
5426 1.1 joerg
5427 1.1 joerg void f() {
5428 1.1 joerg int x;
5429 1.1 joerg static int y;
5430 1.1 joerg thread_local int z;
5431 1.1 joerg }
5432 1.1 joerg int a;
5433 1.1 joerg static int b;
5434 1.1 joerg extern int c;
5435 1.1 joerg varDecl(hasStaticStorageDuration())
5436 1.1 joerg matches the function declaration y, a, b and c.
5437 1.1 joerg </pre></td></tr>
5438 1.1 joerg
5439 1.1 joerg
5440 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
5441 1.1 joerg <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5442 1.1 joerg
5443 1.1 joerg Example matches z, but not x, z, or a.
5444 1.1 joerg (matcher = varDecl(hasThreadStorageDuration())
5445 1.1 joerg void f() {
5446 1.1 joerg int x;
5447 1.1 joerg static int y;
5448 1.1 joerg thread_local int z;
5449 1.1 joerg }
5450 1.1 joerg int a;
5451 1.1 joerg </pre></td></tr>
5452 1.1 joerg
5453 1.1 joerg
5454 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
5455 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5456 1.1 joerg and if constexpr.
5457 1.1 joerg
5458 1.1 joerg Given:
5459 1.1 joerg constexpr int foo = 42;
5460 1.1 joerg constexpr int bar();
5461 1.1 joerg void baz() { if constexpr(1 > 0) {} }
5462 1.1 joerg varDecl(isConstexpr())
5463 1.1 joerg matches the declaration of foo.
5464 1.1 joerg functionDecl(isConstexpr())
5465 1.1 joerg matches the declaration of bar.
5466 1.1 joerg ifStmt(isConstexpr())
5467 1.1 joerg matches the if statement in baz.
5468 1.1 joerg </pre></td></tr>
5469 1.1 joerg
5470 1.1 joerg
5471 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
5472 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5473 1.1 joerg
5474 1.1 joerg Example matches A, va, fa
5475 1.1 joerg class A {};
5476 1.1 joerg class B; // Doesn't match, as it has no body.
5477 1.1 joerg int va;
5478 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
5479 1.1 joerg void fa() {}
5480 1.1 joerg void fb(); // Doesn't match, as it has no body.
5481 1.1 joerg @interface X
5482 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
5483 1.1 joerg @end
5484 1.1 joerg @implementation X
5485 1.1 joerg - (void)ma {}
5486 1.1 joerg @end
5487 1.1 joerg
5488 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
5489 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
5490 1.1 joerg </pre></td></tr>
5491 1.1 joerg
5492 1.1 joerg
5493 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
5494 1.1 joerg <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5495 1.1 joerg a C++ catch block, or an Objective-C statement.
5496 1.1 joerg
5497 1.1 joerg Example matches x (matcher = varDecl(isExceptionVariable())
5498 1.1 joerg void f(int y) {
5499 1.1 joerg try {
5500 1.1 joerg } catch (int x) {
5501 1.1 joerg }
5502 1.1 joerg }
5503 1.1 joerg </pre></td></tr>
5504 1.1 joerg
5505 1.1 joerg
5506 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
5507 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5508 1.1 joerg static member variable template instantiations.
5509 1.1 joerg
5510 1.1 joerg Given
5511 1.1 joerg template<typename T> void A(T t) { }
5512 1.1 joerg template<> void A(int N) { }
5513 1.1 joerg functionDecl(isExplicitTemplateSpecialization())
5514 1.1 joerg matches the specialization A<int>().
5515 1.1 joerg
5516 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
5517 1.1 joerg </pre></td></tr>
5518 1.1 joerg
5519 1.1 joerg
5520 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
5521 1.1 joerg <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5522 1.1 joerg
5523 1.1 joerg Given:
5524 1.1 joerg extern "C" void f() {}
5525 1.1 joerg extern "C" { void g() {} }
5526 1.1 joerg void h() {}
5527 1.1 joerg extern "C" int x = 1;
5528 1.1 joerg extern "C" int y = 2;
5529 1.1 joerg int z = 3;
5530 1.1 joerg functionDecl(isExternC())
5531 1.1 joerg matches the declaration of f and g, but not the declaration of h.
5532 1.1 joerg varDecl(isExternC())
5533 1.1 joerg matches the declaration of x and y, but not the declaration of z.
5534 1.1 joerg </pre></td></tr>
5535 1.1 joerg
5536 1.1 joerg
5537 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
5538 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5539 1.1 joerg
5540 1.1 joerg Example matches y (matcher = varDecl(isStaticLocal()))
5541 1.1 joerg void f() {
5542 1.1 joerg int x;
5543 1.1 joerg static int y;
5544 1.1 joerg }
5545 1.1 joerg static int z;
5546 1.1 joerg </pre></td></tr>
5547 1.1 joerg
5548 1.1 joerg
5549 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
5550 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5551 1.1 joerg class specifier ("static" keyword) written in the source.
5552 1.1 joerg
5553 1.1 joerg Given:
5554 1.1 joerg static void f() {}
5555 1.1 joerg static int i = 0;
5556 1.1 joerg extern int j;
5557 1.1 joerg int k;
5558 1.1 joerg functionDecl(isStaticStorageClass())
5559 1.1 joerg matches the function declaration f.
5560 1.1 joerg varDecl(isStaticStorageClass())
5561 1.1 joerg matches the variable declaration i.
5562 1.1 joerg </pre></td></tr>
5563 1.1 joerg
5564 1.1 joerg
5565 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
5566 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5567 1.1 joerg member variable template instantiations.
5568 1.1 joerg
5569 1.1 joerg Given
5570 1.1 joerg template <typename T> class X {}; class A {}; X<A> x;
5571 1.1 joerg or
5572 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>;
5573 1.1 joerg or
5574 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>;
5575 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5576 1.1 joerg matches the template instantiation of X<A>.
5577 1.1 joerg
5578 1.1 joerg But given
5579 1.1 joerg template <typename T> class X {}; class A {};
5580 1.1 joerg template <> class X<A> {}; X<A> x;
5581 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5582 1.1 joerg does not match, as X<A> is an explicit template specialization.
5583 1.1 joerg
5584 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
5585 1.1 joerg </pre></td></tr>
5586 1.1 joerg
5587 1.1 joerg <!--END_NARROWING_MATCHERS -->
5588 1.1 joerg </table>
5589 1.1 joerg
5590 1.1 joerg <!-- ======================================================================= -->
5591 1.1 joerg <h2 id="traversal-matchers">AST Traversal Matchers</h2>
5592 1.1 joerg <!-- ======================================================================= -->
5593 1.1 joerg
5594 1.1 joerg <p>Traversal matchers specify the relationship to other nodes that are
5595 1.1 joerg reachable from the current node.</p>
5596 1.1 joerg
5597 1.1 joerg <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5598 1.1 joerg forEachDescendant) which work on all nodes and allow users to write more generic
5599 1.1 joerg match expressions.</p>
5600 1.1 joerg
5601 1.1 joerg <table>
5602 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5603 1.1 joerg <!-- START_TRAVERSAL_MATCHERS -->
5604 1.1 joerg
5605 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr>
5606 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5607 1.1.1.2 joerg
5608 1.1.1.2 joerg The code
5609 1.1.1.2 joerg var1 != var2;
5610 1.1.1.2 joerg might be represented in the clang AST as a binaryOperator, a
5611 1.1.1.2 joerg cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5612 1.1.1.2 joerg
5613 1.1.1.2 joerg * whether the types of var1 and var2 are fundamental (binaryOperator) or at
5614 1.1.1.2 joerg least one is a class type (cxxOperatorCallExpr)
5615 1.1.1.2 joerg * whether the code appears in a template declaration, if at least one of the
5616 1.1.1.2 joerg vars is a dependent-type (binaryOperator)
5617 1.1.1.2 joerg * whether the code relies on a rewritten binary operator, such as a
5618 1.1.1.2 joerg spaceship operator or an inverted equality operator
5619 1.1.1.2 joerg (cxxRewrittenBinaryOperator)
5620 1.1.1.2 joerg
5621 1.1.1.2 joerg This matcher elides details in places where the matchers for the nodes are
5622 1.1.1.2 joerg compatible.
5623 1.1.1.2 joerg
5624 1.1.1.2 joerg Given
5625 1.1.1.2 joerg binaryOperation(
5626 1.1.1.2 joerg hasOperatorName("!="),
5627 1.1.1.2 joerg hasLHS(expr().bind("lhs")),
5628 1.1.1.2 joerg hasRHS(expr().bind("rhs"))
5629 1.1.1.2 joerg )
5630 1.1.1.2 joerg matches each use of "!=" in:
5631 1.1.1.2 joerg struct S{
5632 1.1.1.2 joerg bool operator!=(const S&) const;
5633 1.1.1.2 joerg };
5634 1.1.1.2 joerg
5635 1.1.1.2 joerg void foo()
5636 1.1.1.2 joerg {
5637 1.1.1.2 joerg 1 != 2;
5638 1.1.1.2 joerg S() != S();
5639 1.1.1.2 joerg }
5640 1.1.1.2 joerg
5641 1.1.1.2 joerg template<typename T>
5642 1.1.1.2 joerg void templ()
5643 1.1.1.2 joerg {
5644 1.1.1.2 joerg 1 != 2;
5645 1.1.1.2 joerg T() != S();
5646 1.1.1.2 joerg }
5647 1.1.1.2 joerg struct HasOpEq
5648 1.1.1.2 joerg {
5649 1.1.1.2 joerg bool operator==(const HasOpEq &) const;
5650 1.1.1.2 joerg };
5651 1.1.1.2 joerg
5652 1.1.1.2 joerg void inverse()
5653 1.1.1.2 joerg {
5654 1.1.1.2 joerg HasOpEq s1;
5655 1.1.1.2 joerg HasOpEq s2;
5656 1.1.1.2 joerg if (s1 != s2)
5657 1.1.1.2 joerg return;
5658 1.1.1.2 joerg }
5659 1.1.1.2 joerg
5660 1.1.1.2 joerg struct HasSpaceship
5661 1.1.1.2 joerg {
5662 1.1.1.2 joerg bool operator<=>(const HasOpEq &) const;
5663 1.1.1.2 joerg };
5664 1.1.1.2 joerg
5665 1.1.1.2 joerg void use_spaceship()
5666 1.1.1.2 joerg {
5667 1.1.1.2 joerg HasSpaceship s1;
5668 1.1.1.2 joerg HasSpaceship s2;
5669 1.1.1.2 joerg if (s1 != s2)
5670 1.1.1.2 joerg return;
5671 1.1.1.2 joerg }
5672 1.1.1.2 joerg </pre></td></tr>
5673 1.1.1.2 joerg
5674 1.1.1.2 joerg
5675 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
5676 1.1 joerg <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5677 1.1 joerg
5678 1.1 joerg Unlike anyOf, eachOf will generate a match result for each
5679 1.1 joerg matching submatcher.
5680 1.1 joerg
5681 1.1 joerg For example, in:
5682 1.1 joerg class A { int a; int b; };
5683 1.1 joerg The matcher:
5684 1.1 joerg cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5685 1.1 joerg has(fieldDecl(hasName("b")).bind("v"))))
5686 1.1 joerg will generate two results binding "v", the first of which binds
5687 1.1 joerg the field declaration of a, the second the field declaration of
5688 1.1 joerg b.
5689 1.1 joerg
5690 1.1 joerg Usable as: Any Matcher
5691 1.1 joerg </pre></td></tr>
5692 1.1 joerg
5693 1.1 joerg
5694 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr>
5695 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5696 1.1.1.2 joerg
5697 1.1.1.2 joerg Generates results for each match.
5698 1.1.1.2 joerg
5699 1.1.1.2 joerg For example, in:
5700 1.1.1.2 joerg class A { class B {}; class C {}; };
5701 1.1.1.2 joerg The matcher:
5702 1.1.1.2 joerg cxxRecordDecl(hasName("::A"),
5703 1.1.1.2 joerg findAll(cxxRecordDecl(isDefinition()).bind("m")))
5704 1.1.1.2 joerg will generate results for A, B and C.
5705 1.1.1.2 joerg
5706 1.1.1.2 joerg Usable as: Any Matcher
5707 1.1.1.2 joerg </pre></td></tr>
5708 1.1.1.2 joerg
5709 1.1.1.2 joerg
5710 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr>
5711 1.1 joerg <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5712 1.1 joerg provided matcher.
5713 1.1 joerg
5714 1.1 joerg Example matches X, A, A::X, B, B::C, B::C::X
5715 1.1 joerg (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5716 1.1 joerg class X {};
5717 1.1 joerg class A { class X {}; }; // Matches A, because A::X is a class of name
5718 1.1 joerg // X inside A.
5719 1.1 joerg class B { class C { class X {}; }; };
5720 1.1 joerg
5721 1.1 joerg DescendantT must be an AST base type.
5722 1.1 joerg
5723 1.1 joerg As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5724 1.1 joerg each result that matches instead of only on the first one.
5725 1.1 joerg
5726 1.1 joerg Note: Recursively combined ForEachDescendant can cause many matches:
5727 1.1 joerg cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5728 1.1 joerg forEachDescendant(cxxRecordDecl())
5729 1.1 joerg )))
5730 1.1 joerg will match 10 times (plus injected class name matches) on:
5731 1.1 joerg class A { class B { class C { class D { class E {}; }; }; }; };
5732 1.1 joerg
5733 1.1 joerg Usable as: Any Matcher
5734 1.1 joerg </pre></td></tr>
5735 1.1 joerg
5736 1.1 joerg
5737 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr>
5738 1.1 joerg <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5739 1.1 joerg provided matcher.
5740 1.1 joerg
5741 1.1 joerg Example matches X, Y, Y::X, Z::Y, Z::Y::X
5742 1.1 joerg (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5743 1.1 joerg class X {};
5744 1.1 joerg class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
5745 1.1 joerg // inside Y.
5746 1.1 joerg class Z { class Y { class X {}; }; }; // Does not match Z.
5747 1.1 joerg
5748 1.1 joerg ChildT must be an AST base type.
5749 1.1 joerg
5750 1.1 joerg As opposed to 'has', 'forEach' will cause a match for each result that
5751 1.1 joerg matches instead of only on the first one.
5752 1.1 joerg
5753 1.1 joerg Usable as: Any Matcher
5754 1.1 joerg </pre></td></tr>
5755 1.1 joerg
5756 1.1 joerg
5757 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr>
5758 1.1 joerg <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5759 1.1 joerg matcher.
5760 1.1 joerg
5761 1.1 joerg Given
5762 1.1 joerg void f() { if (true) { int x = 42; } }
5763 1.1 joerg void g() { for (;;) { int x = 43; } }
5764 1.1 joerg expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5765 1.1 joerg
5766 1.1 joerg Usable as: Any Matcher
5767 1.1 joerg </pre></td></tr>
5768 1.1 joerg
5769 1.1 joerg
5770 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr>
5771 1.1 joerg <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5772 1.1 joerg provided matcher.
5773 1.1 joerg
5774 1.1 joerg Example matches X, Y, Z
5775 1.1 joerg (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5776 1.1 joerg class X {}; // Matches X, because X::X is a class of name X inside X.
5777 1.1 joerg class Y { class X {}; };
5778 1.1 joerg class Z { class Y { class X {}; }; };
5779 1.1 joerg
5780 1.1 joerg DescendantT must be an AST base type.
5781 1.1 joerg
5782 1.1 joerg Usable as: Any Matcher
5783 1.1 joerg </pre></td></tr>
5784 1.1 joerg
5785 1.1 joerg
5786 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr>
5787 1.1 joerg <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5788 1.1 joerg provided matcher.
5789 1.1 joerg
5790 1.1 joerg Example matches X, Y
5791 1.1 joerg (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5792 1.1 joerg class X {}; // Matches X, because X::X is a class of name X inside X.
5793 1.1 joerg class Y { class X {}; };
5794 1.1 joerg class Z { class Y { class X {}; }; }; // Does not match Z.
5795 1.1 joerg
5796 1.1 joerg ChildT must be an AST base type.
5797 1.1 joerg
5798 1.1 joerg Usable as: Any Matcher
5799 1.1 joerg Note that has is direct matcher, so it also matches things like implicit
5800 1.1 joerg casts and paren casts. If you are matching with expr then you should
5801 1.1 joerg probably consider using ignoringParenImpCasts like:
5802 1.1 joerg has(ignoringParenImpCasts(expr())).
5803 1.1 joerg </pre></td></tr>
5804 1.1 joerg
5805 1.1 joerg
5806 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr>
5807 1.1 joerg <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5808 1.1 joerg matcher.
5809 1.1 joerg
5810 1.1 joerg Given
5811 1.1 joerg void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5812 1.1 joerg compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5813 1.1 joerg
5814 1.1 joerg Usable as: Any Matcher
5815 1.1 joerg </pre></td></tr>
5816 1.1 joerg
5817 1.1 joerg
5818 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr>
5819 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5820 1.1.1.2 joerg
5821 1.1.1.2 joerg Because CallExpr and CXXConstructExpr do not share a common
5822 1.1.1.2 joerg base class with API accessing arguments etc, AST Matchers for code
5823 1.1.1.2 joerg which should match both are typically duplicated. This matcher
5824 1.1.1.2 joerg removes the need for duplication.
5825 1.1.1.2 joerg
5826 1.1.1.2 joerg Given code
5827 1.1.1.2 joerg struct ConstructorTakesInt
5828 1.1.1.2 joerg {
5829 1.1.1.2 joerg ConstructorTakesInt(int i) {}
5830 1.1.1.2 joerg };
5831 1.1.1.2 joerg
5832 1.1.1.2 joerg void callTakesInt(int i)
5833 1.1.1.2 joerg {
5834 1.1.1.2 joerg }
5835 1.1.1.2 joerg
5836 1.1.1.2 joerg void doCall()
5837 1.1.1.2 joerg {
5838 1.1.1.2 joerg callTakesInt(42);
5839 1.1.1.2 joerg }
5840 1.1.1.2 joerg
5841 1.1.1.2 joerg void doConstruct()
5842 1.1.1.2 joerg {
5843 1.1.1.2 joerg ConstructorTakesInt cti(42);
5844 1.1.1.2 joerg }
5845 1.1.1.2 joerg
5846 1.1.1.2 joerg The matcher
5847 1.1.1.2 joerg invocation(hasArgument(0, integerLiteral(equals(42))))
5848 1.1.1.2 joerg matches the expression in both doCall and doConstruct
5849 1.1.1.2 joerg </pre></td></tr>
5850 1.1.1.2 joerg
5851 1.1.1.2 joerg
5852 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr>
5853 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5854 1.1.1.2 joerg
5855 1.1.1.2 joerg However, optionally will retain any bindings generated by the submatcher.
5856 1.1.1.2 joerg Useful when additional information which may or may not present about a main
5857 1.1.1.2 joerg matching node is desired.
5858 1.1.1.2 joerg
5859 1.1.1.2 joerg For example, in:
5860 1.1.1.2 joerg class Foo {
5861 1.1.1.2 joerg int bar;
5862 1.1.1.2 joerg }
5863 1.1.1.2 joerg The matcher:
5864 1.1.1.2 joerg cxxRecordDecl(
5865 1.1.1.2 joerg optionally(has(
5866 1.1.1.2 joerg fieldDecl(hasName("bar")).bind("var")
5867 1.1.1.2 joerg ))).bind("record")
5868 1.1.1.2 joerg will produce a result binding for both "record" and "var".
5869 1.1.1.2 joerg The matcher will produce a "record" binding for even if there is no data
5870 1.1.1.2 joerg member named "bar" in that class.
5871 1.1.1.2 joerg
5872 1.1.1.2 joerg Usable as: Any Matcher
5873 1.1.1.2 joerg </pre></td></tr>
5874 1.1.1.2 joerg
5875 1.1.1.2 joerg
5876 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr>
5877 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5878 1.1.1.2 joerg
5879 1.1.1.2 joerg Given
5880 1.1.1.2 joerg void foo()
5881 1.1.1.2 joerg {
5882 1.1.1.2 joerg int i = 3.0;
5883 1.1.1.2 joerg }
5884 1.1.1.2 joerg The matcher
5885 1.1.1.2 joerg traverse(TK_IgnoreUnlessSpelledInSource,
5886 1.1.1.2 joerg varDecl(hasInitializer(floatLiteral().bind("init")))
5887 1.1.1.2 joerg )
5888 1.1.1.2 joerg matches the variable declaration with "init" bound to the "3.0".
5889 1.1.1.2 joerg </pre></td></tr>
5890 1.1.1.2 joerg
5891 1.1.1.2 joerg
5892 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5893 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5894 1.1 joerg switch statement or conditional operator.
5895 1.1 joerg
5896 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5897 1.1 joerg if (true) {}
5898 1.1 joerg </pre></td></tr>
5899 1.1 joerg
5900 1.1 joerg
5901 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5902 1.1 joerg <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5903 1.1 joerg (binary or ternary).
5904 1.1 joerg
5905 1.1 joerg Example matches b
5906 1.1 joerg condition ? a : b
5907 1.1 joerg condition ?: b
5908 1.1 joerg </pre></td></tr>
5909 1.1 joerg
5910 1.1 joerg
5911 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5912 1.1 joerg <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5913 1.1 joerg
5914 1.1 joerg Example 1 (conditional ternary operator): matches a
5915 1.1 joerg condition ? a : b
5916 1.1 joerg
5917 1.1 joerg Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5918 1.1 joerg condition ?: b
5919 1.1 joerg </pre></td></tr>
5920 1.1 joerg
5921 1.1 joerg
5922 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5923 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5924 1.1 joerg matches the given matcher.
5925 1.1 joerg
5926 1.1 joerg The associated declaration is:
5927 1.1 joerg - for type nodes, the declaration of the underlying type
5928 1.1 joerg - for CallExpr, the declaration of the callee
5929 1.1 joerg - for MemberExpr, the declaration of the referenced member
5930 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
5931 1.1 joerg - for CXXNewExpr, the declaration of the operator new
5932 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
5933 1.1 joerg
5934 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
5935 1.1 joerg sugared type. Given
5936 1.1 joerg class X {};
5937 1.1 joerg typedef X Y;
5938 1.1 joerg Y y;
5939 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5940 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
5941 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5942 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
5943 1.1 joerg recordType(hasDeclaration(decl())))))
5944 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
5945 1.1 joerg
5946 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
5947 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
5948 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
5949 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
5950 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
5951 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
5952 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
5953 1.1 joerg </pre></td></tr>
5954 1.1 joerg
5955 1.1 joerg
5956 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5957 1.1 joerg <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5958 1.1 joerg
5959 1.1 joerg Given
5960 1.1 joerg int i[5];
5961 1.1 joerg void f() { i[1] = 42; }
5962 1.1 joerg arraySubscriptExpression(hasBase(implicitCastExpr(
5963 1.1 joerg hasSourceExpression(declRefExpr()))))
5964 1.1 joerg matches i[1] with the declRefExpr() matching i
5965 1.1 joerg </pre></td></tr>
5966 1.1 joerg
5967 1.1 joerg
5968 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5969 1.1 joerg <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5970 1.1 joerg
5971 1.1 joerg Given
5972 1.1 joerg int i[5];
5973 1.1 joerg void f() { i[1] = 42; }
5974 1.1 joerg arraySubscriptExpression(hasIndex(integerLiteral()))
5975 1.1 joerg matches i[1] with the integerLiteral() matching 1
5976 1.1 joerg </pre></td></tr>
5977 1.1 joerg
5978 1.1 joerg
5979 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5980 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
5981 1.1 joerg
5982 1.1 joerg Example matches a (matcher = binaryOperator(hasLHS()))
5983 1.1 joerg a || b
5984 1.1 joerg </pre></td></tr>
5985 1.1 joerg
5986 1.1 joerg
5987 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5988 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
5989 1.1 joerg
5990 1.1 joerg Example matches b (matcher = binaryOperator(hasRHS()))
5991 1.1 joerg a || b
5992 1.1 joerg </pre></td></tr>
5993 1.1 joerg
5994 1.1 joerg
5995 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>></td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
5996 1.1 joerg <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5997 1.1 joerg type.
5998 1.1 joerg
5999 1.1 joerg Given
6000 1.1 joerg struct A {};
6001 1.1 joerg A a[7];
6002 1.1 joerg int b[7];
6003 1.1 joerg arrayType(hasElementType(builtinType()))
6004 1.1 joerg matches "int b[7]"
6005 1.1 joerg
6006 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>
6007 1.1 joerg </pre></td></tr>
6008 1.1 joerg
6009 1.1 joerg
6010 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>></td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6011 1.1 joerg <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6012 1.1 joerg
6013 1.1 joerg Given
6014 1.1 joerg _Atomic(int) i;
6015 1.1 joerg _Atomic(float) f;
6016 1.1 joerg atomicType(hasValueType(isInteger()))
6017 1.1 joerg matches "_Atomic(int) i"
6018 1.1 joerg
6019 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>
6020 1.1 joerg </pre></td></tr>
6021 1.1 joerg
6022 1.1 joerg
6023 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>></td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6024 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6025 1.1 joerg
6026 1.1 joerg Note: There is no TypeLoc for the deduced type and thus no
6027 1.1 joerg getDeducedLoc() matcher.
6028 1.1 joerg
6029 1.1 joerg Given
6030 1.1 joerg auto a = 1;
6031 1.1 joerg auto b = 2.0;
6032 1.1 joerg autoType(hasDeducedType(isInteger()))
6033 1.1 joerg matches "auto a"
6034 1.1 joerg
6035 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>
6036 1.1 joerg </pre></td></tr>
6037 1.1 joerg
6038 1.1 joerg
6039 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6040 1.1 joerg <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6041 1.1 joerg binary operator matches.
6042 1.1 joerg </pre></td></tr>
6043 1.1 joerg
6044 1.1 joerg
6045 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6046 1.1 joerg <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6047 1.1 joerg
6048 1.1 joerg Example matches a (matcher = binaryOperator(hasLHS()))
6049 1.1 joerg a || b
6050 1.1 joerg </pre></td></tr>
6051 1.1 joerg
6052 1.1 joerg
6053 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr>
6054 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6055 1.1.1.2 joerg
6056 1.1.1.2 joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6057 1.1.1.2 joerg integerLiteral(equals(2)))
6058 1.1.1.2 joerg 1 + 2 // Match
6059 1.1.1.2 joerg 2 + 1 // Match
6060 1.1.1.2 joerg 1 + 1 // No match
6061 1.1.1.2 joerg 2 + 2 // No match
6062 1.1.1.2 joerg </pre></td></tr>
6063 1.1.1.2 joerg
6064 1.1.1.2 joerg
6065 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6066 1.1 joerg <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6067 1.1 joerg
6068 1.1 joerg Example matches b (matcher = binaryOperator(hasRHS()))
6069 1.1 joerg a || b
6070 1.1 joerg </pre></td></tr>
6071 1.1 joerg
6072 1.1 joerg
6073 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>></td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr>
6074 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6075 1.1.1.2 joerg
6076 1.1.1.2 joerg For example, in:
6077 1.1.1.2 joerg void foo()
6078 1.1.1.2 joerg {
6079 1.1.1.2 joerg int arr[3];
6080 1.1.1.2 joerg auto &[f, s, t] = arr;
6081 1.1.1.2 joerg
6082 1.1.1.2 joerg f = 42;
6083 1.1.1.2 joerg }
6084 1.1.1.2 joerg The matcher:
6085 1.1.1.2 joerg bindingDecl(hasName("f"),
6086 1.1.1.2 joerg forDecomposition(decompositionDecl())
6087 1.1.1.2 joerg matches 'f' in 'auto &[f, s, t]'.
6088 1.1.1.2 joerg </pre></td></tr>
6089 1.1.1.2 joerg
6090 1.1.1.2 joerg
6091 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
6092 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6093 1.1 joerg block.
6094 1.1 joerg
6095 1.1 joerg Does not match the 'this' parameter of a method.
6096 1.1 joerg
6097 1.1 joerg Given
6098 1.1 joerg class X { void f(int x, int y, int z) {} };
6099 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
6100 1.1 joerg matches f(int x, int y, int z) {}
6101 1.1 joerg with hasAnyParameter(...)
6102 1.1 joerg matching int y
6103 1.1 joerg
6104 1.1 joerg For ObjectiveC, given
6105 1.1 joerg @interface I - (void) f:(int) y; @end
6106 1.1 joerg
6107 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6108 1.1 joerg matches the declaration of method f with hasParameter
6109 1.1 joerg matching y.
6110 1.1 joerg
6111 1.1 joerg For blocks, given
6112 1.1 joerg b = ^(int y) { printf("%d", y) };
6113 1.1 joerg
6114 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
6115 1.1 joerg matches the declaration of the block b with hasParameter
6116 1.1 joerg matching y.
6117 1.1 joerg </pre></td></tr>
6118 1.1 joerg
6119 1.1 joerg
6120 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
6121 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6122 1.1 joerg declaration or a block.
6123 1.1 joerg
6124 1.1 joerg Given
6125 1.1 joerg class X { void f(int x) {} };
6126 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6127 1.1 joerg matches f(int x) {}
6128 1.1 joerg with hasParameter(...)
6129 1.1 joerg matching int x
6130 1.1 joerg
6131 1.1 joerg For ObjectiveC, given
6132 1.1 joerg @interface I - (void) f:(int) y; @end
6133 1.1 joerg
6134 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6135 1.1 joerg matches the declaration of method f with hasParameter
6136 1.1 joerg matching y.
6137 1.1 joerg </pre></td></tr>
6138 1.1 joerg
6139 1.1 joerg
6140 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
6141 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6142 1.1.1.2 joerg
6143 1.1.1.2 joerg Examples:
6144 1.1.1.2 joerg int x;
6145 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
6146 1.1.1.2 joerg matches int x
6147 1.1.1.2 joerg
6148 1.1.1.2 joerg auto x = int(3);
6149 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6150 1.1.1.2 joerg matches int(3)
6151 1.1.1.2 joerg
6152 1.1.1.2 joerg struct Foo { Foo(int, int); };
6153 1.1.1.2 joerg auto x = Foo(1, 2);
6154 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6155 1.1.1.2 joerg matches Foo(1, 2)
6156 1.1.1.2 joerg
6157 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
6158 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
6159 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
6160 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6161 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
6162 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
6163 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
6164 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6165 1.1.1.2 joerg </pre></td></tr>
6166 1.1.1.2 joerg
6167 1.1.1.2 joerg
6168 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>></td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6169 1.1 joerg <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6170 1.1 joerg pointee matches a given matcher.
6171 1.1 joerg
6172 1.1 joerg Given
6173 1.1 joerg int *a;
6174 1.1 joerg int const *b;
6175 1.1 joerg float const *f;
6176 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
6177 1.1 joerg matches "int const *b"
6178 1.1 joerg
6179 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
6180 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
6181 1.1 joerg </pre></td></tr>
6182 1.1 joerg
6183 1.1 joerg
6184 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
6185 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6186 1.1.1.2 joerg
6187 1.1.1.2 joerg Examples:
6188 1.1.1.2 joerg int x;
6189 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
6190 1.1.1.2 joerg matches int x
6191 1.1.1.2 joerg
6192 1.1.1.2 joerg auto x = int(3);
6193 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6194 1.1.1.2 joerg matches int(3)
6195 1.1.1.2 joerg
6196 1.1.1.2 joerg struct Foo { Foo(int, int); };
6197 1.1.1.2 joerg auto x = Foo(1, 2);
6198 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6199 1.1.1.2 joerg matches Foo(1, 2)
6200 1.1.1.2 joerg
6201 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
6202 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
6203 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
6204 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6205 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
6206 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
6207 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
6208 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6209 1.1.1.2 joerg </pre></td></tr>
6210 1.1.1.2 joerg
6211 1.1.1.2 joerg
6212 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6213 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6214 1.1.1.2 joerg declaration's type.
6215 1.1.1.2 joerg
6216 1.1.1.2 joerg In case of a value declaration (for example a variable declaration),
6217 1.1.1.2 joerg this resolves one layer of indirection. For example, in the value
6218 1.1.1.2 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6219 1.1.1.2 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6220 1.1.1.2 joerg declaration of x.
6221 1.1.1.2 joerg
6222 1.1.1.2 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6223 1.1.1.2 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6224 1.1.1.2 joerg and friend class X (matcher = friendDecl(hasType("X"))
6225 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
6226 1.1.1.2 joerg cxxRecordDecl(hasName("X"))))
6227 1.1.1.2 joerg class X {};
6228 1.1.1.2 joerg void y(X &x) { x; X z; }
6229 1.1.1.2 joerg class Y { friend class X; };
6230 1.1.1.2 joerg class Z : public virtual X {};
6231 1.1.1.2 joerg
6232 1.1.1.2 joerg Example matches class Derived
6233 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6234 1.1.1.2 joerg class Base {};
6235 1.1.1.2 joerg class Derived : Base {};
6236 1.1.1.2 joerg
6237 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>,
6238 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
6239 1.1.1.2 joerg </pre></td></tr>
6240 1.1.1.2 joerg
6241 1.1.1.2 joerg
6242 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6243 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6244 1.1.1.2 joerg matcher.
6245 1.1.1.2 joerg
6246 1.1.1.2 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6247 1.1.1.2 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6248 1.1.1.2 joerg and U (matcher = typedefDecl(hasType(asString("int")))
6249 1.1.1.2 joerg and friend class X (matcher = friendDecl(hasType("X"))
6250 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
6251 1.1.1.2 joerg asString("class X")))
6252 1.1.1.2 joerg class X {};
6253 1.1.1.2 joerg void y(X &x) { x; X z; }
6254 1.1.1.2 joerg typedef int U;
6255 1.1.1.2 joerg class Y { friend class X; };
6256 1.1.1.2 joerg class Z : public virtual X {};
6257 1.1.1.2 joerg </pre></td></tr>
6258 1.1.1.2 joerg
6259 1.1.1.2 joerg
6260 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr>
6261 1.1 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6262 1.1 joerg
6263 1.1 joerg Given
6264 1.1 joerg void f(int i);
6265 1.1 joerg int y;
6266 1.1 joerg f(y);
6267 1.1 joerg callExpr(
6268 1.1 joerg forEachArgumentWithParam(
6269 1.1 joerg declRefExpr(to(varDecl(hasName("y")))),
6270 1.1 joerg parmVarDecl(hasType(isInteger()))
6271 1.1 joerg ))
6272 1.1 joerg matches f(y);
6273 1.1 joerg with declRefExpr(...)
6274 1.1 joerg matching int y
6275 1.1 joerg and parmVarDecl(...)
6276 1.1 joerg matching int i
6277 1.1 joerg </pre></td></tr>
6278 1.1 joerg
6279 1.1 joerg
6280 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType1')"><a name="forEachArgumentWithParamType1Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr>
6281 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6282 1.1.1.2 joerg CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6283 1.1.1.2 joerg it works on calls through function pointers as well.
6284 1.1.1.2 joerg
6285 1.1.1.2 joerg The difference is, that function pointers do not provide access to a
6286 1.1.1.2 joerg ParmVarDecl, but only the QualType for each argument.
6287 1.1.1.2 joerg
6288 1.1.1.2 joerg Given
6289 1.1.1.2 joerg void f(int i);
6290 1.1.1.2 joerg int y;
6291 1.1.1.2 joerg f(y);
6292 1.1.1.2 joerg void (*f_ptr)(int) = f;
6293 1.1.1.2 joerg f_ptr(y);
6294 1.1.1.2 joerg callExpr(
6295 1.1.1.2 joerg forEachArgumentWithParamType(
6296 1.1.1.2 joerg declRefExpr(to(varDecl(hasName("y")))),
6297 1.1.1.2 joerg qualType(isInteger()).bind("type)
6298 1.1.1.2 joerg ))
6299 1.1.1.2 joerg matches f(y) and f_ptr(y)
6300 1.1.1.2 joerg with declRefExpr(...)
6301 1.1.1.2 joerg matching int y
6302 1.1.1.2 joerg and qualType(...)
6303 1.1.1.2 joerg matching int
6304 1.1.1.2 joerg </pre></td></tr>
6305 1.1.1.2 joerg
6306 1.1.1.2 joerg
6307 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6308 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6309 1.1 joerg expression, or an ObjC-message-send expression.
6310 1.1 joerg
6311 1.1 joerg Given
6312 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
6313 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
6314 1.1 joerg matches x(1, y, 42)
6315 1.1 joerg with hasAnyArgument(...)
6316 1.1 joerg matching y
6317 1.1 joerg
6318 1.1 joerg For ObjectiveC, given
6319 1.1 joerg @interface I - (void) f:(int) y; @end
6320 1.1 joerg void foo(I *i) { [i f:12]; }
6321 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6322 1.1 joerg matches [i f:12]
6323 1.1 joerg </pre></td></tr>
6324 1.1 joerg
6325 1.1 joerg
6326 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6327 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6328 1.1 joerg call expression.
6329 1.1 joerg
6330 1.1 joerg Example matches y in x(y)
6331 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr())))
6332 1.1 joerg void x(int) { int y; x(y); }
6333 1.1 joerg </pre></td></tr>
6334 1.1 joerg
6335 1.1 joerg
6336 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6337 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6338 1.1 joerg matches the given matcher.
6339 1.1 joerg
6340 1.1 joerg The associated declaration is:
6341 1.1 joerg - for type nodes, the declaration of the underlying type
6342 1.1 joerg - for CallExpr, the declaration of the callee
6343 1.1 joerg - for MemberExpr, the declaration of the referenced member
6344 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
6345 1.1 joerg - for CXXNewExpr, the declaration of the operator new
6346 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
6347 1.1 joerg
6348 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
6349 1.1 joerg sugared type. Given
6350 1.1 joerg class X {};
6351 1.1 joerg typedef X Y;
6352 1.1 joerg Y y;
6353 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6354 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6355 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6356 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6357 1.1 joerg recordType(hasDeclaration(decl())))))
6358 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6359 1.1 joerg
6360 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6361 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6362 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6363 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6364 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6365 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6366 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6367 1.1 joerg </pre></td></tr>
6368 1.1 joerg
6369 1.1 joerg
6370 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr>
6371 1.1 joerg <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6372 1.1 joerg
6373 1.1 joerg Given
6374 1.1 joerg class A { A() : i(42), j(42) {} int i; int j; };
6375 1.1 joerg cxxConstructorDecl(forEachConstructorInitializer(
6376 1.1 joerg forField(decl().bind("x"))
6377 1.1 joerg ))
6378 1.1 joerg will trigger two matches, binding for 'i' and 'j' respectively.
6379 1.1 joerg </pre></td></tr>
6380 1.1 joerg
6381 1.1 joerg
6382 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr>
6383 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6384 1.1 joerg
6385 1.1 joerg Given
6386 1.1 joerg struct Foo {
6387 1.1 joerg Foo() : foo_(1) { }
6388 1.1 joerg int foo_;
6389 1.1 joerg };
6390 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(
6391 1.1 joerg hasAnyConstructorInitializer(anything())
6392 1.1 joerg )))
6393 1.1 joerg record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6394 1.1 joerg </pre></td></tr>
6395 1.1 joerg
6396 1.1 joerg
6397 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr>
6398 1.1 joerg <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6399 1.1 joerg
6400 1.1 joerg Given
6401 1.1 joerg struct Foo {
6402 1.1 joerg Foo() : foo_(1) { }
6403 1.1 joerg int foo_;
6404 1.1 joerg };
6405 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6406 1.1 joerg forField(hasName("foo_"))))))
6407 1.1 joerg matches Foo
6408 1.1 joerg with forField matching foo_
6409 1.1 joerg </pre></td></tr>
6410 1.1 joerg
6411 1.1 joerg
6412 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
6413 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6414 1.1.1.2 joerg
6415 1.1.1.2 joerg Examples:
6416 1.1.1.2 joerg int x;
6417 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
6418 1.1.1.2 joerg matches int x
6419 1.1.1.2 joerg
6420 1.1.1.2 joerg auto x = int(3);
6421 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6422 1.1.1.2 joerg matches int(3)
6423 1.1.1.2 joerg
6424 1.1.1.2 joerg struct Foo { Foo(int, int); };
6425 1.1.1.2 joerg auto x = Foo(1, 2);
6426 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6427 1.1.1.2 joerg matches Foo(1, 2)
6428 1.1.1.2 joerg
6429 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
6430 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
6431 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
6432 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6433 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
6434 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
6435 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
6436 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6437 1.1.1.2 joerg </pre></td></tr>
6438 1.1.1.2 joerg
6439 1.1.1.2 joerg
6440 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6441 1.1 joerg <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6442 1.1 joerg
6443 1.1 joerg Given
6444 1.1 joerg struct Foo {
6445 1.1 joerg Foo() : foo_(1) { }
6446 1.1 joerg int foo_;
6447 1.1 joerg };
6448 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6449 1.1 joerg withInitializer(integerLiteral(equals(1)))))))
6450 1.1 joerg matches Foo
6451 1.1 joerg with withInitializer matching (1)
6452 1.1 joerg </pre></td></tr>
6453 1.1 joerg
6454 1.1 joerg
6455 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6456 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6457 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches
6458 1.1 joerg use of implicit `this`.
6459 1.1 joerg
6460 1.1 joerg Given
6461 1.1 joerg struct X {
6462 1.1 joerg int m;
6463 1.1 joerg int f(X x) { x.m; return m; }
6464 1.1 joerg };
6465 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6466 1.1 joerg matches `x.m`, but not `m`; however,
6467 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo(
6468 1.1 joerg cxxRecordDecl(hasName("X"))))))
6469 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`.
6470 1.1 joerg </pre></td></tr>
6471 1.1 joerg
6472 1.1 joerg
6473 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6474 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6475 1.1 joerg
6476 1.1.1.2 joerg
6477 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasInitStatement2')"><a name="hasInitStatement2Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6478 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6479 1.1.1.2 joerg
6480 1.1.1.2 joerg Given:
6481 1.1.1.2 joerg void foo() {
6482 1.1.1.2 joerg if (int i = foobar(); i > 0) {}
6483 1.1.1.2 joerg switch (int i = foobar(); i) {}
6484 1.1.1.2 joerg for (auto& a = get_range(); auto& x : a) {}
6485 1.1.1.2 joerg }
6486 1.1.1.2 joerg void bar() {
6487 1.1.1.2 joerg if (foobar() > 0) {}
6488 1.1.1.2 joerg switch (foobar()) {}
6489 1.1.1.2 joerg for (auto& x : get_range()) {}
6490 1.1.1.2 joerg }
6491 1.1.1.2 joerg ifStmt(hasInitStatement(anything()))
6492 1.1.1.2 joerg matches the if statement in foo but not in bar.
6493 1.1.1.2 joerg switchStmt(hasInitStatement(anything()))
6494 1.1.1.2 joerg matches the switch statement in foo but not in bar.
6495 1.1.1.2 joerg cxxForRangeStmt(hasInitStatement(anything()))
6496 1.1.1.2 joerg matches the range for statement in foo but not in bar.
6497 1.1 joerg </pre></td></tr>
6498 1.1 joerg
6499 1.1 joerg
6500 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr>
6501 1.1 joerg <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6502 1.1 joerg
6503 1.1 joerg Example:
6504 1.1 joerg forStmt(hasLoopVariable(anything()))
6505 1.1 joerg matches 'int x' in
6506 1.1 joerg for (int x : a) { }
6507 1.1 joerg </pre></td></tr>
6508 1.1 joerg
6509 1.1 joerg
6510 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6511 1.1 joerg <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6512 1.1 joerg
6513 1.1 joerg Example:
6514 1.1 joerg forStmt(hasRangeInit(anything()))
6515 1.1 joerg matches 'a' in
6516 1.1 joerg for (int x : a) { }
6517 1.1 joerg </pre></td></tr>
6518 1.1 joerg
6519 1.1 joerg
6520 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
6521 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6522 1.1.1.2 joerg
6523 1.1.1.2 joerg Examples:
6524 1.1.1.2 joerg int x;
6525 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
6526 1.1.1.2 joerg matches int x
6527 1.1.1.2 joerg
6528 1.1.1.2 joerg auto x = int(3);
6529 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6530 1.1.1.2 joerg matches int(3)
6531 1.1.1.2 joerg
6532 1.1.1.2 joerg struct Foo { Foo(int, int); };
6533 1.1.1.2 joerg auto x = Foo(1, 2);
6534 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6535 1.1.1.2 joerg matches Foo(1, 2)
6536 1.1.1.2 joerg
6537 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
6538 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
6539 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
6540 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6541 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
6542 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
6543 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
6544 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6545 1.1.1.2 joerg </pre></td></tr>
6546 1.1.1.2 joerg
6547 1.1.1.2 joerg
6548 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6549 1.1 joerg <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6550 1.1 joerg `on`, matches the argument directly without stripping away anything.
6551 1.1 joerg
6552 1.1 joerg Given
6553 1.1 joerg class Y { public: void m(); };
6554 1.1 joerg Y g();
6555 1.1 joerg class X : public Y { void g(); };
6556 1.1 joerg void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6557 1.1 joerg cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6558 1.1 joerg cxxRecordDecl(hasName("Y")))))
6559 1.1 joerg matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6560 1.1 joerg cxxMemberCallExpr(on(callExpr()))
6561 1.1 joerg does not match `(g()).m()`, because the parens are not ignored.
6562 1.1 joerg
6563 1.1 joerg FIXME: Overload to allow directly matching types?
6564 1.1 joerg </pre></td></tr>
6565 1.1 joerg
6566 1.1 joerg
6567 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6568 1.1 joerg <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6569 1.1 joerg stripping off any parentheses or implicit casts.
6570 1.1 joerg
6571 1.1 joerg Given
6572 1.1 joerg class Y { public: void m(); };
6573 1.1 joerg Y g();
6574 1.1 joerg class X : public Y {};
6575 1.1 joerg void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6576 1.1 joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6577 1.1 joerg matches `y.m()` and `(g()).m()`.
6578 1.1 joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6579 1.1 joerg matches `x.m()`.
6580 1.1 joerg cxxMemberCallExpr(on(callExpr()))
6581 1.1 joerg matches `(g()).m()`.
6582 1.1 joerg
6583 1.1 joerg FIXME: Overload to allow directly matching types?
6584 1.1 joerg </pre></td></tr>
6585 1.1 joerg
6586 1.1 joerg
6587 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6588 1.1 joerg <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6589 1.1 joerg </pre></td></tr>
6590 1.1 joerg
6591 1.1 joerg
6592 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6593 1.1 joerg <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6594 1.1 joerg matches the InnerMatcher, or is a pointer to a type that matches the
6595 1.1 joerg InnerMatcher.
6596 1.1 joerg
6597 1.1 joerg Given
6598 1.1 joerg class Y { public: void m(); };
6599 1.1 joerg class X : public Y { void g(); };
6600 1.1 joerg void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); }
6601 1.1 joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
6602 1.1 joerg cxxRecordDecl(hasName("Y")))))
6603 1.1 joerg matches `y.m()`, `p->m()` and `x.m()`.
6604 1.1 joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
6605 1.1 joerg cxxRecordDecl(hasName("X")))))
6606 1.1 joerg matches `x.g()`.
6607 1.1 joerg </pre></td></tr>
6608 1.1 joerg
6609 1.1 joerg
6610 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr>
6611 1.1 joerg <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6612 1.1 joerg produce multiple matches.
6613 1.1 joerg
6614 1.1 joerg Given
6615 1.1 joerg class A { virtual void f(); };
6616 1.1 joerg class B : public A { void f(); };
6617 1.1 joerg class C : public B { void f(); };
6618 1.1 joerg cxxMethodDecl(ofClass(hasName("C")),
6619 1.1 joerg forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6620 1.1 joerg matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6621 1.1 joerg that B::f is not overridden by C::f).
6622 1.1 joerg
6623 1.1 joerg The check can produce multiple matches in case of multiple inheritance, e.g.
6624 1.1 joerg class A1 { virtual void f(); };
6625 1.1 joerg class A2 { virtual void f(); };
6626 1.1 joerg class C : public A1, public A2 { void f(); };
6627 1.1 joerg cxxMethodDecl(ofClass(hasName("C")),
6628 1.1 joerg forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6629 1.1 joerg matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6630 1.1 joerg once with "b" binding "A2::f" and "d" binding "C::f".
6631 1.1 joerg </pre></td></tr>
6632 1.1 joerg
6633 1.1 joerg
6634 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr>
6635 1.1 joerg <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6636 1.1 joerg belongs to.
6637 1.1 joerg
6638 1.1 joerg FIXME: Generalize this for other kinds of declarations.
6639 1.1 joerg FIXME: What other kind of declarations would we need to generalize
6640 1.1 joerg this to?
6641 1.1 joerg
6642 1.1 joerg Example matches A() in the last line
6643 1.1 joerg (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6644 1.1 joerg ofClass(hasName("A"))))))
6645 1.1 joerg class A {
6646 1.1 joerg public:
6647 1.1 joerg A();
6648 1.1 joerg };
6649 1.1 joerg A a = A();
6650 1.1 joerg </pre></td></tr>
6651 1.1 joerg
6652 1.1 joerg
6653 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasAnyPlacementArg0')"><a name="hasAnyPlacementArg0Anchor">hasAnyPlacementArg</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6654 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6655 1.1.1.2 joerg
6656 1.1.1.2 joerg Given:
6657 1.1.1.2 joerg MyClass *p1 = new (Storage) MyClass();
6658 1.1.1.2 joerg cxxNewExpr(hasAnyPlacementArg(anything()))
6659 1.1.1.2 joerg matches the expression 'new (Storage, 16) MyClass()'.
6660 1.1.1.2 joerg </pre></td></tr>
6661 1.1.1.2 joerg
6662 1.1.1.2 joerg
6663 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6664 1.1 joerg <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6665 1.1 joerg
6666 1.1 joerg Given:
6667 1.1 joerg MyClass *p1 = new MyClass[10];
6668 1.1.1.2 joerg cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6669 1.1 joerg matches the expression 'new MyClass[10]'.
6670 1.1 joerg </pre></td></tr>
6671 1.1 joerg
6672 1.1 joerg
6673 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6674 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6675 1.1 joerg matches the given matcher.
6676 1.1 joerg
6677 1.1.1.2 joerg The associated declaration is:
6678 1.1.1.2 joerg - for type nodes, the declaration of the underlying type
6679 1.1.1.2 joerg - for CallExpr, the declaration of the callee
6680 1.1.1.2 joerg - for MemberExpr, the declaration of the referenced member
6681 1.1.1.2 joerg - for CXXConstructExpr, the declaration of the constructor
6682 1.1.1.2 joerg - for CXXNewExpr, the declaration of the operator new
6683 1.1.1.2 joerg - for ObjCIvarExpr, the declaration of the ivar
6684 1.1.1.2 joerg
6685 1.1.1.2 joerg For type nodes, hasDeclaration will generally match the declaration of the
6686 1.1.1.2 joerg sugared type. Given
6687 1.1.1.2 joerg class X {};
6688 1.1.1.2 joerg typedef X Y;
6689 1.1.1.2 joerg Y y;
6690 1.1.1.2 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6691 1.1.1.2 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6692 1.1.1.2 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6693 1.1.1.2 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6694 1.1.1.2 joerg recordType(hasDeclaration(decl())))))
6695 1.1.1.2 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6696 1.1.1.2 joerg
6697 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6698 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6699 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6700 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6701 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6702 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6703 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6704 1.1.1.2 joerg </pre></td></tr>
6705 1.1.1.2 joerg
6706 1.1.1.2 joerg
6707 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasPlacementArg0')"><a name="hasPlacementArg0Anchor">hasPlacementArg</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6708 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6709 1.1.1.2 joerg
6710 1.1.1.2 joerg Given:
6711 1.1.1.2 joerg MyClass *p1 = new (Storage, 16) MyClass();
6712 1.1.1.2 joerg cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6713 1.1.1.2 joerg matches the expression 'new (Storage, 16) MyClass()'.
6714 1.1.1.2 joerg </pre></td></tr>
6715 1.1.1.2 joerg
6716 1.1.1.2 joerg
6717 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
6718 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6719 1.1.1.2 joerg
6720 1.1.1.2 joerg Examples:
6721 1.1.1.2 joerg int x;
6722 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
6723 1.1.1.2 joerg matches int x
6724 1.1.1.2 joerg
6725 1.1.1.2 joerg auto x = int(3);
6726 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6727 1.1.1.2 joerg matches int(3)
6728 1.1.1.2 joerg
6729 1.1.1.2 joerg struct Foo { Foo(int, int); };
6730 1.1.1.2 joerg auto x = Foo(1, 2);
6731 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6732 1.1.1.2 joerg matches Foo(1, 2)
6733 1.1.1.2 joerg
6734 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
6735 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
6736 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
6737 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6738 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
6739 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
6740 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
6741 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6742 1.1.1.2 joerg </pre></td></tr>
6743 1.1.1.2 joerg
6744 1.1.1.2 joerg
6745 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6746 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6747 1.1.1.2 joerg binary operator matches.
6748 1.1.1.2 joerg </pre></td></tr>
6749 1.1.1.2 joerg
6750 1.1.1.2 joerg
6751 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6752 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6753 1.1.1.2 joerg
6754 1.1.1.2 joerg Example matches a (matcher = binaryOperator(hasLHS()))
6755 1.1.1.2 joerg a || b
6756 1.1.1.2 joerg </pre></td></tr>
6757 1.1.1.2 joerg
6758 1.1.1.2 joerg
6759 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperands1')"><a name="hasOperands1Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr>
6760 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6761 1.1.1.2 joerg
6762 1.1.1.2 joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6763 1.1.1.2 joerg integerLiteral(equals(2)))
6764 1.1.1.2 joerg 1 + 2 // Match
6765 1.1.1.2 joerg 2 + 1 // Match
6766 1.1.1.2 joerg 1 + 1 // No match
6767 1.1.1.2 joerg 2 + 2 // No match
6768 1.1.1.2 joerg </pre></td></tr>
6769 1.1.1.2 joerg
6770 1.1.1.2 joerg
6771 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6772 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6773 1.1.1.2 joerg
6774 1.1.1.2 joerg Example matches b (matcher = binaryOperator(hasRHS()))
6775 1.1.1.2 joerg a || b
6776 1.1.1.2 joerg </pre></td></tr>
6777 1.1.1.2 joerg
6778 1.1.1.2 joerg
6779 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasUnaryOperand1')"><a name="hasUnaryOperand1Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6780 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6781 1.1.1.2 joerg
6782 1.1.1.2 joerg Example matches true (matcher = hasUnaryOperand(
6783 1.1.1.2 joerg cxxBoolLiteral(equals(true))))
6784 1.1.1.2 joerg !true
6785 1.1.1.2 joerg </pre></td></tr>
6786 1.1.1.2 joerg
6787 1.1.1.2 joerg
6788 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasAnyBase0')"><a name="hasAnyBase0Anchor">hasAnyBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr>
6789 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6790 1.1.1.2 joerg
6791 1.1.1.2 joerg Example:
6792 1.1.1.2 joerg matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6793 1.1.1.2 joerg class Foo;
6794 1.1.1.2 joerg class Bar : Foo {};
6795 1.1.1.2 joerg class Baz : Bar {};
6796 1.1.1.2 joerg class SpecialBase;
6797 1.1.1.2 joerg class Proxy : SpecialBase {}; // matches Proxy
6798 1.1.1.2 joerg class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived
6799 1.1.1.2 joerg
6800 1.1.1.2 joerg FIXME: Refactor this and isDerivedFrom to reuse implementation.
6801 1.1.1.2 joerg </pre></td></tr>
6802 1.1 joerg
6803 1.1 joerg
6804 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDirectBase0')"><a name="hasDirectBase0Anchor">hasDirectBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr>
6805 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6806 1.1.1.2 joerg
6807 1.1.1.2 joerg Example:
6808 1.1.1.2 joerg matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6809 1.1.1.2 joerg class Foo;
6810 1.1.1.2 joerg class Bar : Foo {};
6811 1.1.1.2 joerg class Baz : Bar {};
6812 1.1.1.2 joerg class SpecialBase;
6813 1.1.1.2 joerg class Proxy : SpecialBase {}; // matches Proxy
6814 1.1.1.2 joerg class IndirectlyDerived : Proxy {}; // doesn't match
6815 1.1 joerg </pre></td></tr>
6816 1.1 joerg
6817 1.1 joerg
6818 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr>
6819 1.1 joerg <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6820 1.1 joerg
6821 1.1 joerg Given:
6822 1.1 joerg class A { void func(); };
6823 1.1 joerg class B { void member(); };
6824 1.1 joerg
6825 1.1 joerg cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
6826 1.1 joerg A but not B.
6827 1.1 joerg </pre></td></tr>
6828 1.1 joerg
6829 1.1 joerg
6830 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
6831 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
6832 1.1 joerg matching Base, or Objective-C classes that directly or indirectly
6833 1.1 joerg subclass a class matching Base.
6834 1.1 joerg
6835 1.1 joerg Note that a class is not considered to be derived from itself.
6836 1.1 joerg
6837 1.1 joerg Example matches Y, Z, C (Base == hasName("X"))
6838 1.1 joerg class X;
6839 1.1 joerg class Y : public X {}; // directly derived
6840 1.1 joerg class Z : public Y {}; // indirectly derived
6841 1.1 joerg typedef X A;
6842 1.1 joerg typedef A B;
6843 1.1 joerg class C : public B {}; // derived from a typedef of X
6844 1.1 joerg
6845 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
6846 1.1 joerg class Foo;
6847 1.1 joerg typedef Foo X;
6848 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
6849 1.1 joerg
6850 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6851 1.1 joerg @interface NSObject @end
6852 1.1 joerg @interface Bar : NSObject @end
6853 1.1 joerg
6854 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>
6855 1.1 joerg </pre></td></tr>
6856 1.1 joerg
6857 1.1 joerg
6858 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
6859 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6860 1.1 joerg matching Base.
6861 1.1 joerg
6862 1.1 joerg Note that a class is not considered to be derived from itself.
6863 1.1 joerg
6864 1.1 joerg Example matches Y, C (Base == hasName("X"))
6865 1.1 joerg class X;
6866 1.1 joerg class Y : public X {}; // directly derived
6867 1.1 joerg class Z : public Y {}; // indirectly derived
6868 1.1 joerg typedef X A;
6869 1.1 joerg typedef A B;
6870 1.1 joerg class C : public B {}; // derived from a typedef of X
6871 1.1 joerg
6872 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
6873 1.1 joerg class Foo;
6874 1.1 joerg typedef Foo X;
6875 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
6876 1.1 joerg </pre></td></tr>
6877 1.1 joerg
6878 1.1 joerg
6879 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
6880 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6881 1.1 joerg match Base.
6882 1.1 joerg </pre></td></tr>
6883 1.1 joerg
6884 1.1 joerg
6885 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand2')"><a name="hasEitherOperand2Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6886 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
6887 1.1.1.2 joerg binary operator matches.
6888 1.1.1.2 joerg </pre></td></tr>
6889 1.1.1.2 joerg
6890 1.1.1.2 joerg
6891 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS2')"><a name="hasLHS2Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6892 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
6893 1.1.1.2 joerg
6894 1.1.1.2 joerg Example matches a (matcher = binaryOperator(hasLHS()))
6895 1.1.1.2 joerg a || b
6896 1.1.1.2 joerg </pre></td></tr>
6897 1.1.1.2 joerg
6898 1.1.1.2 joerg
6899 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands2')"><a name="hasOperands2Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr>
6900 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
6901 1.1.1.2 joerg
6902 1.1.1.2 joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6903 1.1.1.2 joerg integerLiteral(equals(2)))
6904 1.1.1.2 joerg 1 + 2 // Match
6905 1.1.1.2 joerg 2 + 1 // Match
6906 1.1.1.2 joerg 1 + 1 // No match
6907 1.1.1.2 joerg 2 + 2 // No match
6908 1.1.1.2 joerg </pre></td></tr>
6909 1.1.1.2 joerg
6910 1.1.1.2 joerg
6911 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS2')"><a name="hasRHS2Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6912 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
6913 1.1.1.2 joerg
6914 1.1.1.2 joerg Example matches b (matcher = binaryOperator(hasRHS()))
6915 1.1.1.2 joerg a || b
6916 1.1.1.2 joerg </pre></td></tr>
6917 1.1.1.2 joerg
6918 1.1.1.2 joerg
6919 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
6920 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
6921 1.1.1.2 joerg
6922 1.1.1.2 joerg Examples:
6923 1.1.1.2 joerg int x;
6924 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
6925 1.1.1.2 joerg matches int x
6926 1.1.1.2 joerg
6927 1.1.1.2 joerg auto x = int(3);
6928 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6929 1.1.1.2 joerg matches int(3)
6930 1.1.1.2 joerg
6931 1.1.1.2 joerg struct Foo { Foo(int, int); };
6932 1.1.1.2 joerg auto x = Foo(1, 2);
6933 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6934 1.1.1.2 joerg matches Foo(1, 2)
6935 1.1.1.2 joerg
6936 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
6937 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
6938 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
6939 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6940 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
6941 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
6942 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
6943 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6944 1.1.1.2 joerg </pre></td></tr>
6945 1.1.1.2 joerg
6946 1.1.1.2 joerg
6947 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6948 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
6949 1.1 joerg expression, or an ObjC-message-send expression.
6950 1.1 joerg
6951 1.1 joerg Given
6952 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
6953 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
6954 1.1 joerg matches x(1, y, 42)
6955 1.1 joerg with hasAnyArgument(...)
6956 1.1 joerg matching y
6957 1.1 joerg
6958 1.1 joerg For ObjectiveC, given
6959 1.1 joerg @interface I - (void) f:(int) y; @end
6960 1.1 joerg void foo(I *i) { [i f:12]; }
6961 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6962 1.1 joerg matches [i f:12]
6963 1.1 joerg </pre></td></tr>
6964 1.1 joerg
6965 1.1 joerg
6966 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6967 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6968 1.1.1.2 joerg call expression.
6969 1.1.1.2 joerg
6970 1.1.1.2 joerg Example matches y in x(y)
6971 1.1.1.2 joerg (matcher = callExpr(hasArgument(0, declRefExpr())))
6972 1.1.1.2 joerg void x(int) { int y; x(y); }
6973 1.1.1.2 joerg </pre></td></tr>
6974 1.1.1.2 joerg
6975 1.1.1.2 joerg
6976 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
6977 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
6978 1.1.1.2 joerg
6979 1.1.1.2 joerg Examples:
6980 1.1.1.2 joerg int x;
6981 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
6982 1.1.1.2 joerg matches int x
6983 1.1.1.2 joerg
6984 1.1.1.2 joerg auto x = int(3);
6985 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6986 1.1.1.2 joerg matches int(3)
6987 1.1.1.2 joerg
6988 1.1.1.2 joerg struct Foo { Foo(int, int); };
6989 1.1.1.2 joerg auto x = Foo(1, 2);
6990 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6991 1.1.1.2 joerg matches Foo(1, 2)
6992 1.1.1.2 joerg
6993 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
6994 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
6995 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
6996 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6997 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
6998 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
6999 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
7000 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7001 1.1.1.2 joerg </pre></td></tr>
7002 1.1.1.2 joerg
7003 1.1.1.2 joerg
7004 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7005 1.1 joerg <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7006 1.1 joerg given matcher.
7007 1.1 joerg
7008 1.1 joerg Example matches y.x() (matcher = callExpr(callee(
7009 1.1 joerg cxxMethodDecl(hasName("x")))))
7010 1.1 joerg class Y { public: void x(); };
7011 1.1 joerg void z() { Y y; y.x(); }
7012 1.1 joerg </pre></td></tr>
7013 1.1 joerg
7014 1.1 joerg
7015 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7016 1.1 joerg <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7017 1.1 joerg
7018 1.1 joerg Given
7019 1.1 joerg class Y { void x() { this->x(); x(); Y y; y.x(); } };
7020 1.1 joerg void f() { f(); }
7021 1.1 joerg callExpr(callee(expr()))
7022 1.1 joerg matches this->x(), x(), y.x(), f()
7023 1.1 joerg with callee(...)
7024 1.1 joerg matching this->x, x, y.x, f respectively
7025 1.1 joerg
7026 1.1 joerg Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>
7027 1.1 joerg because this introduces ambiguous overloads with calls to Callee taking a
7028 1.1 joerg internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely
7029 1.1 joerg implemented in terms of implicit casts.
7030 1.1 joerg </pre></td></tr>
7031 1.1 joerg
7032 1.1 joerg
7033 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr>
7034 1.1 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7035 1.1 joerg
7036 1.1 joerg Given
7037 1.1 joerg void f(int i);
7038 1.1 joerg int y;
7039 1.1 joerg f(y);
7040 1.1 joerg callExpr(
7041 1.1 joerg forEachArgumentWithParam(
7042 1.1 joerg declRefExpr(to(varDecl(hasName("y")))),
7043 1.1 joerg parmVarDecl(hasType(isInteger()))
7044 1.1 joerg ))
7045 1.1 joerg matches f(y);
7046 1.1 joerg with declRefExpr(...)
7047 1.1 joerg matching int y
7048 1.1 joerg and parmVarDecl(...)
7049 1.1 joerg matching int i
7050 1.1 joerg </pre></td></tr>
7051 1.1 joerg
7052 1.1 joerg
7053 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType0')"><a name="forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr>
7054 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7055 1.1.1.2 joerg CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7056 1.1.1.2 joerg it works on calls through function pointers as well.
7057 1.1.1.2 joerg
7058 1.1.1.2 joerg The difference is, that function pointers do not provide access to a
7059 1.1.1.2 joerg ParmVarDecl, but only the QualType for each argument.
7060 1.1.1.2 joerg
7061 1.1.1.2 joerg Given
7062 1.1.1.2 joerg void f(int i);
7063 1.1.1.2 joerg int y;
7064 1.1.1.2 joerg f(y);
7065 1.1.1.2 joerg void (*f_ptr)(int) = f;
7066 1.1.1.2 joerg f_ptr(y);
7067 1.1.1.2 joerg callExpr(
7068 1.1.1.2 joerg forEachArgumentWithParamType(
7069 1.1.1.2 joerg declRefExpr(to(varDecl(hasName("y")))),
7070 1.1.1.2 joerg qualType(isInteger()).bind("type)
7071 1.1.1.2 joerg ))
7072 1.1.1.2 joerg matches f(y) and f_ptr(y)
7073 1.1.1.2 joerg with declRefExpr(...)
7074 1.1.1.2 joerg matching int y
7075 1.1.1.2 joerg and qualType(...)
7076 1.1.1.2 joerg matching int
7077 1.1.1.2 joerg </pre></td></tr>
7078 1.1.1.2 joerg
7079 1.1.1.2 joerg
7080 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7081 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7082 1.1 joerg expression, or an ObjC-message-send expression.
7083 1.1 joerg
7084 1.1 joerg Given
7085 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
7086 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
7087 1.1 joerg matches x(1, y, 42)
7088 1.1 joerg with hasAnyArgument(...)
7089 1.1 joerg matching y
7090 1.1 joerg
7091 1.1 joerg For ObjectiveC, given
7092 1.1 joerg @interface I - (void) f:(int) y; @end
7093 1.1 joerg void foo(I *i) { [i f:12]; }
7094 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7095 1.1 joerg matches [i f:12]
7096 1.1 joerg </pre></td></tr>
7097 1.1 joerg
7098 1.1 joerg
7099 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7100 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7101 1.1 joerg call expression.
7102 1.1 joerg
7103 1.1 joerg Example matches y in x(y)
7104 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr())))
7105 1.1 joerg void x(int) { int y; x(y); }
7106 1.1 joerg </pre></td></tr>
7107 1.1 joerg
7108 1.1 joerg
7109 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7110 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7111 1.1 joerg matches the given matcher.
7112 1.1 joerg
7113 1.1 joerg The associated declaration is:
7114 1.1 joerg - for type nodes, the declaration of the underlying type
7115 1.1 joerg - for CallExpr, the declaration of the callee
7116 1.1 joerg - for MemberExpr, the declaration of the referenced member
7117 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
7118 1.1 joerg - for CXXNewExpr, the declaration of the operator new
7119 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
7120 1.1 joerg
7121 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
7122 1.1 joerg sugared type. Given
7123 1.1 joerg class X {};
7124 1.1 joerg typedef X Y;
7125 1.1 joerg Y y;
7126 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7127 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
7128 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7129 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
7130 1.1 joerg recordType(hasDeclaration(decl())))))
7131 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
7132 1.1 joerg
7133 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
7134 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
7135 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
7136 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
7137 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
7138 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
7139 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7140 1.1 joerg </pre></td></tr>
7141 1.1 joerg
7142 1.1 joerg
7143 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>></td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7144 1.1 joerg <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7145 1.1 joerg extension, matches the constant given in the statement.
7146 1.1 joerg
7147 1.1 joerg Given
7148 1.1 joerg switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7149 1.1 joerg caseStmt(hasCaseConstant(integerLiteral()))
7150 1.1 joerg matches "case 1:"
7151 1.1 joerg </pre></td></tr>
7152 1.1 joerg
7153 1.1 joerg
7154 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7155 1.1 joerg <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7156 1.1 joerg or opaque value's source expression matches the given matcher.
7157 1.1 joerg
7158 1.1 joerg Example 1: matches "a string"
7159 1.1 joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7160 1.1 joerg class URL { URL(string); };
7161 1.1 joerg URL url = "a string";
7162 1.1 joerg
7163 1.1 joerg Example 2: matches 'b' (matcher =
7164 1.1 joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7165 1.1 joerg int a = b ?: 1;
7166 1.1 joerg </pre></td></tr>
7167 1.1 joerg
7168 1.1 joerg
7169 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
7170 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7171 1.1 joerg functionDecl that have at least one TemplateArgument matching the given
7172 1.1 joerg InnerMatcher.
7173 1.1 joerg
7174 1.1 joerg Given
7175 1.1 joerg template<typename T> class A {};
7176 1.1 joerg template<> class A<double> {};
7177 1.1 joerg A<int> a;
7178 1.1 joerg
7179 1.1 joerg template<typename T> f() {};
7180 1.1 joerg void func() { f<int>(); };
7181 1.1 joerg
7182 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
7183 1.1 joerg refersToType(asString("int"))))
7184 1.1 joerg matches the specialization A<int>
7185 1.1 joerg
7186 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7187 1.1 joerg matches the specialization f<int>
7188 1.1 joerg </pre></td></tr>
7189 1.1 joerg
7190 1.1 joerg
7191 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>> InnerMatcher</td></tr>
7192 1.1 joerg <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7193 1.1 joerg
7194 1.1 joerg Given
7195 1.1 joerg template<typename T> class A {}; #1
7196 1.1 joerg template<> class A<int> {}; #2
7197 1.1 joerg classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7198 1.1 joerg matches '#2' with classTemplateDecl() matching the class template
7199 1.1 joerg declaration of 'A' at #1.
7200 1.1 joerg </pre></td></tr>
7201 1.1 joerg
7202 1.1 joerg
7203 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
7204 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7205 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7206 1.1 joerg
7207 1.1 joerg Given
7208 1.1 joerg template<typename T, typename U> class A {};
7209 1.1 joerg A<bool, int> b;
7210 1.1 joerg A<int, bool> c;
7211 1.1 joerg
7212 1.1 joerg template<typename T> void f() {}
7213 1.1 joerg void func() { f<int>(); };
7214 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument(
7215 1.1 joerg 1, refersToType(asString("int"))))
7216 1.1 joerg matches the specialization A<bool, int>
7217 1.1 joerg
7218 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7219 1.1 joerg matches the specialization f<int>
7220 1.1 joerg </pre></td></tr>
7221 1.1 joerg
7222 1.1 joerg
7223 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
7224 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7225 1.1.1.2 joerg
7226 1.1.1.2 joerg Examples:
7227 1.1.1.2 joerg int x;
7228 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
7229 1.1.1.2 joerg matches int x
7230 1.1.1.2 joerg
7231 1.1.1.2 joerg auto x = int(3);
7232 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7233 1.1.1.2 joerg matches int(3)
7234 1.1.1.2 joerg
7235 1.1.1.2 joerg struct Foo { Foo(int, int); };
7236 1.1.1.2 joerg auto x = Foo(1, 2);
7237 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7238 1.1.1.2 joerg matches Foo(1, 2)
7239 1.1.1.2 joerg
7240 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
7241 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
7242 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
7243 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7244 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
7245 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
7246 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
7247 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7248 1.1.1.2 joerg </pre></td></tr>
7249 1.1.1.2 joerg
7250 1.1.1.2 joerg
7251 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>></td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
7252 1.1 joerg <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7253 1.1 joerg type.
7254 1.1 joerg
7255 1.1 joerg Given
7256 1.1 joerg struct A {};
7257 1.1 joerg A a[7];
7258 1.1 joerg int b[7];
7259 1.1 joerg arrayType(hasElementType(builtinType()))
7260 1.1 joerg matches "int b[7]"
7261 1.1 joerg
7262 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>
7263 1.1 joerg </pre></td></tr>
7264 1.1 joerg
7265 1.1 joerg
7266 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
7267 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7268 1.1.1.2 joerg
7269 1.1.1.2 joerg Examples:
7270 1.1.1.2 joerg int x;
7271 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
7272 1.1.1.2 joerg matches int x
7273 1.1.1.2 joerg
7274 1.1.1.2 joerg auto x = int(3);
7275 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7276 1.1.1.2 joerg matches int(3)
7277 1.1.1.2 joerg
7278 1.1.1.2 joerg struct Foo { Foo(int, int); };
7279 1.1.1.2 joerg auto x = Foo(1, 2);
7280 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7281 1.1.1.2 joerg matches Foo(1, 2)
7282 1.1.1.2 joerg
7283 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
7284 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
7285 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
7286 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7287 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
7288 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
7289 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
7290 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7291 1.1.1.2 joerg </pre></td></tr>
7292 1.1.1.2 joerg
7293 1.1.1.2 joerg
7294 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7295 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7296 1.1 joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7297 1.1 joerg
7298 1.1 joerg Given
7299 1.1 joerg { {}; 1+2; }
7300 1.1 joerg hasAnySubstatement(compoundStmt())
7301 1.1 joerg matches '{ {}; 1+2; }'
7302 1.1 joerg with compoundStmt()
7303 1.1 joerg matching '{}'
7304 1.1 joerg </pre></td></tr>
7305 1.1 joerg
7306 1.1 joerg
7307 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>></td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr>
7308 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7309 1.1 joerg </pre></td></tr>
7310 1.1 joerg
7311 1.1 joerg
7312 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7313 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7314 1.1 joerg matches the given matcher.
7315 1.1 joerg
7316 1.1 joerg The associated declaration is:
7317 1.1 joerg - for type nodes, the declaration of the underlying type
7318 1.1 joerg - for CallExpr, the declaration of the callee
7319 1.1 joerg - for MemberExpr, the declaration of the referenced member
7320 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
7321 1.1 joerg - for CXXNewExpr, the declaration of the operator new
7322 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
7323 1.1 joerg
7324 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
7325 1.1 joerg sugared type. Given
7326 1.1 joerg class X {};
7327 1.1 joerg typedef X Y;
7328 1.1 joerg Y y;
7329 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7330 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
7331 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7332 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
7333 1.1 joerg recordType(hasDeclaration(decl())))))
7334 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
7335 1.1 joerg
7336 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
7337 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
7338 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
7339 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
7340 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
7341 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
7342 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7343 1.1 joerg </pre></td></tr>
7344 1.1 joerg
7345 1.1 joerg
7346 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr>
7347 1.1 joerg <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7348 1.1 joerg specific using shadow declaration.
7349 1.1 joerg
7350 1.1 joerg Given
7351 1.1 joerg namespace a { void f() {} }
7352 1.1 joerg using a::f;
7353 1.1 joerg void g() {
7354 1.1 joerg f(); // Matches this ..
7355 1.1 joerg a::f(); // .. but not this.
7356 1.1 joerg }
7357 1.1 joerg declRefExpr(throughUsingDecl(anything()))
7358 1.1 joerg matches f()
7359 1.1 joerg </pre></td></tr>
7360 1.1 joerg
7361 1.1 joerg
7362 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7363 1.1 joerg <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7364 1.1 joerg specified matcher.
7365 1.1 joerg
7366 1.1 joerg Example matches x in if(x)
7367 1.1 joerg (matcher = declRefExpr(to(varDecl(hasName("x")))))
7368 1.1 joerg bool x;
7369 1.1 joerg if (x) {}
7370 1.1 joerg </pre></td></tr>
7371 1.1 joerg
7372 1.1 joerg
7373 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7374 1.1 joerg <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7375 1.1 joerg
7376 1.1 joerg Note that this does not work for global declarations because the AST
7377 1.1 joerg breaks up multiple-declaration DeclStmt's into multiple single-declaration
7378 1.1 joerg DeclStmt's.
7379 1.1 joerg Example: Given non-global declarations
7380 1.1 joerg int a, b = 0;
7381 1.1 joerg int c;
7382 1.1 joerg int d = 2, e;
7383 1.1 joerg declStmt(containsDeclaration(
7384 1.1 joerg 0, varDecl(hasInitializer(anything()))))
7385 1.1 joerg matches only 'int d = 2, e;', and
7386 1.1 joerg declStmt(containsDeclaration(1, varDecl()))
7387 1.1 joerg matches 'int a, b = 0' as well as 'int d = 2, e;'
7388 1.1 joerg but 'int c;' is not matched.
7389 1.1 joerg </pre></td></tr>
7390 1.1 joerg
7391 1.1 joerg
7392 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7393 1.1 joerg <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7394 1.1 joerg
7395 1.1 joerg Given
7396 1.1 joerg int a, b;
7397 1.1 joerg int c;
7398 1.1 joerg declStmt(hasSingleDecl(anything()))
7399 1.1 joerg matches 'int c;' but not 'int a, b;'.
7400 1.1 joerg </pre></td></tr>
7401 1.1 joerg
7402 1.1 joerg
7403 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
7404 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7405 1.1 joerg
7406 1.1.1.2 joerg Examples:
7407 1.1 joerg int x;
7408 1.1 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
7409 1.1 joerg matches int x
7410 1.1.1.2 joerg
7411 1.1.1.2 joerg auto x = int(3);
7412 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7413 1.1.1.2 joerg matches int(3)
7414 1.1.1.2 joerg
7415 1.1.1.2 joerg struct Foo { Foo(int, int); };
7416 1.1.1.2 joerg auto x = Foo(1, 2);
7417 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7418 1.1.1.2 joerg matches Foo(1, 2)
7419 1.1.1.2 joerg
7420 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
7421 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
7422 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
7423 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7424 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
7425 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
7426 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
7427 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7428 1.1 joerg </pre></td></tr>
7429 1.1 joerg
7430 1.1 joerg
7431 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7432 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7433 1.1 joerg Decl, matches InnerMatcher.
7434 1.1 joerg
7435 1.1 joerg Given
7436 1.1 joerg namespace N {
7437 1.1 joerg namespace M {
7438 1.1 joerg class D {};
7439 1.1 joerg }
7440 1.1 joerg }
7441 1.1 joerg
7442 1.1 joerg cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7443 1.1 joerg declaration of class D.
7444 1.1 joerg </pre></td></tr>
7445 1.1 joerg
7446 1.1 joerg
7447 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>></td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
7448 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7449 1.1 joerg
7450 1.1 joerg Given
7451 1.1 joerg decltype(1) a = 1;
7452 1.1 joerg decltype(2.0) b = 2.0;
7453 1.1 joerg decltypeType(hasUnderlyingType(isInteger()))
7454 1.1 joerg matches the type of "a"
7455 1.1 joerg
7456 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>
7457 1.1 joerg </pre></td></tr>
7458 1.1 joerg
7459 1.1 joerg
7460 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasAnyBinding0')"><a name="hasAnyBinding0Anchor">hasAnyBinding</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr>
7461 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7462 1.1 joerg
7463 1.1.1.2 joerg For example, in:
7464 1.1.1.2 joerg void foo()
7465 1.1.1.2 joerg {
7466 1.1.1.2 joerg int arr[3];
7467 1.1.1.2 joerg auto &[f, s, t] = arr;
7468 1.1.1.2 joerg
7469 1.1.1.2 joerg f = 42;
7470 1.1.1.2 joerg }
7471 1.1.1.2 joerg The matcher:
7472 1.1.1.2 joerg decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7473 1.1.1.2 joerg matches the decomposition decl with 'f' bound to "fBinding".
7474 1.1.1.2 joerg </pre></td></tr>
7475 1.1.1.2 joerg
7476 1.1.1.2 joerg
7477 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasBinding0')"><a name="hasBinding0Anchor">hasBinding</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr>
7478 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7479 1.1.1.2 joerg
7480 1.1.1.2 joerg For example, in:
7481 1.1.1.2 joerg void foo()
7482 1.1.1.2 joerg {
7483 1.1.1.2 joerg int arr[3];
7484 1.1.1.2 joerg auto &[f, s, t] = arr;
7485 1.1.1.2 joerg
7486 1.1.1.2 joerg f = 42;
7487 1.1.1.2 joerg }
7488 1.1.1.2 joerg The matcher:
7489 1.1.1.2 joerg decompositionDecl(hasBinding(0,
7490 1.1.1.2 joerg bindingDecl(hasName("f").bind("fBinding"))))
7491 1.1.1.2 joerg matches the decomposition decl with 'f' bound to "fBinding".
7492 1.1 joerg </pre></td></tr>
7493 1.1 joerg
7494 1.1 joerg
7495 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7496 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7497 1.1.1.2 joerg
7498 1.1.1.2 joerg
7499 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7500 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7501 1.1 joerg switch statement or conditional operator.
7502 1.1 joerg
7503 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7504 1.1 joerg if (true) {}
7505 1.1 joerg </pre></td></tr>
7506 1.1 joerg
7507 1.1 joerg
7508 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr>
7509 1.1 joerg <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7510 1.1 joerg matches InnerMatcher if the qualifier exists.
7511 1.1 joerg
7512 1.1 joerg Given
7513 1.1 joerg namespace N {
7514 1.1 joerg namespace M {
7515 1.1 joerg class D {};
7516 1.1 joerg }
7517 1.1 joerg }
7518 1.1 joerg N::M::D d;
7519 1.1 joerg
7520 1.1 joerg elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7521 1.1 joerg matches the type of the variable declaration of d.
7522 1.1 joerg </pre></td></tr>
7523 1.1 joerg
7524 1.1 joerg
7525 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7526 1.1 joerg <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7527 1.1 joerg
7528 1.1 joerg Given
7529 1.1 joerg namespace N {
7530 1.1 joerg namespace M {
7531 1.1 joerg class D {};
7532 1.1 joerg }
7533 1.1 joerg }
7534 1.1 joerg N::M::D d;
7535 1.1 joerg
7536 1.1 joerg elaboratedType(namesType(recordType(
7537 1.1 joerg hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7538 1.1 joerg declaration of d.
7539 1.1 joerg </pre></td></tr>
7540 1.1 joerg
7541 1.1 joerg
7542 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7543 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7544 1.1 joerg matches the given matcher.
7545 1.1 joerg
7546 1.1 joerg The associated declaration is:
7547 1.1 joerg - for type nodes, the declaration of the underlying type
7548 1.1 joerg - for CallExpr, the declaration of the callee
7549 1.1 joerg - for MemberExpr, the declaration of the referenced member
7550 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
7551 1.1 joerg - for CXXNewExpr, the declaration of the operator new
7552 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
7553 1.1 joerg
7554 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
7555 1.1 joerg sugared type. Given
7556 1.1 joerg class X {};
7557 1.1 joerg typedef X Y;
7558 1.1 joerg Y y;
7559 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7560 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
7561 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7562 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
7563 1.1 joerg recordType(hasDeclaration(decl())))))
7564 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
7565 1.1 joerg
7566 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
7567 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
7568 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
7569 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
7570 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
7571 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
7572 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7573 1.1 joerg </pre></td></tr>
7574 1.1 joerg
7575 1.1 joerg
7576 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7577 1.1 joerg <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7578 1.1 joerg
7579 1.1 joerg (Note: Clang's AST refers to other conversions as "casts" too, and calls
7580 1.1 joerg actual casts "explicit" casts.)
7581 1.1 joerg </pre></td></tr>
7582 1.1 joerg
7583 1.1 joerg
7584 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
7585 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7586 1.1.1.2 joerg
7587 1.1.1.2 joerg Examples:
7588 1.1.1.2 joerg int x;
7589 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
7590 1.1.1.2 joerg matches int x
7591 1.1.1.2 joerg
7592 1.1.1.2 joerg auto x = int(3);
7593 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7594 1.1.1.2 joerg matches int(3)
7595 1.1.1.2 joerg
7596 1.1.1.2 joerg struct Foo { Foo(int, int); };
7597 1.1.1.2 joerg auto x = Foo(1, 2);
7598 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7599 1.1.1.2 joerg matches Foo(1, 2)
7600 1.1.1.2 joerg
7601 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
7602 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
7603 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
7604 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7605 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
7606 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
7607 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
7608 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7609 1.1.1.2 joerg </pre></td></tr>
7610 1.1.1.2 joerg
7611 1.1.1.2 joerg
7612 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7613 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7614 1.1 joerg declaration's type.
7615 1.1 joerg
7616 1.1 joerg In case of a value declaration (for example a variable declaration),
7617 1.1 joerg this resolves one layer of indirection. For example, in the value
7618 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7619 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7620 1.1 joerg declaration of x.
7621 1.1 joerg
7622 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7623 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7624 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
7625 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
7626 1.1.1.2 joerg cxxRecordDecl(hasName("X"))))
7627 1.1 joerg class X {};
7628 1.1 joerg void y(X &x) { x; X z; }
7629 1.1 joerg class Y { friend class X; };
7630 1.1.1.2 joerg class Z : public virtual X {};
7631 1.1.1.2 joerg
7632 1.1.1.2 joerg Example matches class Derived
7633 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7634 1.1.1.2 joerg class Base {};
7635 1.1.1.2 joerg class Derived : Base {};
7636 1.1 joerg
7637 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>,
7638 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
7639 1.1 joerg </pre></td></tr>
7640 1.1 joerg
7641 1.1 joerg
7642 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7643 1.1 joerg <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7644 1.1 joerg matcher.
7645 1.1 joerg
7646 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7647 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7648 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
7649 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
7650 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
7651 1.1.1.2 joerg asString("class X")))
7652 1.1 joerg class X {};
7653 1.1 joerg void y(X &x) { x; X z; }
7654 1.1 joerg typedef int U;
7655 1.1 joerg class Y { friend class X; };
7656 1.1.1.2 joerg class Z : public virtual X {};
7657 1.1 joerg </pre></td></tr>
7658 1.1 joerg
7659 1.1 joerg
7660 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7661 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7662 1.1 joerg elidable constructor and other corresponding bookkeeping nodes.
7663 1.1 joerg
7664 1.1 joerg In C++17, elidable copy constructors are no longer being generated in the
7665 1.1 joerg AST as it is not permitted by the standard. They are, however, part of the
7666 1.1 joerg AST in C++14 and earlier. So, a matcher must abstract over these differences
7667 1.1 joerg to work in all language modes. This matcher skips elidable constructor-call
7668 1.1 joerg AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7669 1.1 joerg various implicit nodes inside the constructor calls, all of which will not
7670 1.1 joerg appear in the C++17 AST.
7671 1.1 joerg
7672 1.1 joerg Given
7673 1.1 joerg
7674 1.1 joerg struct H {};
7675 1.1 joerg H G();
7676 1.1 joerg void f() {
7677 1.1 joerg H D = G();
7678 1.1 joerg }
7679 1.1 joerg
7680 1.1 joerg ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7681 1.1 joerg matches ``H D = G()`` in C++11 through C++17 (and beyond).
7682 1.1 joerg </pre></td></tr>
7683 1.1 joerg
7684 1.1 joerg
7685 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7686 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7687 1.1 joerg are stripped off.
7688 1.1 joerg
7689 1.1 joerg Parentheses and explicit casts are not discarded.
7690 1.1 joerg Given
7691 1.1 joerg int arr[5];
7692 1.1 joerg int a = 0;
7693 1.1 joerg char b = 0;
7694 1.1 joerg const int c = a;
7695 1.1 joerg int *d = arr;
7696 1.1 joerg long e = (long) 0l;
7697 1.1 joerg The matchers
7698 1.1 joerg varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7699 1.1 joerg varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7700 1.1 joerg would match the declarations for a, b, c, and d, but not e.
7701 1.1 joerg While
7702 1.1 joerg varDecl(hasInitializer(integerLiteral()))
7703 1.1 joerg varDecl(hasInitializer(declRefExpr()))
7704 1.1 joerg only match the declarations for b, c, and d.
7705 1.1 joerg </pre></td></tr>
7706 1.1 joerg
7707 1.1 joerg
7708 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7709 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7710 1.1 joerg nodes are stripped off.
7711 1.1 joerg
7712 1.1 joerg Parentheses and explicit casts are not discarded.
7713 1.1 joerg Given
7714 1.1 joerg class C {};
7715 1.1 joerg C a = C();
7716 1.1 joerg C b;
7717 1.1 joerg C c = b;
7718 1.1 joerg The matchers
7719 1.1 joerg varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7720 1.1 joerg would match the declarations for a, b, and c.
7721 1.1 joerg While
7722 1.1 joerg varDecl(hasInitializer(cxxConstructExpr()))
7723 1.1 joerg only match the declarations for b and c.
7724 1.1 joerg </pre></td></tr>
7725 1.1 joerg
7726 1.1 joerg
7727 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7728 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7729 1.1 joerg casts are stripped off.
7730 1.1 joerg
7731 1.1 joerg Implicit and non-C Style casts are also discarded.
7732 1.1 joerg Given
7733 1.1 joerg int a = 0;
7734 1.1 joerg char b = (0);
7735 1.1 joerg void* c = reinterpret_cast<char*>(0);
7736 1.1 joerg char d = char(0);
7737 1.1 joerg The matcher
7738 1.1 joerg varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7739 1.1 joerg would match the declarations for a, b, c, and d.
7740 1.1 joerg while
7741 1.1 joerg varDecl(hasInitializer(integerLiteral()))
7742 1.1 joerg only match the declaration for a.
7743 1.1 joerg </pre></td></tr>
7744 1.1 joerg
7745 1.1 joerg
7746 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7747 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7748 1.1 joerg parentheses are stripped off.
7749 1.1 joerg
7750 1.1 joerg Explicit casts are not discarded.
7751 1.1 joerg Given
7752 1.1 joerg int arr[5];
7753 1.1 joerg int a = 0;
7754 1.1 joerg char b = (0);
7755 1.1 joerg const int c = a;
7756 1.1 joerg int *d = (arr);
7757 1.1 joerg long e = ((long) 0l);
7758 1.1 joerg The matchers
7759 1.1 joerg varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7760 1.1 joerg varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7761 1.1 joerg would match the declarations for a, b, c, and d, but not e.
7762 1.1 joerg while
7763 1.1 joerg varDecl(hasInitializer(integerLiteral()))
7764 1.1 joerg varDecl(hasInitializer(declRefExpr()))
7765 1.1 joerg would only match the declaration for a.
7766 1.1 joerg </pre></td></tr>
7767 1.1 joerg
7768 1.1 joerg
7769 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7770 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7771 1.1 joerg
7772 1.1 joerg Given
7773 1.1 joerg const char* str = ("my-string");
7774 1.1 joerg The matcher
7775 1.1 joerg implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7776 1.1 joerg would match the implicit cast resulting from the assignment.
7777 1.1 joerg </pre></td></tr>
7778 1.1 joerg
7779 1.1 joerg
7780 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7781 1.1 joerg <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7782 1.1 joerg
7783 1.1 joerg Given
7784 1.1 joerg class C {
7785 1.1 joerg int a = 2;
7786 1.1 joerg int b = 3;
7787 1.1 joerg int c;
7788 1.1 joerg };
7789 1.1 joerg fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7790 1.1 joerg matches 'int a;' but not 'int b;'.
7791 1.1 joerg fieldDecl(hasInClassInitializer(anything()))
7792 1.1 joerg matches 'int a;' and 'int b;' but not 'int c;'.
7793 1.1 joerg </pre></td></tr>
7794 1.1 joerg
7795 1.1 joerg
7796 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7797 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7798 1.1 joerg
7799 1.1 joerg
7800 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7801 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7802 1.1 joerg switch statement or conditional operator.
7803 1.1 joerg
7804 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7805 1.1 joerg if (true) {}
7806 1.1 joerg </pre></td></tr>
7807 1.1 joerg
7808 1.1 joerg
7809 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7810 1.1 joerg <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7811 1.1 joerg
7812 1.1 joerg Example:
7813 1.1 joerg forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7814 1.1 joerg matches '++x' in
7815 1.1 joerg for (x; x < N; ++x) { }
7816 1.1 joerg </pre></td></tr>
7817 1.1 joerg
7818 1.1 joerg
7819 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7820 1.1 joerg <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7821 1.1 joerg
7822 1.1 joerg Example:
7823 1.1 joerg forStmt(hasLoopInit(declStmt()))
7824 1.1 joerg matches 'int x = 0' in
7825 1.1 joerg for (int x = 0; x < N; ++x) { }
7826 1.1 joerg </pre></td></tr>
7827 1.1 joerg
7828 1.1 joerg
7829 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7830 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7831 1.1 joerg declaration's type.
7832 1.1 joerg
7833 1.1 joerg In case of a value declaration (for example a variable declaration),
7834 1.1 joerg this resolves one layer of indirection. For example, in the value
7835 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7836 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7837 1.1 joerg declaration of x.
7838 1.1 joerg
7839 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7840 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7841 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
7842 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
7843 1.1.1.2 joerg cxxRecordDecl(hasName("X"))))
7844 1.1 joerg class X {};
7845 1.1 joerg void y(X &x) { x; X z; }
7846 1.1 joerg class Y { friend class X; };
7847 1.1.1.2 joerg class Z : public virtual X {};
7848 1.1 joerg
7849 1.1.1.2 joerg Example matches class Derived
7850 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7851 1.1.1.2 joerg class Base {};
7852 1.1.1.2 joerg class Derived : Base {};
7853 1.1.1.2 joerg
7854 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>,
7855 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
7856 1.1 joerg </pre></td></tr>
7857 1.1 joerg
7858 1.1 joerg
7859 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7860 1.1 joerg <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
7861 1.1 joerg matcher.
7862 1.1 joerg
7863 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7864 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7865 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
7866 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
7867 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
7868 1.1.1.2 joerg asString("class X")))
7869 1.1 joerg class X {};
7870 1.1 joerg void y(X &x) { x; X z; }
7871 1.1 joerg typedef int U;
7872 1.1 joerg class Y { friend class X; };
7873 1.1.1.2 joerg class Z : public virtual X {};
7874 1.1.1.2 joerg </pre></td></tr>
7875 1.1.1.2 joerg
7876 1.1.1.2 joerg
7877 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7878 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
7879 1.1.1.2 joerg Note that this matcher matches all the declarations of a function whose
7880 1.1.1.2 joerg body is present in the AST.
7881 1.1.1.2 joerg
7882 1.1.1.2 joerg Given
7883 1.1.1.2 joerg void f();
7884 1.1.1.2 joerg void f() {}
7885 1.1.1.2 joerg void g();
7886 1.1.1.2 joerg functionDecl(hasAnyBody(compoundStmt()))
7887 1.1.1.2 joerg matches both 'void f();'
7888 1.1.1.2 joerg and 'void f() {}'
7889 1.1.1.2 joerg with compoundStmt()
7890 1.1.1.2 joerg matching '{}'
7891 1.1.1.2 joerg but does not match 'void g();'
7892 1.1 joerg </pre></td></tr>
7893 1.1 joerg
7894 1.1 joerg
7895 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
7896 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
7897 1.1 joerg block.
7898 1.1 joerg
7899 1.1 joerg Does not match the 'this' parameter of a method.
7900 1.1 joerg
7901 1.1 joerg Given
7902 1.1 joerg class X { void f(int x, int y, int z) {} };
7903 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
7904 1.1 joerg matches f(int x, int y, int z) {}
7905 1.1 joerg with hasAnyParameter(...)
7906 1.1 joerg matching int y
7907 1.1 joerg
7908 1.1 joerg For ObjectiveC, given
7909 1.1 joerg @interface I - (void) f:(int) y; @end
7910 1.1 joerg
7911 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7912 1.1 joerg matches the declaration of method f with hasParameter
7913 1.1 joerg matching y.
7914 1.1 joerg
7915 1.1 joerg For blocks, given
7916 1.1 joerg b = ^(int y) { printf("%d", y) };
7917 1.1 joerg
7918 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
7919 1.1 joerg matches the declaration of the block b with hasParameter
7920 1.1 joerg matching y.
7921 1.1 joerg </pre></td></tr>
7922 1.1 joerg
7923 1.1 joerg
7924 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
7925 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7926 1.1 joerg functionDecl that have at least one TemplateArgument matching the given
7927 1.1 joerg InnerMatcher.
7928 1.1 joerg
7929 1.1 joerg Given
7930 1.1 joerg template<typename T> class A {};
7931 1.1 joerg template<> class A<double> {};
7932 1.1 joerg A<int> a;
7933 1.1 joerg
7934 1.1 joerg template<typename T> f() {};
7935 1.1 joerg void func() { f<int>(); };
7936 1.1 joerg
7937 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
7938 1.1 joerg refersToType(asString("int"))))
7939 1.1 joerg matches the specialization A<int>
7940 1.1 joerg
7941 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7942 1.1 joerg matches the specialization f<int>
7943 1.1 joerg </pre></td></tr>
7944 1.1 joerg
7945 1.1 joerg
7946 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7947 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
7948 1.1 joerg
7949 1.1 joerg
7950 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7951 1.1 joerg <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
7952 1.1 joerg declaration.
7953 1.1 joerg
7954 1.1 joerg Given
7955 1.1 joerg template<bool b>
7956 1.1 joerg struct S {
7957 1.1 joerg S(int); // #1
7958 1.1 joerg explicit S(double); // #2
7959 1.1 joerg operator int(); // #3
7960 1.1 joerg explicit operator bool(); // #4
7961 1.1 joerg explicit(false) S(bool) // # 7
7962 1.1 joerg explicit(true) S(char) // # 8
7963 1.1 joerg explicit(b) S(S) // # 9
7964 1.1 joerg };
7965 1.1 joerg S(int) -> S<true> // #5
7966 1.1 joerg explicit S(double) -> S<false> // #6
7967 1.1 joerg cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
7968 1.1 joerg cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
7969 1.1 joerg cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
7970 1.1 joerg </pre></td></tr>
7971 1.1 joerg
7972 1.1 joerg
7973 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
7974 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
7975 1.1 joerg declaration or a block.
7976 1.1 joerg
7977 1.1 joerg Given
7978 1.1 joerg class X { void f(int x) {} };
7979 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7980 1.1 joerg matches f(int x) {}
7981 1.1 joerg with hasParameter(...)
7982 1.1 joerg matching int x
7983 1.1 joerg
7984 1.1 joerg For ObjectiveC, given
7985 1.1 joerg @interface I - (void) f:(int) y; @end
7986 1.1 joerg
7987 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7988 1.1 joerg matches the declaration of method f with hasParameter
7989 1.1 joerg matching y.
7990 1.1 joerg </pre></td></tr>
7991 1.1 joerg
7992 1.1 joerg
7993 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
7994 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7995 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7996 1.1 joerg
7997 1.1 joerg Given
7998 1.1 joerg template<typename T, typename U> class A {};
7999 1.1 joerg A<bool, int> b;
8000 1.1 joerg A<int, bool> c;
8001 1.1 joerg
8002 1.1 joerg template<typename T> void f() {}
8003 1.1 joerg void func() { f<int>(); };
8004 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument(
8005 1.1 joerg 1, refersToType(asString("int"))))
8006 1.1 joerg matches the specialization A<bool, int>
8007 1.1 joerg
8008 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8009 1.1 joerg matches the specialization f<int>
8010 1.1 joerg </pre></td></tr>
8011 1.1 joerg
8012 1.1 joerg
8013 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8014 1.1 joerg <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8015 1.1 joerg
8016 1.1 joerg Given:
8017 1.1 joerg class X { int f() { return 1; } };
8018 1.1 joerg cxxMethodDecl(returns(asString("int")))
8019 1.1 joerg matches int f() { return 1; }
8020 1.1 joerg </pre></td></tr>
8021 1.1 joerg
8022 1.1 joerg
8023 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8024 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8025 1.1 joerg switch statement or conditional operator.
8026 1.1 joerg
8027 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8028 1.1 joerg if (true) {}
8029 1.1 joerg </pre></td></tr>
8030 1.1 joerg
8031 1.1 joerg
8032 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr>
8033 1.1 joerg <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8034 1.1 joerg
8035 1.1 joerg Given
8036 1.1 joerg if (A* a = GetAPointer()) {}
8037 1.1 joerg hasConditionVariableStatement(...)
8038 1.1 joerg matches 'A* a = GetAPointer()'.
8039 1.1 joerg </pre></td></tr>
8040 1.1 joerg
8041 1.1 joerg
8042 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
8043 1.1 joerg <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8044 1.1 joerg
8045 1.1 joerg Examples matches the if statement
8046 1.1 joerg (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8047 1.1 joerg if (false) false; else true;
8048 1.1 joerg </pre></td></tr>
8049 1.1 joerg
8050 1.1 joerg
8051 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasInitStatement0')"><a name="hasInitStatement0Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
8052 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8053 1.1.1.2 joerg
8054 1.1.1.2 joerg Given:
8055 1.1.1.2 joerg void foo() {
8056 1.1.1.2 joerg if (int i = foobar(); i > 0) {}
8057 1.1.1.2 joerg switch (int i = foobar(); i) {}
8058 1.1.1.2 joerg for (auto& a = get_range(); auto& x : a) {}
8059 1.1.1.2 joerg }
8060 1.1.1.2 joerg void bar() {
8061 1.1.1.2 joerg if (foobar() > 0) {}
8062 1.1.1.2 joerg switch (foobar()) {}
8063 1.1.1.2 joerg for (auto& x : get_range()) {}
8064 1.1.1.2 joerg }
8065 1.1.1.2 joerg ifStmt(hasInitStatement(anything()))
8066 1.1.1.2 joerg matches the if statement in foo but not in bar.
8067 1.1.1.2 joerg switchStmt(hasInitStatement(anything()))
8068 1.1.1.2 joerg matches the switch statement in foo but not in bar.
8069 1.1.1.2 joerg cxxForRangeStmt(hasInitStatement(anything()))
8070 1.1.1.2 joerg matches the range for statement in foo but not in bar.
8071 1.1.1.2 joerg </pre></td></tr>
8072 1.1.1.2 joerg
8073 1.1.1.2 joerg
8074 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
8075 1.1 joerg <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8076 1.1 joerg
8077 1.1 joerg Examples matches the if statement
8078 1.1 joerg (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8079 1.1 joerg if (false) true; else false;
8080 1.1 joerg </pre></td></tr>
8081 1.1 joerg
8082 1.1 joerg
8083 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>></td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8084 1.1 joerg <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8085 1.1 joerg matcher.
8086 1.1 joerg
8087 1.1 joerg FIXME: Unit test this matcher
8088 1.1 joerg </pre></td></tr>
8089 1.1 joerg
8090 1.1 joerg
8091 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8092 1.1 joerg <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8093 1.1 joerg
8094 1.1 joerg Example matches y.
8095 1.1 joerg (matcher = initListExpr(hasInit(0, expr())))
8096 1.1 joerg int x{y}.
8097 1.1 joerg </pre></td></tr>
8098 1.1 joerg
8099 1.1 joerg
8100 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8101 1.1 joerg <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8102 1.1 joerg (if expression have it).
8103 1.1 joerg </pre></td></tr>
8104 1.1 joerg
8105 1.1 joerg
8106 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8107 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8108 1.1 joerg matches the given matcher.
8109 1.1 joerg
8110 1.1 joerg The associated declaration is:
8111 1.1 joerg - for type nodes, the declaration of the underlying type
8112 1.1 joerg - for CallExpr, the declaration of the callee
8113 1.1 joerg - for MemberExpr, the declaration of the referenced member
8114 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
8115 1.1 joerg - for CXXNewExpr, the declaration of the operator new
8116 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
8117 1.1 joerg
8118 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
8119 1.1 joerg sugared type. Given
8120 1.1 joerg class X {};
8121 1.1 joerg typedef X Y;
8122 1.1 joerg Y y;
8123 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8124 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
8125 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8126 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
8127 1.1 joerg recordType(hasDeclaration(decl())))))
8128 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
8129 1.1 joerg
8130 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
8131 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
8132 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
8133 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
8134 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
8135 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
8136 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8137 1.1 joerg </pre></td></tr>
8138 1.1 joerg
8139 1.1 joerg
8140 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8141 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8142 1.1 joerg matches the given matcher.
8143 1.1 joerg
8144 1.1 joerg The associated declaration is:
8145 1.1 joerg - for type nodes, the declaration of the underlying type
8146 1.1 joerg - for CallExpr, the declaration of the callee
8147 1.1 joerg - for MemberExpr, the declaration of the referenced member
8148 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
8149 1.1 joerg - for CXXNewExpr, the declaration of the operator new
8150 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
8151 1.1 joerg
8152 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
8153 1.1 joerg sugared type. Given
8154 1.1 joerg class X {};
8155 1.1 joerg typedef X Y;
8156 1.1 joerg Y y;
8157 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8158 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
8159 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8160 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
8161 1.1 joerg recordType(hasDeclaration(decl())))))
8162 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
8163 1.1 joerg
8164 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
8165 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
8166 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
8167 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
8168 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
8169 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
8170 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8171 1.1 joerg </pre></td></tr>
8172 1.1 joerg
8173 1.1 joerg
8174 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>> InnerMatcher</td></tr>
8175 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
8176 1.1.1.2 joerg
8177 1.1.1.2 joerg Given
8178 1.1.1.2 joerg struct foo {
8179 1.1.1.2 joerg void bar() {
8180 1.1.1.2 joerg auto f = [this](){};
8181 1.1.1.2 joerg }
8182 1.1.1.2 joerg }
8183 1.1.1.2 joerg lambdaExpr(hasAnyCapture(cxxThisExpr()))
8184 1.1.1.2 joerg matches [this](){};
8185 1.1.1.2 joerg </pre></td></tr>
8186 1.1.1.2 joerg
8187 1.1.1.2 joerg
8188 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr>
8189 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
8190 1.1.1.2 joerg
8191 1.1.1.2 joerg Given
8192 1.1.1.2 joerg void foo() {
8193 1.1.1.2 joerg int x;
8194 1.1.1.2 joerg auto f = [x](){};
8195 1.1.1.2 joerg }
8196 1.1.1.2 joerg lambdaExpr(hasAnyCapture(anything()))
8197 1.1.1.2 joerg matches [x](){};
8198 1.1.1.2 joerg </pre></td></tr>
8199 1.1.1.2 joerg
8200 1.1.1.2 joerg
8201 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8202 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8203 1.1 joerg matches the given matcher.
8204 1.1 joerg
8205 1.1 joerg The associated declaration is:
8206 1.1 joerg - for type nodes, the declaration of the underlying type
8207 1.1 joerg - for CallExpr, the declaration of the callee
8208 1.1 joerg - for MemberExpr, the declaration of the referenced member
8209 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
8210 1.1 joerg - for CXXNewExpr, the declaration of the operator new
8211 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
8212 1.1 joerg
8213 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
8214 1.1 joerg sugared type. Given
8215 1.1 joerg class X {};
8216 1.1 joerg typedef X Y;
8217 1.1 joerg Y y;
8218 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8219 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
8220 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8221 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
8222 1.1 joerg recordType(hasDeclaration(decl())))))
8223 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
8224 1.1 joerg
8225 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
8226 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
8227 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
8228 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
8229 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
8230 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
8231 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8232 1.1 joerg </pre></td></tr>
8233 1.1 joerg
8234 1.1 joerg
8235 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8236 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8237 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches
8238 1.1 joerg use of implicit `this`.
8239 1.1 joerg
8240 1.1 joerg Given
8241 1.1 joerg struct X {
8242 1.1 joerg int m;
8243 1.1 joerg int f(X x) { x.m; return m; }
8244 1.1 joerg };
8245 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8246 1.1 joerg matches `x.m`, but not `m`; however,
8247 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo(
8248 1.1 joerg cxxRecordDecl(hasName("X"))))))
8249 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`.
8250 1.1 joerg </pre></td></tr>
8251 1.1 joerg
8252 1.1 joerg
8253 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr>
8254 1.1 joerg <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8255 1.1 joerg given matcher.
8256 1.1 joerg
8257 1.1 joerg Given
8258 1.1 joerg struct { int first, second; } first, second;
8259 1.1 joerg int i(second.first);
8260 1.1 joerg int j(first.second);
8261 1.1 joerg memberExpr(member(hasName("first")))
8262 1.1 joerg matches second.first
8263 1.1 joerg but not first.second (because the member name there is "second").
8264 1.1 joerg </pre></td></tr>
8265 1.1 joerg
8266 1.1 joerg
8267 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>></td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
8268 1.1 joerg <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8269 1.1 joerg pointee matches a given matcher.
8270 1.1 joerg
8271 1.1 joerg Given
8272 1.1 joerg int *a;
8273 1.1 joerg int const *b;
8274 1.1 joerg float const *f;
8275 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
8276 1.1 joerg matches "int const *b"
8277 1.1 joerg
8278 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
8279 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
8280 1.1 joerg </pre></td></tr>
8281 1.1 joerg
8282 1.1 joerg
8283 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr>
8284 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8285 1.1 joerg matcher.
8286 1.1 joerg
8287 1.1 joerg Given
8288 1.1 joerg namespace N { template<class T> void f(T t); }
8289 1.1 joerg template <class T> void g() { using N::f; f(T()); }
8290 1.1 joerg unresolvedLookupExpr(hasAnyDeclaration(
8291 1.1 joerg namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8292 1.1 joerg matches the use of f in g() .
8293 1.1 joerg </pre></td></tr>
8294 1.1 joerg
8295 1.1 joerg
8296 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr>
8297 1.1 joerg <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8298 1.1 joerg
8299 1.1 joerg Given
8300 1.1 joerg struct A { struct B { struct C {}; }; };
8301 1.1 joerg A::B::C c;
8302 1.1 joerg nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8303 1.1 joerg matches "A::"
8304 1.1 joerg </pre></td></tr>
8305 1.1 joerg
8306 1.1 joerg
8307 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr>
8308 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8309 1.1.1.2 joerg NestedNameSpecifier-matcher matches.
8310 1.1.1.2 joerg </pre></td></tr>
8311 1.1.1.2 joerg
8312 1.1.1.2 joerg
8313 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr>
8314 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8315 1.1 joerg given TypeLoc.
8316 1.1 joerg
8317 1.1 joerg Given
8318 1.1 joerg struct A { struct B { struct C {}; }; };
8319 1.1 joerg A::B::C c;
8320 1.1 joerg nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8321 1.1 joerg hasDeclaration(cxxRecordDecl(hasName("A")))))))
8322 1.1 joerg matches "A::"
8323 1.1 joerg </pre></td></tr>
8324 1.1 joerg
8325 1.1 joerg
8326 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr>
8327 1.1 joerg <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8328 1.1 joerg
8329 1.1 joerg Given
8330 1.1 joerg struct A { struct B { struct C {}; }; };
8331 1.1 joerg A::B::C c;
8332 1.1 joerg nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8333 1.1 joerg matches "A::"
8334 1.1 joerg </pre></td></tr>
8335 1.1 joerg
8336 1.1 joerg
8337 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr>
8338 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8339 1.1 joerg given namespace matcher.
8340 1.1 joerg
8341 1.1 joerg Given
8342 1.1 joerg namespace ns { struct A {}; }
8343 1.1 joerg ns::A a;
8344 1.1 joerg nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8345 1.1 joerg matches "ns::"
8346 1.1 joerg </pre></td></tr>
8347 1.1 joerg
8348 1.1 joerg
8349 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8350 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8351 1.1 joerg given QualType matcher without qualifiers.
8352 1.1 joerg
8353 1.1 joerg Given
8354 1.1 joerg struct A { struct B { struct C {}; }; };
8355 1.1 joerg A::B::C c;
8356 1.1 joerg nestedNameSpecifier(specifiesType(
8357 1.1 joerg hasDeclaration(cxxRecordDecl(hasName("A")))
8358 1.1 joerg ))
8359 1.1 joerg matches "A::"
8360 1.1 joerg </pre></td></tr>
8361 1.1 joerg
8362 1.1 joerg
8363 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>> InnerMatcher</td></tr>
8364 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8365 1.1 joerg
8366 1.1 joerg Given
8367 1.1 joerg
8368 1.1 joerg #pragma omp parallel
8369 1.1 joerg #pragma omp parallel default(none)
8370 1.1 joerg
8371 1.1 joerg ``ompExecutableDirective(hasAnyClause(anything()))`` matches
8372 1.1 joerg ``omp parallel default(none)``.
8373 1.1 joerg </pre></td></tr>
8374 1.1 joerg
8375 1.1 joerg
8376 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
8377 1.1 joerg <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8378 1.1 joerg
8379 1.1 joerg Prerequisite: the executable directive must not be standalone directive.
8380 1.1 joerg If it is, it will never match.
8381 1.1 joerg
8382 1.1 joerg Given
8383 1.1 joerg
8384 1.1 joerg #pragma omp parallel
8385 1.1 joerg ;
8386 1.1 joerg #pragma omp parallel
8387 1.1 joerg {}
8388 1.1 joerg
8389 1.1 joerg ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8390 1.1 joerg </pre></td></tr>
8391 1.1 joerg
8392 1.1 joerg
8393 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
8394 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8395 1.1 joerg matching Base, or Objective-C classes that directly or indirectly
8396 1.1 joerg subclass a class matching Base.
8397 1.1 joerg
8398 1.1 joerg Note that a class is not considered to be derived from itself.
8399 1.1 joerg
8400 1.1 joerg Example matches Y, Z, C (Base == hasName("X"))
8401 1.1 joerg class X;
8402 1.1 joerg class Y : public X {}; // directly derived
8403 1.1 joerg class Z : public Y {}; // indirectly derived
8404 1.1 joerg typedef X A;
8405 1.1 joerg typedef A B;
8406 1.1 joerg class C : public B {}; // derived from a typedef of X
8407 1.1 joerg
8408 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
8409 1.1 joerg class Foo;
8410 1.1 joerg typedef Foo X;
8411 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
8412 1.1 joerg
8413 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8414 1.1 joerg @interface NSObject @end
8415 1.1 joerg @interface Bar : NSObject @end
8416 1.1 joerg
8417 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>
8418 1.1 joerg </pre></td></tr>
8419 1.1 joerg
8420 1.1 joerg
8421 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
8422 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8423 1.1 joerg matching Base.
8424 1.1 joerg
8425 1.1 joerg Note that a class is not considered to be derived from itself.
8426 1.1 joerg
8427 1.1 joerg Example matches Y, C (Base == hasName("X"))
8428 1.1 joerg class X;
8429 1.1 joerg class Y : public X {}; // directly derived
8430 1.1 joerg class Z : public Y {}; // indirectly derived
8431 1.1 joerg typedef X A;
8432 1.1 joerg typedef A B;
8433 1.1 joerg class C : public B {}; // derived from a typedef of X
8434 1.1 joerg
8435 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
8436 1.1 joerg class Foo;
8437 1.1 joerg typedef Foo X;
8438 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
8439 1.1 joerg </pre></td></tr>
8440 1.1 joerg
8441 1.1 joerg
8442 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
8443 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8444 1.1 joerg match Base.
8445 1.1 joerg </pre></td></tr>
8446 1.1 joerg
8447 1.1 joerg
8448 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8449 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8450 1.1 joerg expression, or an ObjC-message-send expression.
8451 1.1 joerg
8452 1.1 joerg Given
8453 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
8454 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
8455 1.1 joerg matches x(1, y, 42)
8456 1.1 joerg with hasAnyArgument(...)
8457 1.1 joerg matching y
8458 1.1 joerg
8459 1.1 joerg For ObjectiveC, given
8460 1.1 joerg @interface I - (void) f:(int) y; @end
8461 1.1 joerg void foo(I *i) { [i f:12]; }
8462 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8463 1.1 joerg matches [i f:12]
8464 1.1 joerg </pre></td></tr>
8465 1.1 joerg
8466 1.1 joerg
8467 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument3')"><a name="hasArgument3Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8468 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8469 1.1 joerg call expression.
8470 1.1 joerg
8471 1.1 joerg Example matches y in x(y)
8472 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr())))
8473 1.1 joerg void x(int) { int y; x(y); }
8474 1.1 joerg </pre></td></tr>
8475 1.1 joerg
8476 1.1 joerg
8477 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8478 1.1 joerg <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8479 1.1 joerg and the inner matcher matches on that instance.
8480 1.1 joerg
8481 1.1 joerg For example the method call in
8482 1.1 joerg NSString *x = @"hello";
8483 1.1 joerg [x containsString:@"h"];
8484 1.1 joerg is matched by
8485 1.1 joerg objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8486 1.1 joerg </pre></td></tr>
8487 1.1 joerg
8488 1.1 joerg
8489 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8490 1.1 joerg <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8491 1.1 joerg
8492 1.1 joerg Example
8493 1.1 joerg matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8494 1.1 joerg matches the [webView ...] message invocation.
8495 1.1 joerg NSString *webViewJavaScript = ...
8496 1.1 joerg UIWebView *webView = ...
8497 1.1 joerg [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8498 1.1 joerg </pre></td></tr>
8499 1.1 joerg
8500 1.1 joerg
8501 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
8502 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8503 1.1 joerg block.
8504 1.1 joerg
8505 1.1 joerg Does not match the 'this' parameter of a method.
8506 1.1 joerg
8507 1.1 joerg Given
8508 1.1 joerg class X { void f(int x, int y, int z) {} };
8509 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
8510 1.1 joerg matches f(int x, int y, int z) {}
8511 1.1 joerg with hasAnyParameter(...)
8512 1.1 joerg matching int y
8513 1.1 joerg
8514 1.1 joerg For ObjectiveC, given
8515 1.1 joerg @interface I - (void) f:(int) y; @end
8516 1.1 joerg
8517 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8518 1.1 joerg matches the declaration of method f with hasParameter
8519 1.1 joerg matching y.
8520 1.1 joerg
8521 1.1 joerg For blocks, given
8522 1.1 joerg b = ^(int y) { printf("%d", y) };
8523 1.1 joerg
8524 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
8525 1.1 joerg matches the declaration of the block b with hasParameter
8526 1.1 joerg matching y.
8527 1.1 joerg </pre></td></tr>
8528 1.1 joerg
8529 1.1 joerg
8530 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
8531 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8532 1.1 joerg declaration or a block.
8533 1.1 joerg
8534 1.1 joerg Given
8535 1.1 joerg class X { void f(int x) {} };
8536 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8537 1.1 joerg matches f(int x) {}
8538 1.1 joerg with hasParameter(...)
8539 1.1 joerg matching int x
8540 1.1 joerg
8541 1.1 joerg For ObjectiveC, given
8542 1.1 joerg @interface I - (void) f:(int) y; @end
8543 1.1 joerg
8544 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8545 1.1 joerg matches the declaration of method f with hasParameter
8546 1.1 joerg matching y.
8547 1.1 joerg </pre></td></tr>
8548 1.1 joerg
8549 1.1 joerg
8550 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
8551 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8552 1.1.1.2 joerg
8553 1.1.1.2 joerg Examples:
8554 1.1.1.2 joerg int x;
8555 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
8556 1.1.1.2 joerg matches int x
8557 1.1.1.2 joerg
8558 1.1.1.2 joerg auto x = int(3);
8559 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8560 1.1.1.2 joerg matches int(3)
8561 1.1.1.2 joerg
8562 1.1.1.2 joerg struct Foo { Foo(int, int); };
8563 1.1.1.2 joerg auto x = Foo(1, 2);
8564 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8565 1.1.1.2 joerg matches Foo(1, 2)
8566 1.1.1.2 joerg
8567 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
8568 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
8569 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
8570 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
8571 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
8572 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
8573 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
8574 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
8575 1.1.1.2 joerg </pre></td></tr>
8576 1.1.1.2 joerg
8577 1.1.1.2 joerg
8578 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8579 1.1 joerg <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8580 1.1 joerg or opaque value's source expression matches the given matcher.
8581 1.1 joerg
8582 1.1 joerg Example 1: matches "a string"
8583 1.1 joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8584 1.1 joerg class URL { URL(string); };
8585 1.1 joerg URL url = "a string";
8586 1.1 joerg
8587 1.1 joerg Example 2: matches 'b' (matcher =
8588 1.1 joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8589 1.1 joerg int a = b ?: 1;
8590 1.1 joerg </pre></td></tr>
8591 1.1 joerg
8592 1.1 joerg
8593 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>></td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8594 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8595 1.1 joerg overloads matches the given matcher.
8596 1.1 joerg
8597 1.1 joerg Given
8598 1.1 joerg template <typename T> void foo(T);
8599 1.1 joerg template <typename T> void bar(T);
8600 1.1 joerg template <typename T> void baz(T t) {
8601 1.1 joerg foo(t);
8602 1.1 joerg bar(t);
8603 1.1 joerg }
8604 1.1 joerg unresolvedLookupExpr(hasAnyDeclaration(
8605 1.1 joerg functionTemplateDecl(hasName("foo"))))
8606 1.1 joerg matches foo in foo(t); but not bar in bar(t);
8607 1.1 joerg </pre></td></tr>
8608 1.1 joerg
8609 1.1 joerg
8610 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>></td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
8611 1.1 joerg <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8612 1.1 joerg
8613 1.1 joerg Given
8614 1.1 joerg int (*ptr_to_array)[4];
8615 1.1 joerg int (*ptr_to_func)(int);
8616 1.1 joerg
8617 1.1 joerg varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8618 1.1 joerg ptr_to_func but not ptr_to_array.
8619 1.1 joerg
8620 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>
8621 1.1 joerg </pre></td></tr>
8622 1.1 joerg
8623 1.1 joerg
8624 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>></td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
8625 1.1 joerg <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8626 1.1 joerg pointee matches a given matcher.
8627 1.1 joerg
8628 1.1 joerg Given
8629 1.1 joerg int *a;
8630 1.1 joerg int const *b;
8631 1.1 joerg float const *f;
8632 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
8633 1.1 joerg matches "int const *b"
8634 1.1 joerg
8635 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
8636 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
8637 1.1 joerg </pre></td></tr>
8638 1.1 joerg
8639 1.1 joerg
8640 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8641 1.1 joerg <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8642 1.1 joerg
8643 1.1 joerg Given:
8644 1.1 joerg typedef int &int_ref;
8645 1.1 joerg int a;
8646 1.1 joerg int_ref b = a;
8647 1.1 joerg
8648 1.1 joerg varDecl(hasType(qualType(referenceType()))))) will not match the
8649 1.1 joerg declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8650 1.1 joerg </pre></td></tr>
8651 1.1 joerg
8652 1.1 joerg
8653 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8654 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8655 1.1 joerg matches the given matcher.
8656 1.1 joerg
8657 1.1 joerg The associated declaration is:
8658 1.1 joerg - for type nodes, the declaration of the underlying type
8659 1.1 joerg - for CallExpr, the declaration of the callee
8660 1.1 joerg - for MemberExpr, the declaration of the referenced member
8661 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
8662 1.1 joerg - for CXXNewExpr, the declaration of the operator new
8663 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
8664 1.1 joerg
8665 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
8666 1.1 joerg sugared type. Given
8667 1.1 joerg class X {};
8668 1.1 joerg typedef X Y;
8669 1.1 joerg Y y;
8670 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8671 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
8672 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8673 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
8674 1.1 joerg recordType(hasDeclaration(decl())))))
8675 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
8676 1.1 joerg
8677 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
8678 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
8679 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
8680 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
8681 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
8682 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
8683 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8684 1.1 joerg </pre></td></tr>
8685 1.1 joerg
8686 1.1 joerg
8687 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8688 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8689 1.1 joerg
8690 1.1 joerg Given
8691 1.1 joerg void (*fp)(void);
8692 1.1 joerg The matcher
8693 1.1 joerg varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8694 1.1 joerg would match the declaration for fp.
8695 1.1 joerg </pre></td></tr>
8696 1.1 joerg
8697 1.1 joerg
8698 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8699 1.1 joerg <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8700 1.1 joerg </pre></td></tr>
8701 1.1 joerg
8702 1.1 joerg
8703 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8704 1.1 joerg <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8705 1.1 joerg matches the specified matcher.
8706 1.1 joerg
8707 1.1 joerg Example matches y->x()
8708 1.1 joerg (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8709 1.1 joerg cxxRecordDecl(hasName("Y")))))))
8710 1.1 joerg class Y { public: void x(); };
8711 1.1 joerg void z() { Y *y; y->x(); }
8712 1.1 joerg </pre></td></tr>
8713 1.1 joerg
8714 1.1 joerg
8715 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8716 1.1 joerg <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8717 1.1 joerg </pre></td></tr>
8718 1.1 joerg
8719 1.1 joerg
8720 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
8721 1.1 joerg <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8722 1.1 joerg type matches the specified matcher.
8723 1.1 joerg
8724 1.1 joerg Example matches X &x and const X &y
8725 1.1 joerg (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8726 1.1 joerg class X {
8727 1.1 joerg void a(X b) {
8728 1.1 joerg X &x = b;
8729 1.1 joerg const X &y = b;
8730 1.1 joerg }
8731 1.1 joerg };
8732 1.1 joerg </pre></td></tr>
8733 1.1 joerg
8734 1.1 joerg
8735 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>></td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8736 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8737 1.1 joerg matches the given matcher.
8738 1.1 joerg
8739 1.1 joerg The associated declaration is:
8740 1.1 joerg - for type nodes, the declaration of the underlying type
8741 1.1 joerg - for CallExpr, the declaration of the callee
8742 1.1 joerg - for MemberExpr, the declaration of the referenced member
8743 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
8744 1.1 joerg - for CXXNewExpr, the declaration of the operator new
8745 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
8746 1.1 joerg
8747 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
8748 1.1 joerg sugared type. Given
8749 1.1 joerg class X {};
8750 1.1 joerg typedef X Y;
8751 1.1 joerg Y y;
8752 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8753 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
8754 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8755 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
8756 1.1 joerg recordType(hasDeclaration(decl())))))
8757 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
8758 1.1 joerg
8759 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
8760 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
8761 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
8762 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
8763 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
8764 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
8765 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8766 1.1 joerg </pre></td></tr>
8767 1.1 joerg
8768 1.1 joerg
8769 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>></td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
8770 1.1 joerg <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
8771 1.1 joerg pointee matches a given matcher.
8772 1.1 joerg
8773 1.1 joerg Given
8774 1.1 joerg int *a;
8775 1.1 joerg int const *b;
8776 1.1 joerg float const *f;
8777 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
8778 1.1 joerg matches "int const *b"
8779 1.1 joerg
8780 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
8781 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
8782 1.1 joerg </pre></td></tr>
8783 1.1 joerg
8784 1.1 joerg
8785 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>></td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8786 1.1 joerg <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
8787 1.1 joerg
8788 1.1 joerg Given
8789 1.1 joerg return a + b;
8790 1.1 joerg hasReturnValue(binaryOperator())
8791 1.1 joerg matches 'return a + b'
8792 1.1 joerg with binaryOperator()
8793 1.1 joerg matching 'a + b'
8794 1.1 joerg </pre></td></tr>
8795 1.1 joerg
8796 1.1 joerg
8797 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
8798 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
8799 1.1 joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8800 1.1 joerg
8801 1.1 joerg Given
8802 1.1 joerg { {}; 1+2; }
8803 1.1 joerg hasAnySubstatement(compoundStmt())
8804 1.1 joerg matches '{ {}; 1+2; }'
8805 1.1 joerg with compoundStmt()
8806 1.1 joerg matching '{}'
8807 1.1 joerg </pre></td></tr>
8808 1.1 joerg
8809 1.1 joerg
8810 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr>
8811 1.1 joerg <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8812 1.1 joerg alignof.
8813 1.1 joerg </pre></td></tr>
8814 1.1 joerg
8815 1.1 joerg
8816 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8817 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
8818 1.1.1.2 joerg belongs to.
8819 1.1.1.2 joerg
8820 1.1.1.2 joerg Given:
8821 1.1.1.2 joerg F& operator=(const F& o) {
8822 1.1.1.2 joerg std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
8823 1.1.1.2 joerg return *this;
8824 1.1.1.2 joerg }
8825 1.1.1.2 joerg returnStmt(forCallable(functionDecl(hasName("operator="))))
8826 1.1.1.2 joerg matches 'return *this'
8827 1.1.1.2 joerg but does not match 'return v > 0'
8828 1.1.1.2 joerg
8829 1.1.1.2 joerg Given:
8830 1.1.1.2 joerg -(void) foo {
8831 1.1.1.2 joerg int x = 1;
8832 1.1.1.2 joerg dispatch_sync(queue, ^{ int y = 2; });
8833 1.1.1.2 joerg }
8834 1.1.1.2 joerg declStmt(forCallable(objcMethodDecl()))
8835 1.1.1.2 joerg matches 'int x = 1'
8836 1.1.1.2 joerg but does not match 'int y = 2'.
8837 1.1.1.2 joerg whereas declStmt(forCallable(blockDecl()))
8838 1.1.1.2 joerg matches 'int y = 2'
8839 1.1.1.2 joerg but does not match 'int x = 1'.
8840 1.1.1.2 joerg </pre></td></tr>
8841 1.1.1.2 joerg
8842 1.1.1.2 joerg
8843 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr>
8844 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
8845 1.1.1.2 joerg
8846 1.1.1.2 joerg Deprecated. Use forCallable() to correctly handle the situation when
8847 1.1.1.2 joerg the declaration is not a function (but a block or an Objective-C method).
8848 1.1.1.2 joerg forFunction() not only fails to take non-functions into account but also
8849 1.1.1.2 joerg may match the wrong declaration in their presence.
8850 1.1 joerg
8851 1.1 joerg Given:
8852 1.1 joerg F& operator=(const F& o) {
8853 1.1 joerg std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
8854 1.1 joerg return *this;
8855 1.1 joerg }
8856 1.1 joerg returnStmt(forFunction(hasName("operator=")))
8857 1.1 joerg matches 'return *this'
8858 1.1 joerg but does not match 'return v > 0'
8859 1.1 joerg </pre></td></tr>
8860 1.1 joerg
8861 1.1 joerg
8862 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr>
8863 1.1 joerg <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8864 1.1 joerg sizeof.
8865 1.1 joerg </pre></td></tr>
8866 1.1 joerg
8867 1.1 joerg
8868 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
8869 1.1 joerg <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
8870 1.1 joerg type that matches the provided matcher.
8871 1.1 joerg
8872 1.1 joerg Given
8873 1.1 joerg template <typename T>
8874 1.1 joerg double F(T t);
8875 1.1 joerg int i;
8876 1.1 joerg double j = F(i);
8877 1.1 joerg
8878 1.1 joerg substTemplateTypeParmType(hasReplacementType(type())) matches int
8879 1.1 joerg </pre></td></tr>
8880 1.1 joerg
8881 1.1 joerg
8882 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr>
8883 1.1 joerg <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
8884 1.1 joerg statement. This matcher may produce multiple matches.
8885 1.1 joerg
8886 1.1 joerg Given
8887 1.1 joerg switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
8888 1.1 joerg switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
8889 1.1 joerg matches four times, with "c" binding each of "case 1:", "case 2:",
8890 1.1 joerg "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
8891 1.1 joerg "switch (1)", "switch (2)" and "switch (2)".
8892 1.1 joerg </pre></td></tr>
8893 1.1 joerg
8894 1.1 joerg
8895 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8896 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
8897 1.1 joerg switch statement or conditional operator.
8898 1.1 joerg
8899 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8900 1.1 joerg if (true) {}
8901 1.1 joerg </pre></td></tr>
8902 1.1 joerg
8903 1.1 joerg
8904 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
8905 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
8906 1.1.1.2 joerg
8907 1.1.1.2 joerg Given:
8908 1.1.1.2 joerg void foo() {
8909 1.1.1.2 joerg if (int i = foobar(); i > 0) {}
8910 1.1.1.2 joerg switch (int i = foobar(); i) {}
8911 1.1.1.2 joerg for (auto& a = get_range(); auto& x : a) {}
8912 1.1.1.2 joerg }
8913 1.1.1.2 joerg void bar() {
8914 1.1.1.2 joerg if (foobar() > 0) {}
8915 1.1.1.2 joerg switch (foobar()) {}
8916 1.1.1.2 joerg for (auto& x : get_range()) {}
8917 1.1.1.2 joerg }
8918 1.1.1.2 joerg ifStmt(hasInitStatement(anything()))
8919 1.1.1.2 joerg matches the if statement in foo but not in bar.
8920 1.1.1.2 joerg switchStmt(hasInitStatement(anything()))
8921 1.1.1.2 joerg matches the switch statement in foo but not in bar.
8922 1.1.1.2 joerg cxxForRangeStmt(hasInitStatement(anything()))
8923 1.1.1.2 joerg matches the range for statement in foo but not in bar.
8924 1.1.1.2 joerg </pre></td></tr>
8925 1.1.1.2 joerg
8926 1.1.1.2 joerg
8927 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>></td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
8928 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
8929 1.1 joerg matches the given matcher.
8930 1.1 joerg
8931 1.1 joerg The associated declaration is:
8932 1.1 joerg - for type nodes, the declaration of the underlying type
8933 1.1 joerg - for CallExpr, the declaration of the callee
8934 1.1 joerg - for MemberExpr, the declaration of the referenced member
8935 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
8936 1.1 joerg - for CXXNewExpr, the declaration of the operator new
8937 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
8938 1.1 joerg
8939 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
8940 1.1 joerg sugared type. Given
8941 1.1 joerg class X {};
8942 1.1 joerg typedef X Y;
8943 1.1 joerg Y y;
8944 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8945 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
8946 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8947 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
8948 1.1 joerg recordType(hasDeclaration(decl())))))
8949 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
8950 1.1 joerg
8951 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
8952 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
8953 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
8954 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
8955 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
8956 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
8957 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8958 1.1 joerg </pre></td></tr>
8959 1.1 joerg
8960 1.1 joerg
8961 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
8962 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
8963 1.1.1.2 joerg
8964 1.1.1.2 joerg Examples:
8965 1.1.1.2 joerg int x;
8966 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
8967 1.1.1.2 joerg matches int x
8968 1.1.1.2 joerg
8969 1.1.1.2 joerg auto x = int(3);
8970 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8971 1.1.1.2 joerg matches int(3)
8972 1.1.1.2 joerg
8973 1.1.1.2 joerg struct Foo { Foo(int, int); };
8974 1.1.1.2 joerg auto x = Foo(1, 2);
8975 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8976 1.1.1.2 joerg matches Foo(1, 2)
8977 1.1.1.2 joerg
8978 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
8979 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
8980 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
8981 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
8982 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
8983 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
8984 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
8985 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
8986 1.1.1.2 joerg </pre></td></tr>
8987 1.1.1.2 joerg
8988 1.1.1.2 joerg
8989 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
8990 1.1 joerg <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
8991 1.1 joerg
8992 1.1 joerg Given
8993 1.1 joerg struct B { int next; };
8994 1.1 joerg template<int(B::*next_ptr)> struct A {};
8995 1.1 joerg A<&B::next> a;
8996 1.1 joerg templateSpecializationType(hasAnyTemplateArgument(
8997 1.1 joerg isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
8998 1.1 joerg matches the specialization A<&B::next> with fieldDecl(...) matching
8999 1.1 joerg B::next
9000 1.1 joerg </pre></td></tr>
9001 1.1 joerg
9002 1.1 joerg
9003 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
9004 1.1 joerg <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9005 1.1 joerg declaration.
9006 1.1 joerg
9007 1.1 joerg Given
9008 1.1 joerg struct B { int next; };
9009 1.1 joerg template<int(B::*next_ptr)> struct A {};
9010 1.1 joerg A<&B::next> a;
9011 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
9012 1.1 joerg refersToDeclaration(fieldDecl(hasName("next")))))
9013 1.1 joerg matches the specialization A<&B::next> with fieldDecl(...) matching
9014 1.1 joerg B::next
9015 1.1 joerg </pre></td></tr>
9016 1.1 joerg
9017 1.1 joerg
9018 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
9019 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9020 1.1 joerg
9021 1.1 joerg Given
9022 1.1 joerg template<int T> struct C {};
9023 1.1 joerg C<42> c;
9024 1.1 joerg classTemplateSpecializationDecl(
9025 1.1 joerg hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9026 1.1 joerg matches the implicit instantiation of C in C<42>.
9027 1.1 joerg </pre></td></tr>
9028 1.1 joerg
9029 1.1 joerg
9030 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>> InnerMatcher</td></tr>
9031 1.1 joerg <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9032 1.1 joerg
9033 1.1 joerg Given
9034 1.1 joerg template<template <typename> class S> class X {};
9035 1.1 joerg template<typename T> class Y {};
9036 1.1 joerg X<Y> xi;
9037 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
9038 1.1 joerg refersToTemplate(templateName())))
9039 1.1 joerg matches the specialization X<Y>
9040 1.1 joerg </pre></td></tr>
9041 1.1 joerg
9042 1.1 joerg
9043 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
9044 1.1 joerg <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9045 1.1 joerg
9046 1.1 joerg Given
9047 1.1 joerg struct X {};
9048 1.1 joerg template<typename T> struct A {};
9049 1.1 joerg A<X> a;
9050 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
9051 1.1 joerg refersToType(class(hasName("X")))))
9052 1.1 joerg matches the specialization A<X>
9053 1.1 joerg </pre></td></tr>
9054 1.1 joerg
9055 1.1 joerg
9056 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
9057 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9058 1.1 joerg functionDecl that have at least one TemplateArgument matching the given
9059 1.1 joerg InnerMatcher.
9060 1.1 joerg
9061 1.1 joerg Given
9062 1.1 joerg template<typename T> class A {};
9063 1.1 joerg template<> class A<double> {};
9064 1.1 joerg A<int> a;
9065 1.1 joerg
9066 1.1 joerg template<typename T> f() {};
9067 1.1 joerg void func() { f<int>(); };
9068 1.1 joerg
9069 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
9070 1.1 joerg refersToType(asString("int"))))
9071 1.1 joerg matches the specialization A<int>
9072 1.1 joerg
9073 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9074 1.1 joerg matches the specialization f<int>
9075 1.1 joerg </pre></td></tr>
9076 1.1 joerg
9077 1.1 joerg
9078 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
9079 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9080 1.1 joerg matches the given matcher.
9081 1.1 joerg
9082 1.1 joerg The associated declaration is:
9083 1.1 joerg - for type nodes, the declaration of the underlying type
9084 1.1 joerg - for CallExpr, the declaration of the callee
9085 1.1 joerg - for MemberExpr, the declaration of the referenced member
9086 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
9087 1.1 joerg - for CXXNewExpr, the declaration of the operator new
9088 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
9089 1.1 joerg
9090 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
9091 1.1 joerg sugared type. Given
9092 1.1 joerg class X {};
9093 1.1 joerg typedef X Y;
9094 1.1 joerg Y y;
9095 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9096 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
9097 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9098 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
9099 1.1 joerg recordType(hasDeclaration(decl())))))
9100 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
9101 1.1 joerg
9102 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
9103 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
9104 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
9105 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
9106 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
9107 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
9108 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9109 1.1 joerg </pre></td></tr>
9110 1.1 joerg
9111 1.1 joerg
9112 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
9113 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9114 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9115 1.1 joerg
9116 1.1 joerg Given
9117 1.1 joerg template<typename T, typename U> class A {};
9118 1.1 joerg A<bool, int> b;
9119 1.1 joerg A<int, bool> c;
9120 1.1 joerg
9121 1.1 joerg template<typename T> void f() {}
9122 1.1 joerg void func() { f<int>(); };
9123 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument(
9124 1.1 joerg 1, refersToType(asString("int"))))
9125 1.1 joerg matches the specialization A<bool, int>
9126 1.1 joerg
9127 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9128 1.1 joerg matches the specialization f<int>
9129 1.1 joerg </pre></td></tr>
9130 1.1 joerg
9131 1.1 joerg
9132 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
9133 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9134 1.1 joerg matches the given matcher.
9135 1.1 joerg
9136 1.1 joerg The associated declaration is:
9137 1.1 joerg - for type nodes, the declaration of the underlying type
9138 1.1 joerg - for CallExpr, the declaration of the callee
9139 1.1 joerg - for MemberExpr, the declaration of the referenced member
9140 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
9141 1.1 joerg - for CXXNewExpr, the declaration of the operator new
9142 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
9143 1.1 joerg
9144 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
9145 1.1 joerg sugared type. Given
9146 1.1 joerg class X {};
9147 1.1 joerg typedef X Y;
9148 1.1 joerg Y y;
9149 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9150 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
9151 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9152 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
9153 1.1 joerg recordType(hasDeclaration(decl())))))
9154 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
9155 1.1 joerg
9156 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
9157 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
9158 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
9159 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
9160 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
9161 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
9162 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9163 1.1 joerg </pre></td></tr>
9164 1.1 joerg
9165 1.1 joerg
9166 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
9167 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9168 1.1.1.2 joerg QualType-matcher matches.
9169 1.1.1.2 joerg </pre></td></tr>
9170 1.1 joerg
9171 1.1 joerg
9172 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
9173 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9174 1.1 joerg
9175 1.1.1.2 joerg Examples:
9176 1.1.1.2 joerg int x;
9177 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
9178 1.1.1.2 joerg matches int x
9179 1.1.1.2 joerg
9180 1.1.1.2 joerg auto x = int(3);
9181 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9182 1.1.1.2 joerg matches int(3)
9183 1.1.1.2 joerg
9184 1.1.1.2 joerg struct Foo { Foo(int, int); };
9185 1.1.1.2 joerg auto x = Foo(1, 2);
9186 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9187 1.1.1.2 joerg matches Foo(1, 2)
9188 1.1.1.2 joerg
9189 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>,
9190 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>,
9191 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>,
9192 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
9193 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>,
9194 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>,
9195 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>,
9196 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
9197 1.1 joerg </pre></td></tr>
9198 1.1 joerg
9199 1.1 joerg
9200 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
9201 1.1 joerg <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9202 1.1 joerg matcher.
9203 1.1 joerg
9204 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9205 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9206 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
9207 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
9208 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
9209 1.1.1.2 joerg asString("class X")))
9210 1.1 joerg class X {};
9211 1.1 joerg void y(X &x) { x; X z; }
9212 1.1 joerg typedef int U;
9213 1.1 joerg class Y { friend class X; };
9214 1.1.1.2 joerg class Z : public virtual X {};
9215 1.1 joerg </pre></td></tr>
9216 1.1 joerg
9217 1.1 joerg
9218 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>></td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
9219 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9220 1.1 joerg matches the given matcher.
9221 1.1 joerg
9222 1.1 joerg The associated declaration is:
9223 1.1 joerg - for type nodes, the declaration of the underlying type
9224 1.1 joerg - for CallExpr, the declaration of the callee
9225 1.1 joerg - for MemberExpr, the declaration of the referenced member
9226 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
9227 1.1 joerg - for CXXNewExpr, the declaration of the operator new
9228 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
9229 1.1 joerg
9230 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
9231 1.1 joerg sugared type. Given
9232 1.1 joerg class X {};
9233 1.1 joerg typedef X Y;
9234 1.1 joerg Y y;
9235 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9236 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
9237 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9238 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
9239 1.1 joerg recordType(hasDeclaration(decl())))))
9240 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
9241 1.1 joerg
9242 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
9243 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
9244 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
9245 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
9246 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
9247 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
9248 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9249 1.1 joerg </pre></td></tr>
9250 1.1 joerg
9251 1.1 joerg
9252 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>> InnerMatcher</td></tr>
9253 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9254 1.1 joerg type of the matched node.
9255 1.1 joerg
9256 1.1 joerg For example, in:
9257 1.1 joerg class A {};
9258 1.1 joerg using B = A;
9259 1.1 joerg The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9260 1.1 joerg both B and A.
9261 1.1 joerg </pre></td></tr>
9262 1.1 joerg
9263 1.1 joerg
9264 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
9265 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9266 1.1 joerg
9267 1.1 joerg Given
9268 1.1 joerg int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9269 1.1 joerg unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9270 1.1 joerg matches sizeof(a) and alignof(c)
9271 1.1 joerg </pre></td></tr>
9272 1.1 joerg
9273 1.1 joerg
9274 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
9275 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9276 1.1 joerg
9277 1.1 joerg Example matches true (matcher = hasUnaryOperand(
9278 1.1 joerg cxxBoolLiteral(equals(true))))
9279 1.1 joerg !true
9280 1.1 joerg </pre></td></tr>
9281 1.1 joerg
9282 1.1 joerg
9283 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
9284 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9285 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches
9286 1.1 joerg use of implicit `this`.
9287 1.1 joerg
9288 1.1 joerg Given
9289 1.1 joerg struct X {
9290 1.1 joerg int m;
9291 1.1 joerg int f(X x) { x.m; return m; }
9292 1.1 joerg };
9293 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9294 1.1 joerg matches `x.m`, but not `m`; however,
9295 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo(
9296 1.1 joerg cxxRecordDecl(hasName("X"))))))
9297 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`.
9298 1.1 joerg </pre></td></tr>
9299 1.1 joerg
9300 1.1 joerg
9301 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>></td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
9302 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9303 1.1 joerg matches the given matcher.
9304 1.1 joerg
9305 1.1 joerg The associated declaration is:
9306 1.1 joerg - for type nodes, the declaration of the underlying type
9307 1.1 joerg - for CallExpr, the declaration of the callee
9308 1.1 joerg - for MemberExpr, the declaration of the referenced member
9309 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
9310 1.1 joerg - for CXXNewExpr, the declaration of the operator new
9311 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
9312 1.1 joerg
9313 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
9314 1.1 joerg sugared type. Given
9315 1.1 joerg class X {};
9316 1.1 joerg typedef X Y;
9317 1.1 joerg Y y;
9318 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9319 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
9320 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9321 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
9322 1.1 joerg recordType(hasDeclaration(decl())))))
9323 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
9324 1.1 joerg
9325 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
9326 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
9327 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
9328 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
9329 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
9330 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
9331 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9332 1.1 joerg </pre></td></tr>
9333 1.1 joerg
9334 1.1 joerg
9335 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>></td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr>
9336 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
9337 1.1 joerg
9338 1.1 joerg Given
9339 1.1 joerg namespace X { void b(); }
9340 1.1 joerg using X::b;
9341 1.1 joerg usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
9342 1.1 joerg matches using X::b </pre></td></tr>
9343 1.1 joerg
9344 1.1 joerg
9345 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>></td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr>
9346 1.1 joerg <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9347 1.1 joerg matched by the given matcher.
9348 1.1 joerg
9349 1.1 joerg Given
9350 1.1 joerg namespace X { int a; void b(); }
9351 1.1 joerg using X::a;
9352 1.1 joerg using X::b;
9353 1.1 joerg usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9354 1.1 joerg matches using X::b but not using X::a </pre></td></tr>
9355 1.1 joerg
9356 1.1 joerg
9357 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
9358 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9359 1.1 joerg declaration's type.
9360 1.1 joerg
9361 1.1 joerg In case of a value declaration (for example a variable declaration),
9362 1.1 joerg this resolves one layer of indirection. For example, in the value
9363 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9364 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9365 1.1 joerg declaration of x.
9366 1.1 joerg
9367 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9368 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9369 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
9370 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
9371 1.1.1.2 joerg cxxRecordDecl(hasName("X"))))
9372 1.1 joerg class X {};
9373 1.1 joerg void y(X &x) { x; X z; }
9374 1.1 joerg class Y { friend class X; };
9375 1.1.1.2 joerg class Z : public virtual X {};
9376 1.1.1.2 joerg
9377 1.1.1.2 joerg Example matches class Derived
9378 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9379 1.1.1.2 joerg class Base {};
9380 1.1.1.2 joerg class Derived : Base {};
9381 1.1 joerg
9382 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>,
9383 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
9384 1.1 joerg </pre></td></tr>
9385 1.1 joerg
9386 1.1 joerg
9387 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
9388 1.1 joerg <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9389 1.1 joerg matcher.
9390 1.1 joerg
9391 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9392 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9393 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
9394 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
9395 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType(
9396 1.1.1.2 joerg asString("class X")))
9397 1.1 joerg class X {};
9398 1.1 joerg void y(X &x) { x; X z; }
9399 1.1 joerg typedef int U;
9400 1.1 joerg class Y { friend class X; };
9401 1.1.1.2 joerg class Z : public virtual X {};
9402 1.1 joerg </pre></td></tr>
9403 1.1 joerg
9404 1.1 joerg
9405 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
9406 1.1 joerg <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9407 1.1 joerg that matches the given matcher.
9408 1.1 joerg
9409 1.1 joerg Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9410 1.1 joerg bool y() { return true; }
9411 1.1 joerg bool x = y();
9412 1.1 joerg </pre></td></tr>
9413 1.1 joerg
9414 1.1 joerg
9415 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>></td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
9416 1.1 joerg <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9417 1.1 joerg expression.
9418 1.1 joerg
9419 1.1 joerg Given
9420 1.1 joerg void f(int b) {
9421 1.1 joerg int a[b];
9422 1.1 joerg }
9423 1.1 joerg variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9424 1.1 joerg varDecl(hasName("b")))))))
9425 1.1 joerg matches "int a[b]"
9426 1.1 joerg </pre></td></tr>
9427 1.1 joerg
9428 1.1 joerg
9429 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
9430 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9431 1.1 joerg
9432 1.1 joerg
9433 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
9434 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9435 1.1 joerg switch statement or conditional operator.
9436 1.1 joerg
9437 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9438 1.1 joerg if (true) {}
9439 1.1 joerg </pre></td></tr>
9440 1.1 joerg
9441 1.1 joerg <!--END_TRAVERSAL_MATCHERS -->
9442 1.1 joerg </table>
9443 1.1 joerg
9444 1.1 joerg </div>
9445 1.1 joerg </body>
9446 1.1 joerg </html>
9447 1.1 joerg
9448 1.1 joerg
9449