LibASTMatchersReference.html revision 1.1.1.2 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3 <html>
4 <head>
5 <title>AST Matcher Reference</title>
6 <link type="text/css" rel="stylesheet" href="../menu.css" />
7 <link type="text/css" rel="stylesheet" href="../content.css" />
8 <style type="text/css">
9 td {
10 padding: .33em;
11 }
12 td.doc {
13 display: none;
14 border-bottom: 1px solid black;
15 }
16 td.name:hover {
17 color: blue;
18 cursor: pointer;
19 }
20 span.mono { font-family: monospace; }
21
22 .traverse_compare, .traverse_compare td, .traverse_compare th {
23 border: 1px solid black;
24 border-collapse: collapse;
25 }
26 </style>
27 <script type="text/javascript">
28 function toggle(id) {
29 if (!id) return;
30 row = document.getElementById(id);
31 if (row.style.display != 'table-cell')
32 row.style.display = 'table-cell';
33 else
34 row.style.display = 'none';
35 }
36 </script>
37 </head>
38 <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39
40 <!--#include virtual="../menu.html.incl"-->
41
42 <div id="content">
43
44 <h1>AST Matcher Reference</h1>
45
46 <p>This document shows all currently implemented matchers. The matchers are grouped
47 by category and node type they match. You can click on matcher names to show the
48 matcher's source documentation.</p>
49
50 <p>There are three different basic categories of matchers:
51 <ul>
52 <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53 <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54 <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55 </ul>
56 </p>
57
58 <p>Within each category the matchers are ordered by node type they match on.
59 Note that if a matcher can match multiple node types, it will appear
60 multiple times. This means that by searching for Matcher<Stmt> you can
61 find all matchers that can be used to match on Stmt nodes.</p>
62
63 <p>The exception to that rule are matchers that can match on any node. Those
64 are marked with a * and are listed in the beginning of each category.</p>
65
66 <p>Note that the categorization of matchers is a great help when you combine
67 them into matcher expressions. You will usually want to form matcher expressions
68 that read like english sentences by alternating between node matchers and
69 narrowing or traversal matchers, like this:
70 <pre>
71 recordDecl(hasDescendant(
72 ifStmt(hasTrueExpression(
73 expr(hasDescendant(
74 ifStmt()))))))
75 </pre>
76 </p>
77
78 <!-- ======================================================================= -->
79 <h2 id="traverse-mode">Traverse Mode</h2>
80 <!-- ======================================================================= -->
81
82 <p>The default mode of operation of AST Matchers visits all nodes in the AST,
83 even if they are not spelled in the source. This is
84 <span class="mono">AsIs</span> mode. This mode requires writing AST matchers
85 that explicitly traverse or ignore implicit nodes, such as parentheses
86 surrounding an expression or expressions with cleanups. These implicit
87 nodes are not always obvious from the syntax of the source code, and so this
88 mode requires careful consideration and testing to get the desired behavior
89 from an AST matcher.
90 </p>
91
92 <p>In addition, because template instantiations are matched in the default mode,
93 transformations can be accidentally made to template declarations. Finally,
94 because implicit nodes are matched by default, transformations can be made on
95 entirely incorrect places in the code.</p>
96
97 <p>For these reasons, it is possible to ignore AST nodes which are not spelled
98 in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99 mode. This is likely to be far less error-prone for users who are not already
100 very familiar with where implicit nodes appear in the AST. It is also likely
101 to be less error-prone for experienced AST users, as difficult cases do not
102 need to be encountered and matcher expressions adjusted for these cases.</p>
103
104 <p>In clang-query, the mode can be changed with
105 <pre>
106 set traversal IgnoreUnlessSpelledInSource
107 </pre>
108 </p>
109 This affects both matchers and AST dump output in results.
110
111 <p>When using the C++ API such as in clang-tidy checks, the
112 <span class="mono">traverse()</span> matcher is used to set the mode:
113 <pre>
114 Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115 returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116 ), this);
117 </pre>
118 </p>
119 <p>The following table compares the <span class="mono">AsIs</span> mode with
120 the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121
122 <table class="traverse_compare">
123 <tr>
124 <th></th>
125 <th><span class="mono">AsIs</span></th>
126 <th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127 </tr>
128 <tr>
129 <td>AST dump of <span class="mono">func1</span>:
130 <pre>
131 struct B {
132 B(int);
133 };
134
135 B func1() { return 42; }
136 </pre>
137
138 </td>
139 <td>
140 C++98 dialect:
141 <pre>
142 FunctionDecl
143 `-CompoundStmt
144 `-ReturnStmt
145 `-ExprWithCleanups
146 `-CXXConstructExpr
147 `-MaterializeTemporaryExpr
148 `-ImplicitCastExpr
149 `-ImplicitCastExpr
150 `-CXXConstructExpr
151 `-IntegerLiteral 'int' 42
152 </pre>
153 C++11, C++14 dialect:
154 <pre>
155 FunctionDecl
156 `-CompoundStmt
157 `-ReturnStmt
158 `-ExprWithCleanups
159 `-CXXConstructExpr
160 `-MaterializeTemporaryExpr
161 `-ImplicitCastExpr
162 `-CXXConstructExpr
163 `-IntegerLiteral 'int' 42
164 </pre>
165 C++17, C++20 dialect:
166 <pre>
167 FunctionDecl
168 `-CompoundStmt
169 `-ReturnStmt
170 `-ImplicitCastExpr
171 `-CXXConstructExpr
172 `-IntegerLiteral 'int' 42
173 </pre>
174 </td>
175 <td>
176 All dialects:
177 <pre>
178 FunctionDecl
179 `-CompoundStmt
180 `-ReturnStmt
181 `-IntegerLiteral 'int' 42
182 </pre></td>
183 </tr>
184
185 <tr>
186 <td>Matcher for returned <span class="mono">42</span>:
187 <pre>
188 struct B {
189 B(int);
190 };
191
192 B func1() { return 42; }
193 </pre>
194
195 </td>
196 <td>
197 All dialects:
198 <pre>
199 returnStmt(hasReturnValue(
200 ignoringImplicit(
201 ignoringElidableConstructorCall(
202 ignoringImplicit(
203 cxxConstructExpr(hasArgument(0,
204 ignoringImplicit(
205 integerLiteral().bind("returnVal")
206 )
207 ))
208 )
209 )
210 )
211 ))
212 </pre></td>
213 <td>
214 All dialects:
215 <pre>
216 returnStmt(hasReturnValue(
217 integerLiteral().bind("returnVal")
218 ))
219 </pre></td>
220 </tr>
221 <tr>
222 <td>Match result for
223 <pre>implicitCastExpr()</pre>
224 given:
225 <pre>
226 struct B {
227 B(int);
228 };
229
230 B func1() { return 42; }
231 </pre>
232
233 </td>
234 <td>
235 Match found.</td>
236 <td>
237 No match.</td>
238 </tr>
239 <tr>
240 <td>Match result for:
241 <pre>
242 cxxConstructorDecl(
243 isCopyConstructor()
244 ).bind("prepend_explicit")
245 </pre>
246 given:
247 <pre>
248 struct Other {};
249 struct Copyable {
250 Other m_o;
251 Copyable();
252 };
253 </pre>
254 </td>
255 <td>
256 Match found. Insertion produces incorrect output:
257 <pre>
258 struct Other {};
259 struct explicit Copyable {
260 Other m_o;
261 Copyable();
262 };
263 </pre>
264 </td>
265 <td>
266 No match found. Incorrect replacement not possible.
267 </td>
268 </tr>
269 <tr>
270 <td>Replacement of <span class="mono">begin()</span>
271 with <span class="mono">cbegin()</span>:
272 <pre>
273 cxxMemberCallExpr(
274 on(ConstContainerExpr),
275 callee(cxxMethodDecl(hasName("begin")))
276 ).bind("replace_with_cbegin")
277 </pre>
278 given:
279 <pre>
280 void foo() {
281 const Container c;
282 c.begin();
283
284 for (auto i : c) {
285 }
286 }
287 </pre>
288 </td>
289 <td>
290 2 matches found. Replacement produces incorrect output:
291 <pre>
292 void foo() {
293 const Container c;
294 c.cbegin();
295
296 for (auto i :.cbegin() c) {
297 }
298 }
299 </pre>
300 </td>
301 <td>
302 1 match found. Replacement produces correct output:
303 <pre>
304 void foo() {
305 const Container c;
306 c.cbegin();
307
308 for (auto i : c) {
309 }
310 }
311 </pre>
312 </td>
313 </tr>
314 <tr>
315 <td>Replacement of <span class="mono">int</span> member
316 with <span class="mono">safe_int</span>:
317 <pre>
318 fieldDecl(
319 hasType(asString("int"))
320 ).bind("use_safe_int")
321 </pre>
322 given:
323 <pre>
324 struct S {
325 int m_i;
326 };
327
328 template <typename T> struct TemplStruct {
329 TemplStruct() {}
330 ~TemplStruct() {}
331
332 private:
333 T m_t;
334 };
335
336 void instantiate() { TemplStruct<int> ti; }
337 </pre>
338 </td>
339 <td>
340 2 matches found. Replacement produces incorrect output:
341 <pre>
342 struct S {
343 safe_int m_i;
344 };
345
346 template <typename T> struct TemplStruct {
347 TemplStruct() {}
348 ~TemplStruct() {}
349
350 private:
351 safe_int m_t;
352 };
353
354 void instantiate() { TemplStruct<int> ti; }
355 </pre>
356 </td>
357 <td>
358 1 match found. Replacement produces correct output:
359 <pre>
360 struct S {
361 safe_int m_i;
362 };
363
364 template <typename T> struct TemplStruct {
365 TemplStruct() {}
366 ~TemplStruct() {}
367
368 private:
369 T m_t;
370 };
371
372 void instantiate() { TemplStruct<int> ti; }
373 </pre>
374 </td>
375 </tr>
376 <tr>
377 <td>Add prefix to member initializer
378 <pre>
379 cxxCtorInitializer(
380 forField(fieldDecl())
381 ).bind("add_prefix")
382 </pre>
383 given:
384 <pre>
385 struct Simple {};
386
387 struct Record {
388 Record() : i(42) {}
389 private:
390 int i;
391 Simple s;
392 };
393 </pre>
394 </td>
395 <td>
396 2 matches found. Replacement produces incorrect output:
397 <pre>
398 struct Simple {};
399
400 struct Record {
401 m_Record() : m_i(42) {}
402 private:
403 int i;
404 Simple s;
405 };
406 </pre>
407 </td>
408 <td>
409 1 match found. Replacement produces correct output:
410 <pre>
411 struct Simple {};
412
413 struct Record {
414 Record() : m_i(42) {}
415 private:
416 int i;
417 Simple s;
418 };
419 </pre>
420 </td>
421 </tr>
422 <tr>
423 <td>Ignored default arguments
424 <pre>
425 callExpr(
426 callee(functionDecl(
427 hasName("hasDefaultArg")
428 )),
429 argumentCountIs(1)
430 ).bind("add_prefix")
431 </pre>
432 given:
433 <pre>
434 void hasDefaultArg(int i, int j = 0) {}
435 void callDefaultArg() { hasDefaultArg(42); }
436 </pre>
437 </td>
438 <td>
439 No match.
440 </td>
441 <td>
442 1 match found.
443 </td>
444 </tr>
445 <tr>
446 <td>Lambda fields
447 <pre>
448 fieldDecl(
449 hasType(asString("int"))
450 ).bind("make_safe")
451 </pre>
452 given:
453 <pre>
454 struct S {
455 int m_i;
456 };
457
458 void func() {
459 int a = 0;
460 int c = 0;
461
462 auto l = [a, b = c](int d) { int e = d; };
463 l(43);
464 }
465 </pre>
466 </td>
467 <td>
468 2 matches found. Replacement produces incorrect output:
469 <pre>
470 struct S {
471 safe_int m_i;
472 };
473
474 void func() {
475 int a = 0;
476 int c = 0;
477
478 auto l = [safe_a, safe_b = c](int d) { int e = d; };
479 l(43);
480 }
481 </pre>
482 </td>
483 <td>
484 1 match found. Replacement produces correct output:
485 <pre>
486 struct S {
487 safe_int m_i;
488 };
489
490 void func() {
491 int a = 0;
492 int c = 0;
493
494 auto l = [a, b = c](int d) { int e = d; };
495 l(43);
496 }
497 </pre>
498 </td>
499
500 </tr>
501
502
503
504
505
506 <tr>
507 <td>Rewritten binary operators
508 <pre>
509 binaryOperator(
510 hasOperatorName("<"),
511 hasRHS(hasDescendant(integerLiteral(equals(0))))
512 )
513 </pre>
514 given:
515 <pre>
516 #include <compare>
517
518 class HasSpaceship {
519 public:
520 int x;
521 bool operator==(const HasSpaceship&) const = default;
522 std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523 };
524
525 bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526 return a < b;
527 }
528 </pre>
529 </td>
530 <td>
531 1 match found.
532
533 <pre>
534 return a < b;
535 ^~~~~
536 </pre>
537
538 </td>
539 <td>
540 No match found.
541 </td>
542 </tr>
543 </table>
544
545 <!-- ======================================================================= -->
546 <h2 id="decl-matchers">Node Matchers</h2>
547 <!-- ======================================================================= -->
548
549 <p>Node matchers are at the core of matcher expressions - they specify the type
550 of node that is expected. Every match expression starts with a node matcher,
551 which can then be further refined with a narrowing or traversal matcher. All
552 traversal matchers take node matchers as their arguments.</p>
553
554 <p>For convenience, all node matchers take an arbitrary number of arguments
555 and implicitly act as allOf matchers.</p>
556
557 <p>Node matchers are the only matchers that support the bind("id") call to
558 bind the matched node to the given string, to be later retrieved from the
559 match callback.</p>
560
561 <p>It is important to remember that the arguments to node matchers are
562 predicates on the same node, just with additional information about the type.
563 This is often useful to make matcher expression more readable by inlining bind
564 calls into redundant node matchers inside another node matcher:
565 <pre>
566 // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567 // the same node.
568 recordDecl(decl().bind("id"), hasName("::MyClass"))
569 </pre>
570 </p>
571
572 <table>
573 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574 <!-- START_DECL_MATCHERS -->
575
576 <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 <tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
578
579 Examples matches public virtual B.
580 class B {};
581 class C : public virtual B {};
582 </pre></td></tr>
583
584
585 <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 <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
587
588 Examples matches i(42).
589 class C {
590 C() : i(42) {}
591 int i;
592 };
593 </pre></td></tr>
594
595
596 <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 <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
598
599 Given
600 class C {
601 public:
602 int a;
603 };
604 accessSpecDecl()
605 matches 'public:'
606 </pre></td></tr>
607
608
609 <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 <tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
611 Example matches foo and bar
612 (matcher = bindingDecl()
613
614 auto [foo, bar] = std::make_pair{42, 42};
615 </pre></td></tr>
616
617
618 <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 <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
620
621 Example matches the declaration of the nameless block printing an input
622 integer.
623
624 myFunc(^(int p) {
625 printf("%d", p);
626 })
627 </pre></td></tr>
628
629
630 <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 <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
632
633 Example matches Z
634 template<class T> class Z {};
635 </pre></td></tr>
636
637
638 <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 <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
640
641 Given
642 template<class T1, class T2, int I>
643 class A {};
644
645 template<class T, int I>
646 class A<T, T*, I> {};
647
648 template<>
649 class A<int, int, 1> {};
650 classTemplatePartialSpecializationDecl()
651 matches the specialization A<T,T*,I> but not A<int,int,1>
652 </pre></td></tr>
653
654
655 <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 <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
657
658 Given
659 template<typename T> class A {};
660 template<> class A<double> {};
661 A<int> a;
662 classTemplateSpecializationDecl()
663 matches the specializations A<int> and A<double>
664 </pre></td></tr>
665
666
667 <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 <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
669
670 Example matches Foo::Foo() and Foo::Foo(int)
671 class Foo {
672 public:
673 Foo();
674 Foo(int);
675 int DoSomething();
676 };
677 </pre></td></tr>
678
679
680 <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 <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
682
683 Example matches the operator.
684 class X { operator int() const; };
685 </pre></td></tr>
686
687
688 <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 <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
690
691 Example matches the deduction guide.
692 template<typename T>
693 class X { X(int) };
694 X(int) -> X<int>;
695 </pre></td></tr>
696
697
698 <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 <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
700
701 Example matches Foo::~Foo()
702 class Foo {
703 public:
704 virtual ~Foo();
705 };
706 </pre></td></tr>
707
708
709 <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 <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
711
712 Example matches y
713 class X { void y(); };
714 </pre></td></tr>
715
716
717 <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 <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
719
720 Example matches X, Z
721 class X;
722 template<class T> class Z {};
723 </pre></td></tr>
724
725
726 <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 <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
728
729 Examples matches X, C, and the friend declaration inside C;
730 void X();
731 class C {
732 friend X;
733 };
734 </pre></td></tr>
735
736
737 <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 <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
739 and non-type template parameter declarations).
740
741 Given
742 class X { int y; };
743 declaratorDecl()
744 matches int y.
745 </pre></td></tr>
746
747
748 <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 <tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
750
751 Examples matches the declaration node with foo and bar, but not
752 number.
753 (matcher = declStmt(has(decompositionDecl())))
754
755 int number = 42;
756 auto [foo, bar] = std::make_pair{42, 42};
757 </pre></td></tr>
758
759
760 <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 <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
762
763 Example matches A, B, C
764 enum X {
765 A, B, C
766 };
767 </pre></td></tr>
768
769
770 <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 <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
772
773 Example matches X
774 enum X {
775 A, B, C
776 };
777 </pre></td></tr>
778
779
780 <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 <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
782
783 Given
784 class X { int m; };
785 fieldDecl()
786 matches 'm'.
787 </pre></td></tr>
788
789
790 <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 <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
792
793 Given
794 class X { friend void foo(); };
795 friendDecl()
796 matches 'friend void foo()'.
797 </pre></td></tr>
798
799
800 <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 <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
802
803 Example matches f
804 void f();
805 </pre></td></tr>
806
807
808 <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 <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
810
811 Example matches f
812 template<class T> void f(T t) {}
813 </pre></td></tr>
814
815
816 <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 <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
818
819 Given
820 struct X { struct { int a; }; };
821 indirectFieldDecl()
822 matches 'a'.
823 </pre></td></tr>
824
825
826 <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 <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
828
829 Given
830 goto FOO;
831 FOO: bar();
832 labelDecl()
833 matches 'FOO:'
834 </pre></td></tr>
835
836
837 <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 <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
839
840 Given
841 extern "C" {}
842 linkageSpecDecl()
843 matches "extern "C" {}"
844 </pre></td></tr>
845
846
847 <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 <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
849
850 Example matches X, S, the anonymous union type, i, and U;
851 typedef int X;
852 struct S {
853 union {
854 int i;
855 } U;
856 };
857 </pre></td></tr>
858
859
860 <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 <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
862
863 Given
864 namespace test {}
865 namespace alias = ::test;
866 namespaceAliasDecl()
867 matches "namespace alias" but not "namespace test"
868 </pre></td></tr>
869
870
871 <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 <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
873
874 Given
875 namespace {}
876 namespace test {}
877 namespaceDecl()
878 matches "namespace {}" and "namespace test {}"
879 </pre></td></tr>
880
881
882 <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 <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
884
885 Given
886 template <typename T, int N> struct C {};
887 nonTypeTemplateParmDecl()
888 matches 'N', but not 'T'.
889 </pre></td></tr>
890
891
892 <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 <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
894
895 Example matches Foo (Additions)
896 @interface Foo (Additions)
897 @end
898 </pre></td></tr>
899
900
901 <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 <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
903
904 Example matches Foo (Additions)
905 @implementation Foo (Additions)
906 @end
907 </pre></td></tr>
908
909
910 <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 <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
912
913 Example matches Foo
914 @implementation Foo
915 @end
916 </pre></td></tr>
917
918
919 <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 <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
921
922 Example matches Foo
923 @interface Foo
924 @end
925 </pre></td></tr>
926
927
928 <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 <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
930
931 Example matches _enabled
932 @implementation Foo {
933 BOOL _enabled;
934 }
935 @end
936 </pre></td></tr>
937
938
939 <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 <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
941
942 Example matches both declaration and definition of -[Foo method]
943 @interface Foo
944 - (void)method;
945 @end
946
947 @implementation Foo
948 - (void)method {}
949 @end
950 </pre></td></tr>
951
952
953 <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 <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
955
956 Example matches enabled
957 @interface Foo
958 @property BOOL enabled;
959 @end
960 </pre></td></tr>
961
962
963 <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 <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
965
966 Example matches FooDelegate
967 @protocol FooDelegate
968 @end
969 </pre></td></tr>
970
971
972 <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 <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
974
975 Given
976 void f(int x);
977 parmVarDecl()
978 matches int x.
979 </pre></td></tr>
980
981
982 <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 <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
984
985 Example matches X, Z, U, and S
986 class X;
987 template<class T> class Z {};
988 struct S {};
989 union U {};
990 </pre></td></tr>
991
992
993 <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 <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
995
996 Example:
997 staticAssertExpr()
998 matches
999 static_assert(sizeof(S) == sizeof(int))
1000 in
1001 struct S {
1002 int x;
1003 };
1004 static_assert(sizeof(S) == sizeof(int));
1005 </pre></td></tr>
1006
1007
1008 <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 <tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1010
1011 Example matches X, Z, U, S, E
1012 class X;
1013 template<class T> class Z {};
1014 struct S {};
1015 union U {};
1016 enum E {
1017 A, B, C
1018 };
1019 </pre></td></tr>
1020
1021
1022 <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 <tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1024
1025 Given
1026 template <template <typename> class Z, int N> struct C {};
1027 templateTypeParmDecl()
1028 matches 'Z', but not 'N'.
1029 </pre></td></tr>
1030
1031
1032 <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 <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1034
1035 Given
1036 template <typename T, int N> struct C {};
1037 templateTypeParmDecl()
1038 matches 'T', but not 'N'.
1039 </pre></td></tr>
1040
1041
1042 <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 <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1044
1045 Given
1046 int X;
1047 namespace NS {
1048 int Y;
1049 } // namespace NS
1050 decl(hasDeclContext(translationUnitDecl()))
1051 matches "int X", but not "int Y".
1052 </pre></td></tr>
1053
1054
1055 <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 <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1057
1058 Given
1059 typedef int X;
1060 using Y = int;
1061 typeAliasDecl()
1062 matches "using Y = int", but not "typedef int X"
1063 </pre></td></tr>
1064
1065
1066 <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 <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1068
1069 typeAliasTemplateDecl() matches
1070 template <typename T>
1071 using Y = X<T>;
1072 </pre></td></tr>
1073
1074
1075 <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 <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1077
1078 Given
1079 typedef int X;
1080 using Y = int;
1081 typedefDecl()
1082 matches "typedef int X", but not "using Y = int"
1083 </pre></td></tr>
1084
1085
1086 <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 <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1088
1089 Given
1090 typedef int X;
1091 using Y = int;
1092 typedefNameDecl()
1093 matches "typedef int X" and "using Y = int"
1094 </pre></td></tr>
1095
1096
1097 <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 <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1099 typename.
1100
1101 Given
1102 template <typename T>
1103 struct Base { typedef T Foo; };
1104
1105 template<typename T>
1106 struct S : private Base<T> {
1107 using typename Base<T>::Foo;
1108 };
1109 unresolvedUsingTypenameDecl()
1110 matches using Base<T>::Foo </pre></td></tr>
1111
1112
1113 <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 <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1115
1116 Given
1117 template<typename X>
1118 class C : private X {
1119 using X::x;
1120 };
1121 unresolvedUsingValueDecl()
1122 matches using X::x </pre></td></tr>
1123
1124
1125 <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 <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1127
1128 Given
1129 namespace X { int x; }
1130 using X::x;
1131 usingDecl()
1132 matches using X::x </pre></td></tr>
1133
1134
1135 <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 <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1137
1138 Given
1139 namespace X { int x; }
1140 using namespace X;
1141 usingDirectiveDecl()
1142 matches using namespace X </pre></td></tr>
1143
1144
1145 <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 <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1147
1148 Example matches A, B, C and F
1149 enum X { A, B, C };
1150 void F();
1151 </pre></td></tr>
1152
1153
1154 <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 <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1156
1157 Note: this does not match declarations of member variables, which are
1158 "field" declarations in Clang parlance.
1159
1160 Example matches a
1161 int a;
1162 </pre></td></tr>
1163
1164
1165 <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 <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1167 </pre></td></tr>
1168
1169
1170 <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 <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1172
1173 Given
1174 namespace ns {
1175 struct A { static void f(); };
1176 void A::f() {}
1177 void g() { A::f(); }
1178 }
1179 ns::A a;
1180 nestedNameSpecifier()
1181 matches "ns::" and both "A::"
1182 </pre></td></tr>
1183
1184
1185 <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 <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1187
1188 Given
1189
1190 #pragma omp parallel default(none)
1191 #pragma omp parallel default(shared)
1192 #pragma omp parallel default(firstprivate)
1193 #pragma omp parallel
1194
1195 ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1196 ``default(firstprivate)``
1197 </pre></td></tr>
1198
1199
1200 <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 <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1202 </pre></td></tr>
1203
1204
1205 <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 <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1207
1208 Given
1209 FOO: bar();
1210 void *ptr = &&FOO;
1211 goto *bar;
1212 addrLabelExpr()
1213 matches '&&FOO'
1214 </pre></td></tr>
1215
1216
1217 <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 <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1219
1220 Given
1221 int i = a[1];
1222 arraySubscriptExpr()
1223 matches "a[1]"
1224 </pre></td></tr>
1225
1226
1227 <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 <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1229
1230 int i = 100;
1231 __asm("mov al, 2");
1232 asmStmt()
1233 matches '__asm("mov al, 2")'
1234 </pre></td></tr>
1235
1236
1237 <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 <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1239 Example matches __atomic_load_n(ptr, 1)
1240 void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1241 </pre></td></tr>
1242
1243
1244 <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 <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1246
1247 Given
1248 @autoreleasepool {
1249 int x = 0;
1250 }
1251 autoreleasePoolStmt(stmt()) matches the declaration of "x"
1252 inside the autorelease pool.
1253 </pre></td></tr>
1254
1255
1256 <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 <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1258
1259 Example matches a ?: b
1260 (a ?: b) + 42;
1261 </pre></td></tr>
1262
1263
1264 <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 <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1266
1267 Example matches a || b
1268 !(a || b)
1269 See also the binaryOperation() matcher for more-general matching.
1270 </pre></td></tr>
1271
1272
1273 <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 <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1275
1276 Example: matches "^{}":
1277 void f() { ^{}(); }
1278 </pre></td></tr>
1279
1280
1281 <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 <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1283
1284 Given
1285 while (true) { break; }
1286 breakStmt()
1287 matches 'break'
1288 </pre></td></tr>
1289
1290
1291 <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 <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1293
1294 Example: Matches (int) 2.2f in
1295 int i = (int) 2.2f;
1296 </pre></td></tr>
1297
1298
1299 <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 <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1301
1302 Example matches x.y() and y()
1303 X x;
1304 x.y();
1305 y();
1306 </pre></td></tr>
1307
1308
1309 <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 <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1311
1312 Given
1313 switch(a) { case 42: break; default: break; }
1314 caseStmt()
1315 matches 'case 42:'.
1316 </pre></td></tr>
1317
1318
1319 <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 <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1321
1322 Example: castExpr() matches each of the following:
1323 (int) 3;
1324 const_cast<Expr *>(SubExpr);
1325 char c = 0;
1326 but does not match
1327 int i = (0);
1328 int k = 0;
1329 </pre></td></tr>
1330
1331
1332 <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 <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1334
1335 Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1336 though.
1337
1338 Example matches 'a', L'a'
1339 char ch = 'a';
1340 wchar_t chw = L'a';
1341 </pre></td></tr>
1342
1343
1344 <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 <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1346 </pre></td></tr>
1347
1348
1349 <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 <tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1351
1352 Given
1353 co_await 1;
1354 coawaitExpr()
1355 matches 'co_await 1'
1356 </pre></td></tr>
1357
1358
1359 <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 <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1361
1362 Example match: {1}, (1, 2)
1363 int array[4] = {1};
1364 vector int myvec = (vector int)(1, 2);
1365 </pre></td></tr>
1366
1367
1368 <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 <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1370
1371 Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1372 for (;;) {{}}
1373 </pre></td></tr>
1374
1375
1376 <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 <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1378
1379 Example matches a ? b : c
1380 (a ? b : c) + 42
1381 </pre></td></tr>
1382
1383
1384 <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 <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1386
1387 Example matches the constant in the case statement:
1388 (matcher = constantExpr())
1389 switch (a) {
1390 case 37: break;
1391 }
1392 </pre></td></tr>
1393
1394
1395 <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 <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1397
1398 Given
1399 while (true) { continue; }
1400 continueStmt()
1401 matches 'continue'
1402 </pre></td></tr>
1403
1404
1405 <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 <tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1407
1408 Given
1409 while (true) { co_return; }
1410 coreturnStmt()
1411 matches 'co_return'
1412 </pre></td></tr>
1413
1414
1415 <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 <tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1417
1418 Given
1419 co_yield 1;
1420 coyieldExpr()
1421 matches 'co_yield 1'
1422 </pre></td></tr>
1423
1424
1425 <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 <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1427
1428 Example matches,
1429 kernel<<<i,j>>>();
1430 </pre></td></tr>
1431
1432
1433 <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 <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1435
1436 Example matches FunctionTakesString(GetStringByValue())
1437 (matcher = cxxBindTemporaryExpr())
1438 FunctionTakesString(GetStringByValue());
1439 FunctionTakesStringByPointer(GetStringPointer());
1440 </pre></td></tr>
1441
1442
1443 <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 <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1445
1446 Example matches true
1447 true
1448 </pre></td></tr>
1449
1450
1451 <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 <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1453
1454 try {} catch(int i) {}
1455 cxxCatchStmt()
1456 matches 'catch(int i)'
1457 </pre></td></tr>
1458
1459
1460 <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 <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1462
1463 Example: Matches const_cast<int*>(&r) in
1464 int n = 42;
1465 const int &r(n);
1466 int* p = const_cast<int*>(&r);
1467 </pre></td></tr>
1468
1469
1470 <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 <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1472
1473 Example matches string(ptr, n) and ptr within arguments of f
1474 (matcher = cxxConstructExpr())
1475 void f(const string &a, const string &b);
1476 char *ptr;
1477 int n;
1478 f(string(ptr, n), ptr);
1479 </pre></td></tr>
1480
1481
1482 <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 <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1484
1485 Example matches the CXXDefaultArgExpr placeholder inserted for the
1486 default value of the second parameter in the call expression f(42)
1487 (matcher = cxxDefaultArgExpr())
1488 void f(int x, int y = 0);
1489 f(42);
1490 </pre></td></tr>
1491
1492
1493 <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 <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1495
1496 Given
1497 delete X;
1498 cxxDeleteExpr()
1499 matches 'delete X'.
1500 </pre></td></tr>
1501
1502
1503 <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 <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1505 resolved because the base expression or the member name was dependent.
1506
1507 Given
1508 template <class T> void f() { T t; t.g(); }
1509 cxxDependentScopeMemberExpr()
1510 matches t.g
1511 </pre></td></tr>
1512
1513
1514 <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 <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1516
1517 Example:
1518 cxxDynamicCastExpr()
1519 matches
1520 dynamic_cast<D*>(&b);
1521 in
1522 struct B { virtual ~B() {} }; struct D : B {};
1523 B b;
1524 D* p = dynamic_cast<D*>(&b);
1525 </pre></td></tr>
1526
1527
1528 <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 <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1530
1531 cxxForRangeStmt() matches 'for (auto a : i)'
1532 int i[] = {1, 2, 3}; for (auto a : i);
1533 for(int j = 0; j < 5; ++j);
1534 </pre></td></tr>
1535
1536
1537 <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 <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1539
1540 Example: Matches Foo(bar);
1541 Foo f = bar;
1542 Foo g = (Foo) bar;
1543 Foo h = Foo(bar);
1544 </pre></td></tr>
1545
1546
1547 <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 <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1549
1550 Example matches x.y()
1551 X x;
1552 x.y();
1553 </pre></td></tr>
1554
1555
1556 <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 <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1558
1559 Given
1560 new X;
1561 cxxNewExpr()
1562 matches 'new X'.
1563 </pre></td></tr>
1564
1565
1566 <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 <tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1568
1569 Given
1570 bool a() noexcept;
1571 bool b() noexcept(true);
1572 bool c() noexcept(false);
1573 bool d() noexcept(noexcept(a()));
1574 bool e = noexcept(b()) || noexcept(c());
1575 cxxNoexceptExpr()
1576 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1577 doesn't match the noexcept specifier in the declarations a, b, c or d.
1578 </pre></td></tr>
1579
1580
1581 <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 <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1583 </pre></td></tr>
1584
1585
1586 <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 <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1588
1589 Note that if an operator isn't overloaded, it won't match. Instead, use
1590 binaryOperator matcher.
1591 Currently it does not match operators such as new delete.
1592 FIXME: figure out why these do not match?
1593
1594 Example matches both operator<<((o << b), c) and operator<<(o, b)
1595 (matcher = cxxOperatorCallExpr())
1596 ostream &operator<< (ostream &out, int i) { };
1597 ostream &o; int b = 1, c = 1;
1598 o << b << c;
1599 See also the binaryOperation() matcher for more-general matching of binary
1600 uses of this AST node.
1601 </pre></td></tr>
1602
1603
1604 <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 <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1606
1607 Either the source expression or the destination type can be matched
1608 using has(), but hasDestinationType() is more specific and can be
1609 more readable.
1610
1611 Example matches reinterpret_cast<char*>(&p) in
1612 void* p = reinterpret_cast<char*>(&p);
1613 </pre></td></tr>
1614
1615
1616 <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 <tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1618
1619 Example matches use of "<":
1620 #include <compare>
1621 struct HasSpaceshipMem {
1622 int a;
1623 constexpr auto operator<=>(const HasSpaceshipMem&) const = default;
1624 };
1625 void compare() {
1626 HasSpaceshipMem hs1, hs2;
1627 if (hs1 < hs2)
1628 return;
1629 }
1630 See also the binaryOperation() matcher for more-general matching
1631 of this AST node.
1632 </pre></td></tr>
1633
1634
1635 <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 <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1637
1638 See also: hasDestinationType
1639 See also: reinterpretCast
1640
1641 Example:
1642 cxxStaticCastExpr()
1643 matches
1644 static_cast<long>(8)
1645 in
1646 long eight(static_cast<long>(8));
1647 </pre></td></tr>
1648
1649
1650 <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 <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1652
1653 Given
1654 std::vector<int> a({ 1, 2, 3 });
1655 std::vector<int> b = { 4, 5 };
1656 int c[] = { 6, 7 };
1657 std::pair<int, int> d = { 8, 9 };
1658 cxxStdInitializerListExpr()
1659 matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1660 </pre></td></tr>
1661
1662
1663 <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 <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1665
1666 Example: Matches Foo(bar, bar)
1667 Foo h = Foo(bar, bar);
1668 </pre></td></tr>
1669
1670
1671 <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 <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1673
1674 Example matches the implicit this expression in "return i".
1675 (matcher = cxxThisExpr())
1676 struct foo {
1677 int i;
1678 int f() { return i; }
1679 };
1680 </pre></td></tr>
1681
1682
1683 <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 <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1685
1686 try { throw 5; } catch(int i) {}
1687 cxxThrowExpr()
1688 matches 'throw 5'
1689 </pre></td></tr>
1690
1691
1692 <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 <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1694
1695 try {} catch(int i) {}
1696 cxxTryStmt()
1697 matches 'try {}'
1698 </pre></td></tr>
1699
1700
1701 <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 <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1703
1704 Example matches T(t) in return statement of f
1705 (matcher = cxxUnresolvedConstructExpr())
1706 template <typename T>
1707 void f(const T& t) { return T(t); }
1708 </pre></td></tr>
1709
1710
1711 <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 <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1713
1714 Example matches x in if (x)
1715 bool x;
1716 if (x) {}
1717 </pre></td></tr>
1718
1719
1720 <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 <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1722
1723 Given
1724 int a;
1725 declStmt()
1726 matches 'int a'.
1727 </pre></td></tr>
1728
1729
1730 <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 <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1732
1733 Given
1734 switch(a) { case 42: break; default: break; }
1735 defaultStmt()
1736 matches 'default:'.
1737 </pre></td></tr>
1738
1739
1740 <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 <tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1742 </pre></td></tr>
1743
1744
1745 <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 <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1747
1748 Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1749 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1750 </pre></td></tr>
1751
1752
1753 <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 <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1755
1756 Given
1757 do {} while (true);
1758 doStmt()
1759 matches 'do {} while(true)'
1760 </pre></td></tr>
1761
1762
1763 <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 <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1765
1766 Matches any cast expression written in user code, whether it be a
1767 C-style cast, a functional-style cast, or a keyword cast.
1768
1769 Does not match implicit conversions.
1770
1771 Note: the name "explicitCast" is chosen to match Clang's terminology, as
1772 Clang uses the term "cast" to apply to implicit conversions as well as to
1773 actual cast expressions.
1774
1775 See also: hasDestinationType.
1776
1777 Example: matches all five of the casts in
1778 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42)))))
1779 but does not match the implicit conversion in
1780 long ell = 42;
1781 </pre></td></tr>
1782
1783
1784 <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 <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1786
1787 Example matches x()
1788 void f() { x(); }
1789 </pre></td></tr>
1790
1791
1792 <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 <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1794 of the sub-expression's evaluation.
1795
1796 Example matches std::string()
1797 const std::string str = std::string();
1798 </pre></td></tr>
1799
1800
1801 <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 <tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1803 </pre></td></tr>
1804
1805
1806 <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 <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
1808 1.0, 1.0f, 1.0L and 1e10.
1809
1810 Does not match implicit conversions such as
1811 float a = 10;
1812 </pre></td></tr>
1813
1814
1815 <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 <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1817
1818 Example matches 'for (;;) {}'
1819 for (;;) {}
1820 int i[] = {1, 2, 3}; for (auto a : i);
1821 </pre></td></tr>
1822
1823
1824 <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 <tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1826 </pre></td></tr>
1827
1828
1829 <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 <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1831 </pre></td></tr>
1832
1833
1834 <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 <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1836
1837 Given
1838 goto FOO;
1839 FOO: bar();
1840 gotoStmt()
1841 matches 'goto FOO'
1842 </pre></td></tr>
1843
1844
1845 <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 <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1847
1848 Example matches 'if (x) {}'
1849 if (x) {}
1850 </pre></td></tr>
1851
1852
1853 <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 <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1855 point literals e.g.: 1i, 1.0i
1856 </pre></td></tr>
1857
1858
1859 <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 <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1861
1862 This matches many different places, including function call return value
1863 eliding, as well as any type conversions.
1864 </pre></td></tr>
1865
1866
1867 <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 <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1869
1870 Given
1871 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1872 implicitValueInitExpr()
1873 matches "[0].y" (implicitly)
1874 </pre></td></tr>
1875
1876
1877 <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 <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1879
1880 Given
1881 int a[] = { 1, 2 };
1882 struct B { int x, y; };
1883 B b = { 5, 6 };
1884 initListExpr()
1885 matches "{ 1, 2 }" and "{ 5, 6 }"
1886 </pre></td></tr>
1887
1888
1889 <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 <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
1891 1, 1L, 0x1 and 1U.
1892
1893 Does not match character-encoded integers such as L'a'.
1894 </pre></td></tr>
1895
1896
1897 <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 <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1899
1900 Given
1901 goto FOO;
1902 FOO: bar();
1903 labelStmt()
1904 matches 'FOO:'
1905 </pre></td></tr>
1906
1907
1908 <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 <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1910
1911 Example matches [&](){return 5;}
1912 [&](){return 5;}
1913 </pre></td></tr>
1914
1915
1916 <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 <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1918
1919 Example: Given
1920 struct T {void func();};
1921 T f();
1922 void g(T);
1923 materializeTemporaryExpr() matches 'f()' in these statements
1924 T u(f());
1925 g(f());
1926 f().func();
1927 but does not match
1928 f();
1929 </pre></td></tr>
1930
1931
1932 <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 <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1934
1935 Given
1936 class Y {
1937 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
1938 int a; static int b;
1939 };
1940 memberExpr()
1941 matches this->x, x, y.x, a, this->b
1942 </pre></td></tr>
1943
1944
1945 <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 <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1947
1948 foo();;
1949 nullStmt()
1950 matches the second ';'
1951 </pre></td></tr>
1952
1953
1954 <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 <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1956
1957 Example matches @catch
1958 @try {}
1959 @catch (...) {}
1960 </pre></td></tr>
1961
1962
1963 <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 <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1965
1966 Example matches @finally
1967 @try {}
1968 @finally {}
1969 </pre></td></tr>
1970
1971
1972 <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 <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1974
1975 Example: matches "a" in "init" method:
1976 @implementation A {
1977 NSString *a;
1978 }
1979 - (void) init {
1980 a = @"hello";
1981 }
1982 </pre></td></tr>
1983
1984
1985 <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 <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1987
1988 The innermost message send invokes the "alloc" class method on the
1989 NSString class, while the outermost message send invokes the
1990 "initWithString" instance method on the object returned from
1991 NSString's "alloc". This matcher should match both message sends.
1992 [[NSString alloc] initWithString:@"Hello"]
1993 </pre></td></tr>
1994
1995
1996 <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 <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1998
1999 Example matches @throw obj;
2000 </pre></td></tr>
2001
2002
2003 <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 <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2005
2006 Example matches @try
2007 @try {}
2008 @catch (...) {}
2009 </pre></td></tr>
2010
2011
2012 <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 <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2014
2015 Given
2016
2017 #pragma omp parallel
2018 #pragma omp parallel default(none)
2019 #pragma omp taskyield
2020
2021 ``ompExecutableDirective()`` matches ``omp parallel``,
2022 ``omp parallel default(none)`` and ``omp taskyield``.
2023 </pre></td></tr>
2024
2025
2026 <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 <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2028 to reference another expressions and can be met
2029 in BinaryConditionalOperators, for example.
2030
2031 Example matches 'a'
2032 (a ?: c) + 42;
2033 </pre></td></tr>
2034
2035
2036 <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 <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2038
2039 Example matches (foo() + 1)
2040 int foo() { return 1; }
2041 int a = (foo() + 1);
2042 </pre></td></tr>
2043
2044
2045 <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 <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2047 ParenListExprs don't have a predefined type and are used for late parsing.
2048 In the final AST, they can be met in template declarations.
2049
2050 Given
2051 template<typename T> class X {
2052 void f() {
2053 X x(*this);
2054 int a = 0, b = 1; int i = (a, b);
2055 }
2056 };
2057 parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2058 has a predefined type and is a ParenExpr, not a ParenListExpr.
2059 </pre></td></tr>
2060
2061
2062 <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 <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2064
2065 Example: Matches __func__
2066 printf("%s", __func__);
2067 </pre></td></tr>
2068
2069
2070 <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 <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2072
2073 Given
2074 return 1;
2075 returnStmt()
2076 matches 'return 1'
2077 </pre></td></tr>
2078
2079
2080 <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 <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2082
2083 Given
2084 { ++a; }
2085 stmt()
2086 matches both the compound statement '{ ++a; }' and '++a'.
2087 </pre></td></tr>
2088
2089
2090 <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 <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2092
2093 Example match: ({ int X = 4; X; })
2094 int C = ({ int X = 4; X; });
2095 </pre></td></tr>
2096
2097
2098 <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 <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2100
2101 Example matches "abcd", L"abcd"
2102 char *s = "abcd";
2103 wchar_t *ws = L"abcd";
2104 </pre></td></tr>
2105
2106
2107 <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 <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2109
2110 Given
2111 template <int N>
2112 struct A { static const int n = N; };
2113 struct B : public A<42> {};
2114 substNonTypeTemplateParmExpr()
2115 matches "N" in the right-hand side of "static const int n = N;"
2116 </pre></td></tr>
2117
2118
2119 <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 <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2121
2122 Given
2123 switch(a) { case 42: break; default: break; }
2124 switchCase()
2125 matches 'case 42:' and 'default:'.
2126 </pre></td></tr>
2127
2128
2129 <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 <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2131
2132 Given
2133 switch(a) { case 42: break; default: break; }
2134 switchStmt()
2135 matches 'switch(a)'.
2136 </pre></td></tr>
2137
2138
2139 <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 <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2141
2142 Given
2143 Foo x = bar;
2144 int y = sizeof(x) + alignof(x);
2145 unaryExprOrTypeTraitExpr()
2146 matches sizeof(x) and alignof(x)
2147 </pre></td></tr>
2148
2149
2150 <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 <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2152
2153 Example matches !a
2154 !a || b
2155 </pre></td></tr>
2156
2157
2158 <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 <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2160 but could not be resolved to a specific declaration.
2161
2162 Given
2163 template<typename T>
2164 T foo() { T a; return a; }
2165 template<typename T>
2166 void bar() {
2167 foo<T>();
2168 }
2169 unresolvedLookupExpr()
2170 matches foo<T>() </pre></td></tr>
2171
2172
2173 <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 <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2175
2176 Given
2177 struct X {
2178 template <class T> void f();
2179 void g();
2180 };
2181 template <class T> void h() { X x; x.f<T>(); x.g(); }
2182 unresolvedMemberExpr()
2183 matches x.f<T>
2184 </pre></td></tr>
2185
2186
2187 <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 <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2189
2190 Example match: "foo"_suffix
2191 </pre></td></tr>
2192
2193
2194 <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 <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2196
2197 Given
2198 while (true) {}
2199 whileStmt()
2200 matches 'while (true) {}'.
2201 </pre></td></tr>
2202
2203
2204 <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 <tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2206
2207 Given
2208 template <typename T> struct C {};
2209 C<int> c;
2210 templateArgumentLoc()
2211 matches 'int' in C<int>.
2212 </pre></td></tr>
2213
2214
2215 <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 <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2217
2218 Given
2219 template <typename T> struct C {};
2220 C<int> c;
2221 templateArgument()
2222 matches 'int' in C<int>.
2223 </pre></td></tr>
2224
2225
2226 <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 <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2228
2229 Given
2230 template <typename T> class X { };
2231 X<int> xi;
2232 templateName()
2233 matches 'X' in X<int>.
2234 </pre></td></tr>
2235
2236
2237 <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 <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2239 </pre></td></tr>
2240
2241
2242 <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 <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2244
2245 Given
2246 int a[] = { 2, 3 };
2247 int b[4];
2248 void f() { int c[a[0]]; }
2249 arrayType()
2250 matches "int a[]", "int b[4]" and "int c[a[0]]";
2251 </pre></td></tr>
2252
2253
2254 <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 <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2256
2257 Given
2258 _Atomic(int) i;
2259 atomicType()
2260 matches "_Atomic(int) i"
2261 </pre></td></tr>
2262
2263
2264 <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 <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2266
2267 Given:
2268 auto n = 4;
2269 int v[] = { 2, 3 }
2270 for (auto i : v) { }
2271 autoType()
2272 matches "auto n" and "auto i"
2273 </pre></td></tr>
2274
2275
2276 <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 <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2278 "void (^)(int)".
2279
2280 The pointee is always required to be a FunctionType.
2281 </pre></td></tr>
2282
2283
2284 <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 <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2286
2287 Given
2288 struct A {};
2289 A a;
2290 int b;
2291 float c;
2292 bool d;
2293 builtinType()
2294 matches "int b", "float c" and "bool d"
2295 </pre></td></tr>
2296
2297
2298 <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 <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2300
2301 Given
2302 _Complex float f;
2303 complexType()
2304 matches "_Complex float f"
2305 </pre></td></tr>
2306
2307
2308 <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 <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2310
2311 Given
2312 void() {
2313 int a[2];
2314 int b[] = { 2, 3 };
2315 int c[b[0]];
2316 }
2317 constantArrayType()
2318 matches "int a[2]"
2319 </pre></td></tr>
2320
2321
2322 <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 <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2324 Example matches i[] in declaration of f.
2325 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2326 Example matches i[1].
2327 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2328 void f(int i[]) {
2329 i[1] = 0;
2330 }
2331 </pre></td></tr>
2332
2333
2334 <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 <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types.
2336
2337 Given:
2338 short i = 1;
2339 int j = 42;
2340 decltype(i + j) result = i + j;
2341 decltypeType()
2342 matches "decltype(i + j)"
2343 </pre></td></tr>
2344
2345
2346 <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 <tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2348 template types.
2349
2350 Given
2351 template <typename T>
2352 class C { public: C(T); };
2353
2354 C c(123);
2355 deducedTemplateSpecializationType() matches the type in the declaration
2356 of the variable c.
2357 </pre></td></tr>
2358
2359
2360 <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 <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2362
2363 Given
2364 template<typename T, int Size>
2365 class array {
2366 T data[Size];
2367 };
2368 dependentSizedArrayType
2369 matches "T data[Size]"
2370 </pre></td></tr>
2371
2372
2373 <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 <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2375 qualified name.
2376
2377 Given
2378 namespace N {
2379 namespace M {
2380 class D {};
2381 }
2382 }
2383 class C {};
2384
2385 class C c;
2386 N::M::D d;
2387
2388 elaboratedType() matches the type of the variable declarations of both
2389 c and d.
2390 </pre></td></tr>
2391
2392
2393 <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 <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2395
2396 Given
2397 enum C { Green };
2398 enum class S { Red };
2399
2400 C c;
2401 S s;
2402
2403 enumType() matches the type of the variable declarations of both c and
2404 s.
2405 </pre></td></tr>
2406
2407
2408 <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 <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2410
2411 Given
2412 int (*f)(int);
2413 void g();
2414 functionProtoType()
2415 matches "int (*f)(int)" and the type of "g" in C++ mode.
2416 In C mode, "g" is not matched because it does not contain a prototype.
2417 </pre></td></tr>
2418
2419
2420 <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 <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2422
2423 Given
2424 int (*f)(int);
2425 void g();
2426 functionType()
2427 matches "int (*f)(int)" and the type of "g".
2428 </pre></td></tr>
2429
2430
2431 <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 <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2433
2434 Given
2435 int a[] = { 2, 3 };
2436 int b[42];
2437 void f(int c[]) { int d[a[0]]; };
2438 incompleteArrayType()
2439 matches "int a[]" and "int c[]"
2440 </pre></td></tr>
2441
2442
2443 <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 <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2445
2446 Example matches S s, but not S<T> s.
2447 (matcher = parmVarDecl(hasType(injectedClassNameType())))
2448 template <typename T> struct S {
2449 void f(S s);
2450 void g(S<T> s);
2451 };
2452 </pre></td></tr>
2453
2454
2455 <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 <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2457
2458 Given:
2459 int *a;
2460 int &b = *a;
2461 int &&c = 1;
2462 auto &d = b;
2463 auto &&e = c;
2464 auto &&f = 2;
2465 int g = 5;
2466
2467 lValueReferenceType() matches the types of b, d, and e. e is
2468 matched since the type is deduced as int& by reference collapsing rules.
2469 </pre></td></tr>
2470
2471
2472 <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 <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2474 Given
2475 struct A { int i; }
2476 A::* ptr = A::i;
2477 memberPointerType()
2478 matches "A::* ptr"
2479 </pre></td></tr>
2480
2481
2482 <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 <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2484 a pointer type, despite being syntactically similar.
2485
2486 Given
2487 int *a;
2488
2489 @interface Foo
2490 @end
2491 Foo *f;
2492 pointerType()
2493 matches "Foo *f", but does not match "int *a".
2494 </pre></td></tr>
2495
2496
2497 <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 <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2499
2500 Given
2501 int (*ptr_to_array)[4];
2502 int *array_of_ptrs[4];
2503
2504 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2505 array_of_ptrs.
2506 </pre></td></tr>
2507
2508
2509 <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 <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2511 types.
2512
2513 Given
2514 int *a;
2515 int &b = *a;
2516 int c = 5;
2517
2518 @interface Foo
2519 @end
2520 Foo *f;
2521 pointerType()
2522 matches "int *a", but does not match "Foo *f".
2523 </pre></td></tr>
2524
2525
2526 <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 <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2528
2529 Given:
2530 int *a;
2531 int &b = *a;
2532 int &&c = 1;
2533 auto &d = b;
2534 auto &&e = c;
2535 auto &&f = 2;
2536 int g = 5;
2537
2538 rValueReferenceType() matches the types of c and f. e is not
2539 matched as it is deduced to int& by reference collapsing rules.
2540 </pre></td></tr>
2541
2542
2543 <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 <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2545
2546 Given
2547 class C {};
2548 struct S {};
2549
2550 C c;
2551 S s;
2552
2553 recordType() matches the type of the variable declarations of both c
2554 and s.
2555 </pre></td></tr>
2556
2557
2558 <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 <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2560
2561 Given
2562 int *a;
2563 int &b = *a;
2564 int &&c = 1;
2565 auto &d = b;
2566 auto &&e = c;
2567 auto &&f = 2;
2568 int g = 5;
2569
2570 referenceType() matches the types of b, c, d, e, and f.
2571 </pre></td></tr>
2572
2573
2574 <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 <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2576 template type parameter.
2577
2578 Given
2579 template <typename T>
2580 void F(T t) {
2581 int i = 1 + t;
2582 }
2583
2584 substTemplateTypeParmType() matches the type of 't' but not '1'
2585 </pre></td></tr>
2586
2587
2588 <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 <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2590
2591 Given
2592 enum E {};
2593 class C {};
2594
2595 E e;
2596 C c;
2597
2598 tagType() matches the type of the variable declarations of both e
2599 and c.
2600 </pre></td></tr>
2601
2602
2603 <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 <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2605
2606 Given
2607 template <typename T>
2608 class C { };
2609
2610 template class C<int>; // A
2611 C<char> var; // B
2612
2613 templateSpecializationType() matches the type of the explicit
2614 instantiation in A and the type of the variable declaration in B.
2615 </pre></td></tr>
2616
2617
2618 <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 <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2620
2621 Example matches T, but not int.
2622 (matcher = templateTypeParmType())
2623 template <typename T> void f(int i);
2624 </pre></td></tr>
2625
2626
2627 <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 <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2629 </pre></td></tr>
2630
2631
2632 <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 <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2634
2635 Given
2636 typedef int X;
2637 typedefType()
2638 matches "typedef int X"
2639 </pre></td></tr>
2640
2641
2642 <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 <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2644
2645 Given:
2646 typedef __underlying_type(T) type;
2647 unaryTransformType()
2648 matches "__underlying_type(T)"
2649 </pre></td></tr>
2650
2651
2652 <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 <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2654 integer-constant-expression.
2655
2656 Given
2657 void f() {
2658 int a[] = { 2, 3 }
2659 int b[42];
2660 int c[a[0]];
2661 }
2662 variableArrayType()
2663 matches "int c[a[0]]"
2664 </pre></td></tr>
2665
2666 <!--END_DECL_MATCHERS -->
2667 </table>
2668
2669 <!-- ======================================================================= -->
2670 <h2 id="narrowing-matchers">Narrowing Matchers</h2>
2671 <!-- ======================================================================= -->
2672
2673 <p>Narrowing matchers match certain attributes on the current node, thus
2674 narrowing down the set of nodes of the current type to match on.</p>
2675
2676 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2677 which allow users to create more powerful match expressions.</p>
2678
2679 <table>
2680 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2681 <!-- START_NARROWING_MATCHERS -->
2682
2683 <tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
2684 <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2685
2686 Usable as: Any Matcher
2687 </pre></td></tr>
2688
2689
2690 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
2691 <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2692
2693 Usable as: Any Matcher
2694 </pre></td></tr>
2695
2696
2697 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2698 <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2699
2700 Useful when another matcher requires a child matcher, but there's no
2701 additional constraint. This will often be used with an explicit conversion
2702 to an internal::Matcher<> type such as TypeMatcher.
2703
2704 Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2705 "int* p" and "void f()" in
2706 int* p;
2707 void f();
2708
2709 Usable as: Any Matcher
2710 </pre></td></tr>
2711
2712
2713 <tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2714 <tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2715
2716 Given
2717 if (true);
2718 for (; true; );
2719 with the matcher
2720 mapAnyOf(ifStmt, forStmt).with(
2721 hasCondition(cxxBoolLiteralExpr(equals(true)))
2722 ).bind("trueCond")
2723 matches the if and the for. It is equivalent to:
2724 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2725 anyOf(
2726 ifStmt(trueCond).bind("trueCond"),
2727 forStmt(trueCond).bind("trueCond")
2728 );
2729
2730 The with() chain-call accepts zero or more matchers which are combined
2731 as-if with allOf() in each of the node matchers.
2732 Usable as: Any Matcher
2733 </pre></td></tr>
2734
2735
2736 <tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr>
2737 <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2738
2739 Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2740 class X {};
2741 class Y {};
2742
2743 Usable as: Any Matcher
2744 </pre></td></tr>
2745
2746
2747 <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 <tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2749 specified names.
2750
2751 hasAnyOperatorName("+", "-")
2752 Is equivalent to
2753 anyOf(hasOperatorName("+"), hasOperatorName("-"))
2754 </pre></td></tr>
2755
2756
2757 <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 <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2759 unary).
2760
2761 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2762 !(a || b)
2763 </pre></td></tr>
2764
2765
2766 <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 <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2768
2769 Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2770 if (a == b)
2771 a += b;
2772
2773 Example 2: matches s1 = s2
2774 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2775 struct S { S& operator=(const S&); };
2776 void x() { S s1, s2; s1 = s2; }
2777 </pre></td></tr>
2778
2779
2780 <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 <tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2782
2783 Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2784 if (a == b)
2785 a += b;
2786
2787 Example 2: matches s1 < s2
2788 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2789 struct S { bool operator<(const S& other); };
2790 void x(S s1, S s2) { bool b1 = s1 < s2; }
2791 </pre></td></tr>
2792
2793
2794 <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 <tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2796 inheritance.
2797
2798 Examples:
2799 class C {
2800 public: int a;
2801 protected: int b;
2802 private: int c; // fieldDecl(isPrivate()) matches 'c'
2803 };
2804
2805 struct Base {};
2806 struct Derived1 : private Base {}; // matches 'Base'
2807 class Derived2 : Base {}; // matches 'Base'
2808 </pre></td></tr>
2809
2810
2811 <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 <tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2813 protected inheritance.
2814
2815 Examples:
2816 class C {
2817 public: int a;
2818 protected: int b; // fieldDecl(isProtected()) matches 'b'
2819 private: int c;
2820 };
2821
2822 class Base {};
2823 class Derived : protected Base {}; // matches 'Base'
2824 </pre></td></tr>
2825
2826
2827 <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 <tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2829 inheritance.
2830
2831 Examples:
2832 class C {
2833 public: int a; // fieldDecl(isPublic()) matches 'a'
2834 protected: int b;
2835 private: int c;
2836 };
2837
2838 class Base {};
2839 class Derived1 : public Base {}; // matches 'Base'
2840 struct Derived2 : Base {}; // matches 'Base'
2841 </pre></td></tr>
2842
2843
2844 <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 <tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2846 virtual inheritance.
2847
2848 Example:
2849 class A {
2850 public:
2851 virtual void x(); // matches x
2852 };
2853
2854 Example:
2855 class Base {};
2856 class DirectlyDerived : virtual Base {}; // matches Base
2857 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2858
2859 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 </pre></td></tr>
2861
2862
2863 <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 <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2865
2866
2867 <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 <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2869
2870 Given
2871 f('false, 3.14, 42);
2872 characterLiteral(equals(0))
2873 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2874 match false
2875 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2876 match 3.14
2877 integerLiteral(equals(42))
2878 matches 42
2879
2880 Note that you cannot directly match a negative numeric literal because the
2881 minus sign is not part of the literal: It is a unary operator whose operand
2882 is the positive numeric literal. Instead, you must use a unaryOperator()
2883 matcher to match the minus sign:
2884
2885 unaryOperator(hasOperatorName("-"),
2886 hasUnaryOperand(integerLiteral(equals(13))))
2887
2888 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 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 </pre></td></tr>
2891
2892
2893 <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 <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2895
2896
2897 <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 <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2899
2900
2901 <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 <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2903
2904 Given
2905 try {
2906 // ...
2907 } catch (int) {
2908 // ...
2909 } catch (...) {
2910 // ...
2911 }
2912 cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2913 </pre></td></tr>
2914
2915
2916 <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 <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2918 a specific number of arguments (including absent default arguments).
2919
2920 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2921 void f(int x, int y);
2922 f(0, 0);
2923 </pre></td></tr>
2924
2925
2926 <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 <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2928 </pre></td></tr>
2929
2930
2931 <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 <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2933 zero initialization.
2934
2935 Given
2936 void foo() {
2937 struct point { double x; double y; };
2938 point pt[2] = { { 1.0, 2.0 } };
2939 }
2940 initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2941 will match the implicit array filler for pt[1].
2942 </pre></td></tr>
2943
2944
2945 <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 <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2947
2948 Given
2949 struct S {
2950 S(); // #1
2951 S(const S &); // #2
2952 S(S &&); // #3
2953 };
2954 cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2955 </pre></td></tr>
2956
2957
2958 <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 <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2960
2961 Given
2962 struct S {
2963 S(); // #1
2964 S(const S &); // #2
2965 S(S &&); // #3
2966 };
2967 cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2968 </pre></td></tr>
2969
2970
2971 <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 <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2973
2974 Given
2975 struct S {
2976 S(); // #1
2977 S(int) {} // #2
2978 S(S &&) : S() {} // #3
2979 };
2980 S::S() : S(0) {} // #4
2981 cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2982 #1 or #2.
2983 </pre></td></tr>
2984
2985
2986 <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 <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2988 that have an explicit specifier if this explicit specifier is resolved to
2989 true.
2990
2991 Given
2992 template<bool b>
2993 struct S {
2994 S(int); // #1
2995 explicit S(double); // #2
2996 operator int(); // #3
2997 explicit operator bool(); // #4
2998 explicit(false) S(bool) // # 7
2999 explicit(true) S(char) // # 8
3000 explicit(b) S(S) // # 9
3001 };
3002 S(int) -> S<true> // #5
3003 explicit S(double) -> S<false> // #6
3004 cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3005 cxxConversionDecl(isExplicit()) will match #4, but not #3.
3006 cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3007 </pre></td></tr>
3008
3009
3010 <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 <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3012
3013 Given
3014 struct S {
3015 S(); // #1
3016 S(const S &); // #2
3017 S(S &&); // #3
3018 };
3019 cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3020 </pre></td></tr>
3021
3022
3023 <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 <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3025 that have an explicit specifier if this explicit specifier is resolved to
3026 true.
3027
3028 Given
3029 template<bool b>
3030 struct S {
3031 S(int); // #1
3032 explicit S(double); // #2
3033 operator int(); // #3
3034 explicit operator bool(); // #4
3035 explicit(false) S(bool) // # 7
3036 explicit(true) S(char) // # 8
3037 explicit(b) S(S) // # 9
3038 };
3039 S(int) -> S<true> // #5
3040 explicit S(double) -> S<false> // #6
3041 cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3042 cxxConversionDecl(isExplicit()) will match #4, but not #3.
3043 cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3044 </pre></td></tr>
3045
3046
3047 <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 <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3049 opposed to a member.
3050
3051 Given
3052 struct B {};
3053 struct D : B {
3054 int I;
3055 D(int i) : I(i) {}
3056 };
3057 struct E : B {
3058 E() : B() {}
3059 };
3060 cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3061 will match E(), but not match D(int).
3062 </pre></td></tr>
3063
3064
3065 <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 <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3067 opposed to a base.
3068
3069 Given
3070 struct B {};
3071 struct D : B {
3072 int I;
3073 D(int i) : I(i) {}
3074 };
3075 struct E : B {
3076 E() : B() {}
3077 };
3078 cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3079 will match D(int), but not match E().
3080 </pre></td></tr>
3081
3082
3083 <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 <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3085 code (as opposed to implicitly added by the compiler).
3086
3087 Given
3088 struct Foo {
3089 Foo() { }
3090 Foo(int) : foo_("A") { }
3091 string foo_;
3092 };
3093 cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3094 will match Foo(int), but not Foo()
3095 </pre></td></tr>
3096
3097
3098 <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 <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3100 that have an explicit specifier if this explicit specifier is resolved to
3101 true.
3102
3103 Given
3104 template<bool b>
3105 struct S {
3106 S(int); // #1
3107 explicit S(double); // #2
3108 operator int(); // #3
3109 explicit operator bool(); // #4
3110 explicit(false) S(bool) // # 7
3111 explicit(true) S(char) // # 8
3112 explicit(b) S(S) // # 9
3113 };
3114 S(int) -> S<true> // #5
3115 explicit S(double) -> S<false> // #6
3116 cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3117 cxxConversionDecl(isExplicit()) will match #4, but not #3.
3118 cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3119 </pre></td></tr>
3120
3121
3122 <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 <tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3124
3125 In template declarations, dependent members are not resolved and so can
3126 not be matched to particular named declarations.
3127
3128 This matcher allows to match on the known name of members.
3129
3130 Given
3131 template <typename T>
3132 struct S {
3133 void mem();
3134 };
3135 template <typename T>
3136 void x() {
3137 S<T> s;
3138 s.mem();
3139 }
3140 cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3141 </pre></td></tr>
3142
3143
3144 <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 <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed
3146 to '.'.
3147
3148 Member calls on the implicit this pointer match as called with '->'.
3149
3150 Given
3151 class Y {
3152 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
3153 template <class T> void f() { this->f<T>(); f<T>(); }
3154 int a;
3155 static int b;
3156 };
3157 template <class T>
3158 class Z {
3159 void x() { this->m; }
3160 };
3161 memberExpr(isArrow())
3162 matches this->x, x, y.x, a, this->b
3163 cxxDependentScopeMemberExpr(isArrow())
3164 matches this->m
3165 unresolvedMemberExpr(isArrow())
3166 matches this->f<T>, f<T>
3167 </pre></td></tr>
3168
3169
3170 <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 <tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3172 node
3173
3174 In template declarations, dependent members are not resolved and so can
3175 not be matched to particular named declarations.
3176
3177 This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3178 and CXXMethodDecl nodes.
3179
3180 Given
3181 template <typename T>
3182 struct S {
3183 void mem();
3184 };
3185 template <typename T>
3186 void x() {
3187 S<T> s;
3188 s.mem();
3189 }
3190 The matcher
3191 @code
3192 cxxDependentScopeMemberExpr(
3193 hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3194 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3195 cxxMethodDecl(hasName("mem")).bind("templMem")
3196 )))))
3197 )))),
3198 memberHasSameNameAsBoundNode("templMem")
3199 )
3200 @endcode
3201 first matches and binds the @c mem member of the @c S template, then
3202 compares its name to the usage in @c s.mem() in the @c x function template
3203 </pre></td></tr>
3204
3205
3206 <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 <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3208
3209 Given
3210 struct A {
3211 void foo() const;
3212 void bar();
3213 };
3214
3215 cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3216 </pre></td></tr>
3217
3218
3219 <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 <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3221 operator.
3222
3223 Given
3224 struct A {
3225 A &operator=(const A &);
3226 A &operator=(A &&);
3227 };
3228
3229 cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3230 the second one.
3231 </pre></td></tr>
3232
3233
3234 <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 <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3236
3237 Given:
3238 class A final {};
3239
3240 struct B {
3241 virtual void f();
3242 };
3243
3244 struct C : B {
3245 void f() final;
3246 };
3247 matches A and C::f, but not B, C, or B::f
3248 </pre></td></tr>
3249
3250
3251 <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 <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3253 operator.
3254
3255 Given
3256 struct A {
3257 A &operator=(const A &);
3258 A &operator=(A &&);
3259 };
3260
3261 cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3262 the first one.
3263 </pre></td></tr>
3264
3265
3266 <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 <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3268
3269 Given
3270 class A {
3271 public:
3272 virtual void x();
3273 };
3274 class B : public A {
3275 public:
3276 virtual void x();
3277 };
3278 matches B::x
3279 </pre></td></tr>
3280
3281
3282 <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 <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3284
3285 Given
3286 class A {
3287 public:
3288 virtual void x() = 0;
3289 };
3290 matches A::x
3291 </pre></td></tr>
3292
3293
3294 <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 <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3296
3297 Given
3298 struct S {
3299 S(); // #1
3300 S(const S &) = default; // #2
3301 S(S &&) = delete; // #3
3302 };
3303 cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3304 </pre></td></tr>
3305
3306
3307 <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 <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3309 virtual inheritance.
3310
3311 Example:
3312 class A {
3313 public:
3314 virtual void x(); // matches x
3315 };
3316
3317 Example:
3318 class Base {};
3319 class DirectlyDerived : virtual Base {}; // matches Base
3320 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3321
3322 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 </pre></td></tr>
3324
3325
3326 <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 <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3328
3329 Given
3330 class A {
3331 public:
3332 virtual void x();
3333 };
3334 class B : public A {
3335 public:
3336 void x();
3337 };
3338 matches A::x but not B::x
3339 </pre></td></tr>
3340
3341
3342 <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 <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3344
3345 Given:
3346 MyClass *p1 = new MyClass[10];
3347 cxxNewExpr(isArray())
3348 matches the expression 'new MyClass[10]'.
3349 </pre></td></tr>
3350
3351
3352 <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 <tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3354 specified names.
3355
3356 hasAnyOperatorName("+", "-")
3357 Is equivalent to
3358 anyOf(hasOperatorName("+"), hasOperatorName("-"))
3359 </pre></td></tr>
3360
3361
3362 <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 <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3364
3365 Matches overloaded operator names specified in strings without the
3366 "operator" prefix: e.g. "<<".
3367
3368 hasAnyOverloadedOperatorName("+", "-")
3369 Is equivalent to
3370 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3371 </pre></td></tr>
3372
3373
3374 <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 <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3376 unary).
3377
3378 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3379 !(a || b)
3380 </pre></td></tr>
3381
3382
3383 <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 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3385
3386 Matches overloaded operator names specified in strings without the
3387 "operator" prefix: e.g. "<<".
3388
3389 Given:
3390 class A { int operator*(); };
3391 const A &operator<<(const A &a, const A &b);
3392 A a;
3393 a << a; // <-- This matches
3394
3395 cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the
3396 specified line and
3397 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3398 matches the declaration of A.
3399
3400 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 </pre></td></tr>
3402
3403
3404 <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 <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3406
3407 Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3408 if (a == b)
3409 a += b;
3410
3411 Example 2: matches s1 = s2
3412 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3413 struct S { S& operator=(const S&); };
3414 void x() { S s1, s2; s1 = s2; }
3415 </pre></td></tr>
3416
3417
3418 <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 <tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3420
3421 Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3422 if (a == b)
3423 a += b;
3424
3425 Example 2: matches s1 < s2
3426 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3427 struct S { bool operator<(const S& other); };
3428 void x(S s1, S s2) { bool b1 = s1 < s2; }
3429 </pre></td></tr>
3430
3431
3432 <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 <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3434
3435 Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3436 class x {};
3437 class y;
3438 </pre></td></tr>
3439
3440
3441 <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 <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3443 </pre></td></tr>
3444
3445
3446 <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 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3448 </pre></td></tr>
3449
3450
3451 <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 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3453 static member variable template instantiations.
3454
3455 Given
3456 template<typename T> void A(T t) { }
3457 template<> void A(int N) { }
3458 functionDecl(isExplicitTemplateSpecialization())
3459 matches the specialization A<int>().
3460
3461 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 </pre></td></tr>
3463
3464
3465 <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 <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3467
3468 Given:
3469 class A final {};
3470
3471 struct B {
3472 virtual void f();
3473 };
3474
3475 struct C : B {
3476 void f() final;
3477 };
3478 matches A and C::f, but not B, C, or B::f
3479 </pre></td></tr>
3480
3481
3482 <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 <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3484
3485 Given:
3486 auto x = []{};
3487
3488 cxxRecordDecl(isLambda()) matches the implicit class declaration of
3489 decltype(x)
3490 </pre></td></tr>
3491
3492
3493 <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 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3495 isSameOrDerivedFrom(hasName(...)).
3496 </pre></td></tr>
3497
3498
3499 <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 <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3501 member variable template instantiations.
3502
3503 Given
3504 template <typename T> class X {}; class A {}; X<A> x;
3505 or
3506 template <typename T> class X {}; class A {}; template class X<A>;
3507 or
3508 template <typename T> class X {}; class A {}; extern template class X<A>;
3509 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3510 matches the template instantiation of X<A>.
3511
3512 But given
3513 template <typename T> class X {}; class A {};
3514 template <> class X<A> {}; X<A> x;
3515 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3516 does not match, as X<A> is an explicit template specialization.
3517
3518 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 </pre></td></tr>
3520
3521
3522 <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 <tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3524 specified names.
3525
3526 hasAnyOperatorName("+", "-")
3527 Is equivalent to
3528 anyOf(hasOperatorName("+"), hasOperatorName("-"))
3529 </pre></td></tr>
3530
3531
3532 <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 <tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3534 unary).
3535
3536 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3537 !(a || b)
3538 </pre></td></tr>
3539
3540
3541 <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 <tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3543
3544 Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3545 if (a == b)
3546 a += b;
3547
3548 Example 2: matches s1 = s2
3549 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3550 struct S { S& operator=(const S&); };
3551 void x() { S s1, s2; s1 = s2; }
3552 </pre></td></tr>
3553
3554
3555 <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 <tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3557
3558 Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3559 if (a == b)
3560 a += b;
3561
3562 Example 2: matches s1 < s2
3563 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3564 struct S { bool operator<(const S& other); };
3565 void x(S s1, S s2) { bool b1 = s1 < s2; }
3566 </pre></td></tr>
3567
3568
3569 <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 <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3571 a specific number of arguments (including absent default arguments).
3572
3573 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3574 void f(int x, int y);
3575 f(0, 0);
3576 </pre></td></tr>
3577
3578
3579 <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 <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3581 a specific number of arguments (including absent default arguments).
3582
3583 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3584 void f(int x, int y);
3585 f(0, 0);
3586 </pre></td></tr>
3587
3588
3589 <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 <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3591
3592 Example matches y(x) but not y(42) or NS::y(x).
3593 namespace NS {
3594 struct X {};
3595 void y(X);
3596 }
3597
3598 void y(...);
3599
3600 void test() {
3601 NS::X x;
3602 y(x); // Matches
3603 NS::y(x); // Doesn't match
3604 y(42); // Doesn't match
3605 using NS::y;
3606 y(x); // Found by both unqualified lookup and ADL, doesn't match
3607 }
3608 </pre></td></tr>
3609
3610
3611 <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 <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3613
3614 Example: matches the implicit cast around 0
3615 (matcher = castExpr(hasCastKind(CK_NullToPointer)))
3616 int *p = 0;
3617
3618 If the matcher is use from clang-query, CastKind parameter
3619 should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3620 </pre></td></tr>
3621
3622
3623 <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 <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3625
3626
3627 <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 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3629
3630 Given
3631 f('false, 3.14, 42);
3632 characterLiteral(equals(0))
3633 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3634 match false
3635 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3636 match 3.14
3637 integerLiteral(equals(42))
3638 matches 42
3639
3640 Note that you cannot directly match a negative numeric literal because the
3641 minus sign is not part of the literal: It is a unary operator whose operand
3642 is the positive numeric literal. Instead, you must use a unaryOperator()
3643 matcher to match the minus sign:
3644
3645 unaryOperator(hasOperatorName("-"),
3646 hasUnaryOperand(integerLiteral(equals(13))))
3647
3648 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 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 </pre></td></tr>
3651
3652
3653 <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 <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3655
3656
3657 <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 <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3659
3660
3661 <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 <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3663
3664 Given
3665 template<typename T> struct C {};
3666 C<int> c;
3667 classTemplateSpecializationDecl(templateArgumentCountIs(1))
3668 matches C<int>.
3669 </pre></td></tr>
3670
3671
3672 <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 <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3674 child statements.
3675
3676 Example: Given
3677 { for (;;) {} }
3678 compoundStmt(statementCountIs(0)))
3679 matches '{}'
3680 but does not match the outer compound statement.
3681 </pre></td></tr>
3682
3683
3684 <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 <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3686
3687 Given
3688 int a[42];
3689 int b[2 * 21];
3690 int c[41], d[43];
3691 char *s = "abcd";
3692 wchar_t *ws = L"abcd";
3693 char *w = "a";
3694 constantArrayType(hasSize(42))
3695 matches "int a[42]" and "int b[2 * 21]"
3696 stringLiteral(hasSize(4))
3697 matches "abcd", L"abcd"
3698 </pre></td></tr>
3699
3700
3701 <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 <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3703 declarations.
3704
3705 Example: Given
3706 int a, b;
3707 int c;
3708 int d = 2, e;
3709 declCountIs(2)
3710 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3711 </pre></td></tr>
3712
3713
3714 <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 <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3716
3717 Matches a node if it equals the node previously bound to ID.
3718
3719 Given
3720 class X { int a; int b; };
3721 cxxRecordDecl(
3722 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3723 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3724 matches the class X, as a and b have the same type.
3725
3726 Note that when multiple matches are involved via forEach* matchers,
3727 equalsBoundNodes acts as a filter.
3728 For example:
3729 compoundStmt(
3730 forEachDescendant(varDecl().bind("d")),
3731 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3732 will trigger a match for each combination of variable declaration
3733 and reference to that variable declaration within a compound statement.
3734 </pre></td></tr>
3735
3736
3737 <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 <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3739
3740 Decl has pointer identity in the AST.
3741 </pre></td></tr>
3742
3743
3744 <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 <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3746
3747 Given
3748 __attribute__((device)) void f() { ... }
3749 decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3750 f. If the matcher is used from clang-query, attr::Kind parameter should be
3751 passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3752 </pre></td></tr>
3753
3754
3755 <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 <tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3757 Does not match if only part of the statement is expanded from that macro or
3758 if different parts of the the statement are expanded from different
3759 appearances of the macro.
3760 </pre></td></tr>
3761
3762
3763 <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 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3765 partially matching a given regex.
3766
3767 Example matches Y but not X
3768 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3769 #include "ASTMatcher.h"
3770 class X {};
3771 ASTMatcher.h:
3772 class Y {};
3773
3774 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
3776 If the matcher is used in clang-query, RegexFlags parameter
3777 should be passed as a quoted string. e.g: "NoFlags".
3778 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3779 </pre></td></tr>
3780
3781
3782 <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 <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3784
3785 Example matches X but not Y
3786 (matcher = cxxRecordDecl(isExpansionInMainFile())
3787 #include <Y.h>
3788 class X {};
3789 Y.h:
3790 class Y {};
3791
3792 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 </pre></td></tr>
3794
3795
3796 <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 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3798
3799 Example matches Y but not X
3800 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3801 #include <SystemHeader.h>
3802 class X {};
3803 SystemHeader.h:
3804 class Y {};
3805
3806 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 </pre></td></tr>
3808
3809
3810 <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 <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3812 by the compiler (eg. implicit default/copy constructors).
3813 </pre></td></tr>
3814
3815
3816 <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 <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3818
3819 Given
3820 class vector {};
3821 namespace foo {
3822 class vector {};
3823 namespace std {
3824 class vector {};
3825 }
3826 }
3827 namespace std {
3828 inline namespace __1 {
3829 class vector {}; // #1
3830 namespace experimental {
3831 class vector {};
3832 }
3833 }
3834 }
3835 cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3836 </pre></td></tr>
3837
3838
3839 <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 <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3841 template instantiations.
3842
3843 Given
3844 template<typename T> void A(T t) { T i; }
3845 A(0);
3846 A(0U);
3847 functionDecl(isInstantiated())
3848 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3849 </pre></td></tr>
3850
3851
3852 <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 <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3854 inheritance.
3855
3856 Examples:
3857 class C {
3858 public: int a;
3859 protected: int b;
3860 private: int c; // fieldDecl(isPrivate()) matches 'c'
3861 };
3862
3863 struct Base {};
3864 struct Derived1 : private Base {}; // matches 'Base'
3865 class Derived2 : Base {}; // matches 'Base'
3866 </pre></td></tr>
3867
3868
3869 <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 <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3871 protected inheritance.
3872
3873 Examples:
3874 class C {
3875 public: int a;
3876 protected: int b; // fieldDecl(isProtected()) matches 'b'
3877 private: int c;
3878 };
3879
3880 class Base {};
3881 class Derived : protected Base {}; // matches 'Base'
3882 </pre></td></tr>
3883
3884
3885 <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 <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3887 inheritance.
3888
3889 Examples:
3890 class C {
3891 public: int a; // fieldDecl(isPublic()) matches 'a'
3892 protected: int b;
3893 private: int c;
3894 };
3895
3896 class Base {};
3897 class Derived1 : public Base {}; // matches 'Base'
3898 struct Derived2 : Base {}; // matches 'Base'
3899 </pre></td></tr>
3900
3901
3902 <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 <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3904 a specific number of designators.
3905
3906 Example: Given
3907 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3908 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3909 designatorCountIs(2)
3910 matches '{ [2].y = 1.0, [0].x = 1.0 }',
3911 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3912 </pre></td></tr>
3913
3914
3915 <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 <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3917
3918 Example matches Y (matcher = enumDecl(isScoped()))
3919 enum X {};
3920 enum class Y {};
3921 </pre></td></tr>
3922
3923
3924 <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 <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3926 neither type- nor value-dependent.
3927
3928 In the following example, the expression sizeof(sizeof(T() + T()))
3929 is instantiation-dependent (since it involves a template parameter T),
3930 but is neither type- nor value-dependent, since the type of the inner
3931 sizeof is known (std::size_t) and therefore the size of the outer
3932 sizeof is known.
3933 template<typename T>
3934 void f(T x, T y) { sizeof(sizeof(T() + T()); }
3935 expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3936 </pre></td></tr>
3937
3938
3939 <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 <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3941 is not yet instantiated.
3942
3943 For example, the expressions "x" and "x + y" are type-dependent in
3944 the following code, but "y" is not type-dependent:
3945 template<typename T>
3946 void add(T x, int y) {
3947 x + y;
3948 }
3949 expr(isTypeDependent()) matches x + y
3950 </pre></td></tr>
3951
3952
3953 <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 <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3955 non-type template parameter.
3956
3957 For example, the array bound of "Chars" in the following example is
3958 value-dependent.
3959 template<int Size> int f() { return Size; }
3960 expr(isValueDependent()) matches return Size
3961 </pre></td></tr>
3962
3963
3964 <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 <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3966 GNU's __null, C++11's nullptr, or C's NULL macro.
3967
3968 Given:
3969 void *v1 = NULL;
3970 void *v2 = nullptr;
3971 void *v3 = __null; // GNU extension
3972 char *cp = (char *)0;
3973 int *ip = 0;
3974 int i = 0;
3975 expr(nullPointerConstant())
3976 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3977 initializer for i.
3978 </pre></td></tr>
3979
3980
3981 <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 <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3983 bit width.
3984
3985 Given
3986 class C {
3987 int a : 2;
3988 int b : 4;
3989 int c : 2;
3990 };
3991 fieldDecl(hasBitWidth(2))
3992 matches 'int a;' and 'int c;' but not 'int b;'.
3993 </pre></td></tr>
3994
3995
3996 <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 <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3998
3999 Given
4000 class C {
4001 int a : 2;
4002 int b;
4003 };
4004 fieldDecl(isBitField())
4005 matches 'int a;' but not 'int b;'.
4006 </pre></td></tr>
4007
4008
4009 <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 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4011
4012 Given
4013 f('false, 3.14, 42);
4014 characterLiteral(equals(0))
4015 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4016 match false
4017 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4018 match 3.14
4019 integerLiteral(equals(42))
4020 matches 42
4021
4022 Note that you cannot directly match a negative numeric literal because the
4023 minus sign is not part of the literal: It is a unary operator whose operand
4024 is the positive numeric literal. Instead, you must use a unaryOperator()
4025 matcher to match the minus sign:
4026
4027 unaryOperator(hasOperatorName("-"),
4028 hasUnaryOperand(integerLiteral(equals(13))))
4029
4030 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 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 </pre></td></tr>
4033
4034
4035 <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 <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4037
4038
4039 <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 <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4041
4042 Matches overloaded operator names specified in strings without the
4043 "operator" prefix: e.g. "<<".
4044
4045 hasAnyOverloadedOperatorName("+", "-")
4046 Is equivalent to
4047 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4048 </pre></td></tr>
4049
4050
4051 <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 <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4053
4054 Given:
4055 void f();
4056 void g() noexcept;
4057 void h() noexcept(true);
4058 void i() noexcept(false);
4059 void j() throw();
4060 void k() throw(int);
4061 void l() throw(...);
4062 functionDecl(hasDynamicExceptionSpec()) and
4063 functionProtoType(hasDynamicExceptionSpec())
4064 match the declarations of j, k, and l, but not f, g, h, or i.
4065 </pre></td></tr>
4066
4067
4068 <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 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4070
4071 Matches overloaded operator names specified in strings without the
4072 "operator" prefix: e.g. "<<".
4073
4074 Given:
4075 class A { int operator*(); };
4076 const A &operator<<(const A &a, const A &b);
4077 A a;
4078 a << a; // <-- This matches
4079
4080 cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the
4081 specified line and
4082 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4083 matches the declaration of A.
4084
4085 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 </pre></td></tr>
4087
4088
4089 <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 <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4091
4092 Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4093 int X() {}
4094 auto Y() -> int {}
4095 </pre></td></tr>
4096
4097
4098 <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 <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4100 and if constexpr.
4101
4102 Given:
4103 constexpr int foo = 42;
4104 constexpr int bar();
4105 void baz() { if constexpr(1 > 0) {} }
4106 varDecl(isConstexpr())
4107 matches the declaration of foo.
4108 functionDecl(isConstexpr())
4109 matches the declaration of bar.
4110 ifStmt(isConstexpr())
4111 matches the if statement in baz.
4112 </pre></td></tr>
4113
4114
4115 <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 <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4117
4118 Given:
4119 class A { ~A(); };
4120 class B { ~B() = default; };
4121 functionDecl(isDefaulted())
4122 matches the declaration of ~B, but not ~A.
4123 </pre></td></tr>
4124
4125
4126 <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 <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4128
4129 Example matches A, va, fa
4130 class A {};
4131 class B; // Doesn't match, as it has no body.
4132 int va;
4133 extern int vb; // Doesn't match, as it doesn't define the variable.
4134 void fa() {}
4135 void fb(); // Doesn't match, as it has no body.
4136 @interface X
4137 - (void)ma; // Doesn't match, interface is declaration.
4138 @end
4139 @implementation X
4140 - (void)ma {}
4141 @end
4142
4143 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
4145 </pre></td></tr>
4146
4147
4148 <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 <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4150
4151 Given:
4152 void Func();
4153 void DeletedFunc() = delete;
4154 functionDecl(isDeleted())
4155 matches the declaration of DeletedFunc, but not Func.
4156 </pre></td></tr>
4157
4158
4159 <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 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4161 static member variable template instantiations.
4162
4163 Given
4164 template<typename T> void A(T t) { }
4165 template<> void A(int N) { }
4166 functionDecl(isExplicitTemplateSpecialization())
4167 matches the specialization A<int>().
4168
4169 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 </pre></td></tr>
4171
4172
4173 <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 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4175
4176 Given:
4177 extern "C" void f() {}
4178 extern "C" { void g() {} }
4179 void h() {}
4180 extern "C" int x = 1;
4181 extern "C" int y = 2;
4182 int z = 3;
4183 functionDecl(isExternC())
4184 matches the declaration of f and g, but not the declaration of h.
4185 varDecl(isExternC())
4186 matches the declaration of x and y, but not the declaration of z.
4187 </pre></td></tr>
4188
4189
4190 <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 <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4192 the inline keyword.
4193
4194 Given
4195 inline void f();
4196 void g();
4197 namespace n {
4198 inline namespace m {}
4199 }
4200 functionDecl(isInline()) will match ::f().
4201 namespaceDecl(isInline()) will match n::m.
4202 </pre></td></tr>
4203
4204
4205 <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 <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4207 into an executable program.
4208 </pre></td></tr>
4209
4210
4211 <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 <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4213
4214 Given
4215 void nope();
4216 [[noreturn]] void a();
4217 __attribute__((noreturn)) void b();
4218 struct c { [[noreturn]] c(); };
4219 functionDecl(isNoReturn())
4220 matches all of those except
4221 void nope();
4222 </pre></td></tr>
4223
4224
4225 <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 <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4227
4228 Given:
4229 void f();
4230 void g() noexcept;
4231 void h() throw();
4232 void i() throw(int);
4233 void j() noexcept(false);
4234 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4235 match the declarations of g, and h, but not f, i or j.
4236 </pre></td></tr>
4237
4238
4239 <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 <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4241 class specifier ("static" keyword) written in the source.
4242
4243 Given:
4244 static void f() {}
4245 static int i = 0;
4246 extern int j;
4247 int k;
4248 functionDecl(isStaticStorageClass())
4249 matches the function declaration f.
4250 varDecl(isStaticStorageClass())
4251 matches the variable declaration i.
4252 </pre></td></tr>
4253
4254
4255 <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 <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4257 member variable template instantiations.
4258
4259 Given
4260 template <typename T> class X {}; class A {}; X<A> x;
4261 or
4262 template <typename T> class X {}; class A {}; template class X<A>;
4263 or
4264 template <typename T> class X {}; class A {}; extern template class X<A>;
4265 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4266 matches the template instantiation of X<A>.
4267
4268 But given
4269 template <typename T> class X {}; class A {};
4270 template <> class X<A> {}; X<A> x;
4271 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4272 does not match, as X<A> is an explicit template specialization.
4273
4274 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 </pre></td></tr>
4276
4277
4278 <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 <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4280
4281 Example matches f, but not g or h. The function i will not match, even when
4282 compiled in C mode.
4283 void f(...);
4284 void g(int);
4285 template <typename... Ts> void h(Ts...);
4286 void i();
4287 </pre></td></tr>
4288
4289
4290 <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 <tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4292
4293 Given:
4294 void foo() __attribute__((__weakref__("__foo")));
4295 void bar();
4296 functionDecl(isWeak())
4297 matches the weak declaration "foo", but not "bar".
4298 </pre></td></tr>
4299
4300
4301 <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 <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4303 specific parameter count.
4304
4305 Given
4306 void f(int i) {}
4307 void g(int i, int j) {}
4308 void h(int i, int j);
4309 void j(int i);
4310 void k(int x, int y, int z, ...);
4311 functionDecl(parameterCountIs(2))
4312 matches g and h
4313 functionProtoType(parameterCountIs(2))
4314 matches g and h
4315 functionProtoType(parameterCountIs(3))
4316 matches k
4317 </pre></td></tr>
4318
4319
4320 <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 <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4322
4323 Given:
4324 void f();
4325 void g() noexcept;
4326 void h() noexcept(true);
4327 void i() noexcept(false);
4328 void j() throw();
4329 void k() throw(int);
4330 void l() throw(...);
4331 functionDecl(hasDynamicExceptionSpec()) and
4332 functionProtoType(hasDynamicExceptionSpec())
4333 match the declarations of j, k, and l, but not f, g, h, or i.
4334 </pre></td></tr>
4335
4336
4337 <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 <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4339
4340 Given:
4341 void f();
4342 void g() noexcept;
4343 void h() throw();
4344 void i() throw(int);
4345 void j() noexcept(false);
4346 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4347 match the declarations of g, and h, but not f, i or j.
4348 </pre></td></tr>
4349
4350
4351 <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 <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4353 specific parameter count.
4354
4355 Given
4356 void f(int i) {}
4357 void g(int i, int j) {}
4358 void h(int i, int j);
4359 void j(int i);
4360 void k(int x, int y, int z, ...);
4361 functionDecl(parameterCountIs(2))
4362 matches g and h
4363 functionProtoType(parameterCountIs(2))
4364 matches g and h
4365 functionProtoType(parameterCountIs(3))
4366 matches k
4367 </pre></td></tr>
4368
4369
4370 <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 <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4372 and if constexpr.
4373
4374 Given:
4375 constexpr int foo = 42;
4376 constexpr int bar();
4377 void baz() { if constexpr(1 > 0) {} }
4378 varDecl(isConstexpr())
4379 matches the declaration of foo.
4380 functionDecl(isConstexpr())
4381 matches the declaration of bar.
4382 ifStmt(isConstexpr())
4383 matches the if statement in baz.
4384 </pre></td></tr>
4385
4386
4387 <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 <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4389
4390
4391 <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 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4393
4394 Given
4395 f('false, 3.14, 42);
4396 characterLiteral(equals(0))
4397 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4398 match false
4399 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4400 match 3.14
4401 integerLiteral(equals(42))
4402 matches 42
4403
4404 Note that you cannot directly match a negative numeric literal because the
4405 minus sign is not part of the literal: It is a unary operator whose operand
4406 is the positive numeric literal. Instead, you must use a unaryOperator()
4407 matcher to match the minus sign:
4408
4409 unaryOperator(hasOperatorName("-"),
4410 hasUnaryOperand(integerLiteral(equals(13))))
4411
4412 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 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 </pre></td></tr>
4415
4416
4417 <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 <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4419
4420
4421 <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 <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4423
4424
4425 <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 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed
4427 to '.'.
4428
4429 Member calls on the implicit this pointer match as called with '->'.
4430
4431 Given
4432 class Y {
4433 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
4434 template <class T> void f() { this->f<T>(); f<T>(); }
4435 int a;
4436 static int b;
4437 };
4438 template <class T>
4439 class Z {
4440 void x() { this->m; }
4441 };
4442 memberExpr(isArrow())
4443 matches this->x, x, y.x, a, this->b
4444 cxxDependentScopeMemberExpr(isArrow())
4445 matches this->m
4446 unresolvedMemberExpr(isArrow())
4447 matches this->f<T>, f<T>
4448 </pre></td></tr>
4449
4450
4451 <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 <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4453
4454 This matcher is only provided as a performance optimization of hasName.
4455 hasAnyName(a, b, c)
4456 is equivalent to, but faster than
4457 anyOf(hasName(a), hasName(b), hasName(c))
4458 </pre></td></tr>
4459
4460
4461 <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 <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4463
4464 Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4465 void f() {
4466 int x;
4467 static int y;
4468 }
4469 int z;
4470
4471 Example matches f() because it has external formal linkage despite being
4472 unique to the translation unit as though it has internal likage
4473 (matcher = functionDecl(hasExternalFormalLinkage()))
4474
4475 namespace {
4476 void f() {}
4477 }
4478 </pre></td></tr>
4479
4480
4481 <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 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4483
4484 Supports specifying enclosing namespaces or classes by prefixing the name
4485 with '<enclosing>::'.
4486 Does not match typedefs of an underlying type with the given name.
4487
4488 Example matches X (Name == "X")
4489 class X;
4490
4491 Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4492 namespace a { namespace b { class X; } }
4493 </pre></td></tr>
4494
4495
4496 <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 <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4498 a substring matched by the given RegExp.
4499
4500 Supports specifying enclosing namespaces or classes by
4501 prefixing the name with '<enclosing>::'. Does not match typedefs
4502 of an underlying type with the given name.
4503
4504 Example matches X (regexp == "::X")
4505 class X;
4506
4507 Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4508 namespace foo { namespace bar { class X; } }
4509
4510 If the matcher is used in clang-query, RegexFlags parameter
4511 should be passed as a quoted string. e.g: "NoFlags".
4512 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4513 </pre></td></tr>
4514
4515
4516 <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 <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4518
4519 Given
4520 namespace n {
4521 namespace {} // #1
4522 }
4523 namespaceDecl(isAnonymous()) will match #1 but not ::n.
4524 </pre></td></tr>
4525
4526
4527 <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 <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4529 the inline keyword.
4530
4531 Given
4532 inline void f();
4533 void g();
4534 namespace n {
4535 inline namespace m {}
4536 }
4537 functionDecl(isInline()) will match ::f().
4538 namespaceDecl(isInline()) will match n::m.
4539 </pre></td></tr>
4540
4541
4542 <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 <tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4544 specified.
4545
4546 Given
4547
4548 #pragma omp parallel
4549 #pragma omp parallel default(none)
4550 #pragma omp parallel default(shared)
4551 #pragma omp parallel default(firstprivate)
4552
4553 ``ompDefaultClause(isFirstPrivateKind())`` matches only
4554 ``default(firstprivate)``.
4555 </pre></td></tr>
4556
4557
4558 <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 <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4560
4561 Given
4562
4563 #pragma omp parallel
4564 #pragma omp parallel default(none)
4565 #pragma omp parallel default(shared)
4566 #pragma omp parallel default(firstprivate)
4567
4568 ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4569 </pre></td></tr>
4570
4571
4572 <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 <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4574
4575 Given
4576
4577 #pragma omp parallel
4578 #pragma omp parallel default(none)
4579 #pragma omp parallel default(shared)
4580 #pragma omp parallel default(firstprivate)
4581
4582 ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4583 </pre></td></tr>
4584
4585
4586 <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 <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4588 clause kind.
4589
4590 Given
4591
4592 #pragma omp parallel
4593 #pragma omp parallel for
4594 #pragma omp for
4595
4596 `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4597 ``omp parallel`` and ``omp parallel for``.
4598
4599 If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4600 should be passed as a quoted string. e.g.,
4601 ``isAllowedToContainClauseKind("OMPC_default").``
4602 </pre></td></tr>
4603
4604
4605 <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 <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4607 i.e., directives that can't have a structured block.
4608
4609 Given
4610
4611 #pragma omp parallel
4612 {}
4613 #pragma omp taskyield
4614
4615 ``ompExecutableDirective(isStandaloneDirective()))`` matches
4616 ``omp taskyield``.
4617 </pre></td></tr>
4618
4619
4620 <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 <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4622 </pre></td></tr>
4623
4624
4625 <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 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4627 </pre></td></tr>
4628
4629
4630 <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 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4632 isSameOrDerivedFrom(hasName(...)).
4633 </pre></td></tr>
4634
4635
4636 <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 <tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4638 a specific number of arguments (including absent default arguments).
4639
4640 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4641 void f(int x, int y);
4642 f(0, 0);
4643 </pre></td></tr>
4644
4645
4646 <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 <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4648 Selector.getAsString()
4649
4650 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4651 matches both of the expressions below:
4652 [myObj methodA:argA];
4653 [myObj methodB:argB];
4654 </pre></td></tr>
4655
4656
4657 <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 <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4659
4660 objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4661 message expression in
4662
4663 UIWebView *webView = ...;
4664 CGRect bodyFrame = webView.frame;
4665 bodyFrame.size.height = self.bodyContentHeight;
4666 webView.frame = bodyFrame;
4667 // ^---- matches here
4668 </pre></td></tr>
4669
4670
4671 <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 <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4673
4674 Matches only when the selector of the objCMessageExpr is NULL. This may
4675 represent an error condition in the tree!
4676 </pre></td></tr>
4677
4678
4679 <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 <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4681
4682 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4683 matches the outer message expr in the code below, but NOT the message
4684 invocation for self.bodyView.
4685 [self.bodyView loadHTMLString:html baseURL:NULL];
4686 </pre></td></tr>
4687
4688
4689 <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 <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4691
4692 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4693 matches self.bodyView in the code below, but NOT the outer message
4694 invocation of "loadHTMLString:baseURL:".
4695 [self.bodyView loadHTMLString:html baseURL:NULL];
4696 </pre></td></tr>
4697
4698
4699 <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 <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4701
4702 Example
4703 matcher = objcMessageExpr(isClassMessage())
4704 matches
4705 [NSString stringWithFormat:@"format"];
4706 but not
4707 NSString *x = @"hello";
4708 [x containsString:@"h"];
4709 </pre></td></tr>
4710
4711
4712 <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 <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4714
4715 Example
4716 matcher = objcMessageExpr(isInstanceMessage())
4717 matches
4718 NSString *x = @"hello";
4719 [x containsString:@"h"];
4720 but not
4721 [NSString stringWithFormat:@"format"];
4722 </pre></td></tr>
4723
4724
4725 <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 <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4727 a substring matched by the given RegExp.
4728 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4729 invocation for self.bodyView.
4730 [self.bodyView loadHTMLString:html baseURL:NULL];
4731
4732 If the matcher is used in clang-query, RegexFlags parameter
4733 should be passed as a quoted string. e.g: "NoFlags".
4734 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4735 </pre></td></tr>
4736
4737
4738 <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 <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4740
4741 matcher = objCMessageExpr(numSelectorArgs(0));
4742 matches self.bodyView in the code below
4743
4744 matcher = objCMessageExpr(numSelectorArgs(2));
4745 matches the invocation of "loadHTMLString:baseURL:" but not that
4746 of self.bodyView
4747 [self.bodyView loadHTMLString:html baseURL:NULL];
4748 </pre></td></tr>
4749
4750
4751 <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 <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4753
4754 Example
4755 matcher = objcMethodDecl(isClassMethod())
4756 matches
4757 @interface I + (void)foo; @end
4758 but not
4759 @interface I - (void)bar; @end
4760 </pre></td></tr>
4761
4762
4763 <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 <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4765
4766 Example matches A, va, fa
4767 class A {};
4768 class B; // Doesn't match, as it has no body.
4769 int va;
4770 extern int vb; // Doesn't match, as it doesn't define the variable.
4771 void fa() {}
4772 void fb(); // Doesn't match, as it has no body.
4773 @interface X
4774 - (void)ma; // Doesn't match, interface is declaration.
4775 @end
4776 @implementation X
4777 - (void)ma {}
4778 @end
4779
4780 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
4782 </pre></td></tr>
4783
4784
4785 <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 <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4787
4788 Example
4789 matcher = objcMethodDecl(isInstanceMethod())
4790 matches
4791 @interface I - (void)bar; @end
4792 but not
4793 @interface I + (void)foo; @end
4794 </pre></td></tr>
4795
4796
4797 <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 <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4799
4800 Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4801 void x(int val) {}
4802 void y(int val = 0) {}
4803
4804 Deprecated. Use hasInitializer() instead to be able to
4805 match on the contents of the default argument. For example:
4806
4807 void x(int val = 7) {}
4808 void y(int val = 42) {}
4809 parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4810 matches the parameter of y
4811
4812 A matcher such as
4813 parmVarDecl(hasInitializer(anything()))
4814 is equivalent to parmVarDecl(hasDefaultArgument()).
4815 </pre></td></tr>
4816
4817
4818 <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 <tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4820 list. The parameter list could be that of either a block, function, or
4821 objc-method.
4822
4823
4824 Given
4825
4826 void f(int a, int b, int c) {
4827 }
4828
4829 ``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4830
4831 ``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4832 </pre></td></tr>
4833
4834
4835 <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 <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4837
4838 Given
4839 class Y { public: void x(); };
4840 void z() { Y* y; y->x(); }
4841 cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4842 matches y->x()
4843 </pre></td></tr>
4844
4845
4846 <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 <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4848
4849 Matches a node if it equals the node previously bound to ID.
4850
4851 Given
4852 class X { int a; int b; };
4853 cxxRecordDecl(
4854 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4855 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4856 matches the class X, as a and b have the same type.
4857
4858 Note that when multiple matches are involved via forEach* matchers,
4859 equalsBoundNodes acts as a filter.
4860 For example:
4861 compoundStmt(
4862 forEachDescendant(varDecl().bind("d")),
4863 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4864 will trigger a match for each combination of variable declaration
4865 and reference to that variable declaration within a compound statement.
4866 </pre></td></tr>
4867
4868
4869 <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 <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4871 the node, not hidden within a typedef.
4872
4873 Given
4874 typedef const int const_int;
4875 const_int i;
4876 int *const j;
4877 int *volatile k;
4878 int m;
4879 varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4880 i is const-qualified but the qualifier is not local.
4881 </pre></td></tr>
4882
4883
4884 <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 <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4886
4887 Given
4888 void a(char);
4889 void b(wchar_t);
4890 void c(double);
4891 functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4892 matches "a(char)", "b(wchar_t)", but not "c(double)".
4893 </pre></td></tr>
4894
4895
4896 <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 <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4898 the Objective-C object pointer type, which is different despite being
4899 syntactically similar.
4900
4901 Given
4902 int *i = nullptr;
4903
4904 @interface Foo
4905 @end
4906 Foo *f;
4907
4908 int j;
4909 varDecl(hasType(isAnyPointer()))
4910 matches "int *i" and "Foo *f", but not "int j".
4911 </pre></td></tr>
4912
4913
4914 <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 <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4916 include "top-level" const.
4917
4918 Given
4919 void a(int);
4920 void b(int const);
4921 void c(const int);
4922 void d(const int*);
4923 void e(int const) {};
4924 functionDecl(hasAnyParameter(hasType(isConstQualified())))
4925 matches "void b(int const)", "void c(const int)" and
4926 "void e(int const) {}". It does not match d as there
4927 is no top-level const on the parameter type "const int *".
4928 </pre></td></tr>
4929
4930
4931 <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 <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4933
4934 Given
4935 void a(int);
4936 void b(long);
4937 void c(double);
4938 functionDecl(hasAnyParameter(hasType(isInteger())))
4939 matches "a(int)", "b(long)", but not "c(double)".
4940 </pre></td></tr>
4941
4942
4943 <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 <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4945
4946 Given
4947 void a(int);
4948 void b(unsigned long);
4949 void c(double);
4950 functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4951 matches "a(int)", but not "b(unsigned long)" and "c(double)".
4952 </pre></td></tr>
4953
4954
4955 <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 <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4957
4958 Given
4959 void a(int);
4960 void b(unsigned long);
4961 void c(double);
4962 functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4963 matches "b(unsigned long)", but not "a(int)" and "c(double)".
4964 </pre></td></tr>
4965
4966
4967 <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 <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4969 include "top-level" volatile.
4970
4971 Given
4972 void a(int);
4973 void b(int volatile);
4974 void c(volatile int);
4975 void d(volatile int*);
4976 void e(int volatile) {};
4977 functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4978 matches "void b(int volatile)", "void c(volatile int)" and
4979 "void e(int volatile) {}". It does not match d as there
4980 is no top-level volatile on the parameter type "volatile int *".
4981 </pre></td></tr>
4982
4983
4984 <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 <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4986
4987 Matches a node if it equals the node previously bound to ID.
4988
4989 Given
4990 class X { int a; int b; };
4991 cxxRecordDecl(
4992 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4993 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4994 matches the class X, as a and b have the same type.
4995
4996 Note that when multiple matches are involved via forEach* matchers,
4997 equalsBoundNodes acts as a filter.
4998 For example:
4999 compoundStmt(
5000 forEachDescendant(varDecl().bind("d")),
5001 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5002 will trigger a match for each combination of variable declaration
5003 and reference to that variable declaration within a compound statement.
5004 </pre></td></tr>
5005
5006
5007 <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 <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5009
5010 Stmt has pointer identity in the AST.
5011 </pre></td></tr>
5012
5013
5014 <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 <tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5016 Does not match if only part of the statement is expanded from that macro or
5017 if different parts of the the statement are expanded from different
5018 appearances of the macro.
5019 </pre></td></tr>
5020
5021
5022 <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 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5024 partially matching a given regex.
5025
5026 Example matches Y but not X
5027 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5028 #include "ASTMatcher.h"
5029 class X {};
5030 ASTMatcher.h:
5031 class Y {};
5032
5033 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
5035 If the matcher is used in clang-query, RegexFlags parameter
5036 should be passed as a quoted string. e.g: "NoFlags".
5037 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5038 </pre></td></tr>
5039
5040
5041 <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 <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5043
5044 Example matches X but not Y
5045 (matcher = cxxRecordDecl(isExpansionInMainFile())
5046 #include <Y.h>
5047 class X {};
5048 Y.h:
5049 class Y {};
5050
5051 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 </pre></td></tr>
5053
5054
5055 <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 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5057
5058 Example matches Y but not X
5059 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5060 #include <SystemHeader.h>
5061 class X {};
5062 SystemHeader.h:
5063 class Y {};
5064
5065 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 </pre></td></tr>
5067
5068
5069 <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 <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5071
5072 Given
5073 int j;
5074 template<typename T> void A(T t) { T i; j += 42;}
5075 A(0);
5076 A(0U);
5077 declStmt(isInTemplateInstantiation())
5078 matches 'int i;' and 'unsigned i'.
5079 unless(stmt(isInTemplateInstantiation()))
5080 will NOT match j += 42; as it's shared between the template definition and
5081 instantiation.
5082 </pre></td></tr>
5083
5084
5085 <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 <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5087
5088 Given
5089 int a[42];
5090 int b[2 * 21];
5091 int c[41], d[43];
5092 char *s = "abcd";
5093 wchar_t *ws = L"abcd";
5094 char *w = "a";
5095 constantArrayType(hasSize(42))
5096 matches "int a[42]" and "int b[2 * 21]"
5097 stringLiteral(hasSize(4))
5098 matches "abcd", L"abcd"
5099 </pre></td></tr>
5100
5101
5102 <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 <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5104
5105 Example matches C, but not S, U or E.
5106 struct S {};
5107 class C {};
5108 union U {};
5109 enum E {};
5110 </pre></td></tr>
5111
5112
5113 <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 <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5115
5116 Example matches A, va, fa
5117 class A {};
5118 class B; // Doesn't match, as it has no body.
5119 int va;
5120 extern int vb; // Doesn't match, as it doesn't define the variable.
5121 void fa() {}
5122 void fb(); // Doesn't match, as it has no body.
5123 @interface X
5124 - (void)ma; // Doesn't match, interface is declaration.
5125 @end
5126 @implementation X
5127 - (void)ma {}
5128 @end
5129
5130 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
5132 </pre></td></tr>
5133
5134
5135 <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 <tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5137
5138 Example matches E, but not C, S or U.
5139 struct S {};
5140 class C {};
5141 union U {};
5142 enum E {};
5143 </pre></td></tr>
5144
5145
5146 <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 <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5148
5149 Example matches S, but not C, U or E.
5150 struct S {};
5151 class C {};
5152 union U {};
5153 enum E {};
5154 </pre></td></tr>
5155
5156
5157 <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 <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5159
5160 Example matches U, but not C, S or E.
5161 struct S {};
5162 class C {};
5163 union U {};
5164 enum E {};
5165 </pre></td></tr>
5166
5167
5168 <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 <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5170
5171 Note that 'Value' is a string as the template argument's value is
5172 an arbitrary precision integer. 'Value' must be euqal to the canonical
5173 representation of that integral value in base 10.
5174
5175 Given
5176 template<int T> struct C {};
5177 C<42> c;
5178 classTemplateSpecializationDecl(
5179 hasAnyTemplateArgument(equalsIntegralValue("42")))
5180 matches the implicit instantiation of C in C<42>.
5181 </pre></td></tr>
5182
5183
5184 <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 <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5186
5187 Given
5188 template<int T> struct C {};
5189 C<42> c;
5190 classTemplateSpecializationDecl(
5191 hasAnyTemplateArgument(isIntegral()))
5192 matches the implicit instantiation of C in C<42>
5193 with isIntegral() matching 42.
5194 </pre></td></tr>
5195
5196
5197 <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 <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5199
5200 Given
5201 template<typename T> struct C {};
5202 C<int> c;
5203 classTemplateSpecializationDecl(templateArgumentCountIs(1))
5204 matches C<int>.
5205 </pre></td></tr>
5206
5207
5208 <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 <tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5210 Does not match if only part of the statement is expanded from that macro or
5211 if different parts of the the statement are expanded from different
5212 appearances of the macro.
5213 </pre></td></tr>
5214
5215
5216 <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 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5218 partially matching a given regex.
5219
5220 Example matches Y but not X
5221 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5222 #include "ASTMatcher.h"
5223 class X {};
5224 ASTMatcher.h:
5225 class Y {};
5226
5227 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
5229 If the matcher is used in clang-query, RegexFlags parameter
5230 should be passed as a quoted string. e.g: "NoFlags".
5231 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5232 </pre></td></tr>
5233
5234
5235 <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 <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5237
5238 Example matches X but not Y
5239 (matcher = cxxRecordDecl(isExpansionInMainFile())
5240 #include <Y.h>
5241 class X {};
5242 Y.h:
5243 class Y {};
5244
5245 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 </pre></td></tr>
5247
5248
5249 <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 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5251
5252 Example matches Y but not X
5253 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5254 #include <SystemHeader.h>
5255 class X {};
5256 SystemHeader.h:
5257 class Y {};
5258
5259 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 </pre></td></tr>
5261
5262
5263 <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 <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5265
5266 Given
5267 struct S { bool func(); };
5268 functionDecl(returns(booleanType()))
5269 matches "bool func();"
5270 </pre></td></tr>
5271
5272
5273 <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 <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5275
5276 Matches a node if it equals the node previously bound to ID.
5277
5278 Given
5279 class X { int a; int b; };
5280 cxxRecordDecl(
5281 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5282 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5283 matches the class X, as a and b have the same type.
5284
5285 Note that when multiple matches are involved via forEach* matchers,
5286 equalsBoundNodes acts as a filter.
5287 For example:
5288 compoundStmt(
5289 forEachDescendant(varDecl().bind("d")),
5290 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5291 will trigger a match for each combination of variable declaration
5292 and reference to that variable declaration within a compound statement.
5293 </pre></td></tr>
5294
5295
5296 <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 <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5298
5299 Type has pointer identity in the AST.
5300 </pre></td></tr>
5301
5302
5303 <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 <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5305
5306 Given
5307 int i;
5308 float f;
5309 realFloatingPointType()
5310 matches "float f" but not "int i"
5311 </pre></td></tr>
5312
5313
5314 <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 <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5316
5317 Given
5318 struct S { void func(); };
5319 functionDecl(returns(voidType()))
5320 matches "void func();"
5321 </pre></td></tr>
5322
5323
5324 <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 <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5326
5327 Given
5328 int x;
5329 int s = sizeof(x) + alignof(x)
5330 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5331 matches sizeof(x)
5332
5333 If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5334 should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5335 </pre></td></tr>
5336
5337
5338 <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 <tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5340 specified names.
5341
5342 hasAnyOperatorName("+", "-")
5343 Is equivalent to
5344 anyOf(hasOperatorName("+"), hasOperatorName("-"))
5345 </pre></td></tr>
5346
5347
5348 <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 <tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5350 unary).
5351
5352 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5353 !(a || b)
5354 </pre></td></tr>
5355
5356
5357 <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 <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed
5359 to '.'.
5360
5361 Member calls on the implicit this pointer match as called with '->'.
5362
5363 Given
5364 class Y {
5365 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
5366 template <class T> void f() { this->f<T>(); f<T>(); }
5367 int a;
5368 static int b;
5369 };
5370 template <class T>
5371 class Z {
5372 void x() { this->m; }
5373 };
5374 memberExpr(isArrow())
5375 matches this->x, x, y.x, a, this->b
5376 cxxDependentScopeMemberExpr(isArrow())
5377 matches this->m
5378 unresolvedMemberExpr(isArrow())
5379 matches this->f<T>, f<T>
5380 </pre></td></tr>
5381
5382
5383 <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 <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5385
5386 Example matches x, but not y, z, or a.
5387 (matcher = varDecl(hasAutomaticStorageDuration())
5388 void f() {
5389 int x;
5390 static int y;
5391 thread_local int z;
5392 }
5393 int a;
5394 </pre></td></tr>
5395
5396
5397 <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 <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5399
5400 Example matches y and z (matcher = varDecl(hasGlobalStorage())
5401 void f() {
5402 int x;
5403 static int y;
5404 }
5405 int z;
5406 </pre></td></tr>
5407
5408
5409 <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 <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5411 non-static local variable.
5412
5413 Example matches x (matcher = varDecl(hasLocalStorage())
5414 void f() {
5415 int x;
5416 static int y;
5417 }
5418 int z;
5419 </pre></td></tr>
5420
5421
5422 <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 <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5424 It includes the variable declared at namespace scope and those declared
5425 with "static" and "extern" storage class specifiers.
5426
5427 void f() {
5428 int x;
5429 static int y;
5430 thread_local int z;
5431 }
5432 int a;
5433 static int b;
5434 extern int c;
5435 varDecl(hasStaticStorageDuration())
5436 matches the function declaration y, a, b and c.
5437 </pre></td></tr>
5438
5439
5440 <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 <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5442
5443 Example matches z, but not x, z, or a.
5444 (matcher = varDecl(hasThreadStorageDuration())
5445 void f() {
5446 int x;
5447 static int y;
5448 thread_local int z;
5449 }
5450 int a;
5451 </pre></td></tr>
5452
5453
5454 <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 <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5456 and if constexpr.
5457
5458 Given:
5459 constexpr int foo = 42;
5460 constexpr int bar();
5461 void baz() { if constexpr(1 > 0) {} }
5462 varDecl(isConstexpr())
5463 matches the declaration of foo.
5464 functionDecl(isConstexpr())
5465 matches the declaration of bar.
5466 ifStmt(isConstexpr())
5467 matches the if statement in baz.
5468 </pre></td></tr>
5469
5470
5471 <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 <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5473
5474 Example matches A, va, fa
5475 class A {};
5476 class B; // Doesn't match, as it has no body.
5477 int va;
5478 extern int vb; // Doesn't match, as it doesn't define the variable.
5479 void fa() {}
5480 void fb(); // Doesn't match, as it has no body.
5481 @interface X
5482 - (void)ma; // Doesn't match, interface is declaration.
5483 @end
5484 @implementation X
5485 - (void)ma {}
5486 @end
5487
5488 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
5490 </pre></td></tr>
5491
5492
5493 <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 <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5495 a C++ catch block, or an Objective-C statement.
5496
5497 Example matches x (matcher = varDecl(isExceptionVariable())
5498 void f(int y) {
5499 try {
5500 } catch (int x) {
5501 }
5502 }
5503 </pre></td></tr>
5504
5505
5506 <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 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5508 static member variable template instantiations.
5509
5510 Given
5511 template<typename T> void A(T t) { }
5512 template<> void A(int N) { }
5513 functionDecl(isExplicitTemplateSpecialization())
5514 matches the specialization A<int>().
5515
5516 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 </pre></td></tr>
5518
5519
5520 <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 <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5522
5523 Given:
5524 extern "C" void f() {}
5525 extern "C" { void g() {} }
5526 void h() {}
5527 extern "C" int x = 1;
5528 extern "C" int y = 2;
5529 int z = 3;
5530 functionDecl(isExternC())
5531 matches the declaration of f and g, but not the declaration of h.
5532 varDecl(isExternC())
5533 matches the declaration of x and y, but not the declaration of z.
5534 </pre></td></tr>
5535
5536
5537 <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 <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5539
5540 Example matches y (matcher = varDecl(isStaticLocal()))
5541 void f() {
5542 int x;
5543 static int y;
5544 }
5545 static int z;
5546 </pre></td></tr>
5547
5548
5549 <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 <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5551 class specifier ("static" keyword) written in the source.
5552
5553 Given:
5554 static void f() {}
5555 static int i = 0;
5556 extern int j;
5557 int k;
5558 functionDecl(isStaticStorageClass())
5559 matches the function declaration f.
5560 varDecl(isStaticStorageClass())
5561 matches the variable declaration i.
5562 </pre></td></tr>
5563
5564
5565 <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 <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5567 member variable template instantiations.
5568
5569 Given
5570 template <typename T> class X {}; class A {}; X<A> x;
5571 or
5572 template <typename T> class X {}; class A {}; template class X<A>;
5573 or
5574 template <typename T> class X {}; class A {}; extern template class X<A>;
5575 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5576 matches the template instantiation of X<A>.
5577
5578 But given
5579 template <typename T> class X {}; class A {};
5580 template <> class X<A> {}; X<A> x;
5581 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5582 does not match, as X<A> is an explicit template specialization.
5583
5584 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 </pre></td></tr>
5586
5587 <!--END_NARROWING_MATCHERS -->
5588 </table>
5589
5590 <!-- ======================================================================= -->
5591 <h2 id="traversal-matchers">AST Traversal Matchers</h2>
5592 <!-- ======================================================================= -->
5593
5594 <p>Traversal matchers specify the relationship to other nodes that are
5595 reachable from the current node.</p>
5596
5597 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5598 forEachDescendant) which work on all nodes and allow users to write more generic
5599 match expressions.</p>
5600
5601 <table>
5602 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5603 <!-- START_TRAVERSAL_MATCHERS -->
5604
5605 <tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr>
5606 <tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5607
5608 The code
5609 var1 != var2;
5610 might be represented in the clang AST as a binaryOperator, a
5611 cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5612
5613 * whether the types of var1 and var2 are fundamental (binaryOperator) or at
5614 least one is a class type (cxxOperatorCallExpr)
5615 * whether the code appears in a template declaration, if at least one of the
5616 vars is a dependent-type (binaryOperator)
5617 * whether the code relies on a rewritten binary operator, such as a
5618 spaceship operator or an inverted equality operator
5619 (cxxRewrittenBinaryOperator)
5620
5621 This matcher elides details in places where the matchers for the nodes are
5622 compatible.
5623
5624 Given
5625 binaryOperation(
5626 hasOperatorName("!="),
5627 hasLHS(expr().bind("lhs")),
5628 hasRHS(expr().bind("rhs"))
5629 )
5630 matches each use of "!=" in:
5631 struct S{
5632 bool operator!=(const S&) const;
5633 };
5634
5635 void foo()
5636 {
5637 1 != 2;
5638 S() != S();
5639 }
5640
5641 template<typename T>
5642 void templ()
5643 {
5644 1 != 2;
5645 T() != S();
5646 }
5647 struct HasOpEq
5648 {
5649 bool operator==(const HasOpEq &) const;
5650 };
5651
5652 void inverse()
5653 {
5654 HasOpEq s1;
5655 HasOpEq s2;
5656 if (s1 != s2)
5657 return;
5658 }
5659
5660 struct HasSpaceship
5661 {
5662 bool operator<=>(const HasOpEq &) const;
5663 };
5664
5665 void use_spaceship()
5666 {
5667 HasSpaceship s1;
5668 HasSpaceship s2;
5669 if (s1 != s2)
5670 return;
5671 }
5672 </pre></td></tr>
5673
5674
5675 <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
5676 <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5677
5678 Unlike anyOf, eachOf will generate a match result for each
5679 matching submatcher.
5680
5681 For example, in:
5682 class A { int a; int b; };
5683 The matcher:
5684 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5685 has(fieldDecl(hasName("b")).bind("v"))))
5686 will generate two results binding "v", the first of which binds
5687 the field declaration of a, the second the field declaration of
5688 b.
5689
5690 Usable as: Any Matcher
5691 </pre></td></tr>
5692
5693
5694 <tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr>
5695 <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5696
5697 Generates results for each match.
5698
5699 For example, in:
5700 class A { class B {}; class C {}; };
5701 The matcher:
5702 cxxRecordDecl(hasName("::A"),
5703 findAll(cxxRecordDecl(isDefinition()).bind("m")))
5704 will generate results for A, B and C.
5705
5706 Usable as: Any Matcher
5707 </pre></td></tr>
5708
5709
5710 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr>
5711 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5712 provided matcher.
5713
5714 Example matches X, A, A::X, B, B::C, B::C::X
5715 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5716 class X {};
5717 class A { class X {}; }; // Matches A, because A::X is a class of name
5718 // X inside A.
5719 class B { class C { class X {}; }; };
5720
5721 DescendantT must be an AST base type.
5722
5723 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5724 each result that matches instead of only on the first one.
5725
5726 Note: Recursively combined ForEachDescendant can cause many matches:
5727 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5728 forEachDescendant(cxxRecordDecl())
5729 )))
5730 will match 10 times (plus injected class name matches) on:
5731 class A { class B { class C { class D { class E {}; }; }; }; };
5732
5733 Usable as: Any Matcher
5734 </pre></td></tr>
5735
5736
5737 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr>
5738 <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5739 provided matcher.
5740
5741 Example matches X, Y, Y::X, Z::Y, Z::Y::X
5742 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5743 class X {};
5744 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
5745 // inside Y.
5746 class Z { class Y { class X {}; }; }; // Does not match Z.
5747
5748 ChildT must be an AST base type.
5749
5750 As opposed to 'has', 'forEach' will cause a match for each result that
5751 matches instead of only on the first one.
5752
5753 Usable as: Any Matcher
5754 </pre></td></tr>
5755
5756
5757 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr>
5758 <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5759 matcher.
5760
5761 Given
5762 void f() { if (true) { int x = 42; } }
5763 void g() { for (;;) { int x = 43; } }
5764 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5765
5766 Usable as: Any Matcher
5767 </pre></td></tr>
5768
5769
5770 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr>
5771 <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5772 provided matcher.
5773
5774 Example matches X, Y, Z
5775 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5776 class X {}; // Matches X, because X::X is a class of name X inside X.
5777 class Y { class X {}; };
5778 class Z { class Y { class X {}; }; };
5779
5780 DescendantT must be an AST base type.
5781
5782 Usable as: Any Matcher
5783 </pre></td></tr>
5784
5785
5786 <tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr>
5787 <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5788 provided matcher.
5789
5790 Example matches X, Y
5791 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5792 class X {}; // Matches X, because X::X is a class of name X inside X.
5793 class Y { class X {}; };
5794 class Z { class Y { class X {}; }; }; // Does not match Z.
5795
5796 ChildT must be an AST base type.
5797
5798 Usable as: Any Matcher
5799 Note that has is direct matcher, so it also matches things like implicit
5800 casts and paren casts. If you are matching with expr then you should
5801 probably consider using ignoringParenImpCasts like:
5802 has(ignoringParenImpCasts(expr())).
5803 </pre></td></tr>
5804
5805
5806 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr>
5807 <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5808 matcher.
5809
5810 Given
5811 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5812 compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5813
5814 Usable as: Any Matcher
5815 </pre></td></tr>
5816
5817
5818 <tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr>
5819 <tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5820
5821 Because CallExpr and CXXConstructExpr do not share a common
5822 base class with API accessing arguments etc, AST Matchers for code
5823 which should match both are typically duplicated. This matcher
5824 removes the need for duplication.
5825
5826 Given code
5827 struct ConstructorTakesInt
5828 {
5829 ConstructorTakesInt(int i) {}
5830 };
5831
5832 void callTakesInt(int i)
5833 {
5834 }
5835
5836 void doCall()
5837 {
5838 callTakesInt(42);
5839 }
5840
5841 void doConstruct()
5842 {
5843 ConstructorTakesInt cti(42);
5844 }
5845
5846 The matcher
5847 invocation(hasArgument(0, integerLiteral(equals(42))))
5848 matches the expression in both doCall and doConstruct
5849 </pre></td></tr>
5850
5851
5852 <tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr>
5853 <tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5854
5855 However, optionally will retain any bindings generated by the submatcher.
5856 Useful when additional information which may or may not present about a main
5857 matching node is desired.
5858
5859 For example, in:
5860 class Foo {
5861 int bar;
5862 }
5863 The matcher:
5864 cxxRecordDecl(
5865 optionally(has(
5866 fieldDecl(hasName("bar")).bind("var")
5867 ))).bind("record")
5868 will produce a result binding for both "record" and "var".
5869 The matcher will produce a "record" binding for even if there is no data
5870 member named "bar" in that class.
5871
5872 Usable as: Any Matcher
5873 </pre></td></tr>
5874
5875
5876 <tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr>
5877 <tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5878
5879 Given
5880 void foo()
5881 {
5882 int i = 3.0;
5883 }
5884 The matcher
5885 traverse(TK_IgnoreUnlessSpelledInSource,
5886 varDecl(hasInitializer(floatLiteral().bind("init")))
5887 )
5888 matches the variable declaration with "init" bound to the "3.0".
5889 </pre></td></tr>
5890
5891
5892 <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 <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5894 switch statement or conditional operator.
5895
5896 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5897 if (true) {}
5898 </pre></td></tr>
5899
5900
5901 <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 <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5903 (binary or ternary).
5904
5905 Example matches b
5906 condition ? a : b
5907 condition ?: b
5908 </pre></td></tr>
5909
5910
5911 <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 <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5913
5914 Example 1 (conditional ternary operator): matches a
5915 condition ? a : b
5916
5917 Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5918 condition ?: b
5919 </pre></td></tr>
5920
5921
5922 <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 <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5924 matches the given matcher.
5925
5926 The associated declaration is:
5927 - for type nodes, the declaration of the underlying type
5928 - for CallExpr, the declaration of the callee
5929 - for MemberExpr, the declaration of the referenced member
5930 - for CXXConstructExpr, the declaration of the constructor
5931 - for CXXNewExpr, the declaration of the operator new
5932 - for ObjCIvarExpr, the declaration of the ivar
5933
5934 For type nodes, hasDeclaration will generally match the declaration of the
5935 sugared type. Given
5936 class X {};
5937 typedef X Y;
5938 Y y;
5939 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5940 typedefDecl. A common use case is to match the underlying, desugared type.
5941 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5942 varDecl(hasType(hasUnqualifiedDesugaredType(
5943 recordType(hasDeclaration(decl())))))
5944 In this matcher, the decl will match the CXXRecordDecl of class X.
5945
5946 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
5953 </pre></td></tr>
5954
5955
5956 <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 <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5958
5959 Given
5960 int i[5];
5961 void f() { i[1] = 42; }
5962 arraySubscriptExpression(hasBase(implicitCastExpr(
5963 hasSourceExpression(declRefExpr()))))
5964 matches i[1] with the declRefExpr() matching i
5965 </pre></td></tr>
5966
5967
5968 <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 <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5970
5971 Given
5972 int i[5];
5973 void f() { i[1] = 42; }
5974 arraySubscriptExpression(hasIndex(integerLiteral()))
5975 matches i[1] with the integerLiteral() matching 1
5976 </pre></td></tr>
5977
5978
5979 <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 <tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
5981
5982 Example matches a (matcher = binaryOperator(hasLHS()))
5983 a || b
5984 </pre></td></tr>
5985
5986
5987 <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 <tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
5989
5990 Example matches b (matcher = binaryOperator(hasRHS()))
5991 a || b
5992 </pre></td></tr>
5993
5994
5995 <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 <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5997 type.
5998
5999 Given
6000 struct A {};
6001 A a[7];
6002 int b[7];
6003 arrayType(hasElementType(builtinType()))
6004 matches "int b[7]"
6005
6006 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 </pre></td></tr>
6008
6009
6010 <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 <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6012
6013 Given
6014 _Atomic(int) i;
6015 _Atomic(float) f;
6016 atomicType(hasValueType(isInteger()))
6017 matches "_Atomic(int) i"
6018
6019 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>
6020 </pre></td></tr>
6021
6022
6023 <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 <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6025
6026 Note: There is no TypeLoc for the deduced type and thus no
6027 getDeducedLoc() matcher.
6028
6029 Given
6030 auto a = 1;
6031 auto b = 2.0;
6032 autoType(hasDeducedType(isInteger()))
6033 matches "auto a"
6034
6035 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>
6036 </pre></td></tr>
6037
6038
6039 <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 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6041 binary operator matches.
6042 </pre></td></tr>
6043
6044
6045 <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 <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6047
6048 Example matches a (matcher = binaryOperator(hasLHS()))
6049 a || b
6050 </pre></td></tr>
6051
6052
6053 <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 <tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6055
6056 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6057 integerLiteral(equals(2)))
6058 1 + 2 // Match
6059 2 + 1 // Match
6060 1 + 1 // No match
6061 2 + 2 // No match
6062 </pre></td></tr>
6063
6064
6065 <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 <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6067
6068 Example matches b (matcher = binaryOperator(hasRHS()))
6069 a || b
6070 </pre></td></tr>
6071
6072
6073 <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 <tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6075
6076 For example, in:
6077 void foo()
6078 {
6079 int arr[3];
6080 auto &[f, s, t] = arr;
6081
6082 f = 42;
6083 }
6084 The matcher:
6085 bindingDecl(hasName("f"),
6086 forDecomposition(decompositionDecl())
6087 matches 'f' in 'auto &[f, s, t]'.
6088 </pre></td></tr>
6089
6090
6091 <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 <tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6093 block.
6094
6095 Does not match the 'this' parameter of a method.
6096
6097 Given
6098 class X { void f(int x, int y, int z) {} };
6099 cxxMethodDecl(hasAnyParameter(hasName("y")))
6100 matches f(int x, int y, int z) {}
6101 with hasAnyParameter(...)
6102 matching int y
6103
6104 For ObjectiveC, given
6105 @interface I - (void) f:(int) y; @end
6106
6107 the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6108 matches the declaration of method f with hasParameter
6109 matching y.
6110
6111 For blocks, given
6112 b = ^(int y) { printf("%d", y) };
6113
6114 the matcher blockDecl(hasAnyParameter(hasName("y")))
6115 matches the declaration of the block b with hasParameter
6116 matching y.
6117 </pre></td></tr>
6118
6119
6120 <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 <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6122 declaration or a block.
6123
6124 Given
6125 class X { void f(int x) {} };
6126 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6127 matches f(int x) {}
6128 with hasParameter(...)
6129 matching int x
6130
6131 For ObjectiveC, given
6132 @interface I - (void) f:(int) y; @end
6133
6134 the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6135 matches the declaration of method f with hasParameter
6136 matching y.
6137 </pre></td></tr>
6138
6139
6140 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6142
6143 Examples:
6144 int x;
6145 declaratorDecl(hasTypeLoc(loc(asString("int"))))
6146 matches int x
6147
6148 auto x = int(3);
6149 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6150 matches int(3)
6151
6152 struct Foo { Foo(int, int); };
6153 auto x = Foo(1, 2);
6154 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6155 matches Foo(1, 2)
6156
6157 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6161 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6165 </pre></td></tr>
6166
6167
6168 <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 <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6170 pointee matches a given matcher.
6171
6172 Given
6173 int *a;
6174 int const *b;
6175 float const *f;
6176 pointerType(pointee(isConstQualified(), isInteger()))
6177 matches "int const *b"
6178
6179 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 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 </pre></td></tr>
6182
6183
6184 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6186
6187 Examples:
6188 int x;
6189 declaratorDecl(hasTypeLoc(loc(asString("int"))))
6190 matches int x
6191
6192 auto x = int(3);
6193 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6194 matches int(3)
6195
6196 struct Foo { Foo(int, int); };
6197 auto x = Foo(1, 2);
6198 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6199 matches Foo(1, 2)
6200
6201 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6205 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6209 </pre></td></tr>
6210
6211
6212 <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 <tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6214 declaration's type.
6215
6216 In case of a value declaration (for example a variable declaration),
6217 this resolves one layer of indirection. For example, in the value
6218 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6219 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6220 declaration of x.
6221
6222 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6223 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6224 and friend class X (matcher = friendDecl(hasType("X"))
6225 and public virtual X (matcher = cxxBaseSpecifier(hasType(
6226 cxxRecordDecl(hasName("X"))))
6227 class X {};
6228 void y(X &x) { x; X z; }
6229 class Y { friend class X; };
6230 class Z : public virtual X {};
6231
6232 Example matches class Derived
6233 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6234 class Base {};
6235 class Derived : Base {};
6236
6237 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
6239 </pre></td></tr>
6240
6241
6242 <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 <tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6244 matcher.
6245
6246 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6247 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6248 and U (matcher = typedefDecl(hasType(asString("int")))
6249 and friend class X (matcher = friendDecl(hasType("X"))
6250 and public virtual X (matcher = cxxBaseSpecifier(hasType(
6251 asString("class X")))
6252 class X {};
6253 void y(X &x) { x; X z; }
6254 typedef int U;
6255 class Y { friend class X; };
6256 class Z : public virtual X {};
6257 </pre></td></tr>
6258
6259
6260 <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 <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6262
6263 Given
6264 void f(int i);
6265 int y;
6266 f(y);
6267 callExpr(
6268 forEachArgumentWithParam(
6269 declRefExpr(to(varDecl(hasName("y")))),
6270 parmVarDecl(hasType(isInteger()))
6271 ))
6272 matches f(y);
6273 with declRefExpr(...)
6274 matching int y
6275 and parmVarDecl(...)
6276 matching int i
6277 </pre></td></tr>
6278
6279
6280 <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 <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6282 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6283 it works on calls through function pointers as well.
6284
6285 The difference is, that function pointers do not provide access to a
6286 ParmVarDecl, but only the QualType for each argument.
6287
6288 Given
6289 void f(int i);
6290 int y;
6291 f(y);
6292 void (*f_ptr)(int) = f;
6293 f_ptr(y);
6294 callExpr(
6295 forEachArgumentWithParamType(
6296 declRefExpr(to(varDecl(hasName("y")))),
6297 qualType(isInteger()).bind("type)
6298 ))
6299 matches f(y) and f_ptr(y)
6300 with declRefExpr(...)
6301 matching int y
6302 and qualType(...)
6303 matching int
6304 </pre></td></tr>
6305
6306
6307 <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 <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6309 expression, or an ObjC-message-send expression.
6310
6311 Given
6312 void x(int, int, int) { int y; x(1, y, 42); }
6313 callExpr(hasAnyArgument(declRefExpr()))
6314 matches x(1, y, 42)
6315 with hasAnyArgument(...)
6316 matching y
6317
6318 For ObjectiveC, given
6319 @interface I - (void) f:(int) y; @end
6320 void foo(I *i) { [i f:12]; }
6321 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6322 matches [i f:12]
6323 </pre></td></tr>
6324
6325
6326 <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 <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6328 call expression.
6329
6330 Example matches y in x(y)
6331 (matcher = callExpr(hasArgument(0, declRefExpr())))
6332 void x(int) { int y; x(y); }
6333 </pre></td></tr>
6334
6335
6336 <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 <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6338 matches the given matcher.
6339
6340 The associated declaration is:
6341 - for type nodes, the declaration of the underlying type
6342 - for CallExpr, the declaration of the callee
6343 - for MemberExpr, the declaration of the referenced member
6344 - for CXXConstructExpr, the declaration of the constructor
6345 - for CXXNewExpr, the declaration of the operator new
6346 - for ObjCIvarExpr, the declaration of the ivar
6347
6348 For type nodes, hasDeclaration will generally match the declaration of the
6349 sugared type. Given
6350 class X {};
6351 typedef X Y;
6352 Y y;
6353 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6354 typedefDecl. A common use case is to match the underlying, desugared type.
6355 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6356 varDecl(hasType(hasUnqualifiedDesugaredType(
6357 recordType(hasDeclaration(decl())))))
6358 In this matcher, the decl will match the CXXRecordDecl of class X.
6359
6360 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6367 </pre></td></tr>
6368
6369
6370 <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 <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6372
6373 Given
6374 class A { A() : i(42), j(42) {} int i; int j; };
6375 cxxConstructorDecl(forEachConstructorInitializer(
6376 forField(decl().bind("x"))
6377 ))
6378 will trigger two matches, binding for 'i' and 'j' respectively.
6379 </pre></td></tr>
6380
6381
6382 <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 <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6384
6385 Given
6386 struct Foo {
6387 Foo() : foo_(1) { }
6388 int foo_;
6389 };
6390 cxxRecordDecl(has(cxxConstructorDecl(
6391 hasAnyConstructorInitializer(anything())
6392 )))
6393 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6394 </pre></td></tr>
6395
6396
6397 <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 <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6399
6400 Given
6401 struct Foo {
6402 Foo() : foo_(1) { }
6403 int foo_;
6404 };
6405 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6406 forField(hasName("foo_"))))))
6407 matches Foo
6408 with forField matching foo_
6409 </pre></td></tr>
6410
6411
6412 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6414
6415 Examples:
6416 int x;
6417 declaratorDecl(hasTypeLoc(loc(asString("int"))))
6418 matches int x
6419
6420 auto x = int(3);
6421 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6422 matches int(3)
6423
6424 struct Foo { Foo(int, int); };
6425 auto x = Foo(1, 2);
6426 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6427 matches Foo(1, 2)
6428
6429 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6433 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6437 </pre></td></tr>
6438
6439
6440 <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 <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6442
6443 Given
6444 struct Foo {
6445 Foo() : foo_(1) { }
6446 int foo_;
6447 };
6448 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6449 withInitializer(integerLiteral(equals(1)))))))
6450 matches Foo
6451 with withInitializer matching (1)
6452 </pre></td></tr>
6453
6454
6455 <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 <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6457 given matcher. Implicit object expressions are included; that is, it matches
6458 use of implicit `this`.
6459
6460 Given
6461 struct X {
6462 int m;
6463 int f(X x) { x.m; return m; }
6464 };
6465 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6466 matches `x.m`, but not `m`; however,
6467 memberExpr(hasObjectExpression(hasType(pointsTo(
6468 cxxRecordDecl(hasName("X"))))))
6469 matches `m` (aka. `this->m`), but not `x.m`.
6470 </pre></td></tr>
6471
6472
6473 <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 <tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6475
6476
6477 <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 <tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6479
6480 Given:
6481 void foo() {
6482 if (int i = foobar(); i > 0) {}
6483 switch (int i = foobar(); i) {}
6484 for (auto& a = get_range(); auto& x : a) {}
6485 }
6486 void bar() {
6487 if (foobar() > 0) {}
6488 switch (foobar()) {}
6489 for (auto& x : get_range()) {}
6490 }
6491 ifStmt(hasInitStatement(anything()))
6492 matches the if statement in foo but not in bar.
6493 switchStmt(hasInitStatement(anything()))
6494 matches the switch statement in foo but not in bar.
6495 cxxForRangeStmt(hasInitStatement(anything()))
6496 matches the range for statement in foo but not in bar.
6497 </pre></td></tr>
6498
6499
6500 <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 <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6502
6503 Example:
6504 forStmt(hasLoopVariable(anything()))
6505 matches 'int x' in
6506 for (int x : a) { }
6507 </pre></td></tr>
6508
6509
6510 <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 <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6512
6513 Example:
6514 forStmt(hasRangeInit(anything()))
6515 matches 'a' in
6516 for (int x : a) { }
6517 </pre></td></tr>
6518
6519
6520 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6522
6523 Examples:
6524 int x;
6525 declaratorDecl(hasTypeLoc(loc(asString("int"))))
6526 matches int x
6527
6528 auto x = int(3);
6529 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6530 matches int(3)
6531
6532 struct Foo { Foo(int, int); };
6533 auto x = Foo(1, 2);
6534 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6535 matches Foo(1, 2)
6536
6537 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6541 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6545 </pre></td></tr>
6546
6547
6548 <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 <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6550 `on`, matches the argument directly without stripping away anything.
6551
6552 Given
6553 class Y { public: void m(); };
6554 Y g();
6555 class X : public Y { void g(); };
6556 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6557 cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6558 cxxRecordDecl(hasName("Y")))))
6559 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6560 cxxMemberCallExpr(on(callExpr()))
6561 does not match `(g()).m()`, because the parens are not ignored.
6562
6563 FIXME: Overload to allow directly matching types?
6564 </pre></td></tr>
6565
6566
6567 <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 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6569 stripping off any parentheses or implicit casts.
6570
6571 Given
6572 class Y { public: void m(); };
6573 Y g();
6574 class X : public Y {};
6575 void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6576 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6577 matches `y.m()` and `(g()).m()`.
6578 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6579 matches `x.m()`.
6580 cxxMemberCallExpr(on(callExpr()))
6581 matches `(g()).m()`.
6582
6583 FIXME: Overload to allow directly matching types?
6584 </pre></td></tr>
6585
6586
6587 <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 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6589 </pre></td></tr>
6590
6591
6592 <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 <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6594 matches the InnerMatcher, or is a pointer to a type that matches the
6595 InnerMatcher.
6596
6597 Given
6598 class Y { public: void m(); };
6599 class X : public Y { void g(); };
6600 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); }
6601 cxxMemberCallExpr(thisPointerType(hasDeclaration(
6602 cxxRecordDecl(hasName("Y")))))
6603 matches `y.m()`, `p->m()` and `x.m()`.
6604 cxxMemberCallExpr(thisPointerType(hasDeclaration(
6605 cxxRecordDecl(hasName("X")))))
6606 matches `x.g()`.
6607 </pre></td></tr>
6608
6609
6610 <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 <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6612 produce multiple matches.
6613
6614 Given
6615 class A { virtual void f(); };
6616 class B : public A { void f(); };
6617 class C : public B { void f(); };
6618 cxxMethodDecl(ofClass(hasName("C")),
6619 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6620 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6621 that B::f is not overridden by C::f).
6622
6623 The check can produce multiple matches in case of multiple inheritance, e.g.
6624 class A1 { virtual void f(); };
6625 class A2 { virtual void f(); };
6626 class C : public A1, public A2 { void f(); };
6627 cxxMethodDecl(ofClass(hasName("C")),
6628 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6629 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6630 once with "b" binding "A2::f" and "d" binding "C::f".
6631 </pre></td></tr>
6632
6633
6634 <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 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6636 belongs to.
6637
6638 FIXME: Generalize this for other kinds of declarations.
6639 FIXME: What other kind of declarations would we need to generalize
6640 this to?
6641
6642 Example matches A() in the last line
6643 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6644 ofClass(hasName("A"))))))
6645 class A {
6646 public:
6647 A();
6648 };
6649 A a = A();
6650 </pre></td></tr>
6651
6652
6653 <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 <tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6655
6656 Given:
6657 MyClass *p1 = new (Storage) MyClass();
6658 cxxNewExpr(hasAnyPlacementArg(anything()))
6659 matches the expression 'new (Storage, 16) MyClass()'.
6660 </pre></td></tr>
6661
6662
6663 <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 <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6665
6666 Given:
6667 MyClass *p1 = new MyClass[10];
6668 cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6669 matches the expression 'new MyClass[10]'.
6670 </pre></td></tr>
6671
6672
6673 <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 <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6675 matches the given matcher.
6676
6677 The associated declaration is:
6678 - for type nodes, the declaration of the underlying type
6679 - for CallExpr, the declaration of the callee
6680 - for MemberExpr, the declaration of the referenced member
6681 - for CXXConstructExpr, the declaration of the constructor
6682 - for CXXNewExpr, the declaration of the operator new
6683 - for ObjCIvarExpr, the declaration of the ivar
6684
6685 For type nodes, hasDeclaration will generally match the declaration of the
6686 sugared type. Given
6687 class X {};
6688 typedef X Y;
6689 Y y;
6690 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6691 typedefDecl. A common use case is to match the underlying, desugared type.
6692 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6693 varDecl(hasType(hasUnqualifiedDesugaredType(
6694 recordType(hasDeclaration(decl())))))
6695 In this matcher, the decl will match the CXXRecordDecl of class X.
6696
6697 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6704 </pre></td></tr>
6705
6706
6707 <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 <tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6709
6710 Given:
6711 MyClass *p1 = new (Storage, 16) MyClass();
6712 cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6713 matches the expression 'new (Storage, 16) MyClass()'.
6714 </pre></td></tr>
6715
6716
6717 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6719
6720 Examples:
6721 int x;
6722 declaratorDecl(hasTypeLoc(loc(asString("int"))))
6723 matches int x
6724
6725 auto x = int(3);
6726 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6727 matches int(3)
6728
6729 struct Foo { Foo(int, int); };
6730 auto x = Foo(1, 2);
6731 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6732 matches Foo(1, 2)
6733
6734 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6738 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6742 </pre></td></tr>
6743
6744
6745 <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 <tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6747 binary operator matches.
6748 </pre></td></tr>
6749
6750
6751 <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 <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6753
6754 Example matches a (matcher = binaryOperator(hasLHS()))
6755 a || b
6756 </pre></td></tr>
6757
6758
6759 <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 <tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6761
6762 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6763 integerLiteral(equals(2)))
6764 1 + 2 // Match
6765 2 + 1 // Match
6766 1 + 1 // No match
6767 2 + 2 // No match
6768 </pre></td></tr>
6769
6770
6771 <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 <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6773
6774 Example matches b (matcher = binaryOperator(hasRHS()))
6775 a || b
6776 </pre></td></tr>
6777
6778
6779 <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 <tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6781
6782 Example matches true (matcher = hasUnaryOperand(
6783 cxxBoolLiteral(equals(true))))
6784 !true
6785 </pre></td></tr>
6786
6787
6788 <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 <tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6790
6791 Example:
6792 matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6793 class Foo;
6794 class Bar : Foo {};
6795 class Baz : Bar {};
6796 class SpecialBase;
6797 class Proxy : SpecialBase {}; // matches Proxy
6798 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived
6799
6800 FIXME: Refactor this and isDerivedFrom to reuse implementation.
6801 </pre></td></tr>
6802
6803
6804 <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 <tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6806
6807 Example:
6808 matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6809 class Foo;
6810 class Bar : Foo {};
6811 class Baz : Bar {};
6812 class SpecialBase;
6813 class Proxy : SpecialBase {}; // matches Proxy
6814 class IndirectlyDerived : Proxy {}; // doesn't match
6815 </pre></td></tr>
6816
6817
6818 <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 <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6820
6821 Given:
6822 class A { void func(); };
6823 class B { void member(); };
6824
6825 cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
6826 A but not B.
6827 </pre></td></tr>
6828
6829
6830 <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 <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
6832 matching Base, or Objective-C classes that directly or indirectly
6833 subclass a class matching Base.
6834
6835 Note that a class is not considered to be derived from itself.
6836
6837 Example matches Y, Z, C (Base == hasName("X"))
6838 class X;
6839 class Y : public X {}; // directly derived
6840 class Z : public Y {}; // indirectly derived
6841 typedef X A;
6842 typedef A B;
6843 class C : public B {}; // derived from a typedef of X
6844
6845 In the following example, Bar matches isDerivedFrom(hasName("X")):
6846 class Foo;
6847 typedef Foo X;
6848 class Bar : public Foo {}; // derived from a type that X is a typedef of
6849
6850 In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6851 @interface NSObject @end
6852 @interface Bar : NSObject @end
6853
6854 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 </pre></td></tr>
6856
6857
6858 <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 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6860 matching Base.
6861
6862 Note that a class is not considered to be derived from itself.
6863
6864 Example matches Y, C (Base == hasName("X"))
6865 class X;
6866 class Y : public X {}; // directly derived
6867 class Z : public Y {}; // indirectly derived
6868 typedef X A;
6869 typedef A B;
6870 class C : public B {}; // derived from a typedef of X
6871
6872 In the following example, Bar matches isDerivedFrom(hasName("X")):
6873 class Foo;
6874 typedef Foo X;
6875 class Bar : public Foo {}; // derived from a type that X is a typedef of
6876 </pre></td></tr>
6877
6878
6879 <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 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6881 match Base.
6882 </pre></td></tr>
6883
6884
6885 <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 <tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
6887 binary operator matches.
6888 </pre></td></tr>
6889
6890
6891 <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 <tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
6893
6894 Example matches a (matcher = binaryOperator(hasLHS()))
6895 a || b
6896 </pre></td></tr>
6897
6898
6899 <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 <tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
6901
6902 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6903 integerLiteral(equals(2)))
6904 1 + 2 // Match
6905 2 + 1 // Match
6906 1 + 1 // No match
6907 2 + 2 // No match
6908 </pre></td></tr>
6909
6910
6911 <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 <tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
6913
6914 Example matches b (matcher = binaryOperator(hasRHS()))
6915 a || b
6916 </pre></td></tr>
6917
6918
6919 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
6921
6922 Examples:
6923 int x;
6924 declaratorDecl(hasTypeLoc(loc(asString("int"))))
6925 matches int x
6926
6927 auto x = int(3);
6928 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6929 matches int(3)
6930
6931 struct Foo { Foo(int, int); };
6932 auto x = Foo(1, 2);
6933 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6934 matches Foo(1, 2)
6935
6936 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6940 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
6944 </pre></td></tr>
6945
6946
6947 <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 <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
6949 expression, or an ObjC-message-send expression.
6950
6951 Given
6952 void x(int, int, int) { int y; x(1, y, 42); }
6953 callExpr(hasAnyArgument(declRefExpr()))
6954 matches x(1, y, 42)
6955 with hasAnyArgument(...)
6956 matching y
6957
6958 For ObjectiveC, given
6959 @interface I - (void) f:(int) y; @end
6960 void foo(I *i) { [i f:12]; }
6961 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6962 matches [i f:12]
6963 </pre></td></tr>
6964
6965
6966 <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 <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6968 call expression.
6969
6970 Example matches y in x(y)
6971 (matcher = callExpr(hasArgument(0, declRefExpr())))
6972 void x(int) { int y; x(y); }
6973 </pre></td></tr>
6974
6975
6976 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
6978
6979 Examples:
6980 int x;
6981 declaratorDecl(hasTypeLoc(loc(asString("int"))))
6982 matches int x
6983
6984 auto x = int(3);
6985 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6986 matches int(3)
6987
6988 struct Foo { Foo(int, int); };
6989 auto x = Foo(1, 2);
6990 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6991 matches Foo(1, 2)
6992
6993 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
6997 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7001 </pre></td></tr>
7002
7003
7004 <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 <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7006 given matcher.
7007
7008 Example matches y.x() (matcher = callExpr(callee(
7009 cxxMethodDecl(hasName("x")))))
7010 class Y { public: void x(); };
7011 void z() { Y y; y.x(); }
7012 </pre></td></tr>
7013
7014
7015 <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 <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7017
7018 Given
7019 class Y { void x() { this->x(); x(); Y y; y.x(); } };
7020 void f() { f(); }
7021 callExpr(callee(expr()))
7022 matches this->x(), x(), y.x(), f()
7023 with callee(...)
7024 matching this->x, x, y.x, f respectively
7025
7026 Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>
7027 because this introduces ambiguous overloads with calls to Callee taking a
7028 internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely
7029 implemented in terms of implicit casts.
7030 </pre></td></tr>
7031
7032
7033 <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 <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7035
7036 Given
7037 void f(int i);
7038 int y;
7039 f(y);
7040 callExpr(
7041 forEachArgumentWithParam(
7042 declRefExpr(to(varDecl(hasName("y")))),
7043 parmVarDecl(hasType(isInteger()))
7044 ))
7045 matches f(y);
7046 with declRefExpr(...)
7047 matching int y
7048 and parmVarDecl(...)
7049 matching int i
7050 </pre></td></tr>
7051
7052
7053 <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 <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7055 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7056 it works on calls through function pointers as well.
7057
7058 The difference is, that function pointers do not provide access to a
7059 ParmVarDecl, but only the QualType for each argument.
7060
7061 Given
7062 void f(int i);
7063 int y;
7064 f(y);
7065 void (*f_ptr)(int) = f;
7066 f_ptr(y);
7067 callExpr(
7068 forEachArgumentWithParamType(
7069 declRefExpr(to(varDecl(hasName("y")))),
7070 qualType(isInteger()).bind("type)
7071 ))
7072 matches f(y) and f_ptr(y)
7073 with declRefExpr(...)
7074 matching int y
7075 and qualType(...)
7076 matching int
7077 </pre></td></tr>
7078
7079
7080 <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 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7082 expression, or an ObjC-message-send expression.
7083
7084 Given
7085 void x(int, int, int) { int y; x(1, y, 42); }
7086 callExpr(hasAnyArgument(declRefExpr()))
7087 matches x(1, y, 42)
7088 with hasAnyArgument(...)
7089 matching y
7090
7091 For ObjectiveC, given
7092 @interface I - (void) f:(int) y; @end
7093 void foo(I *i) { [i f:12]; }
7094 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7095 matches [i f:12]
7096 </pre></td></tr>
7097
7098
7099 <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 <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7101 call expression.
7102
7103 Example matches y in x(y)
7104 (matcher = callExpr(hasArgument(0, declRefExpr())))
7105 void x(int) { int y; x(y); }
7106 </pre></td></tr>
7107
7108
7109 <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 <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7111 matches the given matcher.
7112
7113 The associated declaration is:
7114 - for type nodes, the declaration of the underlying type
7115 - for CallExpr, the declaration of the callee
7116 - for MemberExpr, the declaration of the referenced member
7117 - for CXXConstructExpr, the declaration of the constructor
7118 - for CXXNewExpr, the declaration of the operator new
7119 - for ObjCIvarExpr, the declaration of the ivar
7120
7121 For type nodes, hasDeclaration will generally match the declaration of the
7122 sugared type. Given
7123 class X {};
7124 typedef X Y;
7125 Y y;
7126 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7127 typedefDecl. A common use case is to match the underlying, desugared type.
7128 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7129 varDecl(hasType(hasUnqualifiedDesugaredType(
7130 recordType(hasDeclaration(decl())))))
7131 In this matcher, the decl will match the CXXRecordDecl of class X.
7132
7133 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7140 </pre></td></tr>
7141
7142
7143 <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 <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7145 extension, matches the constant given in the statement.
7146
7147 Given
7148 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7149 caseStmt(hasCaseConstant(integerLiteral()))
7150 matches "case 1:"
7151 </pre></td></tr>
7152
7153
7154 <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 <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7156 or opaque value's source expression matches the given matcher.
7157
7158 Example 1: matches "a string"
7159 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7160 class URL { URL(string); };
7161 URL url = "a string";
7162
7163 Example 2: matches 'b' (matcher =
7164 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7165 int a = b ?: 1;
7166 </pre></td></tr>
7167
7168
7169 <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 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7171 functionDecl that have at least one TemplateArgument matching the given
7172 InnerMatcher.
7173
7174 Given
7175 template<typename T> class A {};
7176 template<> class A<double> {};
7177 A<int> a;
7178
7179 template<typename T> f() {};
7180 void func() { f<int>(); };
7181
7182 classTemplateSpecializationDecl(hasAnyTemplateArgument(
7183 refersToType(asString("int"))))
7184 matches the specialization A<int>
7185
7186 functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7187 matches the specialization f<int>
7188 </pre></td></tr>
7189
7190
7191 <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 <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7193
7194 Given
7195 template<typename T> class A {}; #1
7196 template<> class A<int> {}; #2
7197 classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7198 matches '#2' with classTemplateDecl() matching the class template
7199 declaration of 'A' at #1.
7200 </pre></td></tr>
7201
7202
7203 <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 <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7205 functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7206
7207 Given
7208 template<typename T, typename U> class A {};
7209 A<bool, int> b;
7210 A<int, bool> c;
7211
7212 template<typename T> void f() {}
7213 void func() { f<int>(); };
7214 classTemplateSpecializationDecl(hasTemplateArgument(
7215 1, refersToType(asString("int"))))
7216 matches the specialization A<bool, int>
7217
7218 functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7219 matches the specialization f<int>
7220 </pre></td></tr>
7221
7222
7223 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7225
7226 Examples:
7227 int x;
7228 declaratorDecl(hasTypeLoc(loc(asString("int"))))
7229 matches int x
7230
7231 auto x = int(3);
7232 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7233 matches int(3)
7234
7235 struct Foo { Foo(int, int); };
7236 auto x = Foo(1, 2);
7237 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7238 matches Foo(1, 2)
7239
7240 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7244 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7248 </pre></td></tr>
7249
7250
7251 <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 <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7253 type.
7254
7255 Given
7256 struct A {};
7257 A a[7];
7258 int b[7];
7259 arrayType(hasElementType(builtinType()))
7260 matches "int b[7]"
7261
7262 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 </pre></td></tr>
7264
7265
7266 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7268
7269 Examples:
7270 int x;
7271 declaratorDecl(hasTypeLoc(loc(asString("int"))))
7272 matches int x
7273
7274 auto x = int(3);
7275 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7276 matches int(3)
7277
7278 struct Foo { Foo(int, int); };
7279 auto x = Foo(1, 2);
7280 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7281 matches Foo(1, 2)
7282
7283 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7287 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7291 </pre></td></tr>
7292
7293
7294 <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 <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7296 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7297
7298 Given
7299 { {}; 1+2; }
7300 hasAnySubstatement(compoundStmt())
7301 matches '{ {}; 1+2; }'
7302 with compoundStmt()
7303 matching '{}'
7304 </pre></td></tr>
7305
7306
7307 <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 <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7309 </pre></td></tr>
7310
7311
7312 <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 <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7314 matches the given matcher.
7315
7316 The associated declaration is:
7317 - for type nodes, the declaration of the underlying type
7318 - for CallExpr, the declaration of the callee
7319 - for MemberExpr, the declaration of the referenced member
7320 - for CXXConstructExpr, the declaration of the constructor
7321 - for CXXNewExpr, the declaration of the operator new
7322 - for ObjCIvarExpr, the declaration of the ivar
7323
7324 For type nodes, hasDeclaration will generally match the declaration of the
7325 sugared type. Given
7326 class X {};
7327 typedef X Y;
7328 Y y;
7329 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7330 typedefDecl. A common use case is to match the underlying, desugared type.
7331 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7332 varDecl(hasType(hasUnqualifiedDesugaredType(
7333 recordType(hasDeclaration(decl())))))
7334 In this matcher, the decl will match the CXXRecordDecl of class X.
7335
7336 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7343 </pre></td></tr>
7344
7345
7346 <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 <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7348 specific using shadow declaration.
7349
7350 Given
7351 namespace a { void f() {} }
7352 using a::f;
7353 void g() {
7354 f(); // Matches this ..
7355 a::f(); // .. but not this.
7356 }
7357 declRefExpr(throughUsingDecl(anything()))
7358 matches f()
7359 </pre></td></tr>
7360
7361
7362 <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 <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7364 specified matcher.
7365
7366 Example matches x in if(x)
7367 (matcher = declRefExpr(to(varDecl(hasName("x")))))
7368 bool x;
7369 if (x) {}
7370 </pre></td></tr>
7371
7372
7373 <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 <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7375
7376 Note that this does not work for global declarations because the AST
7377 breaks up multiple-declaration DeclStmt's into multiple single-declaration
7378 DeclStmt's.
7379 Example: Given non-global declarations
7380 int a, b = 0;
7381 int c;
7382 int d = 2, e;
7383 declStmt(containsDeclaration(
7384 0, varDecl(hasInitializer(anything()))))
7385 matches only 'int d = 2, e;', and
7386 declStmt(containsDeclaration(1, varDecl()))
7387 matches 'int a, b = 0' as well as 'int d = 2, e;'
7388 but 'int c;' is not matched.
7389 </pre></td></tr>
7390
7391
7392 <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 <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7394
7395 Given
7396 int a, b;
7397 int c;
7398 declStmt(hasSingleDecl(anything()))
7399 matches 'int c;' but not 'int a, b;'.
7400 </pre></td></tr>
7401
7402
7403 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7405
7406 Examples:
7407 int x;
7408 declaratorDecl(hasTypeLoc(loc(asString("int"))))
7409 matches int x
7410
7411 auto x = int(3);
7412 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7413 matches int(3)
7414
7415 struct Foo { Foo(int, int); };
7416 auto x = Foo(1, 2);
7417 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7418 matches Foo(1, 2)
7419
7420 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7424 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7428 </pre></td></tr>
7429
7430
7431 <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 <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7433 Decl, matches InnerMatcher.
7434
7435 Given
7436 namespace N {
7437 namespace M {
7438 class D {};
7439 }
7440 }
7441
7442 cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7443 declaration of class D.
7444 </pre></td></tr>
7445
7446
7447 <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 <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7449
7450 Given
7451 decltype(1) a = 1;
7452 decltype(2.0) b = 2.0;
7453 decltypeType(hasUnderlyingType(isInteger()))
7454 matches the type of "a"
7455
7456 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>
7457 </pre></td></tr>
7458
7459
7460 <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 <tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7462
7463 For example, in:
7464 void foo()
7465 {
7466 int arr[3];
7467 auto &[f, s, t] = arr;
7468
7469 f = 42;
7470 }
7471 The matcher:
7472 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7473 matches the decomposition decl with 'f' bound to "fBinding".
7474 </pre></td></tr>
7475
7476
7477 <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 <tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7479
7480 For example, in:
7481 void foo()
7482 {
7483 int arr[3];
7484 auto &[f, s, t] = arr;
7485
7486 f = 42;
7487 }
7488 The matcher:
7489 decompositionDecl(hasBinding(0,
7490 bindingDecl(hasName("f").bind("fBinding"))))
7491 matches the decomposition decl with 'f' bound to "fBinding".
7492 </pre></td></tr>
7493
7494
7495 <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 <tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7497
7498
7499 <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 <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7501 switch statement or conditional operator.
7502
7503 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7504 if (true) {}
7505 </pre></td></tr>
7506
7507
7508 <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 <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7510 matches InnerMatcher if the qualifier exists.
7511
7512 Given
7513 namespace N {
7514 namespace M {
7515 class D {};
7516 }
7517 }
7518 N::M::D d;
7519
7520 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7521 matches the type of the variable declaration of d.
7522 </pre></td></tr>
7523
7524
7525 <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 <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7527
7528 Given
7529 namespace N {
7530 namespace M {
7531 class D {};
7532 }
7533 }
7534 N::M::D d;
7535
7536 elaboratedType(namesType(recordType(
7537 hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7538 declaration of d.
7539 </pre></td></tr>
7540
7541
7542 <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 <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7544 matches the given matcher.
7545
7546 The associated declaration is:
7547 - for type nodes, the declaration of the underlying type
7548 - for CallExpr, the declaration of the callee
7549 - for MemberExpr, the declaration of the referenced member
7550 - for CXXConstructExpr, the declaration of the constructor
7551 - for CXXNewExpr, the declaration of the operator new
7552 - for ObjCIvarExpr, the declaration of the ivar
7553
7554 For type nodes, hasDeclaration will generally match the declaration of the
7555 sugared type. Given
7556 class X {};
7557 typedef X Y;
7558 Y y;
7559 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7560 typedefDecl. A common use case is to match the underlying, desugared type.
7561 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7562 varDecl(hasType(hasUnqualifiedDesugaredType(
7563 recordType(hasDeclaration(decl())))))
7564 In this matcher, the decl will match the CXXRecordDecl of class X.
7565
7566 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7573 </pre></td></tr>
7574
7575
7576 <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 <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7578
7579 (Note: Clang's AST refers to other conversions as "casts" too, and calls
7580 actual casts "explicit" casts.)
7581 </pre></td></tr>
7582
7583
7584 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7586
7587 Examples:
7588 int x;
7589 declaratorDecl(hasTypeLoc(loc(asString("int"))))
7590 matches int x
7591
7592 auto x = int(3);
7593 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7594 matches int(3)
7595
7596 struct Foo { Foo(int, int); };
7597 auto x = Foo(1, 2);
7598 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7599 matches Foo(1, 2)
7600
7601 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
7605 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
7609 </pre></td></tr>
7610
7611
7612 <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 <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7614 declaration's type.
7615
7616 In case of a value declaration (for example a variable declaration),
7617 this resolves one layer of indirection. For example, in the value
7618 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7619 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7620 declaration of x.
7621
7622 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7623 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7624 and friend class X (matcher = friendDecl(hasType("X"))
7625 and public virtual X (matcher = cxxBaseSpecifier(hasType(
7626 cxxRecordDecl(hasName("X"))))
7627 class X {};
7628 void y(X &x) { x; X z; }
7629 class Y { friend class X; };
7630 class Z : public virtual X {};
7631
7632 Example matches class Derived
7633 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7634 class Base {};
7635 class Derived : Base {};
7636
7637 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
7639 </pre></td></tr>
7640
7641
7642 <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 <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7644 matcher.
7645
7646 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7647 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7648 and U (matcher = typedefDecl(hasType(asString("int")))
7649 and friend class X (matcher = friendDecl(hasType("X"))
7650 and public virtual X (matcher = cxxBaseSpecifier(hasType(
7651 asString("class X")))
7652 class X {};
7653 void y(X &x) { x; X z; }
7654 typedef int U;
7655 class Y { friend class X; };
7656 class Z : public virtual X {};
7657 </pre></td></tr>
7658
7659
7660 <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 <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7662 elidable constructor and other corresponding bookkeeping nodes.
7663
7664 In C++17, elidable copy constructors are no longer being generated in the
7665 AST as it is not permitted by the standard. They are, however, part of the
7666 AST in C++14 and earlier. So, a matcher must abstract over these differences
7667 to work in all language modes. This matcher skips elidable constructor-call
7668 AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7669 various implicit nodes inside the constructor calls, all of which will not
7670 appear in the C++17 AST.
7671
7672 Given
7673
7674 struct H {};
7675 H G();
7676 void f() {
7677 H D = G();
7678 }
7679
7680 ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7681 matches ``H D = G()`` in C++11 through C++17 (and beyond).
7682 </pre></td></tr>
7683
7684
7685 <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 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7687 are stripped off.
7688
7689 Parentheses and explicit casts are not discarded.
7690 Given
7691 int arr[5];
7692 int a = 0;
7693 char b = 0;
7694 const int c = a;
7695 int *d = arr;
7696 long e = (long) 0l;
7697 The matchers
7698 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7699 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7700 would match the declarations for a, b, c, and d, but not e.
7701 While
7702 varDecl(hasInitializer(integerLiteral()))
7703 varDecl(hasInitializer(declRefExpr()))
7704 only match the declarations for b, c, and d.
7705 </pre></td></tr>
7706
7707
7708 <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 <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7710 nodes are stripped off.
7711
7712 Parentheses and explicit casts are not discarded.
7713 Given
7714 class C {};
7715 C a = C();
7716 C b;
7717 C c = b;
7718 The matchers
7719 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7720 would match the declarations for a, b, and c.
7721 While
7722 varDecl(hasInitializer(cxxConstructExpr()))
7723 only match the declarations for b and c.
7724 </pre></td></tr>
7725
7726
7727 <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 <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7729 casts are stripped off.
7730
7731 Implicit and non-C Style casts are also discarded.
7732 Given
7733 int a = 0;
7734 char b = (0);
7735 void* c = reinterpret_cast<char*>(0);
7736 char d = char(0);
7737 The matcher
7738 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7739 would match the declarations for a, b, c, and d.
7740 while
7741 varDecl(hasInitializer(integerLiteral()))
7742 only match the declaration for a.
7743 </pre></td></tr>
7744
7745
7746 <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 <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7748 parentheses are stripped off.
7749
7750 Explicit casts are not discarded.
7751 Given
7752 int arr[5];
7753 int a = 0;
7754 char b = (0);
7755 const int c = a;
7756 int *d = (arr);
7757 long e = ((long) 0l);
7758 The matchers
7759 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7760 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7761 would match the declarations for a, b, c, and d, but not e.
7762 while
7763 varDecl(hasInitializer(integerLiteral()))
7764 varDecl(hasInitializer(declRefExpr()))
7765 would only match the declaration for a.
7766 </pre></td></tr>
7767
7768
7769 <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 <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7771
7772 Given
7773 const char* str = ("my-string");
7774 The matcher
7775 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7776 would match the implicit cast resulting from the assignment.
7777 </pre></td></tr>
7778
7779
7780 <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 <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7782
7783 Given
7784 class C {
7785 int a = 2;
7786 int b = 3;
7787 int c;
7788 };
7789 fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7790 matches 'int a;' but not 'int b;'.
7791 fieldDecl(hasInClassInitializer(anything()))
7792 matches 'int a;' and 'int b;' but not 'int c;'.
7793 </pre></td></tr>
7794
7795
7796 <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 <tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7798
7799
7800 <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 <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7802 switch statement or conditional operator.
7803
7804 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7805 if (true) {}
7806 </pre></td></tr>
7807
7808
7809 <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 <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7811
7812 Example:
7813 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7814 matches '++x' in
7815 for (x; x < N; ++x) { }
7816 </pre></td></tr>
7817
7818
7819 <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 <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7821
7822 Example:
7823 forStmt(hasLoopInit(declStmt()))
7824 matches 'int x = 0' in
7825 for (int x = 0; x < N; ++x) { }
7826 </pre></td></tr>
7827
7828
7829 <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 <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7831 declaration's type.
7832
7833 In case of a value declaration (for example a variable declaration),
7834 this resolves one layer of indirection. For example, in the value
7835 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7836 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7837 declaration of x.
7838
7839 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7840 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7841 and friend class X (matcher = friendDecl(hasType("X"))
7842 and public virtual X (matcher = cxxBaseSpecifier(hasType(
7843 cxxRecordDecl(hasName("X"))))
7844 class X {};
7845 void y(X &x) { x; X z; }
7846 class Y { friend class X; };
7847 class Z : public virtual X {};
7848
7849 Example matches class Derived
7850 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7851 class Base {};
7852 class Derived : Base {};
7853
7854 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
7856 </pre></td></tr>
7857
7858
7859 <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 <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
7861 matcher.
7862
7863 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7864 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7865 and U (matcher = typedefDecl(hasType(asString("int")))
7866 and friend class X (matcher = friendDecl(hasType("X"))
7867 and public virtual X (matcher = cxxBaseSpecifier(hasType(
7868 asString("class X")))
7869 class X {};
7870 void y(X &x) { x; X z; }
7871 typedef int U;
7872 class Y { friend class X; };
7873 class Z : public virtual X {};
7874 </pre></td></tr>
7875
7876
7877 <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 <tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
7879 Note that this matcher matches all the declarations of a function whose
7880 body is present in the AST.
7881
7882 Given
7883 void f();
7884 void f() {}
7885 void g();
7886 functionDecl(hasAnyBody(compoundStmt()))
7887 matches both 'void f();'
7888 and 'void f() {}'
7889 with compoundStmt()
7890 matching '{}'
7891 but does not match 'void g();'
7892 </pre></td></tr>
7893
7894
7895 <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 <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
7897 block.
7898
7899 Does not match the 'this' parameter of a method.
7900
7901 Given
7902 class X { void f(int x, int y, int z) {} };
7903 cxxMethodDecl(hasAnyParameter(hasName("y")))
7904 matches f(int x, int y, int z) {}
7905 with hasAnyParameter(...)
7906 matching int y
7907
7908 For ObjectiveC, given
7909 @interface I - (void) f:(int) y; @end
7910
7911 the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7912 matches the declaration of method f with hasParameter
7913 matching y.
7914
7915 For blocks, given
7916 b = ^(int y) { printf("%d", y) };
7917
7918 the matcher blockDecl(hasAnyParameter(hasName("y")))
7919 matches the declaration of the block b with hasParameter
7920 matching y.
7921 </pre></td></tr>
7922
7923
7924 <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 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7926 functionDecl that have at least one TemplateArgument matching the given
7927 InnerMatcher.
7928
7929 Given
7930 template<typename T> class A {};
7931 template<> class A<double> {};
7932 A<int> a;
7933
7934 template<typename T> f() {};
7935 void func() { f<int>(); };
7936
7937 classTemplateSpecializationDecl(hasAnyTemplateArgument(
7938 refersToType(asString("int"))))
7939 matches the specialization A<int>
7940
7941 functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7942 matches the specialization f<int>
7943 </pre></td></tr>
7944
7945
7946 <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 <tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
7948
7949
7950 <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 <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
7952 declaration.
7953
7954 Given
7955 template<bool b>
7956 struct S {
7957 S(int); // #1
7958 explicit S(double); // #2
7959 operator int(); // #3
7960 explicit operator bool(); // #4
7961 explicit(false) S(bool) // # 7
7962 explicit(true) S(char) // # 8
7963 explicit(b) S(S) // # 9
7964 };
7965 S(int) -> S<true> // #5
7966 explicit S(double) -> S<false> // #6
7967 cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
7968 cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
7969 cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
7970 </pre></td></tr>
7971
7972
7973 <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 <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
7975 declaration or a block.
7976
7977 Given
7978 class X { void f(int x) {} };
7979 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7980 matches f(int x) {}
7981 with hasParameter(...)
7982 matching int x
7983
7984 For ObjectiveC, given
7985 @interface I - (void) f:(int) y; @end
7986
7987 the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7988 matches the declaration of method f with hasParameter
7989 matching y.
7990 </pre></td></tr>
7991
7992
7993 <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 <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7995 functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7996
7997 Given
7998 template<typename T, typename U> class A {};
7999 A<bool, int> b;
8000 A<int, bool> c;
8001
8002 template<typename T> void f() {}
8003 void func() { f<int>(); };
8004 classTemplateSpecializationDecl(hasTemplateArgument(
8005 1, refersToType(asString("int"))))
8006 matches the specialization A<bool, int>
8007
8008 functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8009 matches the specialization f<int>
8010 </pre></td></tr>
8011
8012
8013 <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 <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8015
8016 Given:
8017 class X { int f() { return 1; } };
8018 cxxMethodDecl(returns(asString("int")))
8019 matches int f() { return 1; }
8020 </pre></td></tr>
8021
8022
8023 <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 <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8025 switch statement or conditional operator.
8026
8027 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8028 if (true) {}
8029 </pre></td></tr>
8030
8031
8032 <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 <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8034
8035 Given
8036 if (A* a = GetAPointer()) {}
8037 hasConditionVariableStatement(...)
8038 matches 'A* a = GetAPointer()'.
8039 </pre></td></tr>
8040
8041
8042 <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 <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8044
8045 Examples matches the if statement
8046 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8047 if (false) false; else true;
8048 </pre></td></tr>
8049
8050
8051 <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 <tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8053
8054 Given:
8055 void foo() {
8056 if (int i = foobar(); i > 0) {}
8057 switch (int i = foobar(); i) {}
8058 for (auto& a = get_range(); auto& x : a) {}
8059 }
8060 void bar() {
8061 if (foobar() > 0) {}
8062 switch (foobar()) {}
8063 for (auto& x : get_range()) {}
8064 }
8065 ifStmt(hasInitStatement(anything()))
8066 matches the if statement in foo but not in bar.
8067 switchStmt(hasInitStatement(anything()))
8068 matches the switch statement in foo but not in bar.
8069 cxxForRangeStmt(hasInitStatement(anything()))
8070 matches the range for statement in foo but not in bar.
8071 </pre></td></tr>
8072
8073
8074 <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 <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8076
8077 Examples matches the if statement
8078 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8079 if (false) true; else false;
8080 </pre></td></tr>
8081
8082
8083 <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 <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8085 matcher.
8086
8087 FIXME: Unit test this matcher
8088 </pre></td></tr>
8089
8090
8091 <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 <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8093
8094 Example matches y.
8095 (matcher = initListExpr(hasInit(0, expr())))
8096 int x{y}.
8097 </pre></td></tr>
8098
8099
8100 <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 <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8102 (if expression have it).
8103 </pre></td></tr>
8104
8105
8106 <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 <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8108 matches the given matcher.
8109
8110 The associated declaration is:
8111 - for type nodes, the declaration of the underlying type
8112 - for CallExpr, the declaration of the callee
8113 - for MemberExpr, the declaration of the referenced member
8114 - for CXXConstructExpr, the declaration of the constructor
8115 - for CXXNewExpr, the declaration of the operator new
8116 - for ObjCIvarExpr, the declaration of the ivar
8117
8118 For type nodes, hasDeclaration will generally match the declaration of the
8119 sugared type. Given
8120 class X {};
8121 typedef X Y;
8122 Y y;
8123 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8124 typedefDecl. A common use case is to match the underlying, desugared type.
8125 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8126 varDecl(hasType(hasUnqualifiedDesugaredType(
8127 recordType(hasDeclaration(decl())))))
8128 In this matcher, the decl will match the CXXRecordDecl of class X.
8129
8130 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8137 </pre></td></tr>
8138
8139
8140 <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 <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8142 matches the given matcher.
8143
8144 The associated declaration is:
8145 - for type nodes, the declaration of the underlying type
8146 - for CallExpr, the declaration of the callee
8147 - for MemberExpr, the declaration of the referenced member
8148 - for CXXConstructExpr, the declaration of the constructor
8149 - for CXXNewExpr, the declaration of the operator new
8150 - for ObjCIvarExpr, the declaration of the ivar
8151
8152 For type nodes, hasDeclaration will generally match the declaration of the
8153 sugared type. Given
8154 class X {};
8155 typedef X Y;
8156 Y y;
8157 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8158 typedefDecl. A common use case is to match the underlying, desugared type.
8159 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8160 varDecl(hasType(hasUnqualifiedDesugaredType(
8161 recordType(hasDeclaration(decl())))))
8162 In this matcher, the decl will match the CXXRecordDecl of class X.
8163
8164 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8171 </pre></td></tr>
8172
8173
8174 <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 <tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
8176
8177 Given
8178 struct foo {
8179 void bar() {
8180 auto f = [this](){};
8181 }
8182 }
8183 lambdaExpr(hasAnyCapture(cxxThisExpr()))
8184 matches [this](){};
8185 </pre></td></tr>
8186
8187
8188 <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 <tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
8190
8191 Given
8192 void foo() {
8193 int x;
8194 auto f = [x](){};
8195 }
8196 lambdaExpr(hasAnyCapture(anything()))
8197 matches [x](){};
8198 </pre></td></tr>
8199
8200
8201 <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 <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8203 matches the given matcher.
8204
8205 The associated declaration is:
8206 - for type nodes, the declaration of the underlying type
8207 - for CallExpr, the declaration of the callee
8208 - for MemberExpr, the declaration of the referenced member
8209 - for CXXConstructExpr, the declaration of the constructor
8210 - for CXXNewExpr, the declaration of the operator new
8211 - for ObjCIvarExpr, the declaration of the ivar
8212
8213 For type nodes, hasDeclaration will generally match the declaration of the
8214 sugared type. Given
8215 class X {};
8216 typedef X Y;
8217 Y y;
8218 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8219 typedefDecl. A common use case is to match the underlying, desugared type.
8220 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8221 varDecl(hasType(hasUnqualifiedDesugaredType(
8222 recordType(hasDeclaration(decl())))))
8223 In this matcher, the decl will match the CXXRecordDecl of class X.
8224
8225 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8232 </pre></td></tr>
8233
8234
8235 <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 <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8237 given matcher. Implicit object expressions are included; that is, it matches
8238 use of implicit `this`.
8239
8240 Given
8241 struct X {
8242 int m;
8243 int f(X x) { x.m; return m; }
8244 };
8245 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8246 matches `x.m`, but not `m`; however,
8247 memberExpr(hasObjectExpression(hasType(pointsTo(
8248 cxxRecordDecl(hasName("X"))))))
8249 matches `m` (aka. `this->m`), but not `x.m`.
8250 </pre></td></tr>
8251
8252
8253 <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 <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8255 given matcher.
8256
8257 Given
8258 struct { int first, second; } first, second;
8259 int i(second.first);
8260 int j(first.second);
8261 memberExpr(member(hasName("first")))
8262 matches second.first
8263 but not first.second (because the member name there is "second").
8264 </pre></td></tr>
8265
8266
8267 <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 <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8269 pointee matches a given matcher.
8270
8271 Given
8272 int *a;
8273 int const *b;
8274 float const *f;
8275 pointerType(pointee(isConstQualified(), isInteger()))
8276 matches "int const *b"
8277
8278 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 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 </pre></td></tr>
8281
8282
8283 <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 <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8285 matcher.
8286
8287 Given
8288 namespace N { template<class T> void f(T t); }
8289 template <class T> void g() { using N::f; f(T()); }
8290 unresolvedLookupExpr(hasAnyDeclaration(
8291 namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8292 matches the use of f in g() .
8293 </pre></td></tr>
8294
8295
8296 <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 <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8298
8299 Given
8300 struct A { struct B { struct C {}; }; };
8301 A::B::C c;
8302 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8303 matches "A::"
8304 </pre></td></tr>
8305
8306
8307 <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 <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8309 NestedNameSpecifier-matcher matches.
8310 </pre></td></tr>
8311
8312
8313 <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 <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8315 given TypeLoc.
8316
8317 Given
8318 struct A { struct B { struct C {}; }; };
8319 A::B::C c;
8320 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8321 hasDeclaration(cxxRecordDecl(hasName("A")))))))
8322 matches "A::"
8323 </pre></td></tr>
8324
8325
8326 <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 <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8328
8329 Given
8330 struct A { struct B { struct C {}; }; };
8331 A::B::C c;
8332 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8333 matches "A::"
8334 </pre></td></tr>
8335
8336
8337 <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 <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8339 given namespace matcher.
8340
8341 Given
8342 namespace ns { struct A {}; }
8343 ns::A a;
8344 nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8345 matches "ns::"
8346 </pre></td></tr>
8347
8348
8349 <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 <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8351 given QualType matcher without qualifiers.
8352
8353 Given
8354 struct A { struct B { struct C {}; }; };
8355 A::B::C c;
8356 nestedNameSpecifier(specifiesType(
8357 hasDeclaration(cxxRecordDecl(hasName("A")))
8358 ))
8359 matches "A::"
8360 </pre></td></tr>
8361
8362
8363 <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 <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8365
8366 Given
8367
8368 #pragma omp parallel
8369 #pragma omp parallel default(none)
8370
8371 ``ompExecutableDirective(hasAnyClause(anything()))`` matches
8372 ``omp parallel default(none)``.
8373 </pre></td></tr>
8374
8375
8376 <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 <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8378
8379 Prerequisite: the executable directive must not be standalone directive.
8380 If it is, it will never match.
8381
8382 Given
8383
8384 #pragma omp parallel
8385 ;
8386 #pragma omp parallel
8387 {}
8388
8389 ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8390 </pre></td></tr>
8391
8392
8393 <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 <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8395 matching Base, or Objective-C classes that directly or indirectly
8396 subclass a class matching Base.
8397
8398 Note that a class is not considered to be derived from itself.
8399
8400 Example matches Y, Z, C (Base == hasName("X"))
8401 class X;
8402 class Y : public X {}; // directly derived
8403 class Z : public Y {}; // indirectly derived
8404 typedef X A;
8405 typedef A B;
8406 class C : public B {}; // derived from a typedef of X
8407
8408 In the following example, Bar matches isDerivedFrom(hasName("X")):
8409 class Foo;
8410 typedef Foo X;
8411 class Bar : public Foo {}; // derived from a type that X is a typedef of
8412
8413 In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8414 @interface NSObject @end
8415 @interface Bar : NSObject @end
8416
8417 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 </pre></td></tr>
8419
8420
8421 <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 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8423 matching Base.
8424
8425 Note that a class is not considered to be derived from itself.
8426
8427 Example matches Y, C (Base == hasName("X"))
8428 class X;
8429 class Y : public X {}; // directly derived
8430 class Z : public Y {}; // indirectly derived
8431 typedef X A;
8432 typedef A B;
8433 class C : public B {}; // derived from a typedef of X
8434
8435 In the following example, Bar matches isDerivedFrom(hasName("X")):
8436 class Foo;
8437 typedef Foo X;
8438 class Bar : public Foo {}; // derived from a type that X is a typedef of
8439 </pre></td></tr>
8440
8441
8442 <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 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8444 match Base.
8445 </pre></td></tr>
8446
8447
8448 <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 <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8450 expression, or an ObjC-message-send expression.
8451
8452 Given
8453 void x(int, int, int) { int y; x(1, y, 42); }
8454 callExpr(hasAnyArgument(declRefExpr()))
8455 matches x(1, y, 42)
8456 with hasAnyArgument(...)
8457 matching y
8458
8459 For ObjectiveC, given
8460 @interface I - (void) f:(int) y; @end
8461 void foo(I *i) { [i f:12]; }
8462 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8463 matches [i f:12]
8464 </pre></td></tr>
8465
8466
8467 <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 <tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8469 call expression.
8470
8471 Example matches y in x(y)
8472 (matcher = callExpr(hasArgument(0, declRefExpr())))
8473 void x(int) { int y; x(y); }
8474 </pre></td></tr>
8475
8476
8477 <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 <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8479 and the inner matcher matches on that instance.
8480
8481 For example the method call in
8482 NSString *x = @"hello";
8483 [x containsString:@"h"];
8484 is matched by
8485 objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8486 </pre></td></tr>
8487
8488
8489 <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 <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8491
8492 Example
8493 matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8494 matches the [webView ...] message invocation.
8495 NSString *webViewJavaScript = ...
8496 UIWebView *webView = ...
8497 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8498 </pre></td></tr>
8499
8500
8501 <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 <tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8503 block.
8504
8505 Does not match the 'this' parameter of a method.
8506
8507 Given
8508 class X { void f(int x, int y, int z) {} };
8509 cxxMethodDecl(hasAnyParameter(hasName("y")))
8510 matches f(int x, int y, int z) {}
8511 with hasAnyParameter(...)
8512 matching int y
8513
8514 For ObjectiveC, given
8515 @interface I - (void) f:(int) y; @end
8516
8517 the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8518 matches the declaration of method f with hasParameter
8519 matching y.
8520
8521 For blocks, given
8522 b = ^(int y) { printf("%d", y) };
8523
8524 the matcher blockDecl(hasAnyParameter(hasName("y")))
8525 matches the declaration of the block b with hasParameter
8526 matching y.
8527 </pre></td></tr>
8528
8529
8530 <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 <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8532 declaration or a block.
8533
8534 Given
8535 class X { void f(int x) {} };
8536 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8537 matches f(int x) {}
8538 with hasParameter(...)
8539 matching int x
8540
8541 For ObjectiveC, given
8542 @interface I - (void) f:(int) y; @end
8543
8544 the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8545 matches the declaration of method f with hasParameter
8546 matching y.
8547 </pre></td></tr>
8548
8549
8550 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8552
8553 Examples:
8554 int x;
8555 declaratorDecl(hasTypeLoc(loc(asString("int"))))
8556 matches int x
8557
8558 auto x = int(3);
8559 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8560 matches int(3)
8561
8562 struct Foo { Foo(int, int); };
8563 auto x = Foo(1, 2);
8564 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8565 matches Foo(1, 2)
8566
8567 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
8571 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
8575 </pre></td></tr>
8576
8577
8578 <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 <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8580 or opaque value's source expression matches the given matcher.
8581
8582 Example 1: matches "a string"
8583 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8584 class URL { URL(string); };
8585 URL url = "a string";
8586
8587 Example 2: matches 'b' (matcher =
8588 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8589 int a = b ?: 1;
8590 </pre></td></tr>
8591
8592
8593 <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 <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8595 overloads matches the given matcher.
8596
8597 Given
8598 template <typename T> void foo(T);
8599 template <typename T> void bar(T);
8600 template <typename T> void baz(T t) {
8601 foo(t);
8602 bar(t);
8603 }
8604 unresolvedLookupExpr(hasAnyDeclaration(
8605 functionTemplateDecl(hasName("foo"))))
8606 matches foo in foo(t); but not bar in bar(t);
8607 </pre></td></tr>
8608
8609
8610 <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 <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8612
8613 Given
8614 int (*ptr_to_array)[4];
8615 int (*ptr_to_func)(int);
8616
8617 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8618 ptr_to_func but not ptr_to_array.
8619
8620 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>
8621 </pre></td></tr>
8622
8623
8624 <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 <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8626 pointee matches a given matcher.
8627
8628 Given
8629 int *a;
8630 int const *b;
8631 float const *f;
8632 pointerType(pointee(isConstQualified(), isInteger()))
8633 matches "int const *b"
8634
8635 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 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 </pre></td></tr>
8638
8639
8640 <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 <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8642
8643 Given:
8644 typedef int &int_ref;
8645 int a;
8646 int_ref b = a;
8647
8648 varDecl(hasType(qualType(referenceType()))))) will not match the
8649 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8650 </pre></td></tr>
8651
8652
8653 <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 <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8655 matches the given matcher.
8656
8657 The associated declaration is:
8658 - for type nodes, the declaration of the underlying type
8659 - for CallExpr, the declaration of the callee
8660 - for MemberExpr, the declaration of the referenced member
8661 - for CXXConstructExpr, the declaration of the constructor
8662 - for CXXNewExpr, the declaration of the operator new
8663 - for ObjCIvarExpr, the declaration of the ivar
8664
8665 For type nodes, hasDeclaration will generally match the declaration of the
8666 sugared type. Given
8667 class X {};
8668 typedef X Y;
8669 Y y;
8670 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8671 typedefDecl. A common use case is to match the underlying, desugared type.
8672 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8673 varDecl(hasType(hasUnqualifiedDesugaredType(
8674 recordType(hasDeclaration(decl())))))
8675 In this matcher, the decl will match the CXXRecordDecl of class X.
8676
8677 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8684 </pre></td></tr>
8685
8686
8687 <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 <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8689
8690 Given
8691 void (*fp)(void);
8692 The matcher
8693 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8694 would match the declaration for fp.
8695 </pre></td></tr>
8696
8697
8698 <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 <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8700 </pre></td></tr>
8701
8702
8703 <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 <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8705 matches the specified matcher.
8706
8707 Example matches y->x()
8708 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8709 cxxRecordDecl(hasName("Y")))))))
8710 class Y { public: void x(); };
8711 void z() { Y *y; y->x(); }
8712 </pre></td></tr>
8713
8714
8715 <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 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8717 </pre></td></tr>
8718
8719
8720 <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 <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8722 type matches the specified matcher.
8723
8724 Example matches X &x and const X &y
8725 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8726 class X {
8727 void a(X b) {
8728 X &x = b;
8729 const X &y = b;
8730 }
8731 };
8732 </pre></td></tr>
8733
8734
8735 <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 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8737 matches the given matcher.
8738
8739 The associated declaration is:
8740 - for type nodes, the declaration of the underlying type
8741 - for CallExpr, the declaration of the callee
8742 - for MemberExpr, the declaration of the referenced member
8743 - for CXXConstructExpr, the declaration of the constructor
8744 - for CXXNewExpr, the declaration of the operator new
8745 - for ObjCIvarExpr, the declaration of the ivar
8746
8747 For type nodes, hasDeclaration will generally match the declaration of the
8748 sugared type. Given
8749 class X {};
8750 typedef X Y;
8751 Y y;
8752 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8753 typedefDecl. A common use case is to match the underlying, desugared type.
8754 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8755 varDecl(hasType(hasUnqualifiedDesugaredType(
8756 recordType(hasDeclaration(decl())))))
8757 In this matcher, the decl will match the CXXRecordDecl of class X.
8758
8759 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8766 </pre></td></tr>
8767
8768
8769 <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 <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
8771 pointee matches a given matcher.
8772
8773 Given
8774 int *a;
8775 int const *b;
8776 float const *f;
8777 pointerType(pointee(isConstQualified(), isInteger()))
8778 matches "int const *b"
8779
8780 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 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 </pre></td></tr>
8783
8784
8785 <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 <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
8787
8788 Given
8789 return a + b;
8790 hasReturnValue(binaryOperator())
8791 matches 'return a + b'
8792 with binaryOperator()
8793 matching 'a + b'
8794 </pre></td></tr>
8795
8796
8797 <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 <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
8799 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8800
8801 Given
8802 { {}; 1+2; }
8803 hasAnySubstatement(compoundStmt())
8804 matches '{ {}; 1+2; }'
8805 with compoundStmt()
8806 matching '{}'
8807 </pre></td></tr>
8808
8809
8810 <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 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8812 alignof.
8813 </pre></td></tr>
8814
8815
8816 <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 <tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
8818 belongs to.
8819
8820 Given:
8821 F& operator=(const F& o) {
8822 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
8823 return *this;
8824 }
8825 returnStmt(forCallable(functionDecl(hasName("operator="))))
8826 matches 'return *this'
8827 but does not match 'return v > 0'
8828
8829 Given:
8830 -(void) foo {
8831 int x = 1;
8832 dispatch_sync(queue, ^{ int y = 2; });
8833 }
8834 declStmt(forCallable(objcMethodDecl()))
8835 matches 'int x = 1'
8836 but does not match 'int y = 2'.
8837 whereas declStmt(forCallable(blockDecl()))
8838 matches 'int y = 2'
8839 but does not match 'int x = 1'.
8840 </pre></td></tr>
8841
8842
8843 <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 <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
8845
8846 Deprecated. Use forCallable() to correctly handle the situation when
8847 the declaration is not a function (but a block or an Objective-C method).
8848 forFunction() not only fails to take non-functions into account but also
8849 may match the wrong declaration in their presence.
8850
8851 Given:
8852 F& operator=(const F& o) {
8853 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
8854 return *this;
8855 }
8856 returnStmt(forFunction(hasName("operator=")))
8857 matches 'return *this'
8858 but does not match 'return v > 0'
8859 </pre></td></tr>
8860
8861
8862 <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 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8864 sizeof.
8865 </pre></td></tr>
8866
8867
8868 <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 <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
8870 type that matches the provided matcher.
8871
8872 Given
8873 template <typename T>
8874 double F(T t);
8875 int i;
8876 double j = F(i);
8877
8878 substTemplateTypeParmType(hasReplacementType(type())) matches int
8879 </pre></td></tr>
8880
8881
8882 <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 <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
8884 statement. This matcher may produce multiple matches.
8885
8886 Given
8887 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
8888 switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
8889 matches four times, with "c" binding each of "case 1:", "case 2:",
8890 "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
8891 "switch (1)", "switch (2)" and "switch (2)".
8892 </pre></td></tr>
8893
8894
8895 <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 <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
8897 switch statement or conditional operator.
8898
8899 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8900 if (true) {}
8901 </pre></td></tr>
8902
8903
8904 <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 <tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
8906
8907 Given:
8908 void foo() {
8909 if (int i = foobar(); i > 0) {}
8910 switch (int i = foobar(); i) {}
8911 for (auto& a = get_range(); auto& x : a) {}
8912 }
8913 void bar() {
8914 if (foobar() > 0) {}
8915 switch (foobar()) {}
8916 for (auto& x : get_range()) {}
8917 }
8918 ifStmt(hasInitStatement(anything()))
8919 matches the if statement in foo but not in bar.
8920 switchStmt(hasInitStatement(anything()))
8921 matches the switch statement in foo but not in bar.
8922 cxxForRangeStmt(hasInitStatement(anything()))
8923 matches the range for statement in foo but not in bar.
8924 </pre></td></tr>
8925
8926
8927 <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 <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
8929 matches the given matcher.
8930
8931 The associated declaration is:
8932 - for type nodes, the declaration of the underlying type
8933 - for CallExpr, the declaration of the callee
8934 - for MemberExpr, the declaration of the referenced member
8935 - for CXXConstructExpr, the declaration of the constructor
8936 - for CXXNewExpr, the declaration of the operator new
8937 - for ObjCIvarExpr, the declaration of the ivar
8938
8939 For type nodes, hasDeclaration will generally match the declaration of the
8940 sugared type. Given
8941 class X {};
8942 typedef X Y;
8943 Y y;
8944 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8945 typedefDecl. A common use case is to match the underlying, desugared type.
8946 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8947 varDecl(hasType(hasUnqualifiedDesugaredType(
8948 recordType(hasDeclaration(decl())))))
8949 In this matcher, the decl will match the CXXRecordDecl of class X.
8950
8951 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
8958 </pre></td></tr>
8959
8960
8961 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
8963
8964 Examples:
8965 int x;
8966 declaratorDecl(hasTypeLoc(loc(asString("int"))))
8967 matches int x
8968
8969 auto x = int(3);
8970 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8971 matches int(3)
8972
8973 struct Foo { Foo(int, int); };
8974 auto x = Foo(1, 2);
8975 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8976 matches Foo(1, 2)
8977
8978 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
8982 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
8986 </pre></td></tr>
8987
8988
8989 <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 <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
8991
8992 Given
8993 struct B { int next; };
8994 template<int(B::*next_ptr)> struct A {};
8995 A<&B::next> a;
8996 templateSpecializationType(hasAnyTemplateArgument(
8997 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
8998 matches the specialization A<&B::next> with fieldDecl(...) matching
8999 B::next
9000 </pre></td></tr>
9001
9002
9003 <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 <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9005 declaration.
9006
9007 Given
9008 struct B { int next; };
9009 template<int(B::*next_ptr)> struct A {};
9010 A<&B::next> a;
9011 classTemplateSpecializationDecl(hasAnyTemplateArgument(
9012 refersToDeclaration(fieldDecl(hasName("next")))))
9013 matches the specialization A<&B::next> with fieldDecl(...) matching
9014 B::next
9015 </pre></td></tr>
9016
9017
9018 <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 <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9020
9021 Given
9022 template<int T> struct C {};
9023 C<42> c;
9024 classTemplateSpecializationDecl(
9025 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9026 matches the implicit instantiation of C in C<42>.
9027 </pre></td></tr>
9028
9029
9030 <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 <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9032
9033 Given
9034 template<template <typename> class S> class X {};
9035 template<typename T> class Y {};
9036 X<Y> xi;
9037 classTemplateSpecializationDecl(hasAnyTemplateArgument(
9038 refersToTemplate(templateName())))
9039 matches the specialization X<Y>
9040 </pre></td></tr>
9041
9042
9043 <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 <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9045
9046 Given
9047 struct X {};
9048 template<typename T> struct A {};
9049 A<X> a;
9050 classTemplateSpecializationDecl(hasAnyTemplateArgument(
9051 refersToType(class(hasName("X")))))
9052 matches the specialization A<X>
9053 </pre></td></tr>
9054
9055
9056 <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 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9058 functionDecl that have at least one TemplateArgument matching the given
9059 InnerMatcher.
9060
9061 Given
9062 template<typename T> class A {};
9063 template<> class A<double> {};
9064 A<int> a;
9065
9066 template<typename T> f() {};
9067 void func() { f<int>(); };
9068
9069 classTemplateSpecializationDecl(hasAnyTemplateArgument(
9070 refersToType(asString("int"))))
9071 matches the specialization A<int>
9072
9073 functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9074 matches the specialization f<int>
9075 </pre></td></tr>
9076
9077
9078 <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 <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9080 matches the given matcher.
9081
9082 The associated declaration is:
9083 - for type nodes, the declaration of the underlying type
9084 - for CallExpr, the declaration of the callee
9085 - for MemberExpr, the declaration of the referenced member
9086 - for CXXConstructExpr, the declaration of the constructor
9087 - for CXXNewExpr, the declaration of the operator new
9088 - for ObjCIvarExpr, the declaration of the ivar
9089
9090 For type nodes, hasDeclaration will generally match the declaration of the
9091 sugared type. Given
9092 class X {};
9093 typedef X Y;
9094 Y y;
9095 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9096 typedefDecl. A common use case is to match the underlying, desugared type.
9097 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9098 varDecl(hasType(hasUnqualifiedDesugaredType(
9099 recordType(hasDeclaration(decl())))))
9100 In this matcher, the decl will match the CXXRecordDecl of class X.
9101
9102 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9109 </pre></td></tr>
9110
9111
9112 <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 <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9114 functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9115
9116 Given
9117 template<typename T, typename U> class A {};
9118 A<bool, int> b;
9119 A<int, bool> c;
9120
9121 template<typename T> void f() {}
9122 void func() { f<int>(); };
9123 classTemplateSpecializationDecl(hasTemplateArgument(
9124 1, refersToType(asString("int"))))
9125 matches the specialization A<bool, int>
9126
9127 functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9128 matches the specialization f<int>
9129 </pre></td></tr>
9130
9131
9132 <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 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9134 matches the given matcher.
9135
9136 The associated declaration is:
9137 - for type nodes, the declaration of the underlying type
9138 - for CallExpr, the declaration of the callee
9139 - for MemberExpr, the declaration of the referenced member
9140 - for CXXConstructExpr, the declaration of the constructor
9141 - for CXXNewExpr, the declaration of the operator new
9142 - for ObjCIvarExpr, the declaration of the ivar
9143
9144 For type nodes, hasDeclaration will generally match the declaration of the
9145 sugared type. Given
9146 class X {};
9147 typedef X Y;
9148 Y y;
9149 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9150 typedefDecl. A common use case is to match the underlying, desugared type.
9151 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9152 varDecl(hasType(hasUnqualifiedDesugaredType(
9153 recordType(hasDeclaration(decl())))))
9154 In this matcher, the decl will match the CXXRecordDecl of class X.
9155
9156 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9163 </pre></td></tr>
9164
9165
9166 <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 <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9168 QualType-matcher matches.
9169 </pre></td></tr>
9170
9171
9172 <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 <tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9174
9175 Examples:
9176 int x;
9177 declaratorDecl(hasTypeLoc(loc(asString("int"))))
9178 matches int x
9179
9180 auto x = int(3);
9181 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9182 matches int(3)
9183
9184 struct Foo { Foo(int, int); };
9185 auto x = Foo(1, 2);
9186 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9187 matches Foo(1, 2)
9188
9189 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>,
9193 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>
9197 </pre></td></tr>
9198
9199
9200 <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 <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9202 matcher.
9203
9204 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9205 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9206 and U (matcher = typedefDecl(hasType(asString("int")))
9207 and friend class X (matcher = friendDecl(hasType("X"))
9208 and public virtual X (matcher = cxxBaseSpecifier(hasType(
9209 asString("class X")))
9210 class X {};
9211 void y(X &x) { x; X z; }
9212 typedef int U;
9213 class Y { friend class X; };
9214 class Z : public virtual X {};
9215 </pre></td></tr>
9216
9217
9218 <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 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9220 matches the given matcher.
9221
9222 The associated declaration is:
9223 - for type nodes, the declaration of the underlying type
9224 - for CallExpr, the declaration of the callee
9225 - for MemberExpr, the declaration of the referenced member
9226 - for CXXConstructExpr, the declaration of the constructor
9227 - for CXXNewExpr, the declaration of the operator new
9228 - for ObjCIvarExpr, the declaration of the ivar
9229
9230 For type nodes, hasDeclaration will generally match the declaration of the
9231 sugared type. Given
9232 class X {};
9233 typedef X Y;
9234 Y y;
9235 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9236 typedefDecl. A common use case is to match the underlying, desugared type.
9237 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9238 varDecl(hasType(hasUnqualifiedDesugaredType(
9239 recordType(hasDeclaration(decl())))))
9240 In this matcher, the decl will match the CXXRecordDecl of class X.
9241
9242 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9249 </pre></td></tr>
9250
9251
9252 <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 <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9254 type of the matched node.
9255
9256 For example, in:
9257 class A {};
9258 using B = A;
9259 The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9260 both B and A.
9261 </pre></td></tr>
9262
9263
9264 <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 <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9266
9267 Given
9268 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9269 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9270 matches sizeof(a) and alignof(c)
9271 </pre></td></tr>
9272
9273
9274 <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 <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9276
9277 Example matches true (matcher = hasUnaryOperand(
9278 cxxBoolLiteral(equals(true))))
9279 !true
9280 </pre></td></tr>
9281
9282
9283 <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 <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9285 given matcher. Implicit object expressions are included; that is, it matches
9286 use of implicit `this`.
9287
9288 Given
9289 struct X {
9290 int m;
9291 int f(X x) { x.m; return m; }
9292 };
9293 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9294 matches `x.m`, but not `m`; however,
9295 memberExpr(hasObjectExpression(hasType(pointsTo(
9296 cxxRecordDecl(hasName("X"))))))
9297 matches `m` (aka. `this->m`), but not `x.m`.
9298 </pre></td></tr>
9299
9300
9301 <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 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9303 matches the given matcher.
9304
9305 The associated declaration is:
9306 - for type nodes, the declaration of the underlying type
9307 - for CallExpr, the declaration of the callee
9308 - for MemberExpr, the declaration of the referenced member
9309 - for CXXConstructExpr, the declaration of the constructor
9310 - for CXXNewExpr, the declaration of the operator new
9311 - for ObjCIvarExpr, the declaration of the ivar
9312
9313 For type nodes, hasDeclaration will generally match the declaration of the
9314 sugared type. Given
9315 class X {};
9316 typedef X Y;
9317 Y y;
9318 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9319 typedefDecl. A common use case is to match the underlying, desugared type.
9320 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9321 varDecl(hasType(hasUnqualifiedDesugaredType(
9322 recordType(hasDeclaration(decl())))))
9323 In this matcher, the decl will match the CXXRecordDecl of class X.
9324
9325 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 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 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 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 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 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
9332 </pre></td></tr>
9333
9334
9335 <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 <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
9337
9338 Given
9339 namespace X { void b(); }
9340 using X::b;
9341 usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
9342 matches using X::b </pre></td></tr>
9343
9344
9345 <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 <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9347 matched by the given matcher.
9348
9349 Given
9350 namespace X { int a; void b(); }
9351 using X::a;
9352 using X::b;
9353 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9354 matches using X::b but not using X::a </pre></td></tr>
9355
9356
9357 <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 <tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9359 declaration's type.
9360
9361 In case of a value declaration (for example a variable declaration),
9362 this resolves one layer of indirection. For example, in the value
9363 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9364 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9365 declaration of x.
9366
9367 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9368 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9369 and friend class X (matcher = friendDecl(hasType("X"))
9370 and public virtual X (matcher = cxxBaseSpecifier(hasType(
9371 cxxRecordDecl(hasName("X"))))
9372 class X {};
9373 void y(X &x) { x; X z; }
9374 class Y { friend class X; };
9375 class Z : public virtual X {};
9376
9377 Example matches class Derived
9378 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9379 class Base {};
9380 class Derived : Base {};
9381
9382 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 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>
9384 </pre></td></tr>
9385
9386
9387 <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 <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9389 matcher.
9390
9391 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9392 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9393 and U (matcher = typedefDecl(hasType(asString("int")))
9394 and friend class X (matcher = friendDecl(hasType("X"))
9395 and public virtual X (matcher = cxxBaseSpecifier(hasType(
9396 asString("class X")))
9397 class X {};
9398 void y(X &x) { x; X z; }
9399 typedef int U;
9400 class Y { friend class X; };
9401 class Z : public virtual X {};
9402 </pre></td></tr>
9403
9404
9405 <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 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9407 that matches the given matcher.
9408
9409 Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9410 bool y() { return true; }
9411 bool x = y();
9412 </pre></td></tr>
9413
9414
9415 <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 <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9417 expression.
9418
9419 Given
9420 void f(int b) {
9421 int a[b];
9422 }
9423 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9424 varDecl(hasName("b")))))))
9425 matches "int a[b]"
9426 </pre></td></tr>
9427
9428
9429 <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 <tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9431
9432
9433 <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 <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9435 switch statement or conditional operator.
9436
9437 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9438 if (true) {}
9439 </pre></td></tr>
9440
9441 <!--END_TRAVERSAL_MATCHERS -->
9442 </table>
9443
9444 </div>
9445 </body>
9446 </html>
9447
9448
9449