1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
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">
14 border-bottom: 1px solid black
;
20 span
.mono
{ font-family: monospace
; }
22 .traverse_compare, .traverse_compare td, .traverse_compare th {
23 border: 1px solid black
;
24 border-collapse: collapse
;
27 <script type=
"text/javascript">
30 row
= document
.getElementById(id
);
31 if (row
.style
.display
!= 'table-cell')
32 row
.style
.display
= 'table-cell';
34 row
.style
.display
= 'none';
38 <body onLoad=
"toggle(location.hash.substring(1, location.hash.length - 6))">
40 <!--#include virtual="../menu.html.incl"-->
44 <h1>AST Matcher Reference
</h1>
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>
50 <p>There are three different basic categories of matchers:
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>
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>
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>
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:
71 recordDecl(hasDescendant(
72 ifStmt(hasTrueExpression(
78 <!-- ======================================================================= -->
79 <h2 id=
"traverse-mode">Traverse Mode
</h2>
80 <!-- ======================================================================= -->
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
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>
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>
104 <p>In clang-query, the mode can be changed with
106 set traversal IgnoreUnlessSpelledInSource
109 This affects both matchers and AST dump output in results.
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:
114 Finder-
>addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115 returnStmt(hasReturnValue(integerLiteral(equals(
0))))
119 <p>The following table compares the
<span class=
"mono">AsIs
</span> mode with
120 the
<span class=
"mono">IgnoreUnlessSpelledInSource
</span> mode:
</p>
122 <table class=
"traverse_compare">
125 <th><span class=
"mono">AsIs
</span></th>
126 <th><span class=
"mono">IgnoreUnlessSpelledInSource
</span></th>
129 <td>AST dump of
<span class=
"mono">func1
</span>:
135 B func1() { return
42; }
147 `-MaterializeTemporaryExpr
151 `-IntegerLiteral 'int'
42
153 C++
11, C++
14 dialect:
160 `-MaterializeTemporaryExpr
163 `-IntegerLiteral 'int'
42
165 C++
17, C++
20 dialect:
172 `-IntegerLiteral 'int'
42
181 `-IntegerLiteral 'int'
42
186 <td>Matcher for returned
<span class=
"mono">42</span>:
192 B func1() { return
42; }
199 returnStmt(hasReturnValue(
201 ignoringElidableConstructorCall(
203 cxxConstructExpr(hasArgument(
0,
205 integerLiteral().bind(
"returnVal")
216 returnStmt(hasReturnValue(
217 integerLiteral().bind(
"returnVal")
223 <pre>implicitCastExpr()
</pre>
230 B func1() { return
42; }
240 <td>Match result for:
244 ).bind(
"prepend_explicit")
256 Match found. Insertion produces incorrect output:
259 struct explicit Copyable {
266 No match found. Incorrect replacement not possible.
270 <td>Replacement of
<span class=
"mono">begin()
</span>
271 with
<span class=
"mono">cbegin()
</span>:
274 on(ConstContainerExpr),
275 callee(cxxMethodDecl(hasName(
"begin")))
276 ).bind(
"replace_with_cbegin")
290 2 matches found. Replacement produces incorrect output:
296 for (auto i :.cbegin() c) {
302 1 match found. Replacement produces correct output:
315 <td>Replacement of
<span class=
"mono">int
</span> member
316 with
<span class=
"mono">safe_int
</span>:
319 hasType(asString(
"int"))
320 ).bind(
"use_safe_int")
328 template
<typename T
> struct TemplStruct {
336 void instantiate() { TemplStruct
<int
> ti; }
340 2 matches found. Replacement produces incorrect output:
346 template
<typename T
> struct TemplStruct {
354 void instantiate() { TemplStruct
<int
> ti; }
358 1 match found. Replacement produces correct output:
364 template
<typename T
> struct TemplStruct {
372 void instantiate() { TemplStruct
<int
> ti; }
377 <td>Add prefix to member initializer
380 forField(fieldDecl())
396 2 matches found. Replacement produces incorrect output:
401 m_Record() : m_i(
42) {}
409 1 match found. Replacement produces correct output:
414 Record() : m_i(
42) {}
423 <td>Ignored default arguments
427 hasName(
"hasDefaultArg")
434 void hasDefaultArg(int i, int j =
0) {}
435 void callDefaultArg() { hasDefaultArg(
42); }
449 hasType(asString(
"int"))
462 auto l = [a, b = c](int d) { int e = d; };
468 2 matches found. Replacement produces incorrect output:
478 auto l = [safe_a, safe_b = c](int d) { int e = d; };
484 1 match found. Replacement produces correct output:
494 auto l = [a, b = c](int d) { int e = d; };
507 <td>Rewritten binary operators
510 hasOperatorName(
"<"),
511 hasRHS(hasDescendant(integerLiteral(equals(
0))))
516 #include
<compare
>
521 bool operator==(const HasSpaceship&) const = default;
522 std::strong_ordering operator<=
>(const HasSpaceship&) const = default;
525 bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
545 <!-- ======================================================================= -->
546 <h2 id=
"decl-matchers">Node Matchers
</h2>
547 <!-- ======================================================================= -->
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>
554 <p>For convenience, all node matchers take an arbitrary number of arguments
555 and implicitly act as allOf matchers.
</p>
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
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:
566 // This binds the CXXRecordDecl to
"id", as the decl() matcher will stay on
568 recordDecl(decl().bind(
"id"), hasName(
"::MyClass"))
573 <tr style=
"text-align:left"><th>Return type
</th><th>Name
</th><th>Parameters
</th></tr>
574 <!-- START_DECL_MATCHERS -->
576 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr
</a>></td><td class=
"name" onclick=
"toggle('attr0')"><a name=
"attr0Anchor">attr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr
</a>>...
</td></tr>
577 <tr><td colspan=
"4" class=
"doc" id=
"attr0"><pre>Matches attributes.
578 Attributes may be attached with a variety of different syntaxes (including
579 keywords, C++
11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
580 and ``#pragma``s). They may also be implicit.
583 struct [[nodiscard]] Foo{};
584 void bar(int * __attribute__((nonnull)) );
585 __declspec(noinline) void baz();
587 #pragma omp declare simd
590 matches
"nodiscard",
"nonnull",
"noinline", and the whole
"#pragma" line.
594 <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>
595 <tr><td colspan=
"4" class=
"doc" id=
"cxxBaseSpecifier0"><pre>Matches class bases.
597 Examples matches public virtual B.
599 class C : public virtual B {};
603 <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>
604 <tr><td colspan=
"4" class=
"doc" id=
"cxxCtorInitializer0"><pre>Matches constructor initializers.
606 Examples matches i(
42).
614 <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>
615 <tr><td colspan=
"4" class=
"doc" id=
"accessSpecDecl0"><pre>Matches C++ access specifier declarations.
627 <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>
628 <tr><td colspan=
"4" class=
"doc" id=
"bindingDecl0"><pre>Matches binding declarations
629 Example matches foo and bar
630 (matcher = bindingDecl()
632 auto [foo, bar] = std::make_pair{
42,
42};
636 <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>
637 <tr><td colspan=
"4" class=
"doc" id=
"blockDecl0"><pre>Matches block declarations.
639 Example matches the declaration of the nameless block printing an input
648 <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>
649 <tr><td colspan=
"4" class=
"doc" id=
"classTemplateDecl0"><pre>Matches C++ class template declarations.
652 template
<class T
> class Z {};
656 <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>
657 <tr><td colspan=
"4" class=
"doc" id=
"classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
660 template
<class T1, class T2, int I
>
663 template
<class T, int I
>
664 class A
<T, T*, I
> {};
667 class A
<int, int,
1> {};
668 classTemplatePartialSpecializationDecl()
669 matches the specialization A
<T,T*,I
> but not A
<int,int,
1>
673 <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>
674 <tr><td colspan=
"4" class=
"doc" id=
"classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
677 template
<typename T
> class A {};
678 template
<> class A
<double
> {};
680 classTemplateSpecializationDecl()
681 matches the specializations A
<int
> and A
<double
>
685 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('conceptDecl0')"><a name=
"conceptDecl0Anchor">conceptDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConceptDecl.html">ConceptDecl
</a>>...
</td></tr>
686 <tr><td colspan=
"4" class=
"doc" id=
"conceptDecl0"><pre>Matches concept declarations.
688 Example matches integral
689 template
<typename T
>
690 concept integral = std::is_integral_v
<T
>;
694 <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>
695 <tr><td colspan=
"4" class=
"doc" id=
"cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
697 Example matches Foo::Foo() and Foo::Foo(int)
707 <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>
708 <tr><td colspan=
"4" class=
"doc" id=
"cxxConversionDecl0"><pre>Matches conversion operator declarations.
710 Example matches the operator.
711 class X { operator int() const; };
715 <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>
716 <tr><td colspan=
"4" class=
"doc" id=
"cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
718 Example matches the deduction guide.
719 template
<typename T
>
721 X(int) -
> X
<int
>;
725 <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>
726 <tr><td colspan=
"4" class=
"doc" id=
"cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
728 Example matches Foo::~Foo()
736 <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>
737 <tr><td colspan=
"4" class=
"doc" id=
"cxxMethodDecl0"><pre>Matches method declarations.
740 class X { void y(); };
744 <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>
745 <tr><td colspan=
"4" class=
"doc" id=
"cxxRecordDecl0"><pre>Matches C++ class declarations.
749 template
<class T
> class Z {};
753 <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>
754 <tr><td colspan=
"4" class=
"doc" id=
"decl0"><pre>Matches declarations.
756 Examples matches X, C, and the friend declaration inside C;
764 <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>
765 <tr><td colspan=
"4" class=
"doc" id=
"declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
766 and non-type template parameter declarations).
775 <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>
776 <tr><td colspan=
"4" class=
"doc" id=
"decompositionDecl0"><pre>Matches decomposition-declarations.
778 Examples matches the declaration node with foo and bar, but not
780 (matcher = declStmt(has(decompositionDecl())))
783 auto [foo, bar] = std::make_pair{
42,
42};
787 <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>
788 <tr><td colspan=
"4" class=
"doc" id=
"enumConstantDecl0"><pre>Matches enum constants.
790 Example matches A, B, C
797 <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>
798 <tr><td colspan=
"4" class=
"doc" id=
"enumDecl0"><pre>Matches enum declarations.
807 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('exportDecl0')"><a name=
"exportDecl0Anchor">exportDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ExportDecl.html">ExportDecl
</a>>...
</td></tr>
808 <tr><td colspan=
"4" class=
"doc" id=
"exportDecl0"><pre>Matches any export declaration.
810 Example matches following declarations.
812 export { void foo(); }
813 export namespace { void foo(); }
818 <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>
819 <tr><td colspan=
"4" class=
"doc" id=
"fieldDecl0"><pre>Matches field declarations.
828 <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>
829 <tr><td colspan=
"4" class=
"doc" id=
"friendDecl0"><pre>Matches friend declarations.
832 class X { friend void foo(); };
834 matches 'friend void foo()'.
838 <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>
839 <tr><td colspan=
"4" class=
"doc" id=
"functionDecl0"><pre>Matches function declarations.
846 <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>
847 <tr><td colspan=
"4" class=
"doc" id=
"functionTemplateDecl0"><pre>Matches C++ function template declarations.
850 template
<class T
> void f(T t) {}
854 <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>
855 <tr><td colspan=
"4" class=
"doc" id=
"indirectFieldDecl0"><pre>Matches indirect field declarations.
858 struct X { struct { int a; }; };
864 <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>
865 <tr><td colspan=
"4" class=
"doc" id=
"labelDecl0"><pre>Matches a declaration of label.
875 <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>
876 <tr><td colspan=
"4" class=
"doc" id=
"linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
881 matches
"extern "C
" {}"
885 <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>
886 <tr><td colspan=
"4" class=
"doc" id=
"namedDecl0"><pre>Matches a declaration of anything that could have a name.
888 Example matches X, S, the anonymous union type, i, and U;
898 <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>
899 <tr><td colspan=
"4" class=
"doc" id=
"namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
903 namespace alias = ::test;
905 matches
"namespace alias" but not
"namespace test"
909 <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>
910 <tr><td colspan=
"4" class=
"doc" id=
"namespaceDecl0"><pre>Matches a declaration of a namespace.
916 matches
"namespace {}" and
"namespace test {}"
920 <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>
921 <tr><td colspan=
"4" class=
"doc" id=
"nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
924 template
<typename T, int N
> struct C {};
925 nonTypeTemplateParmDecl()
926 matches 'N', but not 'T'.
930 <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>
931 <tr><td colspan=
"4" class=
"doc" id=
"objcCategoryDecl0"><pre>Matches Objective-C category declarations.
933 Example matches Foo (Additions)
934 @interface Foo (Additions)
939 <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>
940 <tr><td colspan=
"4" class=
"doc" id=
"objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
942 Example matches Foo (Additions)
943 @implementation Foo (Additions)
948 <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>
949 <tr><td colspan=
"4" class=
"doc" id=
"objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
957 <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>
958 <tr><td colspan=
"4" class=
"doc" id=
"objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
966 <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>
967 <tr><td colspan=
"4" class=
"doc" id=
"objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
969 Example matches _enabled
970 @implementation Foo {
977 <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>
978 <tr><td colspan=
"4" class=
"doc" id=
"objcMethodDecl0"><pre>Matches Objective-C method declarations.
980 Example matches both declaration and definition of -[Foo method]
991 <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>
992 <tr><td colspan=
"4" class=
"doc" id=
"objcPropertyDecl0"><pre>Matches Objective-C property declarations.
994 Example matches enabled
996 @property BOOL enabled;
1001 <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>
1002 <tr><td colspan=
"4" class=
"doc" id=
"objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
1004 Example matches FooDelegate
1005 @protocol FooDelegate
1010 <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>
1011 <tr><td colspan=
"4" class=
"doc" id=
"parmVarDecl0"><pre>Matches parameter variable declarations.
1020 <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>
1021 <tr><td colspan=
"4" class=
"doc" id=
"recordDecl0"><pre>Matches class, struct, and union declarations.
1023 Example matches X, Z, U, and S
1025 template
<class T
> class Z {};
1031 <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>
1032 <tr><td colspan=
"4" class=
"doc" id=
"staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
1037 static_assert(sizeof(S) == sizeof(int))
1042 static_assert(sizeof(S) == sizeof(int));
1046 <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>
1047 <tr><td colspan=
"4" class=
"doc" id=
"tagDecl0"><pre>Matches tag declarations.
1049 Example matches X, Z, U, S, E
1051 template
<class T
> class Z {};
1060 <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>
1061 <tr><td colspan=
"4" class=
"doc" id=
"templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1064 template
<template
<typename
> class Z, int N
> struct C {};
1065 templateTypeParmDecl()
1066 matches 'Z', but not 'N'.
1070 <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>
1071 <tr><td colspan=
"4" class=
"doc" id=
"templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1074 template
<typename T, int N
> struct C {};
1075 templateTypeParmDecl()
1076 matches 'T', but not 'N'.
1080 <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>
1081 <tr><td colspan=
"4" class=
"doc" id=
"translationUnitDecl0"><pre>Matches the top declaration context.
1088 decl(hasDeclContext(translationUnitDecl()))
1089 matches
"int X", but not
"int Y".
1093 <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>
1094 <tr><td colspan=
"4" class=
"doc" id=
"typeAliasDecl0"><pre>Matches type alias declarations.
1100 matches
"using Y = int", but not
"typedef int X"
1104 <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>
1105 <tr><td colspan=
"4" class=
"doc" id=
"typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1107 typeAliasTemplateDecl() matches
1108 template
<typename T
>
1109 using Y = X
<T
>;
1113 <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>
1114 <tr><td colspan=
"4" class=
"doc" id=
"typedefDecl0"><pre>Matches typedef declarations.
1120 matches
"typedef int X", but not
"using Y = int"
1124 <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>
1125 <tr><td colspan=
"4" class=
"doc" id=
"typedefNameDecl0"><pre>Matches typedef name declarations.
1131 matches
"typedef int X" and
"using Y = int"
1135 <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>
1136 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1140 template
<typename T
>
1141 struct Base { typedef T Foo; };
1143 template
<typename T
>
1144 struct S : private Base
<T
> {
1145 using typename Base
<T
>::Foo;
1147 unresolvedUsingTypenameDecl()
1148 matches using Base
<T
>::Foo
</pre></td></tr>
1151 <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>
1152 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1155 template
<typename X
>
1156 class C : private X {
1159 unresolvedUsingValueDecl()
1160 matches using X::x
</pre></td></tr>
1163 <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>
1164 <tr><td colspan=
"4" class=
"doc" id=
"usingDecl0"><pre>Matches using declarations.
1167 namespace X { int x; }
1170 matches using X::x
</pre></td></tr>
1173 <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>
1174 <tr><td colspan=
"4" class=
"doc" id=
"usingDirectiveDecl0"><pre>Matches using namespace declarations.
1177 namespace X { int x; }
1179 usingDirectiveDecl()
1180 matches using namespace X
</pre></td></tr>
1183 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('usingEnumDecl0')"><a name=
"usingEnumDecl0Anchor">usingEnumDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl
</a>>...
</td></tr>
1184 <tr><td colspan=
"4" class=
"doc" id=
"usingEnumDecl0"><pre>Matches using-enum declarations.
1187 namespace X { enum x {...}; }
1190 matches using enum X::x
</pre></td></tr>
1193 <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>
1194 <tr><td colspan=
"4" class=
"doc" id=
"valueDecl0"><pre>Matches any value declaration.
1196 Example matches A, B, C and F
1202 <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>
1203 <tr><td colspan=
"4" class=
"doc" id=
"varDecl0"><pre>Matches variable declarations.
1205 Note: this does not match declarations of member variables, which are
1206 "field" declarations in Clang parlance.
1213 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>></td><td class=
"name" onclick=
"toggle('lambdaCapture0')"><a name=
"lambdaCapture0Anchor">lambdaCapture
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>>...
</td></tr>
1214 <tr><td colspan=
"4" class=
"doc" id=
"lambdaCapture0"><pre>Matches lambda captures.
1220 auto g = [x =
1](){};
1222 In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`,
1223 `lambdaCapture()` matches `x` and `x=
1`.
1227 <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>
1228 <tr><td colspan=
"4" class=
"doc" id=
"nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1232 <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>
1233 <tr><td colspan=
"4" class=
"doc" id=
"nestedNameSpecifier0"><pre>Matches nested name specifiers.
1237 struct A { static void f(); };
1239 void g() { A::f(); }
1242 nestedNameSpecifier()
1243 matches
"ns::" and both
"A::"
1247 <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>
1248 <tr><td colspan=
"4" class=
"doc" id=
"ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1252 #pragma omp parallel default(none)
1253 #pragma omp parallel default(shared)
1254 #pragma omp parallel default(private)
1255 #pragma omp parallel default(firstprivate)
1256 #pragma omp parallel
1258 ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``,
1259 `` default(private)`` and ``default(firstprivate)``
1263 <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>
1264 <tr><td colspan=
"4" class=
"doc" id=
"qualType0"><pre>Matches QualTypes in the clang AST.
1268 <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>
1269 <tr><td colspan=
"4" class=
"doc" id=
"addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1273 void *ptr =
&&FOO;
1276 matches '
&&FOO'
1280 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('arrayInitIndexExpr0')"><a name=
"arrayInitIndexExpr0Anchor">arrayInitIndexExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ArrayInitIndexExpr.html">ArrayInitIndexExpr
</a>>...
</td></tr>
1281 <tr><td colspan=
"4" class=
"doc" id=
"arrayInitIndexExpr0"><pre>The arrayInitIndexExpr consists of two subexpressions: a common expression
1282 (the source array) that is evaluated once up-front, and a per-element initializer
1283 that runs once for each array element. Within the per-element initializer,
1284 the current index may be obtained via an ArrayInitIndexExpr.
1287 void testStructBinding() {
1291 arrayInitIndexExpr() matches the array index that implicitly iterates
1292 over the array `a` to copy each element to the anonymous array
1293 that backs the structured binding `[x, y]` elements of which are
1294 referred to by their aliases `x` and `y`.
1298 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('arrayInitLoopExpr0')"><a name=
"arrayInitLoopExpr0Anchor">arrayInitLoopExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ArrayInitLoopExpr.html">ArrayInitLoopExpr
</a>>...
</td></tr>
1299 <tr><td colspan=
"4" class=
"doc" id=
"arrayInitLoopExpr0"><pre>Matches a loop initializing the elements of an array in a number of contexts:
1300 * in the implicit copy/move constructor for a class with an array member
1301 * when a lambda-expression captures an array by value
1302 * when a decomposition declaration decomposes an array
1305 void testLambdaCapture() {
1311 arrayInitLoopExpr() matches the implicit loop that initializes each element of
1312 the implicit array field inside the lambda object, that represents the array `a`
1317 <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>
1318 <tr><td colspan=
"4" class=
"doc" id=
"arraySubscriptExpr0"><pre>Matches array subscript expressions.
1322 arraySubscriptExpr()
1327 <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>
1328 <tr><td colspan=
"4" class=
"doc" id=
"asmStmt0"><pre>Matches asm statements.
1333 matches '__asm(
"mov al, 2")'
1337 <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>
1338 <tr><td colspan=
"4" class=
"doc" id=
"atomicExpr0"><pre>Matches atomic builtins.
1339 Example matches __atomic_load_n(ptr,
1)
1340 void foo() { int *ptr; __atomic_load_n(ptr,
1); }
1344 <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>
1345 <tr><td colspan=
"4" class=
"doc" id=
"autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1351 autoreleasePoolStmt(stmt()) matches the declaration of
"x"
1352 inside the autorelease pool.
1356 <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>
1357 <tr><td colspan=
"4" class=
"doc" id=
"binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1359 Example matches a ?: b
1364 <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>
1365 <tr><td colspan=
"4" class=
"doc" id=
"binaryOperator0"><pre>Matches binary operator expressions.
1367 Example matches a || b
1369 See also the binaryOperation() matcher for more-general matching.
1373 <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>
1374 <tr><td colspan=
"4" class=
"doc" id=
"blockExpr0"><pre>Matches a reference to a block.
1376 Example: matches
"^{}":
1381 <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>
1382 <tr><td colspan=
"4" class=
"doc" id=
"breakStmt0"><pre>Matches break statements.
1385 while (true) { break; }
1391 <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>
1392 <tr><td colspan=
"4" class=
"doc" id=
"cStyleCastExpr0"><pre>Matches a C-style cast expression.
1394 Example: Matches (int)
2.2f in
1399 <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>
1400 <tr><td colspan=
"4" class=
"doc" id=
"callExpr0"><pre>Matches call expressions.
1402 Example matches x.y() and y()
1409 <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>
1410 <tr><td colspan=
"4" class=
"doc" id=
"caseStmt0"><pre>Matches case statements inside switch statements.
1413 switch(a) { case
42: break; default: break; }
1419 <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>
1420 <tr><td colspan=
"4" class=
"doc" id=
"castExpr0"><pre>Matches any cast nodes of Clang's AST.
1422 Example: castExpr() matches each of the following:
1424 const_cast
<Expr *
>(SubExpr);
1432 <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>
1433 <tr><td colspan=
"4" class=
"doc" id=
"characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1435 Not matching Hex-encoded chars (e.g.
0x1234, which is a IntegerLiteral),
1438 Example matches 'a', L'a'
1444 <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>
1445 <tr><td colspan=
"4" class=
"doc" id=
"chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1449 <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>
1450 <tr><td colspan=
"4" class=
"doc" id=
"coawaitExpr0"><pre>Matches co_await expressions.
1455 matches 'co_await
1'
1459 <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>
1460 <tr><td colspan=
"4" class=
"doc" id=
"compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1462 Example match: {
1}, (
1,
2)
1464 vector int myvec = (vector int)(
1,
2);
1468 <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>
1469 <tr><td colspan=
"4" class=
"doc" id=
"compoundStmt0"><pre>Matches compound statements.
1471 Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1476 <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>
1477 <tr><td colspan=
"4" class=
"doc" id=
"conditionalOperator0"><pre>Matches conditional operator expressions.
1479 Example matches a ? b : c
1484 <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>
1485 <tr><td colspan=
"4" class=
"doc" id=
"constantExpr0"><pre>Matches a constant expression wrapper.
1487 Example matches the constant in the case statement:
1488 (matcher = constantExpr())
1495 <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>
1496 <tr><td colspan=
"4" class=
"doc" id=
"continueStmt0"><pre>Matches continue statements.
1499 while (true) { continue; }
1505 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('convertVectorExpr0')"><a name=
"convertVectorExpr0Anchor">convertVectorExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConvertVectorExpr.html">ConvertVectorExpr
</a>>...
</td></tr>
1506 <tr><td colspan=
"4" class=
"doc" id=
"convertVectorExpr0"><pre>Matches builtin function __builtin_convertvector.
1510 <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>
1511 <tr><td colspan=
"4" class=
"doc" id=
"coreturnStmt0"><pre>Matches co_return statements.
1514 while (true) { co_return; }
1520 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('coroutineBodyStmt0')"><a name=
"coroutineBodyStmt0Anchor">coroutineBodyStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CoroutineBodyStmt.html">CoroutineBodyStmt
</a>>...
</td></tr>
1521 <tr><td colspan=
"4" class=
"doc" id=
"coroutineBodyStmt0"><pre>Matches coroutine body statements.
1523 coroutineBodyStmt() matches the coroutine below
1524 generator
<int
> gen() {
1530 <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>
1531 <tr><td colspan=
"4" class=
"doc" id=
"coyieldExpr0"><pre>Matches co_yield expressions.
1536 matches 'co_yield
1'
1540 <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>
1541 <tr><td colspan=
"4" class=
"doc" id=
"cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1544 kernel
<<<i,j
>>>();
1548 <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>
1549 <tr><td colspan=
"4" class=
"doc" id=
"cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1551 Example matches FunctionTakesString(GetStringByValue())
1552 (matcher = cxxBindTemporaryExpr())
1553 FunctionTakesString(GetStringByValue());
1554 FunctionTakesStringByPointer(GetStringPointer());
1558 <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>
1559 <tr><td colspan=
"4" class=
"doc" id=
"cxxBoolLiteral0"><pre>Matches bool literals.
1561 Example matches true
1566 <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>
1567 <tr><td colspan=
"4" class=
"doc" id=
"cxxCatchStmt0"><pre>Matches catch statements.
1569 try {} catch(int i) {}
1571 matches 'catch(int i)'
1575 <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>
1576 <tr><td colspan=
"4" class=
"doc" id=
"cxxConstCastExpr0"><pre>Matches a const_cast expression.
1578 Example: Matches const_cast
<int*
>(
&r) in
1580 const int
&r(n);
1581 int* p = const_cast
<int*
>(
&r);
1585 <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>
1586 <tr><td colspan=
"4" class=
"doc" id=
"cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1588 Example matches string(ptr, n) and ptr within arguments of f
1589 (matcher = cxxConstructExpr())
1590 void f(const string
&a, const string
&b);
1593 f(string(ptr, n), ptr);
1597 <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>
1598 <tr><td colspan=
"4" class=
"doc" id=
"cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1600 Example matches the CXXDefaultArgExpr placeholder inserted for the
1601 default value of the second parameter in the call expression f(
42)
1602 (matcher = cxxDefaultArgExpr())
1603 void f(int x, int y =
0);
1608 <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>
1609 <tr><td colspan=
"4" class=
"doc" id=
"cxxDeleteExpr0"><pre>Matches delete expressions.
1618 <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>
1619 <tr><td colspan=
"4" class=
"doc" id=
"cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1620 resolved because the base expression or the member name was dependent.
1623 template
<class T
> void f() { T t; t.g(); }
1624 cxxDependentScopeMemberExpr()
1629 <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>
1630 <tr><td colspan=
"4" class=
"doc" id=
"cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1633 cxxDynamicCastExpr()
1635 dynamic_cast
<D*
>(
&b);
1637 struct B { virtual ~B() {} }; struct D : B {};
1639 D* p = dynamic_cast
<D*
>(
&b);
1643 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxFoldExpr0')"><a name=
"cxxFoldExpr0Anchor">cxxFoldExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>>...
</td></tr>
1644 <tr><td colspan=
"4" class=
"doc" id=
"cxxFoldExpr0"><pre>Matches C++
17 fold expressions.
1646 Example matches `(
0 + ... + args)`:
1647 template
<typename... Args
>
1648 auto sum(Args... args) {
1649 return (
0 + ... + args);
1654 <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>
1655 <tr><td colspan=
"4" class=
"doc" id=
"cxxForRangeStmt0"><pre>Matches range-based for statements.
1657 cxxForRangeStmt() matches 'for (auto a : i)'
1658 int i[] = {
1,
2,
3}; for (auto a : i);
1659 for(int j =
0; j
< 5; ++j);
1663 <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>
1664 <tr><td colspan=
"4" class=
"doc" id=
"cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1666 Example: Matches Foo(bar);
1673 <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>
1674 <tr><td colspan=
"4" class=
"doc" id=
"cxxMemberCallExpr0"><pre>Matches member call expressions.
1676 Example matches x.y()
1682 <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>
1683 <tr><td colspan=
"4" class=
"doc" id=
"cxxNewExpr0"><pre>Matches new expressions.
1692 <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>
1693 <tr><td colspan=
"4" class=
"doc" id=
"cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1697 bool b() noexcept(true);
1698 bool c() noexcept(false);
1699 bool d() noexcept(noexcept(a()));
1700 bool e = noexcept(b()) || noexcept(c());
1702 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1703 doesn't match the noexcept specifier in the declarations a, b, c or d.
1707 <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>
1708 <tr><td colspan=
"4" class=
"doc" id=
"cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1712 <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>
1713 <tr><td colspan=
"4" class=
"doc" id=
"cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1715 Note that if an operator isn't overloaded, it won't match. Instead, use
1716 binaryOperator matcher.
1717 Currently it does not match operators such as new delete.
1718 FIXME: figure out why these do not match?
1720 Example matches both operator
<<((o
<< b), c) and operator
<<(o, b)
1721 (matcher = cxxOperatorCallExpr())
1722 ostream
&operator
<< (ostream
&out, int i) { };
1723 ostream
&o; int b =
1, c =
1;
1724 o
<< b
<< c;
1725 See also the binaryOperation() matcher for more-general matching of binary
1726 uses of this AST node.
1730 <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>
1731 <tr><td colspan=
"4" class=
"doc" id=
"cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1733 Either the source expression or the destination type can be matched
1734 using has(), but hasDestinationType() is more specific and can be
1737 Example matches reinterpret_cast
<char*
>(
&p) in
1738 void* p = reinterpret_cast
<char*
>(
&p);
1742 <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>
1743 <tr><td colspan=
"4" class=
"doc" id=
"cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1745 Example matches use of
"<":
1746 #include
<compare
>
1747 struct HasSpaceshipMem {
1749 constexpr auto operator
<=
>(const HasSpaceshipMem
&) const = default;
1752 HasSpaceshipMem hs1, hs2;
1756 See also the binaryOperation() matcher for more-general matching
1761 <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>
1762 <tr><td colspan=
"4" class=
"doc" id=
"cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1764 See also: hasDestinationType
1765 See also: reinterpretCast
1770 static_cast
<long
>(
8)
1772 long eight(static_cast
<long
>(
8));
1776 <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>
1777 <tr><td colspan=
"4" class=
"doc" id=
"cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1780 std::vector
<int
> a({
1,
2,
3 });
1781 std::vector
<int
> b = {
4,
5 };
1783 std::pair
<int, int
> d = {
8,
9 };
1784 cxxStdInitializerListExpr()
1785 matches
"{ 1, 2, 3 }" and
"{ 4, 5 }"
1789 <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>
1790 <tr><td colspan=
"4" class=
"doc" id=
"cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N !=
1 arguments
1792 Example: Matches Foo(bar, bar)
1793 Foo h = Foo(bar, bar);
1797 <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>
1798 <tr><td colspan=
"4" class=
"doc" id=
"cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1800 Example matches the implicit this expression in
"return i".
1801 (matcher = cxxThisExpr())
1804 int f() { return i; }
1809 <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>
1810 <tr><td colspan=
"4" class=
"doc" id=
"cxxThrowExpr0"><pre>Matches throw expressions.
1812 try { throw
5; } catch(int i) {}
1818 <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>
1819 <tr><td colspan=
"4" class=
"doc" id=
"cxxTryStmt0"><pre>Matches try statements.
1821 try {} catch(int i) {}
1827 <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>
1828 <tr><td colspan=
"4" class=
"doc" id=
"cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1830 Example matches T(t) in return statement of f
1831 (matcher = cxxUnresolvedConstructExpr())
1832 template
<typename T
>
1833 void f(const T
& t) { return T(t); }
1837 <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>
1838 <tr><td colspan=
"4" class=
"doc" id=
"declRefExpr0"><pre>Matches expressions that refer to declarations.
1840 Example matches x in if (x)
1845 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('dependentScopeDeclRefExpr0')"><a name=
"dependentScopeDeclRefExpr0Anchor">dependentScopeDeclRefExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentScopeDeclRefExpr.html">DependentScopeDeclRefExpr
</a>>...
</td></tr>
1846 <tr><td colspan=
"4" class=
"doc" id=
"dependentScopeDeclRefExpr0"><pre>Matches expressions that refer to dependent scope declarations.
1848 Example matches T::v
1849 template
<class T
> class X : T { void f() { T::v; } };
1852 <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>
1853 <tr><td colspan=
"4" class=
"doc" id=
"declStmt0"><pre>Matches declaration statements.
1862 <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>
1863 <tr><td colspan=
"4" class=
"doc" id=
"defaultStmt0"><pre>Matches default statements inside switch statements.
1866 switch(a) { case
42: break; default: break; }
1872 <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>
1873 <tr><td colspan=
"4" class=
"doc" id=
"dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1877 <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>
1878 <tr><td colspan=
"4" class=
"doc" id=
"designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99
6.7.8].
1880 Example: Matches { [
2].y =
1.0, [
0].x =
1.0 }
1881 point ptarray[
10] = { [
2].y =
1.0, [
0].x =
1.0 };
1885 <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>
1886 <tr><td colspan=
"4" class=
"doc" id=
"doStmt0"><pre>Matches do statements.
1891 matches 'do {} while(true)'
1895 <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>
1896 <tr><td colspan=
"4" class=
"doc" id=
"explicitCastExpr0"><pre>Matches explicit cast expressions.
1898 Matches any cast expression written in user code, whether it be a
1899 C-style cast, a functional-style cast, or a keyword cast.
1901 Does not match implicit conversions.
1903 Note: the name
"explicitCast" is chosen to match Clang's terminology, as
1904 Clang uses the term
"cast" to apply to implicit conversions as well as to
1905 actual cast expressions.
1907 See also: hasDestinationType.
1909 Example: matches all five of the casts in
1910 int((int)(reinterpret_cast
<int
>(static_cast
<int
>(const_cast
<int
>(
42)))))
1911 but does not match the implicit conversion in
1916 <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>
1917 <tr><td colspan=
"4" class=
"doc" id=
"expr0"><pre>Matches expressions.
1924 <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>
1925 <tr><td colspan=
"4" class=
"doc" id=
"exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1926 of the sub-expression's evaluation.
1928 Example matches std::string()
1929 const std::string str = std::string();
1933 <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>
1934 <tr><td colspan=
"4" class=
"doc" id=
"fixedPointLiteral0"><pre>Matches fixed point literals
1938 <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>
1939 <tr><td colspan=
"4" class=
"doc" id=
"floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
1940 1.0,
1.0f,
1.0L and
1e10.
1942 Does not match implicit conversions such as
1947 <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>
1948 <tr><td colspan=
"4" class=
"doc" id=
"forStmt0"><pre>Matches for statements.
1950 Example matches 'for (;;) {}'
1952 int i[] = {
1,
2,
3}; for (auto a : i);
1956 <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>
1957 <tr><td colspan=
"4" class=
"doc" id=
"genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1961 <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>
1962 <tr><td colspan=
"4" class=
"doc" id=
"gnuNullExpr0"><pre>Matches GNU __null expression.
1966 <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>
1967 <tr><td colspan=
"4" class=
"doc" id=
"gotoStmt0"><pre>Matches goto statements.
1977 <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>
1978 <tr><td colspan=
"4" class=
"doc" id=
"ifStmt0"><pre>Matches if statements.
1980 Example matches 'if (x) {}'
1985 <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>
1986 <tr><td colspan=
"4" class=
"doc" id=
"imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1987 point literals e.g.:
1i,
1.0i
1991 <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>
1992 <tr><td colspan=
"4" class=
"doc" id=
"implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1994 This matches many different places, including function call return value
1995 eliding, as well as any type conversions.
1999 <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>
2000 <tr><td colspan=
"4" class=
"doc" id=
"implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
2003 point ptarray[
10] = { [
2].y =
1.0, [
2].x =
2.0, [
0].x =
1.0 };
2004 implicitValueInitExpr()
2005 matches
"[0].y" (implicitly)
2009 <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>
2010 <tr><td colspan=
"4" class=
"doc" id=
"initListExpr0"><pre>Matches init list expressions.
2014 struct B { int x, y; };
2017 matches
"{ 1, 2 }" and
"{ 5, 6 }"
2021 <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>
2022 <tr><td colspan=
"4" class=
"doc" id=
"integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
2025 Does not match character-encoded integers such as L'a'.
2029 <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>
2030 <tr><td colspan=
"4" class=
"doc" id=
"labelStmt0"><pre>Matches label statements.
2040 <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>
2041 <tr><td colspan=
"4" class=
"doc" id=
"lambdaExpr0"><pre>Matches lambda expressions.
2043 Example matches [
&](){return
5;}
2044 [
&](){return
5;}
2048 <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>
2049 <tr><td colspan=
"4" class=
"doc" id=
"materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
2052 struct T {void func();};
2055 materializeTemporaryExpr() matches 'f()' in these statements
2064 <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>
2065 <tr><td colspan=
"4" class=
"doc" id=
"memberExpr0"><pre>Matches member expressions.
2069 void x() { this-
>x(); x(); Y y; y.x(); a; this-
>b; Y::b; }
2070 int a; static int b;
2073 matches this-
>x, x, y.x, a, this-
>b
2077 <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>
2078 <tr><td colspan=
"4" class=
"doc" id=
"nullStmt0"><pre>Matches null statements.
2082 matches the second ';'
2086 <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>
2087 <tr><td colspan=
"4" class=
"doc" id=
"objcCatchStmt0"><pre>Matches Objective-C @catch statements.
2089 Example matches @catch
2095 <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>
2096 <tr><td colspan=
"4" class=
"doc" id=
"objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
2098 Example matches @finally
2104 <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>
2105 <tr><td colspan=
"4" class=
"doc" id=
"objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
2107 Example: matches
"a" in
"init" method:
2117 <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>
2118 <tr><td colspan=
"4" class=
"doc" id=
"objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
2120 The innermost message send invokes the
"alloc" class method on the
2121 NSString class, while the outermost message send invokes the
2122 "initWithString" instance method on the object returned from
2123 NSString's
"alloc". This matcher should match both message sends.
2124 [[NSString alloc] initWithString:@
"Hello"]
2128 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcStringLiteral0')"><a name=
"objcStringLiteral0Anchor">objcStringLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCStringLiteral.html">ObjCStringLiteral
</a>>...
</td></tr>
2129 <tr><td colspan=
"4" class=
"doc" id=
"objcStringLiteral0"><pre>Matches ObjectiveC String literal expressions.
2131 Example matches @
"abcd"
2132 NSString *s = @
"abcd";
2136 <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>
2137 <tr><td colspan=
"4" class=
"doc" id=
"objcThrowStmt0"><pre>Matches Objective-C statements.
2139 Example matches @throw obj;
2143 <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>
2144 <tr><td colspan=
"4" class=
"doc" id=
"objcTryStmt0"><pre>Matches Objective-C @try statements.
2146 Example matches @try
2152 <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>
2153 <tr><td colspan=
"4" class=
"doc" id=
"ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2157 #pragma omp parallel
2158 #pragma omp parallel default(none)
2159 #pragma omp taskyield
2161 ``ompExecutableDirective()`` matches ``omp parallel``,
2162 ``omp parallel default(none)`` and ``omp taskyield``.
2166 <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>
2167 <tr><td colspan=
"4" class=
"doc" id=
"opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2168 to reference another expressions and can be met
2169 in BinaryConditionalOperators, for example.
2176 <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>
2177 <tr><td colspan=
"4" class=
"doc" id=
"parenExpr0"><pre>Matches parentheses used in expressions.
2179 Example matches (foo() +
1)
2180 int foo() { return
1; }
2181 int a = (foo() +
1);
2185 <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>
2186 <tr><td colspan=
"4" class=
"doc" id=
"parenListExpr0"><pre>Matches paren list expressions.
2187 ParenListExprs don't have a predefined type and are used for late parsing.
2188 In the final AST, they can be met in template declarations.
2191 template
<typename T
> class X {
2194 int a =
0, b =
1; int i = (a, b);
2197 parenListExpr() matches
"*this" but NOT matches (a, b) because (a, b)
2198 has a predefined type and is a ParenExpr, not a ParenListExpr.
2202 <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>
2203 <tr><td colspan=
"4" class=
"doc" id=
"predefinedExpr0"><pre>Matches predefined identifier expressions [C99
6.4.2.2].
2205 Example: Matches __func__
2206 printf(
"%s", __func__);
2210 <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>
2211 <tr><td colspan=
"4" class=
"doc" id=
"returnStmt0"><pre>Matches return statements.
2220 <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>
2221 <tr><td colspan=
"4" class=
"doc" id=
"stmt0"><pre>Matches statements.
2226 matches both the compound statement '{ ++a; }' and '++a'.
2230 <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>
2231 <tr><td colspan=
"4" class=
"doc" id=
"stmtExpr0"><pre>Matches statement expression (GNU extension).
2233 Example match: ({ int X =
4; X; })
2234 int C = ({ int X =
4; X; });
2238 <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>
2239 <tr><td colspan=
"4" class=
"doc" id=
"stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2241 Example matches
"abcd", L
"abcd"
2243 wchar_t *ws = L
"abcd";
2247 <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>
2248 <tr><td colspan=
"4" class=
"doc" id=
"substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2251 template
<int N
>
2252 struct A { static const int n = N; };
2253 struct B : public A
<42> {};
2254 substNonTypeTemplateParmExpr()
2255 matches
"N" in the right-hand side of
"static const int n = N;"
2259 <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>
2260 <tr><td colspan=
"4" class=
"doc" id=
"switchCase0"><pre>Matches case and default statements inside switch statements.
2263 switch(a) { case
42: break; default: break; }
2265 matches 'case
42:' and 'default:'.
2269 <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>
2270 <tr><td colspan=
"4" class=
"doc" id=
"switchStmt0"><pre>Matches switch statements.
2273 switch(a) { case
42: break; default: break; }
2275 matches 'switch(a)'.
2279 <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>
2280 <tr><td colspan=
"4" class=
"doc" id=
"unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++
11) and vec_step (OpenCL)
2284 int y = sizeof(x) + alignof(x);
2285 unaryExprOrTypeTraitExpr()
2286 matches sizeof(x) and alignof(x)
2290 <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>
2291 <tr><td colspan=
"4" class=
"doc" id=
"unaryOperator0"><pre>Matches unary operator expressions.
2298 <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>
2299 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2300 but could not be resolved to a specific declaration.
2303 template
<typename T
>
2304 T foo() { T a; return a; }
2305 template
<typename T
>
2309 unresolvedLookupExpr()
2310 matches foo
<T
>()
</pre></td></tr>
2313 <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>
2314 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2318 template
<class T
> void f();
2321 template
<class T
> void h() { X x; x.f
<T
>(); x.g(); }
2322 unresolvedMemberExpr()
2323 matches x.f
<T
>
2327 <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>
2328 <tr><td colspan=
"4" class=
"doc" id=
"userDefinedLiteral0"><pre>Matches user defined literal operator call.
2330 Example match:
"foo"_suffix
2334 <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>
2335 <tr><td colspan=
"4" class=
"doc" id=
"whileStmt0"><pre>Matches while statements.
2340 matches 'while (true) {}'.
2344 <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>
2345 <tr><td colspan=
"4" class=
"doc" id=
"templateArgumentLoc0"><pre>Matches template arguments (with location info).
2348 template
<typename T
> struct C {};
2350 templateArgumentLoc()
2351 matches 'int' in C
<int
>.
2355 <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>
2356 <tr><td colspan=
"4" class=
"doc" id=
"templateArgument0"><pre>Matches template arguments.
2359 template
<typename T
> struct C {};
2362 matches 'int' in C
<int
>.
2366 <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>
2367 <tr><td colspan=
"4" class=
"doc" id=
"templateName0"><pre>Matches template name.
2370 template
<typename T
> class X { };
2373 matches 'X' in X
<int
>.
2377 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('elaboratedTypeLoc0')"><a name=
"elaboratedTypeLoc0Anchor">elaboratedTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc
</a>>...
</td></tr>
2378 <tr><td colspan=
"4" class=
"doc" id=
"elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s.
2384 matches the `TypeLoc` of the variable declaration of `ss`.
2388 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('pointerTypeLoc0')"><a name=
"pointerTypeLoc0Anchor">pointerTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc
</a>>...
</td></tr>
2389 <tr><td colspan=
"4" class=
"doc" id=
"pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
2398 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('qualifiedTypeLoc0')"><a name=
"qualifiedTypeLoc0Anchor">qualifiedTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc
</a>>...
</td></tr>
2399 <tr><td colspan=
"4" class=
"doc" id=
"qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST.
2404 matches `const int`.
2408 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('referenceTypeLoc0')"><a name=
"referenceTypeLoc0Anchor">referenceTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc
</a>>...
</td></tr>
2409 <tr><td colspan=
"4" class=
"doc" id=
"referenceTypeLoc0"><pre>Matches reference `TypeLoc`s.
2414 int
&& r =
3;
2416 matches `int
&` and `int
&&`.
2420 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('templateSpecializationTypeLoc0')"><a name=
"templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc
</a>>...
</td></tr>
2421 <tr><td colspan=
"4" class=
"doc" id=
"templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s.
2424 template
<typename T
> class C {};
2426 varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
2427 matches `C
<char
> var`.
2431 <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>
2432 <tr><td colspan=
"4" class=
"doc" id=
"typeLoc0"><pre>Matches TypeLocs in the clang AST.
2436 <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>
2437 <tr><td colspan=
"4" class=
"doc" id=
"arrayType0"><pre>Matches all kinds of arrays.
2442 void f() { int c[a[
0]]; }
2444 matches
"int a[]",
"int b[4]" and
"int c[a[0]]";
2448 <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>
2449 <tr><td colspan=
"4" class=
"doc" id=
"atomicType0"><pre>Matches atomic types.
2454 matches
"_Atomic(int) i"
2458 <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>
2459 <tr><td colspan=
"4" class=
"doc" id=
"autoType0"><pre>Matches types nodes representing C++
11 auto types.
2464 for (auto i : v) { }
2466 matches
"auto n" and
"auto i"
2470 <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>
2471 <tr><td colspan=
"4" class=
"doc" id=
"blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2474 The pointee is always required to be a FunctionType.
2478 <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>
2479 <tr><td colspan=
"4" class=
"doc" id=
"builtinType0"><pre>Matches builtin Types.
2488 matches
"int b",
"float c" and
"bool d"
2492 <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>
2493 <tr><td colspan=
"4" class=
"doc" id=
"complexType0"><pre>Matches C99 complex types.
2498 matches
"_Complex float f"
2502 <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>
2503 <tr><td colspan=
"4" class=
"doc" id=
"constantArrayType0"><pre>Matches C arrays with a specified constant size.
2516 <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>
2517 <tr><td colspan=
"4" class=
"doc" id=
"decayedType0"><pre>Matches decayed type
2518 Example matches i[] in declaration of f.
2519 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2520 Example matches i[
1].
2521 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2528 <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>
2529 <tr><td colspan=
"4" class=
"doc" id=
"decltypeType0"><pre>Matches types nodes representing C++
11 decltype(
<expr
>) types.
2534 decltype(i + j) result = i + j;
2536 matches
"decltype(i + j)"
2539 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('dependentNameType0')"><a name=
"dependentNameType0Anchor">dependentNameType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentNameType.html">DependentNameType
</a>>...
</td></tr>
2540 <tr><td colspan=
"4" class=
"doc" id=
"dependentNameType0"><pre>Matches a dependent name type.
2542 Example matches T::type
2544 template
<typename T
> struct declToImport {
2545 typedef typename T::type dependent_name;
2549 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('dependentTemplateSpecializationType0')"><a name=
"dependentTemplateSpecializationType0Anchor">dependentTemplateSpecializationType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentTemplateSpecializationType.html">DependentTemplateSpecializationType
</a>>...
</td></tr>
2550 <tr><td colspan=
"4" class=
"doc" id=
"dependentTemplateSpecializationType0"><pre>Matches a dependent template specialization type.
2552 Example matches A
<T>::template B
<T>
2554 template
<typename T
> struct A;
2555 template
<typename T
> struct declToImport {
2556 typename A
<T>::template B
<T> a;
2560 <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>
2561 <tr><td colspan=
"4" class=
"doc" id=
"deducedTemplateSpecializationType0"><pre>Matches C++
17 deduced template specialization types, e.g. deduced class
2565 template
<typename T
>
2566 class C { public: C(T); };
2569 deducedTemplateSpecializationType() matches the type in the declaration
2574 <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>
2575 <tr><td colspan=
"4" class=
"doc" id=
"dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2578 template
<typename T, int Size
>
2582 dependentSizedArrayType()
2583 matches
"T data[Size]"
2587 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('dependentSizedExtVectorType0')"><a name=
"dependentSizedExtVectorType0Anchor">dependentSizedExtVectorType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentSizedExtVectorType.html">DependentSizedExtVectorType
</a>>...
</td></tr>
2588 <tr><td colspan=
"4" class=
"doc" id=
"dependentSizedExtVectorType0"><pre>Matches C++ extended vector type where either the type or size is
2592 template
<typename T, int Size
>
2594 typedef T __attribute__((ext_vector_type(Size))) type;
2596 dependentSizedExtVectorType()
2597 matches
"T __attribute__((ext_vector_type(Size)))"
2601 <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>
2602 <tr><td colspan=
"4" class=
"doc" id=
"elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2616 elaboratedType() matches the type of the variable declarations of both
2621 <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>
2622 <tr><td colspan=
"4" class=
"doc" id=
"enumType0"><pre>Matches enum types.
2626 enum class S { Red };
2631 enumType() matches the type of the variable declarations of both c and
2636 <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>
2637 <tr><td colspan=
"4" class=
"doc" id=
"functionProtoType0"><pre>Matches FunctionProtoType nodes.
2643 matches
"int (*f)(int)" and the type of
"g" in C++ mode.
2644 In C mode,
"g" is not matched because it does not contain a prototype.
2648 <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>
2649 <tr><td colspan=
"4" class=
"doc" id=
"functionType0"><pre>Matches FunctionType nodes.
2655 matches
"int (*f)(int)" and the type of
"g".
2659 <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>
2660 <tr><td colspan=
"4" class=
"doc" id=
"incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2665 void f(int c[]) { int d[a[
0]]; };
2666 incompleteArrayType()
2667 matches
"int a[]" and
"int c[]"
2671 <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>
2672 <tr><td colspan=
"4" class=
"doc" id=
"injectedClassNameType0"><pre>Matches injected class name types.
2674 Example matches S s, but not S
<T
> s.
2675 (matcher = parmVarDecl(hasType(injectedClassNameType())))
2676 template
<typename T
> struct S {
2678 void g(S
<T
> s);
2683 <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>
2684 <tr><td colspan=
"4" class=
"doc" id=
"lValueReferenceType0"><pre>Matches lvalue reference types.
2689 int
&&c =
1;
2691 auto
&&e = c;
2692 auto
&&f =
2;
2695 lValueReferenceType() matches the types of b, d, and e. e is
2696 matched since the type is deduced as int
& by reference collapsing rules.
2700 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('macroQualifiedType0')"><a name=
"macroQualifiedType0Anchor">macroQualifiedType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MacroQualifiedType.html">MacroQualifiedType
</a>>...
</td></tr>
2701 <tr><td colspan=
"4" class=
"doc" id=
"macroQualifiedType0"><pre>Matches qualified types when the qualifier is applied via a macro.
2704 #define CDECL __attribute__((cdecl))
2705 typedef void (CDECL *X)();
2706 typedef void (__attribute__((cdecl)) *Y)();
2707 macroQualifiedType()
2708 matches the type of the typedef declaration of X but not Y.
2712 <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>
2713 <tr><td colspan=
"4" class=
"doc" id=
"memberPointerType0"><pre>Matches member pointer types.
2722 <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>
2723 <tr><td colspan=
"4" class=
"doc" id=
"objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2724 a pointer type, despite being syntactically similar.
2733 matches
"Foo *f", but does not match
"int *a".
2737 <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>
2738 <tr><td colspan=
"4" class=
"doc" id=
"parenType0"><pre>Matches ParenType nodes.
2741 int (*ptr_to_array)[
4];
2742 int *array_of_ptrs[
4];
2744 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2749 <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>
2750 <tr><td colspan=
"4" class=
"doc" id=
"pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2762 matches
"int *a", but does not match
"Foo *f".
2766 <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>
2767 <tr><td colspan=
"4" class=
"doc" id=
"rValueReferenceType0"><pre>Matches rvalue reference types.
2772 int
&&c =
1;
2774 auto
&&e = c;
2775 auto
&&f =
2;
2778 rValueReferenceType() matches the types of c and f. e is not
2779 matched as it is deduced to int
& by reference collapsing rules.
2783 <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>
2784 <tr><td colspan=
"4" class=
"doc" id=
"recordType0"><pre>Matches record types (e.g. structs, classes).
2793 recordType() matches the type of the variable declarations of both c
2798 <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>
2799 <tr><td colspan=
"4" class=
"doc" id=
"referenceType0"><pre>Matches both lvalue and rvalue reference types.
2804 int
&&c =
1;
2806 auto
&&e = c;
2807 auto
&&f =
2;
2810 referenceType() matches the types of b, c, d, e, and f.
2814 <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>
2815 <tr><td colspan=
"4" class=
"doc" id=
"substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2816 template type parameter.
2819 template
<typename T
>
2824 substTemplateTypeParmType() matches the type of 't' but not '
1'
2828 <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>
2829 <tr><td colspan=
"4" class=
"doc" id=
"tagType0"><pre>Matches tag types (record and enum types).
2838 tagType() matches the type of the variable declarations of both e
2843 <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>
2844 <tr><td colspan=
"4" class=
"doc" id=
"templateSpecializationType0"><pre>Matches template specialization types.
2847 template
<typename T
>
2850 template class C
<int
>; // A
2851 C
<char
> var; // B
2853 templateSpecializationType() matches the type of the explicit
2854 instantiation in A and the type of the variable declaration in B.
2858 <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>
2859 <tr><td colspan=
"4" class=
"doc" id=
"templateTypeParmType0"><pre>Matches template type parameter types.
2861 Example matches T, but not int.
2862 (matcher = templateTypeParmType())
2863 template
<typename T
> void f(int i);
2867 <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>
2868 <tr><td colspan=
"4" class=
"doc" id=
"type0"><pre>Matches Types in the clang AST.
2872 <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>
2873 <tr><td colspan=
"4" class=
"doc" id=
"typedefType0"><pre>Matches typedef types.
2878 matches
"typedef int X"
2882 <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>
2883 <tr><td colspan=
"4" class=
"doc" id=
"unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2886 typedef __underlying_type(T) type;
2887 unaryTransformType()
2888 matches
"__underlying_type(T)"
2892 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('usingType0')"><a name=
"usingType0Anchor">usingType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType
</a>>...
</td></tr>
2893 <tr><td colspan=
"4" class=
"doc" id=
"usingType0"><pre>Matches types specified through a using declaration.
2896 namespace a { struct S {}; }
2900 usingType() matches the type of the variable declaration of s.
2904 <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>
2905 <tr><td colspan=
"4" class=
"doc" id=
"variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2906 integer-constant-expression.
2915 matches
"int c[a[0]]"
2918 <!--END_DECL_MATCHERS -->
2921 <!-- ======================================================================= -->
2922 <h2 id=
"narrowing-matchers">Narrowing Matchers
</h2>
2923 <!-- ======================================================================= -->
2925 <p>Narrowing matchers match certain attributes on the current node, thus
2926 narrowing down the set of nodes of the current type to match on.
</p>
2928 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2929 which allow users to create more powerful match expressions.
</p>
2932 <tr style=
"text-align:left"><th>Return type
</th><th>Name
</th><th>Parameters
</th></tr>
2933 <!-- START_NARROWING_MATCHERS -->
2935 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('allOf0')"><a name=
"allOf0Anchor">allOf
</a></td><td>Matcher
<*
>, ..., Matcher
<*
></td></tr>
2936 <tr><td colspan=
"4" class=
"doc" id=
"allOf0"><pre>Matches if all given matchers match.
2938 Usable as: Any Matcher
2942 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('anyOf0')"><a name=
"anyOf0Anchor">anyOf
</a></td><td>Matcher
<*
>, ..., Matcher
<*
></td></tr>
2943 <tr><td colspan=
"4" class=
"doc" id=
"anyOf0"><pre>Matches if any of the given matchers matches.
2945 Usable as: Any Matcher
2949 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('anything0')"><a name=
"anything0Anchor">anything
</a></td><td></td></tr>
2950 <tr><td colspan=
"4" class=
"doc" id=
"anything0"><pre>Matches any node.
2952 Useful when another matcher requires a child matcher, but there's no
2953 additional constraint. This will often be used with an explicit conversion
2954 to an internal::Matcher
<> type such as TypeMatcher.
2956 Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2957 "int* p" and
"void f()" in
2961 Usable as: Any Matcher
2965 <tr><td><em>unspecified
</em></td><td class=
"name" onclick=
"toggle('mapAnyOf0')"><a name=
"mapAnyOf0Anchor">mapAnyOf
</a></td><td>nodeMatcherFunction...
</td></tr>
2966 <tr><td colspan=
"4" class=
"doc" id=
"mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2972 mapAnyOf(ifStmt, forStmt).with(
2973 hasCondition(cxxBoolLiteralExpr(equals(true)))
2975 matches the if and the for. It is equivalent to:
2976 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2978 ifStmt(trueCond).bind(
"trueCond"),
2979 forStmt(trueCond).bind(
"trueCond")
2982 The with() chain-call accepts zero or more matchers which are combined
2983 as-if with allOf() in each of the node matchers.
2984 Usable as: Any Matcher
2988 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('unless0')"><a name=
"unless0Anchor">unless
</a></td><td>Matcher
<*
></td></tr>
2989 <tr><td colspan=
"4" class=
"doc" id=
"unless0"><pre>Matches if the provided matcher does not match.
2991 Example matches Y (matcher = cxxRecordDecl(unless(hasName(
"X"))))
2995 Usable as: Any Matcher
2999 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr
</a>></td><td class=
"name" onclick=
"toggle('isImplicit1')"><a name=
"isImplicit1Anchor">isImplicit
</a></td><td></td></tr>
3000 <tr><td colspan=
"4" class=
"doc" id=
"isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
3001 implicit default/copy constructors).
3005 <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>
3006 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
3009 hasAnyOperatorName(
"+",
"-")
3011 anyOf(hasOperatorName(
"+"), hasOperatorName(
"-"))
3015 <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>
3016 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName0"><pre>Matches the operator Name of operator expressions and fold expressions
3019 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
3022 Example matches `(
0 + ... + args)`
3023 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
3024 template
<typename... Args
>
3025 auto sum(Args... args) {
3026 return (
0 + ... + args);
3031 <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>
3032 <tr><td colspan=
"4" class=
"doc" id=
"isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
3034 Example
1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3038 Example
2: matches s1 = s2
3039 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3040 struct S { S
& operator=(const S
&); };
3041 void x() { S s1, s2; s1 = s2; }
3045 <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>
3046 <tr><td colspan=
"4" class=
"doc" id=
"isComparisonOperator0"><pre>Matches comparison operators.
3048 Example
1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3052 Example
2: matches s1
< s2
3053 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3054 struct S { bool operator
<(const S
& other); };
3055 void x(S s1, S s2) { bool b1 = s1
< s2; }
3059 <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>
3060 <tr><td colspan=
"4" class=
"doc" id=
"isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
3067 private: int c; // fieldDecl(isPrivate()) matches 'c'
3071 struct Derived1 : private Base {}; // matches 'Base'
3072 class Derived2 : Base {}; // matches 'Base'
3076 <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>
3077 <tr><td colspan=
"4" class=
"doc" id=
"isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
3078 protected inheritance.
3083 protected: int b; // fieldDecl(isProtected()) matches 'b'
3088 class Derived : protected Base {}; // matches 'Base'
3092 <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>
3093 <tr><td colspan=
"4" class=
"doc" id=
"isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
3098 public: int a; // fieldDecl(isPublic()) matches 'a'
3104 class Derived1 : public Base {}; // matches 'Base'
3105 struct Derived2 : Base {}; // matches 'Base'
3109 <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>
3110 <tr><td colspan=
"4" class=
"doc" id=
"isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3111 virtual inheritance.
3116 virtual void x(); // matches x
3121 class DirectlyDerived : virtual Base {}; // matches Base
3122 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3124 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>>
3128 <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>
3129 <tr><td colspan=
"4" class=
"doc" id=
"equals5"><pre></pre></td></tr>
3132 <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>
3133 <tr><td colspan=
"4" class=
"doc" id=
"equals2"><pre>Matches literals that are equal to the given value of type ValueT.
3136 f('false,
3.14,
42);
3137 characterLiteral(equals(
0))
3138 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
3140 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
3142 integerLiteral(equals(
42))
3145 Note that you cannot directly match a negative numeric literal because the
3146 minus sign is not part of the literal: It is a unary operator whose operand
3147 is the positive numeric literal. Instead, you must use a unaryOperator()
3148 matcher to match the minus sign:
3150 unaryOperator(hasOperatorName(
"-"),
3151 hasUnaryOperand(integerLiteral(equals(
13))))
3153 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>>,
3154 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>>
3158 <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>
3159 <tr><td colspan=
"4" class=
"doc" id=
"equals11"><pre></pre></td></tr>
3162 <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>
3163 <tr><td colspan=
"4" class=
"doc" id=
"equals8"><pre></pre></td></tr>
3166 <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>
3167 <tr><td colspan=
"4" class=
"doc" id=
"isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
3177 cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
3181 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast1')"><a name=
"argumentCountAtLeast1Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
3182 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast1"><pre>Checks that a call expression or a constructor call expression has at least
3183 the specified number of arguments (including absent default arguments).
3185 Example matches f(
0,
0) and g(
0,
0,
0)
3186 (matcher = callExpr(argumentCountAtLeast(
2)))
3187 void f(int x, int y);
3188 void g(int x, int y, int z);
3194 <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>
3195 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
3196 a specific number of arguments (including absent default arguments).
3198 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
3199 void f(int x, int y);
3204 <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>
3205 <tr><td colspan=
"4" class=
"doc" id=
"isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
3209 <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>
3210 <tr><td colspan=
"4" class=
"doc" id=
"requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
3211 zero initialization.
3215 struct point { double x; double y; };
3216 point pt[
2] = { {
1.0,
2.0 } };
3218 initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
3219 will match the implicit array filler for pt[
1].
3223 <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>
3224 <tr><td colspan=
"4" class=
"doc" id=
"isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
3229 S(const S
&); // #
2
3230 S(S
&&); // #
3
3232 cxxConstructorDecl(isCopyConstructor()) will match #
2, but not #
1 or #
3.
3236 <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>
3237 <tr><td colspan=
"4" class=
"doc" id=
"isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
3242 S(const S
&); // #
2
3243 S(S
&&); // #
3
3245 cxxConstructorDecl(isDefaultConstructor()) will match #
1, but not #
2 or #
3.
3249 <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>
3250 <tr><td colspan=
"4" class=
"doc" id=
"isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
3256 S(S
&&) : S() {} // #
3
3258 S::S() : S(
0) {} // #
4
3259 cxxConstructorDecl(isDelegatingConstructor()) will match #
3 and #
4, but not
3264 <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>
3265 <tr><td colspan=
"4" class=
"doc" id=
"isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
3266 that have an explicit specifier if this explicit specifier is resolved to
3270 template
<bool b
>
3273 explicit S(double); // #
2
3274 operator int(); // #
3
3275 explicit operator bool(); // #
4
3276 explicit(false) S(bool) // #
7
3277 explicit(true) S(char) // #
8
3278 explicit(b) S(S) // #
9
3280 S(int) -
> S
<true
> // #
5
3281 explicit S(double) -
> S
<false
> // #
6
3282 cxxConstructorDecl(isExplicit()) will match #
2 and #
8, but not #
1, #
7 or #
9.
3283 cxxConversionDecl(isExplicit()) will match #
4, but not #
3.
3284 cxxDeductionGuideDecl(isExplicit()) will match #
6, but not #
5.
3288 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('isInheritingConstructor0')"><a name=
"isInheritingConstructor0Anchor">isInheritingConstructor
</a></td><td></td></tr>
3289 <tr><td colspan=
"4" class=
"doc" id=
"isInheritingConstructor0"><pre></pre></td></tr>
3292 <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>
3293 <tr><td colspan=
"4" class=
"doc" id=
"isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3298 S(const S
&); // #
2
3299 S(S
&&); // #
3
3301 cxxConstructorDecl(isMoveConstructor()) will match #
3, but not #
1 or #
2.
3305 <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>
3306 <tr><td colspan=
"4" class=
"doc" id=
"isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3307 that have an explicit specifier if this explicit specifier is resolved to
3311 template
<bool b
>
3314 explicit S(double); // #
2
3315 operator int(); // #
3
3316 explicit operator bool(); // #
4
3317 explicit(false) S(bool) // #
7
3318 explicit(true) S(char) // #
8
3319 explicit(b) S(S) // #
9
3321 S(int) -
> S
<true
> // #
5
3322 explicit S(double) -
> S
<false
> // #
6
3323 cxxConstructorDecl(isExplicit()) will match #
2 and #
8, but not #
1, #
7 or #
9.
3324 cxxConversionDecl(isExplicit()) will match #
4, but not #
3.
3325 cxxDeductionGuideDecl(isExplicit()) will match #
6, but not #
5.
3329 <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>
3330 <tr><td colspan=
"4" class=
"doc" id=
"isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3331 opposed to a member.
3342 cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3343 will match E(), but not match D(int).
3347 <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>
3348 <tr><td colspan=
"4" class=
"doc" id=
"isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3360 cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3361 will match D(int), but not match E().
3365 <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>
3366 <tr><td colspan=
"4" class=
"doc" id=
"isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3367 code (as opposed to implicitly added by the compiler).
3372 Foo(int) : foo_(
"A") { }
3375 cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3376 will match Foo(int), but not Foo()
3380 <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>
3381 <tr><td colspan=
"4" class=
"doc" id=
"isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3382 that have an explicit specifier if this explicit specifier is resolved to
3386 template
<bool b
>
3389 explicit S(double); // #
2
3390 operator int(); // #
3
3391 explicit operator bool(); // #
4
3392 explicit(false) S(bool) // #
7
3393 explicit(true) S(char) // #
8
3394 explicit(b) S(S) // #
9
3396 S(int) -
> S
<true
> // #
5
3397 explicit S(double) -
> S
<false
> // #
6
3398 cxxConstructorDecl(isExplicit()) will match #
2 and #
8, but not #
1, #
7 or #
9.
3399 cxxConversionDecl(isExplicit()) will match #
4, but not #
3.
3400 cxxDeductionGuideDecl(isExplicit()) will match #
6, but not #
5.
3404 <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>
3405 <tr><td colspan=
"4" class=
"doc" id=
"hasMemberName0"><pre>Matches template-dependent, but known, member names.
3407 In template declarations, dependent members are not resolved and so can
3408 not be matched to particular named declarations.
3410 This matcher allows to match on the known name of members.
3413 template
<typename T
>
3417 template
<typename T
>
3422 cxxDependentScopeMemberExpr(hasMemberName(
"mem")) matches `s.mem()`
3426 <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>
3427 <tr><td colspan=
"4" class=
"doc" id=
"isArrow2"><pre>Matches member expressions that are called with '-
>' as opposed
3430 Member calls on the implicit this pointer match as called with '-
>'.
3434 void x() { this-
>x(); x(); Y y; y.x(); a; this-
>b; Y::b; }
3435 template
<class T
> void f() { this-
>f
<T
>(); f
<T
>(); }
3439 template
<class T
>
3441 void x() { this-
>m; }
3443 memberExpr(isArrow())
3444 matches this-
>x, x, y.x, a, this-
>b
3445 cxxDependentScopeMemberExpr(isArrow())
3447 unresolvedMemberExpr(isArrow())
3448 matches this-
>f
<T
>, f
<T
>
3452 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentScopeDeclRefExpr.html">DependentScopeDeclRefExpr
</a>></td><td class=
"name" onclick=
"toggle('hasDependentName0')"><a name=
"hasDependentName0Anchor">hasDependentName
</a></td><td>std::string N
</td></tr>
3453 <tr><td colspan=
"4" class=
"doc" id=
"hasDependentName0"><pre>Matches the dependent name of a DependentScopeDeclRefExpr.
3455 Matches the dependent name of a DependentScopeDeclRefExpr
3459 template
<class T
< class X : T { void f() { T::v; } };
3461 dependentScopeDeclRefExpr(hasDependentName(
"v")) matches `T::v`
3465 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentNameType.html">DependentNameType
</a>></td><td class=
"name" onclick=
"toggle('hasDependentName1')"><a name=
"hasDependentName1Anchor">hasDependentName
</a></td><td>std::string N
</td></tr>
3466 <tr><td colspan=
"4" class=
"doc" id=
"hasDependentName1"><pre>Matches the dependent name of a DependentNameType.
3468 Matches the dependent name of a DependentNameType
3472 template
<typename T
< struct declToImport {
3473 typedef typename T::type dependent_name;
3476 dependentNameType(hasDependentName(
"type")) matches `T::type`
3480 <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>
3481 <tr><td colspan=
"4" class=
"doc" id=
"memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3484 In template declarations, dependent members are not resolved and so can
3485 not be matched to particular named declarations.
3487 This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3488 and CXXMethodDecl nodes.
3491 template
<typename T
>
3495 template
<typename T
>
3502 cxxDependentScopeMemberExpr(
3503 hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3504 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3505 cxxMethodDecl(hasName(
"mem")).bind(
"templMem")
3508 memberHasSameNameAsBoundNode(
"templMem")
3511 first matches and binds the @c mem member of the @c S template, then
3512 compares its name to the usage in @c s.mem() in the @c x function template
3516 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasOperatorName3')"><a name=
"hasOperatorName3Anchor">hasOperatorName
</a></td><td>std::string Name
</td></tr>
3517 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName3"><pre>Matches the operator Name of operator expressions and fold expressions
3520 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
3523 Example matches `(
0 + ... + args)`
3524 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
3525 template
<typename... Args
>
3526 auto sum(Args... args) {
3527 return (
0 + ... + args);
3532 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isBinaryFold0')"><a name=
"isBinaryFold0Anchor">isBinaryFold
</a></td><td></td></tr>
3533 <tr><td colspan=
"4" class=
"doc" id=
"isBinaryFold0"><pre>Matches binary fold expressions, i.e. fold expressions with an initializer.
3535 Example matches `(
0 + ... + args)`
3536 (matcher = cxxFoldExpr(isBinaryFold()))
3537 template
<typename... Args
>
3538 auto sum(Args... args) {
3539 return (
0 + ... + args);
3542 template
<typename... Args
>
3543 auto multiply(Args... args) {
3544 return (args * ...);
3549 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isLeftFold0')"><a name=
"isLeftFold0Anchor">isLeftFold
</a></td><td></td></tr>
3550 <tr><td colspan=
"4" class=
"doc" id=
"isLeftFold0"><pre>Matches left-folding fold expressions.
3552 Example matches `(
0 + ... + args)`
3553 (matcher = cxxFoldExpr(isLeftFold()))
3554 template
<typename... Args
>
3555 auto sum(Args... args) {
3556 return (
0 + ... + args);
3559 template
<typename... Args
>
3560 auto multiply(Args... args) {
3561 return (args * ... *
1);
3566 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isRightFold0')"><a name=
"isRightFold0Anchor">isRightFold
</a></td><td></td></tr>
3567 <tr><td colspan=
"4" class=
"doc" id=
"isRightFold0"><pre>Matches right-folding fold expressions.
3569 Example matches `(args * ... *
1)`
3570 (matcher = cxxFoldExpr(isRightFold()))
3571 template
<typename... Args
>
3572 auto sum(Args... args) {
3573 return (
0 + ... + args);
3576 template
<typename... Args
>
3577 auto multiply(Args... args) {
3578 return (args * ... *
1);
3583 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isUnaryFold0')"><a name=
"isUnaryFold0Anchor">isUnaryFold
</a></td><td></td></tr>
3584 <tr><td colspan=
"4" class=
"doc" id=
"isUnaryFold0"><pre>Matches unary fold expressions, i.e. fold expressions without an
3587 Example matches `(args * ...)`
3588 (matcher = cxxFoldExpr(isUnaryFold()))
3589 template
<typename... Args
>
3590 auto sum(Args... args) {
3591 return (
0 + ... + args);
3594 template
<typename... Args
>
3595 auto multiply(Args... args) {
3596 return (args * ...);
3601 <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>
3602 <tr><td colspan=
"4" class=
"doc" id=
"isConst0"><pre>Matches if the given method declaration is const.
3610 cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3614 <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>
3615 <tr><td colspan=
"4" class=
"doc" id=
"isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3620 A
&operator=(const A
&);
3621 A
&operator=(A
&&);
3624 cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3629 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isExplicitObjectMemberFunction0')"><a name=
"isExplicitObjectMemberFunction0Anchor">isExplicitObjectMemberFunction
</a></td><td></td></tr>
3630 <tr><td colspan=
"4" class=
"doc" id=
"isExplicitObjectMemberFunction0"><pre>Matches if the given method declaration declares a member function with an
3631 explicit object parameter.
3635 int operator-(this A, int);
3636 void fun(this A
&&self);
3637 static int operator()(int);
3641 cxxMethodDecl(isExplicitObjectMemberFunction()) matches the first two
3642 methods but not the last two.
3646 <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>
3647 <tr><td colspan=
"4" class=
"doc" id=
"isFinal1"><pre>Matches if the given method or class declaration is final.
3659 matches A and C::f, but not B, C, or B::f
3663 <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>
3664 <tr><td colspan=
"4" class=
"doc" id=
"isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3669 A
&operator=(const A
&);
3670 A
&operator=(A
&&);
3673 cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3678 <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>
3679 <tr><td colspan=
"4" class=
"doc" id=
"isOverride0"><pre>Matches if the given method declaration overrides another method.
3686 class B : public A {
3694 <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>
3695 <tr><td colspan=
"4" class=
"doc" id=
"isPure0"><pre>Matches if the given method declaration is pure.
3700 virtual void x() =
0;
3706 <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>
3707 <tr><td colspan=
"4" class=
"doc" id=
"isUserProvided0"><pre>Matches method declarations that are user-provided.
3712 S(const S
&) = default; // #
2
3713 S(S
&&) = delete; // #
3
3715 cxxConstructorDecl(isUserProvided()) will match #
1, but not #
2 or #
3.
3719 <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>
3720 <tr><td colspan=
"4" class=
"doc" id=
"isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3721 virtual inheritance.
3726 virtual void x(); // matches x
3731 class DirectlyDerived : virtual Base {}; // matches Base
3732 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3734 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>>
3738 <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>
3739 <tr><td colspan=
"4" class=
"doc" id=
"isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit
"virtual".
3746 class B : public A {
3750 matches A::x but not B::x
3754 <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>
3755 <tr><td colspan=
"4" class=
"doc" id=
"isArray0"><pre>Matches array new expressions.
3758 MyClass *p1 = new MyClass[
10];
3759 cxxNewExpr(isArray())
3760 matches the expression 'new MyClass[
10]'.
3764 <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>
3765 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3768 hasAnyOperatorName(
"+",
"-")
3770 anyOf(hasOperatorName(
"+"), hasOperatorName(
"-"))
3774 <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>
3775 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3777 Matches overloaded operator names specified in strings without the
3778 "operator" prefix: e.g.
"<<".
3780 hasAnyOverloadedOperatorName(
"+",
"-")
3782 anyOf(hasOverloadedOperatorName(
"+"), hasOverloadedOperatorName(
"-"))
3786 <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>
3787 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName1"><pre>Matches the operator Name of operator expressions and fold expressions
3790 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
3793 Example matches `(
0 + ... + args)`
3794 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
3795 template
<typename... Args
>
3796 auto sum(Args... args) {
3797 return (
0 + ... + args);
3802 <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>
3803 <tr><td colspan=
"4" class=
"doc" id=
"hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3805 Matches overloaded operator names specified in strings without the
3806 "operator" prefix: e.g.
"<<".
3809 class A { int operator*(); };
3810 const A
&operator
<<(const A
&a, const A
&b);
3812 a
<< a; //
<-- This matches
3814 cxxOperatorCallExpr(hasOverloadedOperatorName(
"<<"))) matches the
3816 cxxRecordDecl(hasMethod(hasOverloadedOperatorName(
"*")))
3817 matches the declaration of A.
3819 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>>
3823 <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>
3824 <tr><td colspan=
"4" class=
"doc" id=
"isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3826 Example
1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3830 Example
2: matches s1 = s2
3831 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3832 struct S { S
& operator=(const S
&); };
3833 void x() { S s1, s2; s1 = s2; }
3837 <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>
3838 <tr><td colspan=
"4" class=
"doc" id=
"isComparisonOperator1"><pre>Matches comparison operators.
3840 Example
1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3844 Example
2: matches s1
< s2
3845 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3846 struct S { bool operator
<(const S
& other); };
3847 void x(S s1, S s2) { bool b1 = s1
< s2; }
3851 <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>
3852 <tr><td colspan=
"4" class=
"doc" id=
"hasDefinition0"><pre>Matches a class declaration that is defined.
3854 Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3860 <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>
3861 <tr><td colspan=
"4" class=
"doc" id=
"isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3865 <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>
3866 <tr><td colspan=
"4" class=
"doc" id=
"isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3870 <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>
3871 <tr><td colspan=
"4" class=
"doc" id=
"isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3872 static member variable template instantiations.
3875 template
<typename T
> void A(T t) { }
3876 template
<> void A(int N) { }
3877 functionDecl(isExplicitTemplateSpecialization())
3878 matches the specialization A
<int
>().
3880 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>>
3884 <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>
3885 <tr><td colspan=
"4" class=
"doc" id=
"isFinal0"><pre>Matches if the given method or class declaration is final.
3897 matches A and C::f, but not B, C, or B::f
3901 <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>
3902 <tr><td colspan=
"4" class=
"doc" id=
"isLambda0"><pre>Matches the generated class of lambda expressions.
3907 cxxRecordDecl(isLambda()) matches the implicit class declaration of
3912 <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>
3913 <tr><td colspan=
"4" class=
"doc" id=
"isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3914 isSameOrDerivedFrom(hasName(...)).
3918 <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>
3919 <tr><td colspan=
"4" class=
"doc" id=
"isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3920 member variable template instantiations.
3923 template
<typename T
> class X {}; class A {}; X
<A
> x;
3925 template
<typename T
> class X {}; class A {}; template class X
<A
>;
3927 template
<typename T
> class X {}; class A {}; extern template class X
<A
>;
3928 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
3929 matches the template instantiation of X
<A
>.
3932 template
<typename T
> class X {}; class A {};
3933 template
<> class X
<A
> {}; X
<A
> x;
3934 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
3935 does not match, as X
<A
> is an explicit template specialization.
3937 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>>
3941 <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>
3942 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3945 hasAnyOperatorName(
"+",
"-")
3947 anyOf(hasOperatorName(
"+"), hasOperatorName(
"-"))
3951 <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>
3952 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName2"><pre>Matches the operator Name of operator expressions and fold expressions
3955 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
3958 Example matches `(
0 + ... + args)`
3959 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
3960 template
<typename... Args
>
3961 auto sum(Args... args) {
3962 return (
0 + ... + args);
3967 <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>
3968 <tr><td colspan=
"4" class=
"doc" id=
"isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3970 Example
1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3974 Example
2: matches s1 = s2
3975 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3976 struct S { S
& operator=(const S
&); };
3977 void x() { S s1, s2; s1 = s2; }
3981 <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>
3982 <tr><td colspan=
"4" class=
"doc" id=
"isComparisonOperator2"><pre>Matches comparison operators.
3984 Example
1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3988 Example
2: matches s1
< s2
3989 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3990 struct S { bool operator
<(const S
& other); };
3991 void x(S s1, S s2) { bool b1 = s1
< s2; }
3995 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast2')"><a name=
"argumentCountAtLeast2Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
3996 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast2"><pre>Checks that a call expression or a constructor call expression has at least
3997 the specified number of arguments (including absent default arguments).
3999 Example matches f(
0,
0) and g(
0,
0,
0)
4000 (matcher = callExpr(argumentCountAtLeast(
2)))
4001 void f(int x, int y);
4002 void g(int x, int y, int z);
4008 <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>
4009 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
4010 a specific number of arguments (including absent default arguments).
4012 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
4013 void f(int x, int y);
4018 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast0')"><a name=
"argumentCountAtLeast0Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
4019 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast0"><pre>Checks that a call expression or a constructor call expression has at least
4020 the specified number of arguments (including absent default arguments).
4022 Example matches f(
0,
0) and g(
0,
0,
0)
4023 (matcher = callExpr(argumentCountAtLeast(
2)))
4024 void f(int x, int y);
4025 void g(int x, int y, int z);
4031 <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>
4032 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
4033 a specific number of arguments (including absent default arguments).
4035 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
4036 void f(int x, int y);
4041 <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>
4042 <tr><td colspan=
"4" class=
"doc" id=
"usesADL0"><pre>Matches call expressions which were resolved using ADL.
4044 Example matches y(x) but not y(
42) or NS::y(x).
4055 NS::y(x); // Doesn't match
4056 y(
42); // Doesn't match
4058 y(x); // Found by both unqualified lookup and ADL, doesn't match
4063 <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>
4064 <tr><td colspan=
"4" class=
"doc" id=
"hasCastKind0"><pre>Matches casts that has a given cast kind.
4066 Example: matches the implicit cast around
0
4067 (matcher = castExpr(hasCastKind(CK_NullToPointer)))
4070 If the matcher is use from clang-query, CastKind parameter
4071 should be passed as a quoted string. e.g., hasCastKind(
"CK_NullToPointer").
4075 <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>
4076 <tr><td colspan=
"4" class=
"doc" id=
"equals4"><pre></pre></td></tr>
4079 <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>
4080 <tr><td colspan=
"4" class=
"doc" id=
"equals3"><pre>Matches literals that are equal to the given value of type ValueT.
4083 f('false,
3.14,
42);
4084 characterLiteral(equals(
0))
4085 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
4087 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
4089 integerLiteral(equals(
42))
4092 Note that you cannot directly match a negative numeric literal because the
4093 minus sign is not part of the literal: It is a unary operator whose operand
4094 is the positive numeric literal. Instead, you must use a unaryOperator()
4095 matcher to match the minus sign:
4097 unaryOperator(hasOperatorName(
"-"),
4098 hasUnaryOperand(integerLiteral(equals(
13))))
4100 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>>,
4101 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>>
4105 <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>
4106 <tr><td colspan=
"4" class=
"doc" id=
"equals10"><pre></pre></td></tr>
4109 <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>
4110 <tr><td colspan=
"4" class=
"doc" id=
"equals7"><pre></pre></td></tr>
4113 <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>
4114 <tr><td colspan=
"4" class=
"doc" id=
"templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
4117 template
<typename T
> struct C {};
4119 classTemplateSpecializationDecl(templateArgumentCountIs(
1))
4120 matches C
<int
>.
4124 <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>
4125 <tr><td colspan=
"4" class=
"doc" id=
"statementCountIs0"><pre>Checks that a compound statement contains a specific number of
4130 compoundStmt(statementCountIs(
0)))
4132 but does not match the outer compound statement.
4136 <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>
4137 <tr><td colspan=
"4" class=
"doc" id=
"hasSize0"><pre>Matches nodes that have the specified size.
4144 wchar_t *ws = L
"abcd";
4146 constantArrayType(hasSize(
42))
4147 matches
"int a[42]" and
"int b[2 * 21]"
4148 stringLiteral(hasSize(
4))
4149 matches
"abcd", L
"abcd"
4153 <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>
4154 <tr><td colspan=
"4" class=
"doc" id=
"declCountIs0"><pre>Matches declaration statements that contain a specific number of
4162 matches 'int a, b;' and 'int d =
2, e;', but not 'int c;'.
4166 <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>
4167 <tr><td colspan=
"4" class=
"doc" id=
"equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
4169 Matches a node if it equals the node previously bound to ID.
4172 class X { int a; int b; };
4174 has(fieldDecl(hasName(
"a"), hasType(type().bind(
"t")))),
4175 has(fieldDecl(hasName(
"b"), hasType(type(equalsBoundNode(
"t"))))))
4176 matches the class X, as a and b have the same type.
4178 Note that when multiple matches are involved via forEach* matchers,
4179 equalsBoundNodes acts as a filter.
4182 forEachDescendant(varDecl().bind(
"d")),
4183 forEachDescendant(declRefExpr(to(decl(equalsBoundNode(
"d"))))))
4184 will trigger a match for each combination of variable declaration
4185 and reference to that variable declaration within a compound statement.
4189 <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>
4190 <tr><td colspan=
"4" class=
"doc" id=
"equalsNode0"><pre>Matches if a node equals another node.
4192 Decl has pointer identity in the AST.
4196 <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>
4197 <tr><td colspan=
"4" class=
"doc" id=
"hasAttr0"><pre>Matches declaration that has a given attribute.
4200 __attribute__((device)) void f() { ... }
4201 decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
4202 f. If the matcher is used from clang-query, attr::Kind parameter should be
4203 passed as a quoted string. e.g., hasAttr(
"attr::CUDADevice").
4207 <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>
4208 <tr><td colspan=
"4" class=
"doc" id=
"isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
4209 Does not match if only part of the statement is expanded from that macro or
4210 if different parts of the statement are expanded from different
4211 appearances of the macro.
4215 <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>
4216 <tr><td colspan=
"4" class=
"doc" id=
"isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
4217 partially matching a given regex.
4219 Example matches Y but not X
4220 (matcher = cxxRecordDecl(isExpansionInFileMatching(
"AST.*"))
4221 #include
"ASTMatcher.h"
4226 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>>
4228 If the matcher is used in clang-query, RegexFlags parameter
4229 should be passed as a quoted string. e.g:
"NoFlags".
4230 Flags can be combined with '|' example
"IgnoreCase | BasicRegex"
4234 <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>
4235 <tr><td colspan=
"4" class=
"doc" id=
"isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
4237 Example matches X but not Y
4238 (matcher = cxxRecordDecl(isExpansionInMainFile())
4239 #include
<Y.h
>
4244 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>>
4248 <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>
4249 <tr><td colspan=
"4" class=
"doc" id=
"isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
4251 Example matches Y but not X
4252 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4253 #include
<SystemHeader.h
>
4258 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>>
4262 <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>
4263 <tr><td colspan=
"4" class=
"doc" id=
"isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4264 implicit default/copy constructors).
4268 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isInAnonymousNamespace0')"><a name=
"isInAnonymousNamespace0Anchor">isInAnonymousNamespace
</a></td><td></td></tr>
4269 <tr><td colspan=
"4" class=
"doc" id=
"isInAnonymousNamespace0"><pre>Matches declarations in an anonymous namespace.
4276 class vector {}; // #
1
4280 class vector {}; // #
2
4282 class vector{}; // #
3
4285 cxxRecordDecl(hasName(
"vector"), isInAnonymousNamespace()) will match
4290 <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>
4291 <tr><td colspan=
"4" class=
"doc" id=
"isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
4302 inline namespace __1 {
4303 class vector {}; // #
1
4304 namespace experimental {
4309 cxxRecordDecl(hasName(
"vector"), isInStdNamespace()) will match only #
1.
4313 <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>
4314 <tr><td colspan=
"4" class=
"doc" id=
"isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4315 template instantiations.
4318 template
<typename T
> void A(T t) { T i; }
4321 functionDecl(isInstantiated())
4322 matches 'A(int) {...};' and 'A(unsigned) {...}'.
4326 <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>
4327 <tr><td colspan=
"4" class=
"doc" id=
"isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
4334 private: int c; // fieldDecl(isPrivate()) matches 'c'
4338 struct Derived1 : private Base {}; // matches 'Base'
4339 class Derived2 : Base {}; // matches 'Base'
4343 <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>
4344 <tr><td colspan=
"4" class=
"doc" id=
"isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
4345 protected inheritance.
4350 protected: int b; // fieldDecl(isProtected()) matches 'b'
4355 class Derived : protected Base {}; // matches 'Base'
4359 <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>
4360 <tr><td colspan=
"4" class=
"doc" id=
"isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
4365 public: int a; // fieldDecl(isPublic()) matches 'a'
4371 class Derived1 : public Base {}; // matches 'Base'
4372 struct Derived2 : Base {}; // matches 'Base'
4376 <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>
4377 <tr><td colspan=
"4" class=
"doc" id=
"designatorCountIs0"><pre>Matches designated initializer expressions that contain
4378 a specific number of designators.
4381 point ptarray[
10] = { [
2].y =
1.0, [
0].x =
1.0 };
4382 point ptarray2[
10] = { [
2].y =
1.0, [
2].x =
0.0, [
0].x =
1.0 };
4383 designatorCountIs(
2)
4384 matches '{ [
2].y =
1.0, [
0].x =
1.0 }',
4385 but not '{ [
2].y =
1.0, [
2].x =
0.0, [
0].x =
1.0 }'.
4389 <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>
4390 <tr><td colspan=
"4" class=
"doc" id=
"isScoped0"><pre>Matches C++
11 scoped enum declaration.
4392 Example matches Y (matcher = enumDecl(isScoped()))
4398 <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>
4399 <tr><td colspan=
"4" class=
"doc" id=
"isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
4400 neither type- nor value-dependent.
4402 In the following example, the expression sizeof(sizeof(T() + T()))
4403 is instantiation-dependent (since it involves a template parameter T),
4404 but is neither type- nor value-dependent, since the type of the inner
4405 sizeof is known (std::size_t) and therefore the size of the outer
4407 template
<typename T
>
4408 void f(T x, T y) { sizeof(sizeof(T() + T()); }
4409 expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
4413 <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>
4414 <tr><td colspan=
"4" class=
"doc" id=
"isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
4415 is not yet instantiated.
4417 For example, the expressions
"x" and
"x + y" are type-dependent in
4418 the following code, but
"y" is not type-dependent:
4419 template
<typename T
>
4420 void add(T x, int y) {
4423 expr(isTypeDependent()) matches x + y
4427 <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>
4428 <tr><td colspan=
"4" class=
"doc" id=
"isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
4429 non-type template parameter.
4431 For example, the array bound of
"Chars" in the following example is
4433 template
<int Size
> int f() { return Size; }
4434 expr(isValueDependent()) matches return Size
4438 <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>
4439 <tr><td colspan=
"4" class=
"doc" id=
"nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4440 GNU's __null, C++
11's nullptr, or C's NULL macro.
4445 void *v3 = __null; // GNU extension
4446 char *cp = (char *)
0;
4449 expr(nullPointerConstant())
4450 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4455 <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>
4456 <tr><td colspan=
"4" class=
"doc" id=
"hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
4465 fieldDecl(hasBitWidth(
2))
4466 matches 'int a;' and 'int c;' but not 'int b;'.
4470 <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>
4471 <tr><td colspan=
"4" class=
"doc" id=
"isBitField0"><pre>Matches non-static data members that are bit-fields.
4478 fieldDecl(isBitField())
4479 matches 'int a;' but not 'int b;'.
4483 <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>
4484 <tr><td colspan=
"4" class=
"doc" id=
"equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4487 f('false,
3.14,
42);
4488 characterLiteral(equals(
0))
4489 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
4491 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
4493 integerLiteral(equals(
42))
4496 Note that you cannot directly match a negative numeric literal because the
4497 minus sign is not part of the literal: It is a unary operator whose operand
4498 is the positive numeric literal. Instead, you must use a unaryOperator()
4499 matcher to match the minus sign:
4501 unaryOperator(hasOperatorName(
"-"),
4502 hasUnaryOperand(integerLiteral(equals(
13))))
4504 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>>,
4505 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>>
4509 <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>
4510 <tr><td colspan=
"4" class=
"doc" id=
"equals12"><pre></pre></td></tr>
4513 <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>
4514 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4516 Matches overloaded operator names specified in strings without the
4517 "operator" prefix: e.g.
"<<".
4519 hasAnyOverloadedOperatorName(
"+",
"-")
4521 anyOf(hasOverloadedOperatorName(
"+"), hasOverloadedOperatorName(
"-"))
4525 <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>
4526 <tr><td colspan=
"4" class=
"doc" id=
"hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4531 void h() noexcept(true);
4532 void i() noexcept(false);
4534 void k() throw(int);
4535 void l() throw(...);
4536 functionDecl(hasDynamicExceptionSpec()) and
4537 functionProtoType(hasDynamicExceptionSpec())
4538 match the declarations of j, k, and l, but not f, g, h, or i.
4542 <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>
4543 <tr><td colspan=
"4" class=
"doc" id=
"hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4545 Matches overloaded operator names specified in strings without the
4546 "operator" prefix: e.g.
"<<".
4549 class A { int operator*(); };
4550 const A
&operator
<<(const A
&a, const A
&b);
4552 a
<< a; //
<-- This matches
4554 cxxOperatorCallExpr(hasOverloadedOperatorName(
"<<"))) matches the
4556 cxxRecordDecl(hasMethod(hasOverloadedOperatorName(
"*")))
4557 matches the declaration of A.
4559 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>>
4563 <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>
4564 <tr><td colspan=
"4" class=
"doc" id=
"hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4566 Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4568 auto Y() -
> int {}
4572 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isConsteval0')"><a name=
"isConsteval0Anchor">isConsteval
</a></td><td></td></tr>
4573 <tr><td colspan=
"4" class=
"doc" id=
"isConsteval0"><pre>Matches consteval function declarations and if consteval/if ! consteval
4578 void b() { if consteval {} }
4579 void c() { if ! consteval {} }
4580 void d() { if ! consteval {} else {} }
4581 functionDecl(isConsteval())
4582 matches the declaration of
"int a()".
4583 ifStmt(isConsteval())
4584 matches the if statement in
"void b()",
"void c()",
"void d()".
4588 <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>
4589 <tr><td colspan=
"4" class=
"doc" id=
"isConstexpr1"><pre>Matches constexpr variable and function declarations,
4593 constexpr int foo =
42;
4594 constexpr int bar();
4595 void baz() { if constexpr(
1 > 0) {} }
4596 varDecl(isConstexpr())
4597 matches the declaration of foo.
4598 functionDecl(isConstexpr())
4599 matches the declaration of bar.
4600 ifStmt(isConstexpr())
4601 matches the if statement in baz.
4605 <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>
4606 <tr><td colspan=
"4" class=
"doc" id=
"isDefaulted0"><pre>Matches defaulted function declarations.
4610 class B { ~B() = default; };
4611 functionDecl(isDefaulted())
4612 matches the declaration of ~B, but not ~A.
4616 <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>
4617 <tr><td colspan=
"4" class=
"doc" id=
"isDefinition3"><pre>Matches if a declaration has a body attached.
4619 Example matches A, va, fa
4621 class B; // Doesn't match, as it has no body.
4623 extern int vb; // Doesn't match, as it doesn't define the variable.
4625 void fb(); // Doesn't match, as it has no body.
4627 - (void)ma; // Doesn't match, interface is declaration.
4633 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>>,
4634 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl
</a>>
4638 <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>
4639 <tr><td colspan=
"4" class=
"doc" id=
"isDeleted0"><pre>Matches deleted function declarations.
4643 void DeletedFunc() = delete;
4644 functionDecl(isDeleted())
4645 matches the declaration of DeletedFunc, but not Func.
4649 <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>
4650 <tr><td colspan=
"4" class=
"doc" id=
"isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4651 static member variable template instantiations.
4654 template
<typename T
> void A(T t) { }
4655 template
<> void A(int N) { }
4656 functionDecl(isExplicitTemplateSpecialization())
4657 matches the specialization A
<int
>().
4659 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>>
4663 <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>
4664 <tr><td colspan=
"4" class=
"doc" id=
"isExternC0"><pre>Matches extern
"C" function or variable declarations.
4667 extern
"C" void f() {}
4668 extern
"C" { void g() {} }
4670 extern
"C" int x =
1;
4671 extern
"C" int y =
2;
4673 functionDecl(isExternC())
4674 matches the declaration of f and g, but not the declaration of h.
4675 varDecl(isExternC())
4676 matches the declaration of x and y, but not the declaration of z.
4680 <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>
4681 <tr><td colspan=
"4" class=
"doc" id=
"isInline1"><pre>Matches functions, variables and namespace declarations that are marked with
4688 inline namespace m {}
4691 functionDecl(isInline()) will match ::f().
4692 namespaceDecl(isInline()) will match n::m.
4693 varDecl(isInline()) will match Foo;
4697 <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>
4698 <tr><td colspan=
"4" class=
"doc" id=
"isMain0"><pre>Determines whether the function is
"main", which is the entry point
4699 into an executable program.
4703 <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>
4704 <tr><td colspan=
"4" class=
"doc" id=
"isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4708 [[noreturn]] void a();
4709 __attribute__((noreturn)) void b();
4710 struct c { [[noreturn]] c(); };
4711 functionDecl(isNoReturn())
4712 matches all of those except
4717 <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>
4718 <tr><td colspan=
"4" class=
"doc" id=
"isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4724 void i() throw(int);
4725 void j() noexcept(false);
4726 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4727 match the declarations of g, and h, but not f, i or j.
4731 <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>
4732 <tr><td colspan=
"4" class=
"doc" id=
"isStaticStorageClass0"><pre>Matches variable/function declarations that have
"static" storage
4733 class specifier (
"static" keyword) written in the source.
4740 functionDecl(isStaticStorageClass())
4741 matches the function declaration f.
4742 varDecl(isStaticStorageClass())
4743 matches the variable declaration i.
4747 <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>
4748 <tr><td colspan=
"4" class=
"doc" id=
"isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4749 member variable template instantiations.
4752 template
<typename T
> class X {}; class A {}; X
<A
> x;
4754 template
<typename T
> class X {}; class A {}; template class X
<A
>;
4756 template
<typename T
> class X {}; class A {}; extern template class X
<A
>;
4757 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
4758 matches the template instantiation of X
<A
>.
4761 template
<typename T
> class X {}; class A {};
4762 template
<> class X
<A
> {}; X
<A
> x;
4763 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
4764 does not match, as X
<A
> is an explicit template specialization.
4766 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>>
4770 <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>
4771 <tr><td colspan=
"4" class=
"doc" id=
"isVariadic0"><pre>Matches if a function declaration is variadic.
4773 Example matches f, but not g or h. The function i will not match, even when
4777 template
<typename... Ts
> void h(Ts...);
4782 <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>
4783 <tr><td colspan=
"4" class=
"doc" id=
"isWeak0"><pre>Matches weak function declarations.
4786 void foo() __attribute__((__weakref__(
"__foo")));
4788 functionDecl(isWeak())
4789 matches the weak declaration
"foo", but not
"bar".
4793 <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>
4794 <tr><td colspan=
"4" class=
"doc" id=
"parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4795 specific parameter count.
4799 void g(int i, int j) {}
4800 void h(int i, int j);
4802 void k(int x, int y, int z, ...);
4803 functionDecl(parameterCountIs(
2))
4805 functionProtoType(parameterCountIs(
2))
4807 functionProtoType(parameterCountIs(
3))
4812 <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>
4813 <tr><td colspan=
"4" class=
"doc" id=
"hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4818 void h() noexcept(true);
4819 void i() noexcept(false);
4821 void k() throw(int);
4822 void l() throw(...);
4823 functionDecl(hasDynamicExceptionSpec()) and
4824 functionProtoType(hasDynamicExceptionSpec())
4825 match the declarations of j, k, and l, but not f, g, h, or i.
4829 <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>
4830 <tr><td colspan=
"4" class=
"doc" id=
"isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4836 void i() throw(int);
4837 void j() noexcept(false);
4838 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4839 match the declarations of g, and h, but not f, i or j.
4843 <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>
4844 <tr><td colspan=
"4" class=
"doc" id=
"parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4845 specific parameter count.
4849 void g(int i, int j) {}
4850 void h(int i, int j);
4852 void k(int x, int y, int z, ...);
4853 functionDecl(parameterCountIs(
2))
4855 functionProtoType(parameterCountIs(
2))
4857 functionProtoType(parameterCountIs(
3))
4862 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt
</a>></td><td class=
"name" onclick=
"toggle('isConsteval1')"><a name=
"isConsteval1Anchor">isConsteval
</a></td><td></td></tr>
4863 <tr><td colspan=
"4" class=
"doc" id=
"isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval
4868 void b() { if consteval {} }
4869 void c() { if ! consteval {} }
4870 void d() { if ! consteval {} else {} }
4871 functionDecl(isConsteval())
4872 matches the declaration of
"int a()".
4873 ifStmt(isConsteval())
4874 matches the if statement in
"void b()",
"void c()",
"void d()".
4878 <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>
4879 <tr><td colspan=
"4" class=
"doc" id=
"isConstexpr2"><pre>Matches constexpr variable and function declarations,
4883 constexpr int foo =
42;
4884 constexpr int bar();
4885 void baz() { if constexpr(
1 > 0) {} }
4886 varDecl(isConstexpr())
4887 matches the declaration of foo.
4888 functionDecl(isConstexpr())
4889 matches the declaration of bar.
4890 ifStmt(isConstexpr())
4891 matches the if statement in baz.
4895 <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>
4896 <tr><td colspan=
"4" class=
"doc" id=
"equals6"><pre></pre></td></tr>
4899 <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>
4900 <tr><td colspan=
"4" class=
"doc" id=
"equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4903 f('false,
3.14,
42);
4904 characterLiteral(equals(
0))
4905 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
4907 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
4909 integerLiteral(equals(
42))
4912 Note that you cannot directly match a negative numeric literal because the
4913 minus sign is not part of the literal: It is a unary operator whose operand
4914 is the positive numeric literal. Instead, you must use a unaryOperator()
4915 matcher to match the minus sign:
4917 unaryOperator(hasOperatorName(
"-"),
4918 hasUnaryOperand(integerLiteral(equals(
13))))
4920 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>>,
4921 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>>
4925 <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>
4926 <tr><td colspan=
"4" class=
"doc" id=
"equals13"><pre></pre></td></tr>
4929 <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>
4930 <tr><td colspan=
"4" class=
"doc" id=
"equals9"><pre></pre></td></tr>
4933 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>></td><td class=
"name" onclick=
"toggle('capturesThis0')"><a name=
"capturesThis0Anchor">capturesThis
</a></td><td></td></tr>
4934 <tr><td colspan=
"4" class=
"doc" id=
"capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'.
4940 auto l = [this]() { return cc; };
4944 lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4945 matches `[this]() { return cc; }`.
4949 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>></td><td class=
"name" onclick=
"toggle('isImplicit2')"><a name=
"isImplicit2Anchor">isImplicit
</a></td><td></td></tr>
4950 <tr><td colspan=
"4" class=
"doc" id=
"isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4951 implicit default/copy constructors).
4955 <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>
4956 <tr><td colspan=
"4" class=
"doc" id=
"isArrow0"><pre>Matches member expressions that are called with '-
>' as opposed
4959 Member calls on the implicit this pointer match as called with '-
>'.
4963 void x() { this-
>x(); x(); Y y; y.x(); a; this-
>b; Y::b; }
4964 template
<class T
> void f() { this-
>f
<T
>(); f
<T
>(); }
4968 template
<class T
>
4970 void x() { this-
>m; }
4972 memberExpr(isArrow())
4973 matches this-
>x, x, y.x, a, this-
>b
4974 cxxDependentScopeMemberExpr(isArrow())
4976 unresolvedMemberExpr(isArrow())
4977 matches this-
>f
<T
>, f
<T
>
4981 <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>
4982 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4984 This matcher is only provided as a performance optimization of hasName.
4986 is equivalent to, but faster than
4987 anyOf(hasName(a), hasName(b), hasName(c))
4991 <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>
4992 <tr><td colspan=
"4" class=
"doc" id=
"hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4994 Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
5001 Example matches f() because it has external formal linkage despite being
5002 unique to the translation unit as though it has internal likage
5003 (matcher = functionDecl(hasExternalFormalLinkage()))
5011 <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>
5012 <tr><td colspan=
"4" class=
"doc" id=
"hasName0"><pre>Matches NamedDecl nodes that have the specified name.
5014 Supports specifying enclosing namespaces or classes by prefixing the name
5015 with '
<enclosing
>::'.
5016 Does not match typedefs of an underlying type with the given name.
5018 Example matches X (Name ==
"X")
5021 Example matches X (Name is one of
"::a::b::X",
"a::b::X",
"b::X",
"X")
5022 namespace a { namespace b { class X; } }
5026 <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>
5027 <tr><td colspan=
"4" class=
"doc" id=
"matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
5028 a substring matched by the given RegExp.
5030 Supports specifying enclosing namespaces or classes by
5031 prefixing the name with '
<enclosing
>::'. Does not match typedefs
5032 of an underlying type with the given name.
5034 Example matches X (regexp ==
"::X")
5037 Example matches X (regexp is one of
"::X",
"^foo::.*X", among others)
5038 namespace foo { namespace bar { class X; } }
5040 If the matcher is used in clang-query, RegexFlags parameter
5041 should be passed as a quoted string. e.g:
"NoFlags".
5042 Flags can be combined with '|' example
"IgnoreCase | BasicRegex"
5046 <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>
5047 <tr><td colspan=
"4" class=
"doc" id=
"isAnonymous0"><pre>Matches anonymous namespace declarations.
5053 namespaceDecl(isAnonymous()) will match #
1 but not ::n.
5057 <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>
5058 <tr><td colspan=
"4" class=
"doc" id=
"isInline0"><pre>Matches functions, variables and namespace declarations that are marked with
5065 inline namespace m {}
5068 functionDecl(isInline()) will match ::f().
5069 namespaceDecl(isInline()) will match n::m.
5070 varDecl(isInline()) will match Foo;
5074 <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>
5075 <tr><td colspan=
"4" class=
"doc" id=
"isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
5080 #pragma omp parallel
5081 #pragma omp parallel default(none)
5082 #pragma omp parallel default(shared)
5083 #pragma omp parallel default(private)
5084 #pragma omp parallel default(firstprivate)
5086 ``ompDefaultClause(isFirstPrivateKind())`` matches only
5087 ``default(firstprivate)``.
5091 <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>
5092 <tr><td colspan=
"4" class=
"doc" id=
"isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
5096 #pragma omp parallel
5097 #pragma omp parallel default(none)
5098 #pragma omp parallel default(shared)
5099 #pragma omp parallel default(private)
5100 #pragma omp parallel default(firstprivate)
5102 ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
5106 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause
</a>></td><td class=
"name" onclick=
"toggle('isPrivateKind0')"><a name=
"isPrivateKind0Anchor">isPrivateKind
</a></td><td></td></tr>
5107 <tr><td colspan=
"4" class=
"doc" id=
"isPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``private`` kind
5112 #pragma omp parallel
5113 #pragma omp parallel default(none)
5114 #pragma omp parallel default(shared)
5115 #pragma omp parallel default(private)
5116 #pragma omp parallel default(firstprivate)
5118 ``ompDefaultClause(isPrivateKind())`` matches only
5119 ``default(private)``.
5123 <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>
5124 <tr><td colspan=
"4" class=
"doc" id=
"isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
5128 #pragma omp parallel
5129 #pragma omp parallel default(none)
5130 #pragma omp parallel default(shared)
5131 #pragma omp parallel default(private)
5132 #pragma omp parallel default(firstprivate)
5134 ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
5138 <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>
5139 <tr><td colspan=
"4" class=
"doc" id=
"isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
5144 #pragma omp parallel
5145 #pragma omp parallel for
5148 `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
5149 ``omp parallel`` and ``omp parallel for``.
5151 If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
5152 should be passed as a quoted string. e.g.,
5153 ``isAllowedToContainClauseKind(
"OMPC_default").``
5157 <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>
5158 <tr><td colspan=
"4" class=
"doc" id=
"isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
5159 i.e., directives that can't have a structured block.
5163 #pragma omp parallel
5165 #pragma omp taskyield
5167 ``ompExecutableDirective(isStandaloneDirective()))`` matches
5172 <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>
5173 <tr><td colspan=
"4" class=
"doc" id=
"isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
5177 <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>
5178 <tr><td colspan=
"4" class=
"doc" id=
"isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
5182 <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>
5183 <tr><td colspan=
"4" class=
"doc" id=
"isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
5184 isSameOrDerivedFrom(hasName(...)).
5188 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast3')"><a name=
"argumentCountAtLeast3Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
5189 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast3"><pre>Checks that a call expression or a constructor call expression has at least
5190 the specified number of arguments (including absent default arguments).
5192 Example matches f(
0,
0) and g(
0,
0,
0)
5193 (matcher = callExpr(argumentCountAtLeast(
2)))
5194 void f(int x, int y);
5195 void g(int x, int y, int z);
5201 <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>
5202 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
5203 a specific number of arguments (including absent default arguments).
5205 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
5206 void f(int x, int y);
5211 <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>
5212 <tr><td colspan=
"4" class=
"doc" id=
"hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
5213 Selector.getAsString()
5215 matcher = objCMessageExpr(hasSelector(
"methodA:",
"methodB:"));
5216 matches both of the expressions below:
5217 [myObj methodA:argA];
5218 [myObj methodB:argB];
5222 <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>
5223 <tr><td colspan=
"4" class=
"doc" id=
"hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
5225 objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
5226 message expression in
5228 UIWebView *webView = ...;
5229 CGRect bodyFrame = webView.frame;
5230 bodyFrame.size.height = self.bodyContentHeight;
5231 webView.frame = bodyFrame;
5232 // ^---- matches here
5236 <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>
5237 <tr><td colspan=
"4" class=
"doc" id=
"hasNullSelector0"><pre>Matches when the selector is the empty selector
5239 Matches only when the selector of the objCMessageExpr is NULL. This may
5240 represent an error condition in the tree!
5244 <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>
5245 <tr><td colspan=
"4" class=
"doc" id=
"hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
5247 matcher = objCMessageExpr(hasSelector(
"loadHTMLString:baseURL:"));
5248 matches the outer message expr in the code below, but NOT the message
5249 invocation for self.bodyView.
5250 [self.bodyView loadHTMLString:html baseURL:NULL];
5254 <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>
5255 <tr><td colspan=
"4" class=
"doc" id=
"hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
5257 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
5258 matches self.bodyView in the code below, but NOT the outer message
5259 invocation of
"loadHTMLString:baseURL:".
5260 [self.bodyView loadHTMLString:html baseURL:NULL];
5264 <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>
5265 <tr><td colspan=
"4" class=
"doc" id=
"isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
5268 matcher = objcMessageExpr(isClassMessage())
5270 [NSString stringWithFormat:@
"format"];
5272 NSString *x = @
"hello";
5273 [x containsString:@
"h"];
5277 <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>
5278 <tr><td colspan=
"4" class=
"doc" id=
"isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
5281 matcher = objcMessageExpr(isInstanceMessage())
5283 NSString *x = @
"hello";
5284 [x containsString:@
"h"];
5286 [NSString stringWithFormat:@
"format"];
5290 <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>
5291 <tr><td colspan=
"4" class=
"doc" id=
"matchesSelector0"><pre>Matches ObjC selectors whose name contains
5292 a substring matched by the given RegExp.
5293 matcher = objCMessageExpr(matchesSelector(
"loadHTMLStringmatches the outer message expr in the code below, but NOT the message
5294 invocation for self.bodyView.
5295 [self.bodyView loadHTMLString:html baseURL:NULL];
5297 If the matcher is used in clang-query, RegexFlags parameter
5298 should be passed as a quoted string. e.g: "NoFlags
".
5299 Flags can be combined with '|' example "IgnoreCase | BasicRegex
"
5303 <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>
5304 <tr><td colspan="4" class="doc
" id="numSelectorArgs0
"><pre>Matches when the selector has the specified number of arguments
5306 matcher = objCMessageExpr(numSelectorArgs(0));
5307 matches self.bodyView in the code below
5309 matcher = objCMessageExpr(numSelectorArgs(2));
5310 matches the invocation of "loadHTMLString:baseURL:
" but not that
5312 [self.bodyView loadHTMLString:html baseURL:NULL];
5316 <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>
5317 <tr><td colspan="4" class="doc
" id="isClassMethod0
"><pre>Returns true when the Objective-C method declaration is a class method.
5320 matcher = objcMethodDecl(isClassMethod())
5322 @interface I + (void)foo; @end
5324 @interface I - (void)bar; @end
5328 <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>
5329 <tr><td colspan="4" class="doc
" id="isDefinition2
"><pre>Matches if a declaration has a body attached.
5331 Example matches A, va, fa
5333 class B; // Doesn't match, as it has no body.
5335 extern int vb; // Doesn't match, as it doesn't define the variable.
5337 void fb(); // Doesn't match, as it has no body.
5339 - (void)ma; // Doesn't match, interface is declaration.
5345 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>>,
5346 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>>
5350 <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>
5351 <tr><td colspan="4" class="doc
" id="isInstanceMethod0
"><pre>Returns true when the Objective-C method declaration is an instance method.
5354 matcher = objcMethodDecl(isInstanceMethod())
5356 @interface I - (void)bar; @end
5358 @interface I + (void)foo; @end
5362 <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>
5363 <tr><td colspan="4" class="doc
" id="hasDefaultArgument0
"><pre>Matches a declaration that has default arguments.
5365 Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
5367 void y(int val = 0) {}
5369 Deprecated. Use hasInitializer() instead to be able to
5370 match on the contents of the default argument. For example:
5372 void x(int val = 7) {}
5373 void y(int val = 42) {}
5374 parmVarDecl(hasInitializer(integerLiteral(equals(42))))
5375 matches the parameter of y
5378 parmVarDecl(hasInitializer(anything()))
5379 is equivalent to parmVarDecl(hasDefaultArgument()).
5383 <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>
5384 <tr><td colspan="4" class="doc
" id="isAtPosition0
"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
5385 list. The parameter list could be that of either a block, function, or
5391 void f(int a, int b, int c) {
5394 ``parmVarDecl(isAtPosition(0))`` matches ``int a``.
5396 ``parmVarDecl(isAtPosition(1))`` matches ``int b``.
5400 <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>
5401 <tr><td colspan="4" class="doc
" id="asString0
"><pre>Matches if the matched type is represented by the given string.
5404 class Y { public: void x(); };
5405 void z() { Y* y; y->x(); }
5406 cxxMemberCallExpr(on(hasType(asString("class Y *
"))))
5411 <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>
5412 <tr><td colspan="4" class="doc
" id="equalsBoundNode3
"><pre>Matches if a node equals a previously bound node.
5414 Matches a node if it equals the node previously bound to ID.
5417 class X { int a; int b; };
5419 has(fieldDecl(hasName("a
"), hasType(type().bind("t
")))),
5420 has(fieldDecl(hasName("b
"), hasType(type(equalsBoundNode("t
"))))))
5421 matches the class X, as a and b have the same type.
5423 Note that when multiple matches are involved via forEach* matchers,
5424 equalsBoundNodes acts as a filter.
5427 forEachDescendant(varDecl().bind("d
")),
5428 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d
"))))))
5429 will trigger a match for each combination of variable declaration
5430 and reference to that variable declaration within a compound statement.
5434 <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>
5435 <tr><td colspan="4" class="doc
" id="hasLocalQualifiers0
"><pre>Matches QualType nodes that have local CV-qualifiers attached to
5436 the node, not hidden within a typedef.
5439 typedef const int const_int;
5444 varDecl(hasType(hasLocalQualifiers())) matches only j and k.
5445 i is const-qualified but the qualifier is not local.
5449 <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>
5450 <tr><td colspan="4" class="doc
" id="isAnyCharacter0
"><pre>Matches QualType nodes that are of character type.
5456 functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
5457 matches "a(char)
", "b(wchar_t)
", but not "c(double)
".
5461 <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>
5462 <tr><td colspan="4" class="doc
" id="isAnyPointer0
"><pre>Matches QualType nodes that are of any pointer type; this includes
5463 the Objective-C object pointer type, which is different despite being
5464 syntactically similar.
5474 varDecl(hasType(isAnyPointer()))
5475 matches "int *i
" and "Foo *f
", but not "int j
".
5479 <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>
5480 <tr><td colspan="4" class="doc
" id="isConstQualified0
"><pre>Matches QualType nodes that are const-qualified, i.e., that
5481 include "top-level
" const.
5488 void e(int const) {};
5489 functionDecl(hasAnyParameter(hasType(isConstQualified())))
5490 matches "void b(int const)
", "void c(const int)
" and
5491 "void e(int const) {}
". It does not match d as there
5492 is no top-level const on the parameter type "const int *
".
5496 <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>
5497 <tr><td colspan="4" class="doc
" id="isInteger0
"><pre>Matches QualType nodes that are of integer type.
5503 functionDecl(hasAnyParameter(hasType(isInteger())))
5504 matches "a(int)
", "b(long)
", but not "c(double)
".
5508 <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>
5509 <tr><td colspan="4" class="doc
" id="isSignedInteger0
"><pre>Matches QualType nodes that are of signed integer type.
5513 void b(unsigned long);
5515 functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5516 matches "a(int)
", but not "b(unsigned long)
" and "c(double)
".
5520 <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>
5521 <tr><td colspan="4" class="doc
" id="isUnsignedInteger0
"><pre>Matches QualType nodes that are of unsigned integer type.
5525 void b(unsigned long);
5527 functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5528 matches "b(unsigned long)
", but not "a(int)
" and "c(double)
".
5532 <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>
5533 <tr><td colspan="4" class="doc
" id="isVolatileQualified0
"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5534 include "top-level
" volatile.
5538 void b(int volatile);
5539 void c(volatile int);
5540 void d(volatile int*);
5541 void e(int volatile) {};
5542 functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5543 matches "void b(int volatile)
", "void c(volatile int)
" and
5544 "void e(int volatile) {}
". It does not match d as there
5545 is no top-level volatile on the parameter type "volatile int *
".
5549 <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>
5550 <tr><td colspan="4" class="doc
" id="equalsBoundNode0
"><pre>Matches if a node equals a previously bound node.
5552 Matches a node if it equals the node previously bound to ID.
5555 class X { int a; int b; };
5557 has(fieldDecl(hasName("a
"), hasType(type().bind("t
")))),
5558 has(fieldDecl(hasName("b
"), hasType(type(equalsBoundNode("t
"))))))
5559 matches the class X, as a and b have the same type.
5561 Note that when multiple matches are involved via forEach* matchers,
5562 equalsBoundNodes acts as a filter.
5565 forEachDescendant(varDecl().bind("d
")),
5566 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d
"))))))
5567 will trigger a match for each combination of variable declaration
5568 and reference to that variable declaration within a compound statement.
5572 <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>
5573 <tr><td colspan="4" class="doc
" id="equalsNode1
"><pre>Matches if a node equals another node.
5575 Stmt has pointer identity in the AST.
5579 <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>
5580 <tr><td colspan="4" class="doc
" id="isExpandedFromMacro1
"><pre>Matches statements that are (transitively) expanded from the named macro.
5581 Does not match if only part of the statement is expanded from that macro or
5582 if different parts of the statement are expanded from different
5583 appearances of the macro.
5587 <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>
5588 <tr><td colspan="4" class="doc
" id="isExpansionInFileMatching1
"><pre>Matches AST nodes that were expanded within files whose name is
5589 partially matching a given regex.
5591 Example matches Y but not X
5592 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*
"))
5593 #include "ASTMatcher.h
"
5598 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>>
5600 If the matcher is used in clang-query, RegexFlags parameter
5601 should be passed as a quoted string. e.g: "NoFlags
".
5602 Flags can be combined with '|' example "IgnoreCase | BasicRegex
"
5606 <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>
5607 <tr><td colspan="4" class="doc
" id="isExpansionInMainFile1
"><pre>Matches AST nodes that were expanded within the main-file.
5609 Example matches X but not Y
5610 (matcher = cxxRecordDecl(isExpansionInMainFile())
5611 #include <Y.h>
5616 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>>
5620 <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>
5621 <tr><td colspan="4" class="doc
" id="isExpansionInSystemHeader1
"><pre>Matches AST nodes that were expanded within system-header-files.
5623 Example matches Y but not X
5624 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5625 #include <SystemHeader.h>
5630 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>>
5634 <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>
5635 <tr><td colspan="4" class="doc
" id="isInTemplateInstantiation0
"><pre>Matches statements inside of a template instantiation.
5639 template<typename T> void A(T t) { T i; j += 42;}
5642 declStmt(isInTemplateInstantiation())
5643 matches 'int i;' and 'unsigned i'.
5644 unless(stmt(isInTemplateInstantiation()))
5645 will NOT match j += 42; as it's shared between the template definition and
5650 <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>
5651 <tr><td colspan="4" class="doc
" id="hasSize1
"><pre>Matches nodes that have the specified size.
5658 wchar_t *ws = L"abcd
";
5660 constantArrayType(hasSize(42))
5661 matches "int a[
42]
" and "int b[
2 *
21]
"
5662 stringLiteral(hasSize(4))
5663 matches "abcd
", L"abcd
"
5667 <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>
5668 <tr><td colspan="4" class="doc
" id="isClass0
"><pre>Matches TagDecl object that are spelled with "class.
"
5670 Example matches C, but not S, U or E.
5678 <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>
5679 <tr><td colspan="4" class="doc
" id="isDefinition0
"><pre>Matches if a declaration has a body attached.
5681 Example matches A, va, fa
5683 class B; // Doesn't match, as it has no body.
5685 extern int vb; // Doesn't match, as it doesn't define the variable.
5687 void fb(); // Doesn't match, as it has no body.
5689 - (void)ma; // Doesn't match, interface is declaration.
5695 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>>,
5696 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>>
5700 <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>
5701 <tr><td colspan="4" class="doc
" id="isEnum0
"><pre>Matches TagDecl object that are spelled with "enum.
"
5703 Example matches E, but not C, S or U.
5711 <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>
5712 <tr><td colspan="4" class="doc
" id="isStruct0
"><pre>Matches TagDecl object that are spelled with "struct.
"
5714 Example matches S, but not C, U or E.
5722 <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>
5723 <tr><td colspan="4" class="doc
" id="isUnion0
"><pre>Matches TagDecl object that are spelled with "union.
"
5725 Example matches U, but not C, S or E.
5733 <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>
5734 <tr><td colspan="4" class="doc
" id="equalsIntegralValue0
"><pre>Matches a TemplateArgument of integral type with a given value.
5736 Note that 'Value' is a string as the template argument's value is
5737 an arbitrary precision integer. 'Value' must be euqal to the canonical
5738 representation of that integral value in base 10.
5741 template<int T> struct C {};
5743 classTemplateSpecializationDecl(
5744 hasAnyTemplateArgument(equalsIntegralValue("42")))
5745 matches the implicit instantiation of C in C<42>.
5749 <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>
5750 <tr><td colspan="4" class="doc
" id="isIntegral0
"><pre>Matches a TemplateArgument that is an integral value.
5753 template<int T> struct C {};
5755 classTemplateSpecializationDecl(
5756 hasAnyTemplateArgument(isIntegral()))
5757 matches the implicit instantiation of C in C<42>
5758 with isIntegral() matching 42.
5762 <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>
5763 <tr><td colspan="4" class="doc
" id="templateArgumentCountIs1
"><pre>Matches if the number of template arguments equals N.
5766 template<typename T> struct C {};
5768 classTemplateSpecializationDecl(templateArgumentCountIs(1))
5769 matches C<int>.
5773 <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>
5774 <tr><td colspan="4" class="doc
" id="isExpandedFromMacro2
"><pre>Matches statements that are (transitively) expanded from the named macro.
5775 Does not match if only part of the statement is expanded from that macro or
5776 if different parts of the statement are expanded from different
5777 appearances of the macro.
5781 <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>
5782 <tr><td colspan="4" class="doc
" id="isExpansionInFileMatching2
"><pre>Matches AST nodes that were expanded within files whose name is
5783 partially matching a given regex.
5785 Example matches Y but not X
5786 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*
"))
5787 #include "ASTMatcher.h
"
5792 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>>
5794 If the matcher is used in clang-query, RegexFlags parameter
5795 should be passed as a quoted string. e.g: "NoFlags
".
5796 Flags can be combined with '|' example "IgnoreCase | BasicRegex
"
5800 <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>
5801 <tr><td colspan="4" class="doc
" id="isExpansionInMainFile2
"><pre>Matches AST nodes that were expanded within the main-file.
5803 Example matches X but not Y
5804 (matcher = cxxRecordDecl(isExpansionInMainFile())
5805 #include <Y.h>
5810 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>>
5814 <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>
5815 <tr><td colspan="4" class="doc
" id="isExpansionInSystemHeader2
"><pre>Matches AST nodes that were expanded within system-header-files.
5817 Example matches Y but not X
5818 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5819 #include <SystemHeader.h>
5824 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>>
5828 <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>
5829 <tr><td colspan="4" class="doc
" id="booleanType0
"><pre>Matches type bool.
5832 struct S { bool func(); };
5833 functionDecl(returns(booleanType()))
5834 matches "bool func();
"
5838 <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>
5839 <tr><td colspan="4" class="doc
" id="equalsBoundNode2
"><pre>Matches if a node equals a previously bound node.
5841 Matches a node if it equals the node previously bound to ID.
5844 class X { int a; int b; };
5846 has(fieldDecl(hasName("a
"), hasType(type().bind("t
")))),
5847 has(fieldDecl(hasName("b
"), hasType(type(equalsBoundNode("t
"))))))
5848 matches the class X, as a and b have the same type.
5850 Note that when multiple matches are involved via forEach* matchers,
5851 equalsBoundNodes acts as a filter.
5854 forEachDescendant(varDecl().bind("d
")),
5855 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d
"))))))
5856 will trigger a match for each combination of variable declaration
5857 and reference to that variable declaration within a compound statement.
5861 <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>
5862 <tr><td colspan="4" class="doc
" id="equalsNode2
"><pre>Matches if a node equals another node.
5864 Type has pointer identity in the AST.
5868 <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>
5869 <tr><td colspan="4" class="doc
" id="realFloatingPointType0
"><pre>Matches any real floating-point type (float, double, long double).
5874 realFloatingPointType()
5875 matches "float f
" but not "int i
"
5879 <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>
5880 <tr><td colspan="4" class="doc
" id="voidType0
"><pre>Matches type void.
5883 struct S { void func(); };
5884 functionDecl(returns(voidType()))
5885 matches "void func();
"
5889 <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>
5890 <tr><td colspan="4" class="doc
" id="ofKind0
"><pre>Matches unary expressions of a certain kind.
5894 int s = sizeof(x) + alignof(x)
5895 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5898 If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5899 should be passed as a quoted string. e.g., ofKind("UETT_SizeOf
").
5903 <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>
5904 <tr><td colspan="4" class="doc
" id="hasAnyOperatorName3
"><pre>Matches operator expressions (binary or unary) that have any of the
5907 hasAnyOperatorName("+
", "-
")
5909 anyOf(hasOperatorName("+
"), hasOperatorName("-
"))
5913 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html
">UnaryOperator</a>></td><td class="name
" onclick="toggle('hasOperatorName4')
"><a name="hasOperatorName4Anchor
">hasOperatorName</a></td><td>std::string Name</td></tr>
5914 <tr><td colspan="4" class="doc
" id="hasOperatorName4
"><pre>Matches the operator Name of operator expressions and fold expressions
5917 Example matches a || b (matcher = binaryOperator(hasOperatorName("||
")))
5920 Example matches `(0 + ... + args)`
5921 (matcher = cxxFoldExpr(hasOperatorName("+
")))
5922 template <typename... Args>
5923 auto sum(Args... args) {
5924 return (0 + ... + args);
5929 <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>
5930 <tr><td colspan="4" class="doc
" id="isArrow1
"><pre>Matches member expressions that are called with '->' as opposed
5933 Member calls on the implicit this pointer match as called with '->'.
5937 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
5938 template <class T> void f() { this->f<T>(); f<T>(); }
5942 template <class T>
5944 void x() { this->m; }
5946 memberExpr(isArrow())
5947 matches this->x, x, y.x, a, this->b
5948 cxxDependentScopeMemberExpr(isArrow())
5950 unresolvedMemberExpr(isArrow())
5951 matches this->f<T>, f<T>
5955 <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>
5956 <tr><td colspan="4" class="doc
" id="hasAutomaticStorageDuration0
"><pre>Matches a variable declaration that has automatic storage duration.
5958 Example matches x, but not y, z, or a.
5959 (matcher = varDecl(hasAutomaticStorageDuration())
5969 <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>
5970 <tr><td colspan="4" class="doc
" id="hasGlobalStorage0
"><pre>Matches a variable declaration that does not have local storage.
5972 Example matches y and z (matcher = varDecl(hasGlobalStorage())
5981 <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>
5982 <tr><td colspan="4" class="doc
" id="hasLocalStorage0
"><pre>Matches a variable declaration that has function scope and is a
5983 non-static local variable.
5985 Example matches x (matcher = varDecl(hasLocalStorage())
5994 <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>
5995 <tr><td colspan="4" class="doc
" id="hasStaticStorageDuration0
"><pre>Matches a variable declaration that has static storage duration.
5996 It includes the variable declared at namespace scope and those declared
5997 with "static
" and "extern
" storage class specifiers.
6007 varDecl(hasStaticStorageDuration())
6008 matches the function declaration y, a, b and c.
6012 <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>
6013 <tr><td colspan="4" class="doc
" id="hasThreadStorageDuration0
"><pre>Matches a variable declaration that has thread storage duration.
6015 Example matches z, but not x, z, or a.
6016 (matcher = varDecl(hasThreadStorageDuration())
6026 <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>
6027 <tr><td colspan="4" class="doc
" id="isConstexpr0
"><pre>Matches constexpr variable and function declarations,
6031 constexpr int foo = 42;
6032 constexpr int bar();
6033 void baz() { if constexpr(1 > 0) {} }
6034 varDecl(isConstexpr())
6035 matches the declaration of foo.
6036 functionDecl(isConstexpr())
6037 matches the declaration of bar.
6038 ifStmt(isConstexpr())
6039 matches the if statement in baz.
6043 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isConstinit0')
"><a name="isConstinit0Anchor
">isConstinit</a></td><td></td></tr>
6044 <tr><td colspan="4" class="doc
" id="isConstinit0
"><pre>Matches constinit variable declarations.
6047 constinit int foo = 42;
6048 constinit const char* bar = "bar
";
6050 [[clang::require_constant_initialization]] int xyz = 42;
6051 varDecl(isConstinit())
6052 matches the declaration of `foo` and `bar`, but not `baz` and `xyz`.
6056 <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>
6057 <tr><td colspan="4" class="doc
" id="isDefinition1
"><pre>Matches if a declaration has a body attached.
6059 Example matches A, va, fa
6061 class B; // Doesn't match, as it has no body.
6063 extern int vb; // Doesn't match, as it doesn't define the variable.
6065 void fb(); // Doesn't match, as it has no body.
6067 - (void)ma; // Doesn't match, interface is declaration.
6073 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>>,
6074 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>>
6078 <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>
6079 <tr><td colspan="4" class="doc
" id="isExceptionVariable0
"><pre>Matches a variable declaration that is an exception variable from
6080 a C++ catch block, or an Objective-C statement.
6082 Example matches x (matcher = varDecl(isExceptionVariable())
6091 <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>
6092 <tr><td colspan="4" class="doc
" id="isExplicitTemplateSpecialization1
"><pre>Matches explicit template specializations of function, class, or
6093 static member variable template instantiations.
6096 template<typename T> void A(T t) { }
6097 template<> void A(int N) { }
6098 functionDecl(isExplicitTemplateSpecialization())
6099 matches the specialization A<int>().
6101 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>>
6105 <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>
6106 <tr><td colspan="4" class="doc
" id="isExternC1
"><pre>Matches extern "C
" function or variable declarations.
6109 extern "C
" void f() {}
6110 extern "C
" { void g() {} }
6112 extern "C
" int x = 1;
6113 extern "C
" int y = 2;
6115 functionDecl(isExternC())
6116 matches the declaration of f and g, but not the declaration of h.
6117 varDecl(isExternC())
6118 matches the declaration of x and y, but not the declaration of z.
6122 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isInitCapture0')
"><a name="isInitCapture0Anchor
">isInitCapture</a></td><td></td></tr>
6123 <tr><td colspan="4" class="doc
" id="isInitCapture0
"><pre>Matches a variable serving as the implicit variable for a lambda init-
6126 Example matches x (matcher = varDecl(isInitCapture()))
6127 auto f = [x=3]() { return x; };
6131 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isInline2')
"><a name="isInline2Anchor
">isInline</a></td><td></td></tr>
6132 <tr><td colspan="4" class="doc
" id="isInline2
"><pre>Matches functions, variables and namespace declarations that are marked with
6139 inline namespace m {}
6142 functionDecl(isInline()) will match ::f().
6143 namespaceDecl(isInline()) will match n::m.
6144 varDecl(isInline()) will match Foo;
6148 <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>
6149 <tr><td colspan="4" class="doc
" id="isStaticLocal0
"><pre>Matches a static variable with local scope.
6151 Example matches y (matcher = varDecl(isStaticLocal()))
6160 <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>
6161 <tr><td colspan="4" class="doc
" id="isStaticStorageClass1
"><pre>Matches variable/function declarations that have "static
" storage
6162 class specifier ("static
" keyword) written in the source.
6169 functionDecl(isStaticStorageClass())
6170 matches the function declaration f.
6171 varDecl(isStaticStorageClass())
6172 matches the variable declaration i.
6176 <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>
6177 <tr><td colspan="4" class="doc
" id="isTemplateInstantiation1
"><pre>Matches template instantiations of function, class, or static
6178 member variable template instantiations.
6181 template <typename T> class X {}; class A {}; X<A> x;
6183 template <typename T> class X {}; class A {}; template class X<A>;
6185 template <typename T> class X {}; class A {}; extern template class X<A>;
6186 cxxRecordDecl(hasName("::X
"), isTemplateInstantiation())
6187 matches the template instantiation of X<A>.
6190 template <typename T> class X {}; class A {};
6191 template <> class X<A> {}; X<A> x;
6192 cxxRecordDecl(hasName("::X
"), isTemplateInstantiation())
6193 does not match, as X<A> is an explicit template specialization.
6195 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>>
6198 <!--END_NARROWING_MATCHERS -->
6201 <!-- ======================================================================= -->
6202 <h2 id="traversal-matchers
">AST Traversal Matchers</h2>
6203 <!-- ======================================================================= -->
6205 <p>Traversal matchers specify the relationship to other nodes that are
6206 reachable from the current node.</p>
6208 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
6209 forEachDescendant) which work on all nodes and allow users to write more generic
6210 match expressions.</p>
6213 <tr style="text-align:left
"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
6214 <!-- START_TRAVERSAL_MATCHERS -->
6216 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('binaryOperation0')
"><a name="binaryOperation0Anchor
">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr>
6217 <tr><td colspan="4" class="doc
" id="binaryOperation0
"><pre>Matches nodes which can be used with binary operators.
6221 might be represented in the clang AST as a binaryOperator, a
6222 cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
6224 * whether the types of var1 and var2 are fundamental (binaryOperator) or at
6225 least one is a class type (cxxOperatorCallExpr)
6226 * whether the code appears in a template declaration, if at least one of the
6227 vars is a dependent-type (binaryOperator)
6228 * whether the code relies on a rewritten binary operator, such as a
6229 spaceship operator or an inverted equality operator
6230 (cxxRewrittenBinaryOperator)
6232 This matcher elides details in places where the matchers for the nodes are
6237 hasOperatorName("!=
"),
6238 hasLHS(expr().bind("lhs
")),
6239 hasRHS(expr().bind("rhs
"))
6241 matches each use of "!=
" in:
6243 bool operator!=(const S&) const;
6252 template<typename T>
6260 bool operator==(const HasOpEq &) const;
6273 bool operator<=>(const HasOpEq &) const;
6276 void use_spaceship()
6286 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('eachOf0')
"><a name="eachOf0Anchor
">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
6287 <tr><td colspan="4" class="doc
" id="eachOf0
"><pre>Matches if any of the given matchers matches.
6289 Unlike anyOf, eachOf will generate a match result for each
6290 matching submatcher.
6293 class A { int a; int b; };
6295 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a
")).bind("v
")),
6296 has(fieldDecl(hasName("b
")).bind("v
"))))
6297 will generate two results binding "v
", the first of which binds
6298 the field declaration of a, the second the field declaration of
6301 Usable as: Any Matcher
6305 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('findAll0')
"><a name="findAll0Anchor
">findAll</a></td><td>Matcher<*> Matcher</td></tr>
6306 <tr><td colspan="4" class="doc
" id="findAll0
"><pre>Matches if the node or any descendant matches.
6308 Generates results for each match.
6311 class A { class B {}; class C {}; };
6313 cxxRecordDecl(hasName("::A
"),
6314 findAll(cxxRecordDecl(isDefinition()).bind("m
")))
6315 will generate results for A, B and C.
6317 Usable as: Any Matcher
6321 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('forEachDescendant0')
"><a name="forEachDescendant0Anchor
">forEachDescendant</a></td><td>Matcher<*></td></tr>
6322 <tr><td colspan="4" class="doc
" id="forEachDescendant0
"><pre>Matches AST nodes that have descendant AST nodes that match the
6325 Example matches X, A, A::X, B, B::C, B::C::X
6326 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X
")))))
6328 class A { class X {}; }; // Matches A, because A::X is a class of name
6330 class B { class C { class X {}; }; };
6332 DescendantT must be an AST base type.
6334 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
6335 each result that matches instead of only on the first one.
6337 Note: Recursively combined ForEachDescendant can cause many matches:
6338 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
6339 forEachDescendant(cxxRecordDecl())
6341 will match 10 times (plus injected class name matches) on:
6342 class A { class B { class C { class D { class E {}; }; }; }; };
6344 Usable as: Any Matcher
6348 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('forEach0')
"><a name="forEach0Anchor
">forEach</a></td><td>Matcher<*></td></tr>
6349 <tr><td colspan="4" class="doc
" id="forEach0
"><pre>Matches AST nodes that have child AST nodes that match the
6352 Example matches X, Y, Y::X, Z::Y, Z::Y::X
6353 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X
")))
6355 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
6357 class Z { class Y { class X {}; }; }; // Does not match Z.
6359 ChildT must be an AST base type.
6361 As opposed to 'has', 'forEach' will cause a match for each result that
6362 matches instead of only on the first one.
6364 Usable as: Any Matcher
6368 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('hasAncestor0')
"><a name="hasAncestor0Anchor
">hasAncestor</a></td><td>Matcher<*></td></tr>
6369 <tr><td colspan="4" class="doc
" id="hasAncestor0
"><pre>Matches AST nodes that have an ancestor that matches the provided
6373 void f() { if (true) { int x = 42; } }
6374 void g() { for (;;) { int x = 43; } }
6375 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
6377 Usable as: Any Matcher
6381 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('hasDescendant0')
"><a name="hasDescendant0Anchor
">hasDescendant</a></td><td>Matcher<*></td></tr>
6382 <tr><td colspan="4" class="doc
" id="hasDescendant0
"><pre>Matches AST nodes that have descendant AST nodes that match the
6385 Example matches X, Y, Z
6386 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X
")))))
6387 class X {}; // Matches X, because X::X is a class of name X inside X.
6388 class Y { class X {}; };
6389 class Z { class Y { class X {}; }; };
6391 DescendantT must be an AST base type.
6393 Usable as: Any Matcher
6397 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('has0')
"><a name="has0Anchor
">has</a></td><td>Matcher<*></td></tr>
6398 <tr><td colspan="4" class="doc
" id="has0
"><pre>Matches AST nodes that have child AST nodes that match the
6401 Example matches X, Y
6402 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X
")))
6403 class X {}; // Matches X, because X::X is a class of name X inside X.
6404 class Y { class X {}; };
6405 class Z { class Y { class X {}; }; }; // Does not match Z.
6407 ChildT must be an AST base type.
6409 Usable as: Any Matcher
6410 Note that has is direct matcher, so it also matches things like implicit
6411 casts and paren casts. If you are matching with expr then you should
6412 probably consider using ignoringParenImpCasts like:
6413 has(ignoringParenImpCasts(expr())).
6417 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('hasParent0')
"><a name="hasParent0Anchor
">hasParent</a></td><td>Matcher<*></td></tr>
6418 <tr><td colspan="4" class="doc
" id="hasParent0
"><pre>Matches AST nodes that have a parent that matches the provided
6422 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
6423 compoundStmt(hasParent(ifStmt())) matches "{ int x =
43; }
".
6425 Usable as: Any Matcher
6429 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('invocation0')
"><a name="invocation0Anchor
">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr>
6430 <tr><td colspan="4" class="doc
" id="invocation0
"><pre>Matches function calls and constructor calls
6432 Because CallExpr and CXXConstructExpr do not share a common
6433 base class with API accessing arguments etc, AST Matchers for code
6434 which should match both are typically duplicated. This matcher
6435 removes the need for duplication.
6438 struct ConstructorTakesInt
6440 ConstructorTakesInt(int i) {}
6443 void callTakesInt(int i)
6454 ConstructorTakesInt cti(42);
6458 invocation(hasArgument(0, integerLiteral(equals(42))))
6459 matches the expression in both doCall and doConstruct
6463 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('optionally0')
"><a name="optionally0Anchor
">optionally</a></td><td>Matcher<*></td></tr>
6464 <tr><td colspan="4" class="doc
" id="optionally0
"><pre>Matches any node regardless of the submatcher.
6466 However, optionally will retain any bindings generated by the submatcher.
6467 Useful when additional information which may or may not present about a main
6468 matching node is desired.
6477 fieldDecl(hasName("bar
")).bind("var
")
6479 will produce a result binding for both "record
" and "var
".
6480 The matcher will produce a "record
" binding for even if there is no data
6481 member named "bar
" in that class.
6483 Usable as: Any Matcher
6487 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('traverse0')
"><a name="traverse0Anchor
">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr>
6488 <tr><td colspan="4" class="doc
" id="traverse0
"><pre>Causes all nested matchers to be matched with the specified traversal kind.
6496 traverse(TK_IgnoreUnlessSpelledInSource,
6497 varDecl(hasInitializer(floatLiteral().bind("init
")))
6499 matches the variable declaration with "init
" bound to the "3.0".
6503 <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>
6504 <tr><td colspan="4" class="doc
" id="hasCondition5
"><pre>Matches the condition expression of an if statement, for loop,
6505 switch statement or conditional operator.
6507 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6512 <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>
6513 <tr><td colspan="4" class="doc
" id="hasFalseExpression0
"><pre>Matches the false branch expression of a conditional operator
6514 (binary or ternary).
6522 <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>
6523 <tr><td colspan="4" class="doc
" id="hasTrueExpression0
"><pre>Matches the true branch expression of a conditional operator.
6525 Example 1 (conditional ternary operator): matches a
6528 Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6533 <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>
6534 <tr><td colspan="4" class="doc
" id="hasDeclaration15
"><pre>Matches a node if the declaration associated with that node
6535 matches the given matcher.
6537 The associated declaration is:
6538 - for type nodes, the declaration of the underlying type
6539 - for CallExpr, the declaration of the callee
6540 - for MemberExpr, the declaration of the referenced member
6541 - for CXXConstructExpr, the declaration of the constructor
6542 - for CXXNewExpr, the declaration of the operator new
6543 - for ObjCIvarExpr, the declaration of the ivar
6545 For type nodes, hasDeclaration will generally match the declaration of the
6550 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6551 typedefDecl. A common use case is to match the underlying, desugared type.
6552 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6553 varDecl(hasType(hasUnqualifiedDesugaredType(
6554 recordType(hasDeclaration(decl())))))
6555 In this matcher, the decl will match the CXXRecordDecl of class X.
6557 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>>,
6558 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>>,
6559 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>>,
6560 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>>,
6561 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>>,
6562 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>>,
6563 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
6567 <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>
6568 <tr><td colspan="4" class="doc
" id="hasBase0
"><pre>Matches the base expression of an array subscript expression.
6572 void f() { i[1] = 42; }
6573 arraySubscriptExpression(hasBase(implicitCastExpr(
6574 hasSourceExpression(declRefExpr()))))
6575 matches i[1] with the declRefExpr() matching i
6579 <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>
6580 <tr><td colspan="4" class="doc
" id="hasIndex0
"><pre>Matches the index expression of an array subscript expression.
6584 void f() { i[1] = 42; }
6585 arraySubscriptExpression(hasIndex(integerLiteral()))
6586 matches i[1] with the integerLiteral() matching 1
6590 <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>
6591 <tr><td colspan="4" class="doc
" id="hasLHS3
"><pre>Matches the left hand side of binary operator expressions.
6593 Example matches a (matcher = binaryOperator(hasLHS()))
6598 <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>
6599 <tr><td colspan="4" class="doc
" id="hasRHS3
"><pre>Matches the right hand side of binary operator expressions.
6601 Example matches b (matcher = binaryOperator(hasRHS()))
6606 <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>
6607 <tr><td colspan="4" class="doc
" id="hasElementType0
"><pre>Matches arrays and C99 complex types that have a specific element
6614 arrayType(hasElementType(builtinType()))
6617 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>>
6621 <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>
6622 <tr><td colspan="4" class="doc
" id="hasValueType0
"><pre>Matches atomic types with a specific value type.
6627 atomicType(hasValueType(isInteger()))
6628 matches "_Atomic(int) i
"
6630 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html
">AtomicType</a>>
6634 <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>
6635 <tr><td colspan="4" class="doc
" id="hasDeducedType0
"><pre>Matches AutoType nodes where the deduced type is a specific type.
6637 Note: There is no TypeLoc for the deduced type and thus no
6638 getDeducedLoc() matcher.
6643 autoType(hasDeducedType(isInteger()))
6646 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html
">AutoType</a>>
6650 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BaseUsingDecl.html
">BaseUsingDecl</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>
6651 <tr><td colspan="4" class="doc
" id="hasAnyUsingShadowDecl0
"><pre>Matches any using shadow declaration.
6654 namespace X { void b(); }
6656 usingDecl(hasAnyUsingShadowDecl(hasName("b
"))))
6657 matches using X::b </pre></td></tr>
6660 <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>
6661 <tr><td colspan="4" class="doc
" id="hasEitherOperand0
"><pre>Matches if either the left hand side or the right hand side of a
6662 binary operator or fold expression matches.
6666 <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>
6667 <tr><td colspan="4" class="doc
" id="hasLHS0
"><pre>Matches the left hand side of binary operator expressions.
6669 Example matches a (matcher = binaryOperator(hasLHS()))
6674 <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>
6675 <tr><td colspan="4" class="doc
" id="hasOperands0
"><pre>Matches if both matchers match with opposite sides of the binary operator
6678 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6679 integerLiteral(equals(2)))
6687 <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>
6688 <tr><td colspan="4" class="doc
" id="hasRHS0
"><pre>Matches the right hand side of binary operator expressions.
6690 Example matches b (matcher = binaryOperator(hasRHS()))
6695 <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>
6696 <tr><td colspan="4" class="doc
" id="forDecomposition0
"><pre>Matches the DecompositionDecl the binding belongs to.
6702 auto &[f, s, t] = arr;
6707 bindingDecl(hasName("f
"),
6708 forDecomposition(decompositionDecl())
6709 matches 'f' in 'auto &[f, s, t]'.
6713 <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>
6714 <tr><td colspan="4" class="doc
" id="hasAnyParameter2
"><pre>Matches any parameter of a function or an ObjC method declaration or a
6717 Does not match the 'this' parameter of a method.
6720 class X { void f(int x, int y, int z) {} };
6721 cxxMethodDecl(hasAnyParameter(hasName("y
")))
6722 matches f(int x, int y, int z) {}
6723 with hasAnyParameter(...)
6726 For ObjectiveC, given
6727 @interface I - (void) f:(int) y; @end
6729 the matcher objcMethodDecl(hasAnyParameter(hasName("y
")))
6730 matches the declaration of method f with hasParameter
6734 b = ^(int y) { printf("%d
", y) };
6736 the matcher blockDecl(hasAnyParameter(hasName("y
")))
6737 matches the declaration of the block b with hasParameter
6742 <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>
6743 <tr><td colspan="4" class="doc
" id="hasParameter2
"><pre>Matches the n'th parameter of a function or an ObjC method
6744 declaration or a block.
6747 class X { void f(int x) {} };
6748 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6750 with hasParameter(...)
6753 For ObjectiveC, given
6754 @interface I - (void) f:(int) y; @end
6756 the matcher objcMethodDecl(hasParameter(0, hasName("y
")))
6757 matches the declaration of method f with hasParameter
6762 <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>
6763 <tr><td colspan="4" class="doc
" id="hasTypeLoc0
"><pre>Matches if the type location of a node matches the inner matcher.
6767 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
6771 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
6774 struct Foo { Foo(int, int); };
6776 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
6779 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>>,
6780 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>>,
6781 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>>,
6782 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
6783 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
6784 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>>,
6785 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>>,
6786 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
6790 <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>
6791 <tr><td colspan="4" class="doc
" id="pointee0
"><pre>Narrows PointerType (and similar) matchers to those where the
6792 pointee matches a given matcher.
6798 pointerType(pointee(isConstQualified(), isInteger()))
6799 matches "int const *b
"
6801 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>>,
6802 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>>
6806 <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>
6807 <tr><td colspan="4" class="doc
" id="hasTypeLoc1
"><pre>Matches if the type location of a node matches the inner matcher.
6811 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
6815 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
6818 struct Foo { Foo(int, int); };
6820 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
6823 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>>,
6824 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>>,
6825 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>>,
6826 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
6827 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
6828 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>>,
6829 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>>,
6830 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
6834 <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>
6835 <tr><td colspan="4" class="doc
" id="hasType8
"><pre>Overloaded to match the declaration of the expression's or value
6838 In case of a value declaration (for example a variable declaration),
6839 this resolves one layer of indirection. For example, in the value
6840 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
6841 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
6844 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
6845 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
6846 and friend class X (matcher = friendDecl(hasType("X
"))
6847 and public virtual X (matcher = cxxBaseSpecifier(hasType(
6848 cxxRecordDecl(hasName("X
"))))
6850 void y(X &x) { x; X z; }
6851 class Y { friend class X; };
6852 class Z : public virtual X {};
6854 Example matches class Derived
6855 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
6857 class Derived : Base {};
6859 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>>,
6860 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
6864 <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>
6865 <tr><td colspan="4" class="doc
" id="hasType4
"><pre>Matches if the expression's or declaration's type matches a type
6868 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
6869 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
6870 and U (matcher = typedefDecl(hasType(asString("int
")))
6871 and friend class X (matcher = friendDecl(hasType("X
"))
6872 and public virtual X (matcher = cxxBaseSpecifier(hasType(
6873 asString("class X
")))
6875 void y(X &x) { x; X z; }
6877 class Y { friend class X; };
6878 class Z : public virtual X {};
6882 <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>
6883 <tr><td colspan="4" class="doc
" id="forEachArgumentWithParam1
"><pre>Matches all arguments and their respective ParmVarDecl.
6890 forEachArgumentWithParam(
6891 declRefExpr(to(varDecl(hasName("y
")))),
6892 parmVarDecl(hasType(isInteger()))
6895 with declRefExpr(...)
6897 and parmVarDecl(...)
6902 <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>
6903 <tr><td colspan="4" class="doc
" id="forEachArgumentWithParamType1
"><pre>Matches all arguments and their respective types for a CallExpr or
6904 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6905 it works on calls through function pointers as well.
6907 The difference is, that function pointers do not provide access to a
6908 ParmVarDecl, but only the QualType for each argument.
6914 void (*f_ptr)(int) = f;
6917 forEachArgumentWithParamType(
6918 declRefExpr(to(varDecl(hasName("y
")))),
6919 qualType(isInteger()).bind("type)
6921 matches f(y) and f_ptr(y)
6922 with declRefExpr(...)
6929 <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>
6930 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6931 expression, or an ObjC-message-send expression.
6934 void x(int, int, int) { int y; x(
1, y,
42); }
6935 callExpr(hasAnyArgument(declRefExpr()))
6937 with hasAnyArgument(...)
6940 For ObjectiveC, given
6941 @interface I - (void) f:(int) y; @end
6942 void foo(I *i) { [i f:
12]; }
6943 objcMessageExpr(hasAnyArgument(integerLiteral(equals(
12))))
6948 <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>
6949 <tr><td colspan=
"4" class=
"doc" id=
"hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6952 Example matches y in x(y)
6953 (matcher = callExpr(hasArgument(
0, declRefExpr())))
6954 void x(int) { int y; x(y); }
6958 <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>
6959 <tr><td colspan=
"4" class=
"doc" id=
"hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6960 matches the given matcher.
6962 The associated declaration is:
6963 - for type nodes, the declaration of the underlying type
6964 - for CallExpr, the declaration of the callee
6965 - for MemberExpr, the declaration of the referenced member
6966 - for CXXConstructExpr, the declaration of the constructor
6967 - for CXXNewExpr, the declaration of the operator new
6968 - for ObjCIvarExpr, the declaration of the ivar
6970 For type nodes, hasDeclaration will generally match the declaration of the
6975 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6976 typedefDecl. A common use case is to match the underlying, desugared type.
6977 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6978 varDecl(hasType(hasUnqualifiedDesugaredType(
6979 recordType(hasDeclaration(decl())))))
6980 In this matcher, the decl will match the CXXRecordDecl of class X.
6982 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>>,
6983 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>>,
6984 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>>,
6985 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>>,
6986 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>>,
6987 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>>,
6988 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType
</a>>
6992 <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>
6993 <tr><td colspan=
"4" class=
"doc" id=
"forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6996 class A { A() : i(
42), j(
42) {} int i; int j; };
6997 cxxConstructorDecl(forEachConstructorInitializer(
6998 forField(decl().bind(
"x"))
7000 will trigger two matches, binding for 'i' and 'j' respectively.
7004 <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>
7005 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
7012 cxxRecordDecl(has(cxxConstructorDecl(
7013 hasAnyConstructorInitializer(anything())
7015 record matches Foo, hasAnyConstructorInitializer matches foo_(
1)
7019 <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>
7020 <tr><td colspan=
"4" class=
"doc" id=
"forField0"><pre>Matches the field declaration of a constructor initializer.
7027 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
7028 forField(hasName(
"foo_"))))))
7030 with forField matching foo_
7034 <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>
7035 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
7039 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7043 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7046 struct Foo { Foo(int, int); };
7048 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7051 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>>,
7052 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>>,
7053 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>>,
7054 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7055 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7056 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>>,
7057 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>>,
7058 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7062 <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>
7063 <tr><td colspan=
"4" class=
"doc" id=
"withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
7070 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
7071 withInitializer(integerLiteral(equals(
1)))))))
7073 with withInitializer matching (
1)
7077 <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>
7078 <tr><td colspan=
"4" class=
"doc" id=
"hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
7079 given matcher. Implicit object expressions are included; that is, it matches
7080 use of implicit `this`.
7085 int f(X x) { x.m; return m; }
7087 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName(
"X")))))
7088 matches `x.m`, but not `m`; however,
7089 memberExpr(hasObjectExpression(hasType(pointsTo(
7090 cxxRecordDecl(hasName(
"X"))))))
7091 matches `m` (aka. `this-
>m`), but not `x.m`.
7095 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</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_1Stmt.html">Stmt
</a>> InnerMatcher
</td></tr>
7096 <tr><td colspan=
"4" class=
"doc" id=
"callee1"><pre>Matches if the call or fold expression's callee expression matches.
7099 class Y { void x() { this-
>x(); x(); Y y; y.x(); } };
7101 callExpr(callee(expr()))
7102 matches this-
>x(), x(), y.x(), f()
7104 matching this-
>x, x, y.x, f respectively
7107 template
<typename... Args
>
7108 auto sum(Args... args) {
7109 return (
0 + ... + args);
7112 template
<typename... Args
>
7113 auto multiply(Args... args) {
7114 return (args * ... *
1);
7116 cxxFoldExpr(callee(expr()))
7117 matches (args * ... *
1)
7121 Note: Callee cannot take the more general internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>>
7122 because this introduces ambiguous overloads with calls to Callee taking a
7123 internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>, as the matcher hierarchy is purely
7124 implemented in terms of implicit casts.
7128 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</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>
7129 <tr><td colspan=
"4" class=
"doc" id=
"hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
7130 binary operator or fold expression matches.
7134 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasFoldInit0')"><a name=
"hasFoldInit0Anchor">hasFoldInit
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMacher
</td></tr>
7135 <tr><td colspan=
"4" class=
"doc" id=
"hasFoldInit0"><pre>Matches the operand that does not contain the parameter pack.
7137 Example matches `(
0 + ... + args)` and `(args * ... *
1)`
7138 (matcher = cxxFoldExpr(hasFoldInit(expr())))
7139 with hasFoldInit(...)
7140 matching `
0` and `
1` respectively
7141 template
<typename... Args
>
7142 auto sum(Args... args) {
7143 return (
0 + ... + args);
7146 template
<typename... Args
>
7147 auto multiply(Args... args) {
7148 return (args * ... *
1);
7153 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasLHS4')"><a name=
"hasLHS4Anchor">hasLHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7154 <tr><td colspan=
"4" class=
"doc" id=
"hasLHS4"><pre>Matches the left hand side of binary operator expressions.
7156 Example matches a (matcher = binaryOperator(hasLHS()))
7161 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</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>
7162 <tr><td colspan=
"4" class=
"doc" id=
"hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator
7165 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(
1),
7166 integerLiteral(equals(
2)))
7174 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasPattern0')"><a name=
"hasPattern0Anchor">hasPattern
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMacher
</td></tr>
7175 <tr><td colspan=
"4" class=
"doc" id=
"hasPattern0"><pre>Matches the operand that contains the parameter pack.
7177 Example matches `(
0 + ... + args)`
7178 (matcher = cxxFoldExpr(hasPattern(expr())))
7179 with hasPattern(...)
7181 template
<typename... Args
>
7182 auto sum(Args... args) {
7183 return (
0 + ... + args);
7186 template
<typename... Args
>
7187 auto multiply(Args... args) {
7188 return (args * ... *
1);
7193 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasRHS4')"><a name=
"hasRHS4Anchor">hasRHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7194 <tr><td colspan=
"4" class=
"doc" id=
"hasRHS4"><pre>Matches the right hand side of binary operator expressions.
7196 Example matches b (matcher = binaryOperator(hasRHS()))
7201 <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>
7202 <tr><td colspan=
"4" class=
"doc" id=
"hasBody3"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
7203 definition that has a given body. Note that in case of functions or
7204 coroutines this matcher only matches the definition itself and not the
7205 other declarations of the same function or coroutine.
7209 forStmt(hasBody(compoundStmt()))
7210 matches 'for (;;) {}'
7217 functionDecl(hasBody(compoundStmt()))
7218 matches 'void f() {}'
7221 but does not match 'void f();'
7225 <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>
7226 <tr><td colspan=
"4" class=
"doc" id=
"hasInitStatement2"><pre>Matches selection statements with initializer.
7230 if (int i = foobar(); i
> 0) {}
7231 switch (int i = foobar(); i) {}
7232 for (auto
& a = get_range(); auto
& x : a) {}
7235 if (foobar()
> 0) {}
7236 switch (foobar()) {}
7237 for (auto
& x : get_range()) {}
7239 ifStmt(hasInitStatement(anything()))
7240 matches the if statement in foo but not in bar.
7241 switchStmt(hasInitStatement(anything()))
7242 matches the switch statement in foo but not in bar.
7243 cxxForRangeStmt(hasInitStatement(anything()))
7244 matches the range for statement in foo but not in bar.
7248 <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>
7249 <tr><td colspan=
"4" class=
"doc" id=
"hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
7252 forStmt(hasLoopVariable(anything()))
7258 <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>
7259 <tr><td colspan=
"4" class=
"doc" id=
"hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
7262 forStmt(hasRangeInit(anything()))
7268 <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>
7269 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
7273 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7277 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7280 struct Foo { Foo(int, int); };
7282 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7285 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>>,
7286 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>>,
7287 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>>,
7288 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7289 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7290 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>>,
7291 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>>,
7292 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7296 <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>
7297 <tr><td colspan=
"4" class=
"doc" id=
"onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
7298 `on`, matches the argument directly without stripping away anything.
7301 class Y { public: void m(); };
7303 class X : public Y { void g(); };
7304 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
7305 cxxMemberCallExpr(onImplicitObjectArgument(hasType(
7306 cxxRecordDecl(hasName(
"Y")))))
7307 matches `y.m()`, `x.m()` and (`g()).m()`, but not `x.g()`).
7308 cxxMemberCallExpr(on(callExpr()))
7309 only matches `(g()).m()` (the parens are ignored).
7311 FIXME: Overload to allow directly matching types?
7315 <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>
7316 <tr><td colspan=
"4" class=
"doc" id=
"on0"><pre>Matches on the implicit object argument of a member call expression, after
7317 stripping off any parentheses or implicit casts.
7320 class Y { public: void m(); };
7322 class X : public Y {};
7323 void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
7324 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName(
"Y")))))
7325 matches `y.m()` and `(g()).m()`.
7326 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName(
"X")))))
7328 cxxMemberCallExpr(on(callExpr()))
7329 matches `(g()).m()`.
7331 FIXME: Overload to allow directly matching types?
7335 <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>
7336 <tr><td colspan=
"4" class=
"doc" id=
"thisPointerType1"><pre>Overloaded to match the type's declaration.
7340 <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>
7341 <tr><td colspan=
"4" class=
"doc" id=
"thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
7342 matches the InnerMatcher, or is a pointer to a type that matches the
7346 class Y { public: void m(); };
7347 class X : public Y { void g(); };
7348 void z() { Y y; y.m(); Y *p; p-
>m(); X x; x.m(); x.g(); }
7349 cxxMemberCallExpr(thisPointerType(hasDeclaration(
7350 cxxRecordDecl(hasName(
"Y")))))
7351 matches `y.m()`, `p-
>m()` and `x.m()`.
7352 cxxMemberCallExpr(thisPointerType(hasDeclaration(
7353 cxxRecordDecl(hasName(
"X")))))
7358 <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>
7359 <tr><td colspan=
"4" class=
"doc" id=
"forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
7360 produce multiple matches.
7363 class A { virtual void f(); };
7364 class B : public A { void f(); };
7365 class C : public B { void f(); };
7366 cxxMethodDecl(ofClass(hasName(
"C")),
7367 forEachOverridden(cxxMethodDecl().bind(
"b"))).bind(
"d")
7368 matches once, with
"b" binding
"A::f" and
"d" binding
"C::f" (Note
7369 that B::f is not overridden by C::f).
7371 The check can produce multiple matches in case of multiple inheritance, e.g.
7372 class A1 { virtual void f(); };
7373 class A2 { virtual void f(); };
7374 class C : public A1, public A2 { void f(); };
7375 cxxMethodDecl(ofClass(hasName(
"C")),
7376 forEachOverridden(cxxMethodDecl().bind(
"b"))).bind(
"d")
7377 matches twice, once with
"b" binding
"A1::f" and
"d" binding
"C::f", and
7378 once with
"b" binding
"A2::f" and
"d" binding
"C::f".
7382 <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>
7383 <tr><td colspan=
"4" class=
"doc" id=
"ofClass0"><pre>Matches the class declaration that the given method declaration
7386 FIXME: Generalize this for other kinds of declarations.
7387 FIXME: What other kind of declarations would we need to generalize
7390 Example matches A() in the last line
7391 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
7392 ofClass(hasName(
"A"))))))
7401 <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>
7402 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
7405 MyClass *p1 = new (Storage) MyClass();
7406 cxxNewExpr(hasAnyPlacementArg(anything()))
7407 matches the expression 'new (Storage,
16) MyClass()'.
7411 <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>
7412 <tr><td colspan=
"4" class=
"doc" id=
"hasArraySize0"><pre>Matches array new expressions with a given array size.
7415 MyClass *p1 = new MyClass[
10];
7416 cxxNewExpr(hasArraySize(integerLiteral(equals(
10))))
7417 matches the expression 'new MyClass[
10]'.
7421 <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>
7422 <tr><td colspan=
"4" class=
"doc" id=
"hasDeclaration12"><pre>Matches a node if the declaration associated with that node
7423 matches the given matcher.
7425 The associated declaration is:
7426 - for type nodes, the declaration of the underlying type
7427 - for CallExpr, the declaration of the callee
7428 - for MemberExpr, the declaration of the referenced member
7429 - for CXXConstructExpr, the declaration of the constructor
7430 - for CXXNewExpr, the declaration of the operator new
7431 - for ObjCIvarExpr, the declaration of the ivar
7433 For type nodes, hasDeclaration will generally match the declaration of the
7438 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7439 typedefDecl. A common use case is to match the underlying, desugared type.
7440 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7441 varDecl(hasType(hasUnqualifiedDesugaredType(
7442 recordType(hasDeclaration(decl())))))
7443 In this matcher, the decl will match the CXXRecordDecl of class X.
7445 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>>,
7446 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>>,
7447 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>>,
7448 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>>,
7449 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>>,
7450 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>>,
7451 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType
</a>>
7455 <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>
7456 <tr><td colspan=
"4" class=
"doc" id=
"hasPlacementArg0"><pre>Matches placement new expression arguments.
7459 MyClass *p1 = new (Storage,
16) MyClass();
7460 cxxNewExpr(hasPlacementArg(
1, integerLiteral(equals(
16))))
7461 matches the expression 'new (Storage,
16) MyClass()'.
7465 <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>
7466 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
7470 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7474 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7477 struct Foo { Foo(int, int); };
7479 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7482 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>>,
7483 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>>,
7484 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>>,
7485 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7486 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7487 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>>,
7488 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>>,
7489 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7493 <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>
7494 <tr><td colspan=
"4" class=
"doc" id=
"hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
7495 binary operator or fold expression matches.
7499 <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>
7500 <tr><td colspan=
"4" class=
"doc" id=
"hasLHS1"><pre>Matches the left hand side of binary operator expressions.
7502 Example matches a (matcher = binaryOperator(hasLHS()))
7507 <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>
7508 <tr><td colspan=
"4" class=
"doc" id=
"hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator
7511 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(
1),
7512 integerLiteral(equals(
2)))
7520 <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>
7521 <tr><td colspan=
"4" class=
"doc" id=
"hasRHS1"><pre>Matches the right hand side of binary operator expressions.
7523 Example matches b (matcher = binaryOperator(hasRHS()))
7528 <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>
7529 <tr><td colspan=
"4" class=
"doc" id=
"hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
7531 Example matches true (matcher = hasUnaryOperand(
7532 cxxBoolLiteral(equals(true))))
7537 <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>
7538 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
7541 matcher hasAnyBase(hasType(cxxRecordDecl(hasName(
"SpecialBase"))))
7546 class Proxy : SpecialBase {}; // matches Proxy
7547 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived
7549 FIXME: Refactor this and isDerivedFrom to reuse implementation.
7553 <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>
7554 <tr><td colspan=
"4" class=
"doc" id=
"hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
7557 matcher hasDirectBase(hasType(cxxRecordDecl(hasName(
"SpecialBase"))))
7562 class Proxy : SpecialBase {}; // matches Proxy
7563 class IndirectlyDerived : Proxy {}; // doesn't match
7567 <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>
7568 <tr><td colspan=
"4" class=
"doc" id=
"hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
7571 class A { void func(); };
7572 class B { void member(); };
7574 cxxRecordDecl(hasMethod(hasName(
"func"))) matches the declaration of
7579 <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>
7580 <tr><td colspan=
"4" class=
"doc" id=
"isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
7581 matching Base, or Objective-C classes that directly or indirectly
7582 subclass a class matching Base.
7584 Note that a class is not considered to be derived from itself.
7586 Example matches Y, Z, C (Base == hasName(
"X"))
7588 class Y : public X {}; // directly derived
7589 class Z : public Y {}; // indirectly derived
7592 class C : public B {}; // derived from a typedef of X
7594 In the following example, Bar matches isDerivedFrom(hasName(
"X")):
7597 class Bar : public Foo {}; // derived from a type that X is a typedef of
7599 In the following example, Bar matches isDerivedFrom(hasName(
"NSObject"))
7600 @interface NSObject @end
7601 @interface Bar : NSObject @end
7603 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>>
7607 <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>
7608 <tr><td colspan=
"4" class=
"doc" id=
"isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7611 Note that a class is not considered to be derived from itself.
7613 Example matches Y, C (Base == hasName(
"X"))
7615 class Y : public X {}; // directly derived
7616 class Z : public Y {}; // indirectly derived
7619 class C : public B {}; // derived from a typedef of X
7621 In the following example, Bar matches isDerivedFrom(hasName(
"X")):
7624 class Bar : public Foo {}; // derived from a type that X is a typedef of
7628 <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>
7629 <tr><td colspan=
"4" class=
"doc" id=
"isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7634 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasEitherOperand3')"><a name=
"hasEitherOperand3Anchor">hasEitherOperand
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7635 <tr><td colspan=
"4" class=
"doc" id=
"hasEitherOperand3"><pre>Matches if either the left hand side or the right hand side of a
7636 binary operator or fold expression matches.
7640 <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>
7641 <tr><td colspan=
"4" class=
"doc" id=
"hasLHS2"><pre>Matches the left hand side of binary operator expressions.
7643 Example matches a (matcher = binaryOperator(hasLHS()))
7648 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasOperands3')"><a name=
"hasOperands3Anchor">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>
7649 <tr><td colspan=
"4" class=
"doc" id=
"hasOperands3"><pre>Matches if both matchers match with opposite sides of the binary operator
7652 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(
1),
7653 integerLiteral(equals(
2)))
7661 <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>
7662 <tr><td colspan=
"4" class=
"doc" id=
"hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7664 Example matches b (matcher = binaryOperator(hasRHS()))
7669 <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>
7670 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7674 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7678 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7681 struct Foo { Foo(int, int); };
7683 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7686 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>>,
7687 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>>,
7688 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>>,
7689 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7690 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7691 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>>,
7692 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>>,
7693 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7697 <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>
7698 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7699 expression, or an ObjC-message-send expression.
7702 void x(int, int, int) { int y; x(
1, y,
42); }
7703 callExpr(hasAnyArgument(declRefExpr()))
7705 with hasAnyArgument(...)
7708 For ObjectiveC, given
7709 @interface I - (void) f:(int) y; @end
7710 void foo(I *i) { [i f:
12]; }
7711 objcMessageExpr(hasAnyArgument(integerLiteral(equals(
12))))
7716 <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>
7717 <tr><td colspan=
"4" class=
"doc" id=
"hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7720 Example matches y in x(y)
7721 (matcher = callExpr(hasArgument(
0, declRefExpr())))
7722 void x(int) { int y; x(y); }
7726 <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>
7727 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7731 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7735 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7738 struct Foo { Foo(int, int); };
7740 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7743 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>>,
7744 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>>,
7745 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>>,
7746 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7747 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7748 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>>,
7749 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>>,
7750 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7754 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('callee3')"><a name=
"callee3Anchor">callee
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>> InnerMatcher
</td></tr>
7755 <tr><td colspan=
"4" class=
"doc" id=
"callee3"><pre>Matches
1) if the call expression's callee's declaration matches the
7756 given matcher; or
2) if the Obj-C message expression's callee's method
7757 declaration matches the given matcher.
7759 Example matches y.x() (matcher = callExpr(callee(
7760 cxxMethodDecl(hasName(
"x")))))
7761 class Y { public: void x(); };
7762 void z() { Y y; y.x(); }
7764 Example
2. Matches [I foo] with
7765 objcMessageExpr(callee(objcMethodDecl(hasName(
"foo"))))
7767 @interface I: NSObject
7775 <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>
7776 <tr><td colspan=
"4" class=
"doc" id=
"callee0"><pre>Matches if the call or fold expression's callee expression matches.
7779 class Y { void x() { this-
>x(); x(); Y y; y.x(); } };
7781 callExpr(callee(expr()))
7782 matches this-
>x(), x(), y.x(), f()
7784 matching this-
>x, x, y.x, f respectively
7787 template
<typename... Args
>
7788 auto sum(Args... args) {
7789 return (
0 + ... + args);
7792 template
<typename... Args
>
7793 auto multiply(Args... args) {
7794 return (args * ... *
1);
7796 cxxFoldExpr(callee(expr()))
7797 matches (args * ... *
1)
7801 Note: Callee cannot take the more general internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>>
7802 because this introduces ambiguous overloads with calls to Callee taking a
7803 internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>, as the matcher hierarchy is purely
7804 implemented in terms of implicit casts.
7808 <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>
7809 <tr><td colspan=
"4" class=
"doc" id=
"forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7816 forEachArgumentWithParam(
7817 declRefExpr(to(varDecl(hasName(
"y")))),
7818 parmVarDecl(hasType(isInteger()))
7821 with declRefExpr(...)
7823 and parmVarDecl(...)
7828 <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>
7829 <tr><td colspan=
"4" class=
"doc" id=
"forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7830 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7831 it works on calls through function pointers as well.
7833 The difference is, that function pointers do not provide access to a
7834 ParmVarDecl, but only the QualType for each argument.
7840 void (*f_ptr)(int) = f;
7843 forEachArgumentWithParamType(
7844 declRefExpr(to(varDecl(hasName(
"y")))),
7845 qualType(isInteger()).bind(
"type)
7847 matches f(y) and f_ptr(y)
7848 with declRefExpr(...)
7855 <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>
7856 <tr><td colspan="4" class="doc
" id="hasAnyArgument0
"><pre>Matches any argument of a call expression or a constructor call
7857 expression, or an ObjC-message-send expression.
7860 void x(int, int, int) { int y; x(1, y, 42); }
7861 callExpr(hasAnyArgument(declRefExpr()))
7863 with hasAnyArgument(...)
7866 For ObjectiveC, given
7867 @interface I - (void) f:(int) y; @end
7868 void foo(I *i) { [i f:12]; }
7869 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7874 <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>
7875 <tr><td colspan="4" class="doc
" id="hasArgument0
"><pre>Matches the n'th argument of a call expression or a constructor
7878 Example matches y in x(y)
7879 (matcher = callExpr(hasArgument(0, declRefExpr())))
7880 void x(int) { int y; x(y); }
7884 <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>
7885 <tr><td colspan="4" class="doc
" id="hasDeclaration14
"><pre>Matches a node if the declaration associated with that node
7886 matches the given matcher.
7888 The associated declaration is:
7889 - for type nodes, the declaration of the underlying type
7890 - for CallExpr, the declaration of the callee
7891 - for MemberExpr, the declaration of the referenced member
7892 - for CXXConstructExpr, the declaration of the constructor
7893 - for CXXNewExpr, the declaration of the operator new
7894 - for ObjCIvarExpr, the declaration of the ivar
7896 For type nodes, hasDeclaration will generally match the declaration of the
7901 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7902 typedefDecl. A common use case is to match the underlying, desugared type.
7903 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7904 varDecl(hasType(hasUnqualifiedDesugaredType(
7905 recordType(hasDeclaration(decl())))))
7906 In this matcher, the decl will match the CXXRecordDecl of class X.
7908 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>>,
7909 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>>,
7910 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>>,
7911 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>>,
7912 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>>,
7913 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>>,
7914 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
7918 <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>
7919 <tr><td colspan="4" class="doc
" id="hasCaseConstant0
"><pre>If the given case statement does not use the GNU case range
7920 extension, matches the constant given in the statement.
7923 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7924 caseStmt(hasCaseConstant(integerLiteral()))
7929 <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>
7930 <tr><td colspan="4" class="doc
" id="hasSourceExpression0
"><pre>Matches if the cast's source expression
7931 or opaque value's source expression matches the given matcher.
7933 Example 1: matches "a string
"
7934 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7935 class URL { URL(string); };
7936 URL url = "a string
";
7938 Example 2: matches 'b' (matcher =
7939 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7944 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument0')
"><a name="forEachTemplateArgument0Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
7945 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument0
"><pre>Matches templateSpecializationType, class template specialization,
7946 variable template specialization, and function template specialization
7947 nodes where the template argument matches the inner matcher. This matcher
7948 may produce multiple matches.
7951 template <typename T, unsigned N, unsigned M>
7954 constexpr unsigned R = 2;
7955 Matrix<int, R * 2, R * 4> M;
7957 template <typename T, typename U>
7958 void f(T&& t, U&& u) {}
7962 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
7963 matches twice, with expr() matching 'R * 2' and 'R * 4'
7964 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
7965 matches the specialization f<unsigned, bool> twice, for 'unsigned'
7970 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc0')
"><a name="hasAnyTemplateArgumentLoc0Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
7971 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc0
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
7972 variable template specializations, and function template specializations
7973 that have at least one `TemplateArgumentLoc` matching the given
7977 template<typename T> class A {};
7979 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
7980 hasTypeLoc(loc(asString("int
")))))))
7981 matches `A<int> a`.
7985 <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>
7986 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument0
"><pre>Matches templateSpecializationTypes, class template specializations,
7987 variable template specializations, and function template specializations
7988 that have at least one TemplateArgument matching the given InnerMatcher.
7991 template<typename T> class A {};
7992 template<> class A<double> {};
7995 template<typename T> f() {};
7996 void func() { f<int>(); };
7998 classTemplateSpecializationDecl(hasAnyTemplateArgument(
7999 refersToType(asString("int
"))))
8000 matches the specialization A<int>
8002 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
8003 matches the specialization f<int>
8007 <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>
8008 <tr><td colspan="4" class="doc
" id="hasSpecializedTemplate0
"><pre>Matches the specialized template of a specialization declaration.
8011 template<typename T> class A {}; #1
8012 template<> class A<int> {}; #2
8013 classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
8014 matches '#2' with classTemplateDecl() matching the class template
8015 declaration of 'A' at #1.
8019 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc0')
"><a name="hasTemplateArgumentLoc0Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8020 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc0
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8021 variable template specializations, and function template specializations
8022 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
8025 template<typename T, typename U> class A {};
8026 A<double, int> b;
8027 A<int, double> c;
8028 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
8029 hasTypeLoc(loc(asString("double
")))))))
8030 matches `A<double, int> b`, but not `A<int, double> c`.
8034 <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>
8035 <tr><td colspan="4" class="doc
" id="hasTemplateArgument0
"><pre>Matches templateSpecializationType, class template specializations,
8036 variable template specializations, and function template specializations
8037 where the n'th TemplateArgument matches the given InnerMatcher.
8040 template<typename T, typename U> class A {};
8041 A<bool, int> b;
8042 A<int, bool> c;
8044 template<typename T> void f() {}
8045 void func() { f<int>(); };
8046 classTemplateSpecializationDecl(hasTemplateArgument(
8047 1, refersToType(asString("int
"))))
8048 matches the specialization A<bool, int>
8050 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
8051 matches the specialization f<int>
8055 <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>
8056 <tr><td colspan="4" class="doc
" id="hasElementType1
"><pre>Matches arrays and C99 complex types that have a specific element
8063 arrayType(hasElementType(builtinType()))
8066 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>>
8070 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</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>
8071 <tr><td colspan="4" class="doc
" id="hasTypeLoc7
"><pre>Matches if the type location of a node matches the inner matcher.
8075 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
8079 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
8082 struct Foo { Foo(int, int); };
8084 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
8087 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>>,
8088 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>>,
8089 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>>,
8090 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
8091 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
8092 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>>,
8093 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>>,
8094 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
8098 <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>
8099 <tr><td colspan="4" class="doc
" id="hasAnySubstatement0
"><pre>Matches compound statements where at least one substatement matches
8100 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8104 hasAnySubstatement(compoundStmt())
8105 matches '{ {}; 1+2; }'
8111 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoroutineBodyStmt.html
">CoroutineBodyStmt</a>></td><td class="name
" onclick="toggle('hasBody5')
"><a name="hasBody5Anchor
">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8112 <tr><td colspan="4" class="doc
" id="hasBody5
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8113 definition that has a given body. Note that in case of functions or
8114 coroutines this matcher only matches the definition itself and not the
8115 other declarations of the same function or coroutine.
8119 forStmt(hasBody(compoundStmt()))
8120 matches 'for (;;) {}'
8127 functionDecl(hasBody(compoundStmt()))
8128 matches 'void f() {}'
8131 but does not match 'void f();'
8135 <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>
8136 <tr><td colspan="4" class="doc
" id="hasDecayedType0
"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
8140 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc3')
"><a name="hasAnyTemplateArgumentLoc3Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8141 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc3
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8142 variable template specializations, and function template specializations
8143 that have at least one `TemplateArgumentLoc` matching the given
8147 template<typename T> class A {};
8149 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
8150 hasTypeLoc(loc(asString("int
")))))))
8151 matches `A<int> a`.
8155 <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>
8156 <tr><td colspan="4" class="doc
" id="hasDeclaration11
"><pre>Matches a node if the declaration associated with that node
8157 matches the given matcher.
8159 The associated declaration is:
8160 - for type nodes, the declaration of the underlying type
8161 - for CallExpr, the declaration of the callee
8162 - for MemberExpr, the declaration of the referenced member
8163 - for CXXConstructExpr, the declaration of the constructor
8164 - for CXXNewExpr, the declaration of the operator new
8165 - for ObjCIvarExpr, the declaration of the ivar
8167 For type nodes, hasDeclaration will generally match the declaration of the
8172 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8173 typedefDecl. A common use case is to match the underlying, desugared type.
8174 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8175 varDecl(hasType(hasUnqualifiedDesugaredType(
8176 recordType(hasDeclaration(decl())))))
8177 In this matcher, the decl will match the CXXRecordDecl of class X.
8179 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>>,
8180 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>>,
8181 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>>,
8182 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>>,
8183 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>>,
8184 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>>,
8185 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
8189 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc3')
"><a name="hasTemplateArgumentLoc3Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8190 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc3
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8191 variable template specializations, and function template specializations
8192 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
8195 template<typename T, typename U> class A {};
8196 A<double, int> b;
8197 A<int, double> c;
8198 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
8199 hasTypeLoc(loc(asString("double
")))))))
8200 matches `A<double, int> b`, but not `A<int, double> c`.
8204 <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>> Inner</td></tr>
8205 <tr><td colspan="4" class="doc
" id="throughUsingDecl0
"><pre>Matches if a node refers to a declaration through a specific
8206 using shadow declaration.
8209 namespace a { int f(); }
8212 declRefExpr(throughUsingDecl(anything()))
8215 namespace a { class X{}; }
8218 typeLoc(loc(usingType(throughUsingDecl(anything()))))
8221 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
8225 <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>
8226 <tr><td colspan="4" class="doc
" id="to0
"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
8229 Example matches x in if(x)
8230 (matcher = declRefExpr(to(varDecl(hasName("x
")))))
8236 <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>
8237 <tr><td colspan="4" class="doc
" id="containsDeclaration0
"><pre>Matches the n'th declaration of a declaration statement.
8239 Note that this does not work for global declarations because the AST
8240 breaks up multiple-declaration DeclStmt's into multiple single-declaration
8242 Example: Given non-global declarations
8246 declStmt(containsDeclaration(
8247 0, varDecl(hasInitializer(anything()))))
8248 matches only 'int d = 2, e;', and
8249 declStmt(containsDeclaration(1, varDecl()))
8250 matches 'int a, b = 0' as well as 'int d = 2, e;'
8251 but 'int c;' is not matched.
8255 <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>
8256 <tr><td colspan="4" class="doc
" id="hasSingleDecl0
"><pre>Matches the Decl of a DeclStmt which has a single declaration.
8261 declStmt(hasSingleDecl(anything()))
8262 matches 'int c;' but not 'int a, b;'.
8266 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html
">DeclaratorDecl</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>
8267 <tr><td colspan="4" class="doc
" id="hasTypeLoc8
"><pre>Matches if the type location of a node matches the inner matcher.
8271 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
8275 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
8278 struct Foo { Foo(int, int); };
8280 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
8283 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>>,
8284 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>>,
8285 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>>,
8286 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
8287 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
8288 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>>,
8289 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>>,
8290 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
8294 <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>
8295 <tr><td colspan="4" class="doc
" id="hasDeclContext0
"><pre>Matches declarations whose declaration context, interpreted as a
8296 Decl, matches InnerMatcher.
8305 cxxRcordDecl(hasDeclContext(namedDecl(hasName("M
")))) matches the
8306 declaration of class D.
8310 <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>
8311 <tr><td colspan="4" class="doc
" id="hasUnderlyingType0
"><pre>Matches DecltypeType or UsingType nodes to find the underlying type.
8315 decltype(2.0) b = 2.0;
8316 decltypeType(hasUnderlyingType(isInteger()))
8317 matches the type of "a
"
8319 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html
">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
8323 <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>
8324 <tr><td colspan="4" class="doc
" id="hasAnyBinding0
"><pre>Matches any binding of a DecompositionDecl.
8330 auto &[f, s, t] = arr;
8335 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f
").bind("fBinding
"))))
8336 matches the decomposition decl with 'f' bound to "fBinding
".
8340 <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>
8341 <tr><td colspan="4" class="doc
" id="hasBinding0
"><pre>Matches the Nth binding of a DecompositionDecl.
8347 auto &[f, s, t] = arr;
8352 decompositionDecl(hasBinding(0,
8353 bindingDecl(hasName("f
").bind("fBinding
"))))
8354 matches the decomposition decl with 'f' bound to "fBinding
".
8358 <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>
8359 <tr><td colspan="4" class="doc
" id="hasBody0
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8360 definition that has a given body. Note that in case of functions or
8361 coroutines this matcher only matches the definition itself and not the
8362 other declarations of the same function or coroutine.
8366 forStmt(hasBody(compoundStmt()))
8367 matches 'for (;;) {}'
8374 functionDecl(hasBody(compoundStmt()))
8375 matches 'void f() {}'
8378 but does not match 'void f();'
8382 <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>
8383 <tr><td colspan="4" class="doc
" id="hasCondition3
"><pre>Matches the condition expression of an if statement, for loop,
8384 switch statement or conditional operator.
8386 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8391 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html
">ElaboratedTypeLoc</a>></td><td class="name
" onclick="toggle('hasNamedTypeLoc0')
"><a name="hasNamedTypeLoc0Anchor
">hasNamedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> InnerMatcher</td></tr>
8392 <tr><td colspan="4" class="doc
" id="hasNamedTypeLoc0
"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
8396 template <typename T>
8398 class C<int> c;
8402 elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
8403 matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
8407 <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>
8408 <tr><td colspan="4" class="doc
" id="hasQualifier0
"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
8409 matches InnerMatcher if the qualifier exists.
8419 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N
"))))
8420 matches the type of the variable declaration of d.
8424 <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>
8425 <tr><td colspan="4" class="doc
" id="namesType0
"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
8435 elaboratedType(namesType(recordType(
8436 hasDeclaration(namedDecl(hasName("D
")))))) matches the type of the variable
8441 <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>
8442 <tr><td colspan="4" class="doc
" id="hasDeclaration10
"><pre>Matches a node if the declaration associated with that node
8443 matches the given matcher.
8445 The associated declaration is:
8446 - for type nodes, the declaration of the underlying type
8447 - for CallExpr, the declaration of the callee
8448 - for MemberExpr, the declaration of the referenced member
8449 - for CXXConstructExpr, the declaration of the constructor
8450 - for CXXNewExpr, the declaration of the operator new
8451 - for ObjCIvarExpr, the declaration of the ivar
8453 For type nodes, hasDeclaration will generally match the declaration of the
8458 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8459 typedefDecl. A common use case is to match the underlying, desugared type.
8460 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8461 varDecl(hasType(hasUnqualifiedDesugaredType(
8462 recordType(hasDeclaration(decl())))))
8463 In this matcher, the decl will match the CXXRecordDecl of class X.
8465 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>>,
8466 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>>,
8467 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>>,
8468 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>>,
8469 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>>,
8470 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>>,
8471 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
8475 <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>
8476 <tr><td colspan="4" class="doc
" id="hasDestinationType0
"><pre>Matches casts whose destination type matches a given matcher.
8478 (Note: Clang's AST refers to other conversions as "casts
" too, and calls
8479 actual casts "explicit
" casts.)
8483 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html
">ExplicitCastExpr</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>
8484 <tr><td colspan="4" class="doc
" id="hasTypeLoc9
"><pre>Matches if the type location of a node matches the inner matcher.
8488 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
8492 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
8495 struct Foo { Foo(int, int); };
8497 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
8500 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>>,
8501 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>>,
8502 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>>,
8503 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
8504 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
8505 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>>,
8506 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>>,
8507 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
8511 <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>
8512 <tr><td colspan="4" class="doc
" id="hasType5
"><pre>Overloaded to match the declaration of the expression's or value
8515 In case of a value declaration (for example a variable declaration),
8516 this resolves one layer of indirection. For example, in the value
8517 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
8518 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
8521 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8522 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8523 and friend class X (matcher = friendDecl(hasType("X
"))
8524 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8525 cxxRecordDecl(hasName("X
"))))
8527 void y(X &x) { x; X z; }
8528 class Y { friend class X; };
8529 class Z : public virtual X {};
8531 Example matches class Derived
8532 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
8534 class Derived : Base {};
8536 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>>,
8537 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
8541 <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>
8542 <tr><td colspan="4" class="doc
" id="hasType0
"><pre>Matches if the expression's or declaration's type matches a type
8545 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8546 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8547 and U (matcher = typedefDecl(hasType(asString("int
")))
8548 and friend class X (matcher = friendDecl(hasType("X
"))
8549 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8550 asString("class X
")))
8552 void y(X &x) { x; X z; }
8554 class Y { friend class X; };
8555 class Z : public virtual X {};
8559 <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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8560 <tr><td colspan="4" class="doc
" id="ignoringElidableConstructorCall0
"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
8561 elidable constructor and other corresponding bookkeeping nodes.
8563 In C++17, elidable copy constructors are no longer being generated in the
8564 AST as it is not permitted by the standard. They are, however, part of the
8565 AST in C++14 and earlier. So, a matcher must abstract over these differences
8566 to work in all language modes. This matcher skips elidable constructor-call
8567 AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
8568 various implicit nodes inside the constructor calls, all of which will not
8569 appear in the C++17 AST.
8579 ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
8580 matches ``H D = G()`` in C++11 through C++17 (and beyond).
8584 <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>
8585 <tr><td colspan="4" class="doc
" id="ignoringImpCasts0
"><pre>Matches expressions that match InnerMatcher after any implicit casts
8588 Parentheses and explicit casts are not discarded.
8597 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
8598 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
8599 would match the declarations for a, b, c, and d, but not e.
8601 varDecl(hasInitializer(integerLiteral()))
8602 varDecl(hasInitializer(declRefExpr()))
8603 only match the declarations for a.
8607 <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>
8608 <tr><td colspan="4" class="doc
" id="ignoringImplicit0
"><pre>Matches expressions that match InnerMatcher after any implicit AST
8609 nodes are stripped off.
8611 Parentheses and explicit casts are not discarded.
8618 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
8619 would match the declarations for a, b, and c.
8621 varDecl(hasInitializer(cxxConstructExpr()))
8622 only match the declarations for b and c.
8626 <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>
8627 <tr><td colspan="4" class="doc
" id="ignoringParenCasts0
"><pre>Matches expressions that match InnerMatcher after parentheses and
8628 casts are stripped off.
8630 Implicit and non-C Style casts are also discarded.
8634 void* c = reinterpret_cast<char*>(0);
8637 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
8638 would match the declarations for a, b, c, and d.
8640 varDecl(hasInitializer(integerLiteral()))
8641 only match the declaration for a.
8645 <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>
8646 <tr><td colspan="4" class="doc
" id="ignoringParenImpCasts0
"><pre>Matches expressions that match InnerMatcher after implicit casts and
8647 parentheses are stripped off.
8649 Explicit casts are not discarded.
8656 long e = ((long) 0l);
8658 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
8659 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
8660 would match the declarations for a, b, c, and d, but not e.
8662 varDecl(hasInitializer(integerLiteral()))
8663 varDecl(hasInitializer(declRefExpr()))
8664 would only match the declaration for a.
8668 <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>
8669 <tr><td colspan="4" class="doc
" id="ignoringParens1
"><pre>Overload ignoringParens for Expr.
8672 const char* str = ("my-string
");
8674 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
8675 would match the implicit cast resulting from the assignment.
8679 <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>
8680 <tr><td colspan="4" class="doc
" id="hasInClassInitializer0
"><pre>Matches non-static data members that have an in-class initializer.
8688 fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
8689 matches 'int a;' but not 'int b;'.
8690 fieldDecl(hasInClassInitializer(anything()))
8691 matches 'int a;' and 'int b;' but not 'int c;'.
8695 <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>
8696 <tr><td colspan="4" class="doc
" id="hasBody1
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8697 definition that has a given body. Note that in case of functions or
8698 coroutines this matcher only matches the definition itself and not the
8699 other declarations of the same function or coroutine.
8703 forStmt(hasBody(compoundStmt()))
8704 matches 'for (;;) {}'
8711 functionDecl(hasBody(compoundStmt()))
8712 matches 'void f() {}'
8715 but does not match 'void f();'
8719 <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>
8720 <tr><td colspan="4" class="doc
" id="hasCondition1
"><pre>Matches the condition expression of an if statement, for loop,
8721 switch statement or conditional operator.
8723 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8728 <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>
8729 <tr><td colspan="4" class="doc
" id="hasIncrement0
"><pre>Matches the increment statement of a for loop.
8732 forStmt(hasIncrement(unaryOperator(hasOperatorName("++
"))))
8734 for (x; x < N; ++x) { }
8738 <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>
8739 <tr><td colspan="4" class="doc
" id="hasLoopInit0
"><pre>Matches the initialization statement of a for loop.
8742 forStmt(hasLoopInit(declStmt()))
8743 matches 'int x = 0' in
8744 for (int x = 0; x < N; ++x) { }
8748 <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>
8749 <tr><td colspan="4" class="doc
" id="hasType6
"><pre>Overloaded to match the declaration of the expression's or value
8752 In case of a value declaration (for example a variable declaration),
8753 this resolves one layer of indirection. For example, in the value
8754 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
8755 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
8758 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8759 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8760 and friend class X (matcher = friendDecl(hasType("X
"))
8761 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8762 cxxRecordDecl(hasName("X
"))))
8764 void y(X &x) { x; X z; }
8765 class Y { friend class X; };
8766 class Z : public virtual X {};
8768 Example matches class Derived
8769 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
8771 class Derived : Base {};
8773 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>>,
8774 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
8778 <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>
8779 <tr><td colspan="4" class="doc
" id="hasType1
"><pre>Matches if the expression's or declaration's type matches a type
8782 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8783 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8784 and U (matcher = typedefDecl(hasType(asString("int
")))
8785 and friend class X (matcher = friendDecl(hasType("X
"))
8786 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8787 asString("class X
")))
8789 void y(X &x) { x; X z; }
8791 class Y { friend class X; };
8792 class Z : public virtual X {};
8796 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument2')
"><a name="forEachTemplateArgument2Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
8797 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument2
"><pre>Matches templateSpecializationType, class template specialization,
8798 variable template specialization, and function template specialization
8799 nodes where the template argument matches the inner matcher. This matcher
8800 may produce multiple matches.
8803 template <typename T, unsigned N, unsigned M>
8806 constexpr unsigned R = 2;
8807 Matrix<int, R * 2, R * 4> M;
8809 template <typename T, typename U>
8810 void f(T&& t, U&& u) {}
8814 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
8815 matches twice, with expr() matching 'R * 2' and 'R * 4'
8816 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
8817 matches the specialization f<unsigned, bool> twice, for 'unsigned'
8822 <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>
8823 <tr><td colspan="4" class="doc
" id="hasAnyBody0
"><pre>Matches a function declaration that has a given body present in the AST.
8824 Note that this matcher matches all the declarations of a function whose
8825 body is present in the AST.
8831 functionDecl(hasAnyBody(compoundStmt()))
8832 matches both 'void f();'
8836 but does not match 'void g();'
8840 <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>
8841 <tr><td colspan="4" class="doc
" id="hasAnyParameter0
"><pre>Matches any parameter of a function or an ObjC method declaration or a
8844 Does not match the 'this' parameter of a method.
8847 class X { void f(int x, int y, int z) {} };
8848 cxxMethodDecl(hasAnyParameter(hasName("y
")))
8849 matches f(int x, int y, int z) {}
8850 with hasAnyParameter(...)
8853 For ObjectiveC, given
8854 @interface I - (void) f:(int) y; @end
8856 the matcher objcMethodDecl(hasAnyParameter(hasName("y
")))
8857 matches the declaration of method f with hasParameter
8861 b = ^(int y) { printf("%d
", y) };
8863 the matcher blockDecl(hasAnyParameter(hasName("y
")))
8864 matches the declaration of the block b with hasParameter
8869 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc2')
"><a name="hasAnyTemplateArgumentLoc2Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8870 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc2
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8871 variable template specializations, and function template specializations
8872 that have at least one `TemplateArgumentLoc` matching the given
8876 template<typename T> class A {};
8878 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
8879 hasTypeLoc(loc(asString("int
")))))))
8880 matches `A<int> a`.
8884 <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>
8885 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument2
"><pre>Matches templateSpecializationTypes, class template specializations,
8886 variable template specializations, and function template specializations
8887 that have at least one TemplateArgument matching the given InnerMatcher.
8890 template<typename T> class A {};
8891 template<> class A<double> {};
8894 template<typename T> f() {};
8895 void func() { f<int>(); };
8897 classTemplateSpecializationDecl(hasAnyTemplateArgument(
8898 refersToType(asString("int
"))))
8899 matches the specialization A<int>
8901 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
8902 matches the specialization f<int>
8906 <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>
8907 <tr><td colspan="4" class="doc
" id="hasBody4
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8908 definition that has a given body. Note that in case of functions or
8909 coroutines this matcher only matches the definition itself and not the
8910 other declarations of the same function or coroutine.
8914 forStmt(hasBody(compoundStmt()))
8915 matches 'for (;;) {}'
8922 functionDecl(hasBody(compoundStmt()))
8923 matches 'void f() {}'
8926 but does not match 'void f();'
8930 <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>
8931 <tr><td colspan="4" class="doc
" id="hasExplicitSpecifier0
"><pre>Matches the expression in an explicit specifier if present in the given
8935 template<bool b>
8938 explicit S(double); // #2
8939 operator int(); // #3
8940 explicit operator bool(); // #4
8941 explicit(false) S(bool) // # 7
8942 explicit(true) S(char) // # 8
8943 explicit(b) S(S) // # 9
8945 S(int) -> S<true> // #5
8946 explicit S(double) -> S<false> // #6
8947 cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8948 cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8949 cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8953 <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>
8954 <tr><td colspan="4" class="doc
" id="hasParameter0
"><pre>Matches the n'th parameter of a function or an ObjC method
8955 declaration or a block.
8958 class X { void f(int x) {} };
8959 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8961 with hasParameter(...)
8964 For ObjectiveC, given
8965 @interface I - (void) f:(int) y; @end
8967 the matcher objcMethodDecl(hasParameter(0, hasName("y
")))
8968 matches the declaration of method f with hasParameter
8973 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasReturnTypeLoc0')
"><a name="hasReturnTypeLoc0Anchor
">hasReturnTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> ReturnMatcher</td></tr>
8974 <tr><td colspan="4" class="doc
" id="hasReturnTypeLoc0
"><pre>Matches a function declared with the specified return `TypeLoc`.
8977 int f() { return 5; }
8979 functionDecl(hasReturnTypeLoc(loc(asString("int
"))))
8980 matches the declaration of `f`, but not `g`.
8984 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc2')
"><a name="hasTemplateArgumentLoc2Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8985 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc2
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8986 variable template specializations, and function template specializations
8987 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
8990 template<typename T, typename U> class A {};
8991 A<double, int> b;
8992 A<int, double> c;
8993 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
8994 hasTypeLoc(loc(asString("double
")))))))
8995 matches `A<double, int> b`, but not `A<int, double> c`.
8999 <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>
9000 <tr><td colspan="4" class="doc
" id="hasTemplateArgument2
"><pre>Matches templateSpecializationType, class template specializations,
9001 variable template specializations, and function template specializations
9002 where the n'th TemplateArgument matches the given InnerMatcher.
9005 template<typename T, typename U> class A {};
9006 A<bool, int> b;
9007 A<int, bool> c;
9009 template<typename T> void f() {}
9010 void func() { f<int>(); };
9011 classTemplateSpecializationDecl(hasTemplateArgument(
9012 1, refersToType(asString("int
"))))
9013 matches the specialization A<bool, int>
9015 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
9016 matches the specialization f<int>
9020 <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>
9021 <tr><td colspan="4" class="doc
" id="returns0
"><pre>Matches the return type of a function declaration.
9024 class X { int f() { return 1; } };
9025 cxxMethodDecl(returns(asString("int
")))
9026 matches int f() { return 1; }
9030 <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>
9031 <tr><td colspan="4" class="doc
" id="hasCondition0
"><pre>Matches the condition expression of an if statement, for loop,
9032 switch statement or conditional operator.
9034 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9039 <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>
9040 <tr><td colspan="4" class="doc
" id="hasConditionVariableStatement0
"><pre>Matches the condition variable statement in an if statement.
9043 if (A* a = GetAPointer()) {}
9044 hasConditionVariableStatement(...)
9045 matches 'A* a = GetAPointer()'.
9049 <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>
9050 <tr><td colspan="4" class="doc
" id="hasElse0
"><pre>Matches the else-statement of an if statement.
9052 Examples matches the if statement
9053 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
9054 if (false) false; else true;
9058 <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>
9059 <tr><td colspan="4" class="doc
" id="hasInitStatement0
"><pre>Matches selection statements with initializer.
9063 if (int i = foobar(); i > 0) {}
9064 switch (int i = foobar(); i) {}
9065 for (auto& a = get_range(); auto& x : a) {}
9068 if (foobar() > 0) {}
9069 switch (foobar()) {}
9070 for (auto& x : get_range()) {}
9072 ifStmt(hasInitStatement(anything()))
9073 matches the if statement in foo but not in bar.
9074 switchStmt(hasInitStatement(anything()))
9075 matches the switch statement in foo but not in bar.
9076 cxxForRangeStmt(hasInitStatement(anything()))
9077 matches the range for statement in foo but not in bar.
9081 <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>
9082 <tr><td colspan="4" class="doc
" id="hasThen0
"><pre>Matches the then-statement of an if statement.
9084 Examples matches the if statement
9085 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
9086 if (false) true; else false;
9090 <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>
9091 <tr><td colspan="4" class="doc
" id="hasImplicitDestinationType0
"><pre>Matches implicit casts whose destination type matches a given
9096 <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, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9097 <tr><td colspan="4" class="doc
" id="hasInit0
"><pre>Matches the n'th item of an initializer list expression.
9100 (matcher = initListExpr(hasInit(0, expr())))
9105 <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>
9106 <tr><td colspan="4" class="doc
" id="hasSyntacticForm0
"><pre>Matches the syntactic form of init list expressions
9107 (if expression have it).
9111 <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>
9112 <tr><td colspan="4" class="doc
" id="hasDeclaration9
"><pre>Matches a node if the declaration associated with that node
9113 matches the given matcher.
9115 The associated declaration is:
9116 - for type nodes, the declaration of the underlying type
9117 - for CallExpr, the declaration of the callee
9118 - for MemberExpr, the declaration of the referenced member
9119 - for CXXConstructExpr, the declaration of the constructor
9120 - for CXXNewExpr, the declaration of the operator new
9121 - for ObjCIvarExpr, the declaration of the ivar
9123 For type nodes, hasDeclaration will generally match the declaration of the
9128 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9129 typedefDecl. A common use case is to match the underlying, desugared type.
9130 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9131 varDecl(hasType(hasUnqualifiedDesugaredType(
9132 recordType(hasDeclaration(decl())))))
9133 In this matcher, the decl will match the CXXRecordDecl of class X.
9135 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>>,
9136 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>>,
9137 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>>,
9138 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>>,
9139 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>>,
9140 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>>,
9141 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9145 <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>
9146 <tr><td colspan="4" class="doc
" id="hasDeclaration8
"><pre>Matches a node if the declaration associated with that node
9147 matches the given matcher.
9149 The associated declaration is:
9150 - for type nodes, the declaration of the underlying type
9151 - for CallExpr, the declaration of the callee
9152 - for MemberExpr, the declaration of the referenced member
9153 - for CXXConstructExpr, the declaration of the constructor
9154 - for CXXNewExpr, the declaration of the operator new
9155 - for ObjCIvarExpr, the declaration of the ivar
9157 For type nodes, hasDeclaration will generally match the declaration of the
9162 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9163 typedefDecl. A common use case is to match the underlying, desugared type.
9164 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9165 varDecl(hasType(hasUnqualifiedDesugaredType(
9166 recordType(hasDeclaration(decl())))))
9167 In this matcher, the decl will match the CXXRecordDecl of class X.
9169 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>>,
9170 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>>,
9171 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>>,
9172 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>>,
9173 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>>,
9174 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>>,
9175 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9179 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html
">LambdaCapture</a>></td><td class="name
" onclick="toggle('capturesVar0')
"><a name="capturesVar0Anchor
">capturesVar</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>> InnerMatcher</td></tr>
9180 <tr><td colspan="4" class="doc
" id="capturesVar0
"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
9181 `VarDecl` can be a separate variable that is captured by value or
9182 reference, or a synthesized variable if the capture has an initializer.
9188 auto g = [x = 1](){};
9191 lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x
")))),
9192 capturesVar(hasName("x
")) matches `x` and `x = 1`.
9196 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html
">LambdaExpr</a>></td><td class="name
" onclick="toggle('forEachLambdaCapture0')
"><a name="forEachLambdaCapture0Anchor
">forEachLambdaCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html
">LambdaCapture</a>> InnerMatcher</td></tr>
9197 <tr><td colspan="4" class="doc
" id="forEachLambdaCapture0
"><pre>Matches each lambda capture in a lambda expression.
9203 auto f = [=]() { return x + y + z; };
9205 lambdaExpr(forEachLambdaCapture(
9206 lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
9207 will trigger two matches, binding for 'x' and 'y' respectively.
9211 <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_1LambdaCapture.html
">LambdaCapture</a>> InnerMatcher</td></tr>
9212 <tr><td colspan="4" class="doc
" id="hasAnyCapture0
"><pre>Matches any capture in a lambda expression.
9217 auto f = [=](){ return t; };
9219 lambdaExpr(hasAnyCapture(lambdaCapture())) and
9220 lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t
")))))
9221 both match `[=](){ return t; }`.
9225 <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>
9226 <tr><td colspan="4" class="doc
" id="hasDeclaration7
"><pre>Matches a node if the declaration associated with that node
9227 matches the given matcher.
9229 The associated declaration is:
9230 - for type nodes, the declaration of the underlying type
9231 - for CallExpr, the declaration of the callee
9232 - for MemberExpr, the declaration of the referenced member
9233 - for CXXConstructExpr, the declaration of the constructor
9234 - for CXXNewExpr, the declaration of the operator new
9235 - for ObjCIvarExpr, the declaration of the ivar
9237 For type nodes, hasDeclaration will generally match the declaration of the
9242 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9243 typedefDecl. A common use case is to match the underlying, desugared type.
9244 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9245 varDecl(hasType(hasUnqualifiedDesugaredType(
9246 recordType(hasDeclaration(decl())))))
9247 In this matcher, the decl will match the CXXRecordDecl of class X.
9249 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>>,
9250 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>>,
9251 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>>,
9252 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>>,
9253 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>>,
9254 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>>,
9255 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9259 <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>
9260 <tr><td colspan="4" class="doc
" id="hasObjectExpression0
"><pre>Matches a member expression where the object expression is matched by a
9261 given matcher. Implicit object expressions are included; that is, it matches
9262 use of implicit `this`.
9267 int f(X x) { x.m; return m; }
9269 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X
")))))
9270 matches `x.m`, but not `m`; however,
9271 memberExpr(hasObjectExpression(hasType(pointsTo(
9272 cxxRecordDecl(hasName("X
"))))))
9273 matches `m` (aka. `this->m`), but not `x.m`.
9277 <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>
9278 <tr><td colspan="4" class="doc
" id="member0
"><pre>Matches a member expression where the member is matched by a
9282 struct { int first, second; } first, second;
9283 int i(second.first);
9284 int j(first.second);
9285 memberExpr(member(hasName("first
")))
9286 matches second.first
9287 but not first.second (because the member name there is "second
").
9291 <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>
9292 <tr><td colspan="4" class="doc
" id="pointee1
"><pre>Narrows PointerType (and similar) matchers to those where the
9293 pointee matches a given matcher.
9299 pointerType(pointee(isConstQualified(), isInteger()))
9300 matches "int const *b
"
9302 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>>,
9303 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>>
9307 <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>
9308 <tr><td colspan="4" class="doc
" id="hasUnderlyingDecl0
"><pre>Matches a NamedDecl whose underlying declaration matches the given
9312 namespace N { template<class T> void f(T t); }
9313 template <class T> void g() { using N::f; f(T()); }
9314 unresolvedLookupExpr(hasAnyDeclaration(
9315 namedDecl(hasUnderlyingDecl(hasName("::N::f
")))))
9316 matches the use of f in g() .
9320 <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>
9321 <tr><td colspan="4" class="doc
" id="hasPrefix1
"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
9324 struct A { struct B { struct C {}; }; };
9326 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A
")))))
9331 <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>
9332 <tr><td colspan="4" class="doc
" id="loc1
"><pre>Matches NestedNameSpecifierLocs for which the given inner
9333 NestedNameSpecifier-matcher matches.
9337 <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>
9338 <tr><td colspan="4" class="doc
" id="specifiesTypeLoc0
"><pre>Matches nested name specifier locs that specify a type matching the
9342 struct A { struct B { struct C {}; }; };
9344 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
9345 hasDeclaration(cxxRecordDecl(hasName("A
")))))))
9350 <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>
9351 <tr><td colspan="4" class="doc
" id="hasPrefix0
"><pre>Matches on the prefix of a NestedNameSpecifier.
9354 struct A { struct B { struct C {}; }; };
9356 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A
")))) and
9361 <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>
9362 <tr><td colspan="4" class="doc
" id="specifiesNamespace0
"><pre>Matches nested name specifiers that specify a namespace matching the
9363 given namespace matcher.
9366 namespace ns { struct A {}; }
9368 nestedNameSpecifier(specifiesNamespace(hasName("ns
")))
9373 <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>
9374 <tr><td colspan="4" class="doc
" id="specifiesType0
"><pre>Matches nested name specifiers that specify a type matching the
9375 given QualType matcher without qualifiers.
9378 struct A { struct B { struct C {}; }; };
9380 nestedNameSpecifier(specifiesType(
9381 hasDeclaration(cxxRecordDecl(hasName("A
")))
9387 <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>
9388 <tr><td colspan="4" class="doc
" id="hasAnyClause0
"><pre>Matches any clause in an OpenMP directive.
9392 #pragma omp parallel
9393 #pragma omp parallel default(none)
9395 ``ompExecutableDirective(hasAnyClause(anything()))`` matches
9396 ``omp parallel default(none)``.
9400 <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>
9401 <tr><td colspan="4" class="doc
" id="hasStructuredBlock0
"><pre>Matches the structured-block of the OpenMP executable directive
9403 Prerequisite: the executable directive must not be standalone directive.
9404 If it is, it will never match.
9408 #pragma omp parallel
9410 #pragma omp parallel
9413 ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
9417 <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>
9418 <tr><td colspan="4" class="doc
" id="isDerivedFrom1
"><pre>Matches C++ classes that are directly or indirectly derived from a class
9419 matching Base, or Objective-C classes that directly or indirectly
9420 subclass a class matching Base.
9422 Note that a class is not considered to be derived from itself.
9424 Example matches Y, Z, C (Base == hasName("X
"))
9426 class Y : public X {}; // directly derived
9427 class Z : public Y {}; // indirectly derived
9430 class C : public B {}; // derived from a typedef of X
9432 In the following example, Bar matches isDerivedFrom(hasName("X
")):
9435 class Bar : public Foo {}; // derived from a type that X is a typedef of
9437 In the following example, Bar matches isDerivedFrom(hasName("NSObject
"))
9438 @interface NSObject @end
9439 @interface Bar : NSObject @end
9441 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>>
9445 <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>
9446 <tr><td colspan="4" class="doc
" id="isDirectlyDerivedFrom1
"><pre>Matches C++ or Objective-C classes that are directly derived from a class
9449 Note that a class is not considered to be derived from itself.
9451 Example matches Y, C (Base == hasName("X
"))
9453 class Y : public X {}; // directly derived
9454 class Z : public Y {}; // indirectly derived
9457 class C : public B {}; // derived from a typedef of X
9459 In the following example, Bar matches isDerivedFrom(hasName("X
")):
9462 class Bar : public Foo {}; // derived from a type that X is a typedef of
9466 <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>
9467 <tr><td colspan="4" class="doc
" id="isSameOrDerivedFrom1
"><pre>Similar to isDerivedFrom(), but also matches classes that directly
9472 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html
">ObjCMessageExpr</a>></td><td class="name
" onclick="toggle('callee2')
"><a name="callee2Anchor
">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9473 <tr><td colspan="4" class="doc
" id="callee2
"><pre>Matches 1) if the call expression's callee's declaration matches the
9474 given matcher; or 2) if the Obj-C message expression's callee's method
9475 declaration matches the given matcher.
9477 Example matches y.x() (matcher = callExpr(callee(
9478 cxxMethodDecl(hasName("x
")))))
9479 class Y { public: void x(); };
9480 void z() { Y y; y.x(); }
9482 Example 2. Matches [I foo] with
9483 objcMessageExpr(callee(objcMethodDecl(hasName("foo
"))))
9485 @interface I: NSObject
9493 <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>
9494 <tr><td colspan="4" class="doc
" id="hasAnyArgument3
"><pre>Matches any argument of a call expression or a constructor call
9495 expression, or an ObjC-message-send expression.
9498 void x(int, int, int) { int y; x(1, y, 42); }
9499 callExpr(hasAnyArgument(declRefExpr()))
9501 with hasAnyArgument(...)
9504 For ObjectiveC, given
9505 @interface I - (void) f:(int) y; @end
9506 void foo(I *i) { [i f:12]; }
9507 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
9512 <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>
9513 <tr><td colspan="4" class="doc
" id="hasArgument3
"><pre>Matches the n'th argument of a call expression or a constructor
9516 Example matches y in x(y)
9517 (matcher = callExpr(hasArgument(0, declRefExpr())))
9518 void x(int) { int y; x(y); }
9522 <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>
9523 <tr><td colspan="4" class="doc
" id="hasReceiver0
"><pre>Matches if the Objective-C message is sent to an instance,
9524 and the inner matcher matches on that instance.
9526 For example the method call in
9527 NSString *x = @"hello
";
9528 [x containsString:@"h
"];
9530 objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x
"))))))
9534 <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>
9535 <tr><td colspan="4" class="doc
" id="hasReceiverType0
"><pre>Matches on the receiver of an ObjectiveC Message expression.
9538 matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *
")));
9539 matches the [webView ...] message invocation.
9540 NSString *webViewJavaScript = ...
9541 UIWebView *webView = ...
9542 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
9546 <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>
9547 <tr><td colspan="4" class="doc
" id="hasAnyParameter1
"><pre>Matches any parameter of a function or an ObjC method declaration or a
9550 Does not match the 'this' parameter of a method.
9553 class X { void f(int x, int y, int z) {} };
9554 cxxMethodDecl(hasAnyParameter(hasName("y
")))
9555 matches f(int x, int y, int z) {}
9556 with hasAnyParameter(...)
9559 For ObjectiveC, given
9560 @interface I - (void) f:(int) y; @end
9562 the matcher objcMethodDecl(hasAnyParameter(hasName("y
")))
9563 matches the declaration of method f with hasParameter
9567 b = ^(int y) { printf("%d
", y) };
9569 the matcher blockDecl(hasAnyParameter(hasName("y
")))
9570 matches the declaration of the block b with hasParameter
9575 <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>
9576 <tr><td colspan="4" class="doc
" id="hasParameter1
"><pre>Matches the n'th parameter of a function or an ObjC method
9577 declaration or a block.
9580 class X { void f(int x) {} };
9581 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
9583 with hasParameter(...)
9586 For ObjectiveC, given
9587 @interface I - (void) f:(int) y; @end
9589 the matcher objcMethodDecl(hasParameter(0, hasName("y
")))
9590 matches the declaration of method f with hasParameter
9595 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html
">ObjCPropertyDecl</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>
9596 <tr><td colspan="4" class="doc
" id="hasTypeLoc10
"><pre>Matches if the type location of a node matches the inner matcher.
9600 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
9604 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
9607 struct Foo { Foo(int, int); };
9609 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
9612 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>>,
9613 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>>,
9614 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>>,
9615 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
9616 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
9617 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>>,
9618 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>>,
9619 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
9623 <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>
9624 <tr><td colspan="4" class="doc
" id="hasSourceExpression1
"><pre>Matches if the cast's source expression
9625 or opaque value's source expression matches the given matcher.
9627 Example 1: matches "a string
"
9628 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
9629 class URL { URL(string); };
9630 URL url = "a string
";
9632 Example 2: matches 'b' (matcher =
9633 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
9638 <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>
9639 <tr><td colspan="4" class="doc
" id="hasAnyDeclaration0
"><pre>Matches an OverloadExpr if any of the declarations in the set of
9640 overloads matches the given matcher.
9643 template <typename T> void foo(T);
9644 template <typename T> void bar(T);
9645 template <typename T> void baz(T t) {
9649 unresolvedLookupExpr(hasAnyDeclaration(
9650 functionTemplateDecl(hasName("foo
"))))
9651 matches foo in foo(t); but not bar in bar(t);
9655 <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>
9656 <tr><td colspan="4" class="doc
" id="innerType0
"><pre>Matches ParenType nodes where the inner type is a specific type.
9659 int (*ptr_to_array)[4];
9660 int (*ptr_to_func)(int);
9662 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
9663 ptr_to_func but not ptr_to_array.
9665 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html
">ParenType</a>>
9669 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html
">PointerTypeLoc</a>></td><td class="name
" onclick="toggle('hasPointeeLoc0')
"><a name="hasPointeeLoc0Anchor
">hasPointeeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> PointeeMatcher</td></tr>
9670 <tr><td colspan="4" class="doc
" id="hasPointeeLoc0
"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
9675 pointerTypeLoc(hasPointeeLoc(loc(asString("int
"))))
9680 <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>
9681 <tr><td colspan="4" class="doc
" id="pointee2
"><pre>Narrows PointerType (and similar) matchers to those where the
9682 pointee matches a given matcher.
9688 pointerType(pointee(isConstQualified(), isInteger()))
9689 matches "int const *b
"
9691 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>>,
9692 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>>
9696 <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>
9697 <tr><td colspan="4" class="doc
" id="hasCanonicalType0
"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
9700 typedef int &int_ref;
9704 varDecl(hasType(qualType(referenceType()))))) will not match the
9705 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
9709 <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>
9710 <tr><td colspan="4" class="doc
" id="hasDeclaration6
"><pre>Matches a node if the declaration associated with that node
9711 matches the given matcher.
9713 The associated declaration is:
9714 - for type nodes, the declaration of the underlying type
9715 - for CallExpr, the declaration of the callee
9716 - for MemberExpr, the declaration of the referenced member
9717 - for CXXConstructExpr, the declaration of the constructor
9718 - for CXXNewExpr, the declaration of the operator new
9719 - for ObjCIvarExpr, the declaration of the ivar
9721 For type nodes, hasDeclaration will generally match the declaration of the
9726 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9727 typedefDecl. A common use case is to match the underlying, desugared type.
9728 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9729 varDecl(hasType(hasUnqualifiedDesugaredType(
9730 recordType(hasDeclaration(decl())))))
9731 In this matcher, the decl will match the CXXRecordDecl of class X.
9733 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>>,
9734 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>>,
9735 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>>,
9736 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>>,
9737 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>>,
9738 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>>,
9739 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9743 <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>
9744 <tr><td colspan="4" class="doc
" id="ignoringParens0
"><pre>Matches types that match InnerMatcher after any parens are stripped.
9749 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
9750 would match the declaration for fp.
9754 <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>
9755 <tr><td colspan="4" class="doc
" id="pointsTo1
"><pre>Overloaded to match the pointee type's declaration.
9759 <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>
9760 <tr><td colspan="4" class="doc
" id="pointsTo0
"><pre>Matches if the matched type is a pointer type and the pointee type
9761 matches the specified matcher.
9763 Example matches y->x()
9764 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
9765 cxxRecordDecl(hasName("Y
")))))))
9766 class Y { public: void x(); };
9767 void z() { Y *y; y->x(); }
9771 <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>
9772 <tr><td colspan="4" class="doc
" id="references1
"><pre>Overloaded to match the referenced type's declaration.
9776 <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>
9777 <tr><td colspan="4" class="doc
" id="references0
"><pre>Matches if the matched type is a reference type and the referenced
9778 type matches the specified matcher.
9780 Example matches X &x and const X &y
9781 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X
"))))))
9791 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html
">QualifiedTypeLoc</a>></td><td class="name
" onclick="toggle('hasUnqualifiedLoc0')
"><a name="hasUnqualifiedLoc0Anchor
">hasUnqualifiedLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> InnerMatcher</td></tr>
9792 <tr><td colspan="4" class="doc
" id="hasUnqualifiedLoc0
"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
9798 qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
9799 matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
9803 <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>
9804 <tr><td colspan="4" class="doc
" id="hasDeclaration5
"><pre>Matches a node if the declaration associated with that node
9805 matches the given matcher.
9807 The associated declaration is:
9808 - for type nodes, the declaration of the underlying type
9809 - for CallExpr, the declaration of the callee
9810 - for MemberExpr, the declaration of the referenced member
9811 - for CXXConstructExpr, the declaration of the constructor
9812 - for CXXNewExpr, the declaration of the operator new
9813 - for ObjCIvarExpr, the declaration of the ivar
9815 For type nodes, hasDeclaration will generally match the declaration of the
9820 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9821 typedefDecl. A common use case is to match the underlying, desugared type.
9822 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9823 varDecl(hasType(hasUnqualifiedDesugaredType(
9824 recordType(hasDeclaration(decl())))))
9825 In this matcher, the decl will match the CXXRecordDecl of class X.
9827 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>>,
9828 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>>,
9829 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>>,
9830 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>>,
9831 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>>,
9832 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>>,
9833 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9837 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html
">ReferenceTypeLoc</a>></td><td class="name
" onclick="toggle('hasReferentLoc0')
"><a name="hasReferentLoc0Anchor
">hasReferentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> ReferentMatcher</td></tr>
9838 <tr><td colspan="4" class="doc
" id="hasReferentLoc0
"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
9844 referenceTypeLoc(hasReferentLoc(loc(asString("int
"))))
9849 <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>
9850 <tr><td colspan="4" class="doc
" id="pointee3
"><pre>Narrows PointerType (and similar) matchers to those where the
9851 pointee matches a given matcher.
9857 pointerType(pointee(isConstQualified(), isInteger()))
9858 matches "int const *b
"
9860 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>>,
9861 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>>
9865 <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>
9866 <tr><td colspan="4" class="doc
" id="hasReturnValue0
"><pre>Matches the return value expression of a return statement
9870 hasReturnValue(binaryOperator())
9871 matches 'return a + b'
9872 with binaryOperator()
9877 <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>
9878 <tr><td colspan="4" class="doc
" id="hasAnySubstatement1
"><pre>Matches compound statements where at least one substatement matches
9879 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
9883 hasAnySubstatement(compoundStmt())
9884 matches '{ {}; 1+2; }'
9890 <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>
9891 <tr><td colspan="4" class="doc
" id="alignOfExpr0
"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9896 <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>
9897 <tr><td colspan="4" class="doc
" id="forCallable0
"><pre>Matches declaration of the function, method, or block the statement
9901 F& operator=(const F& o) {
9902 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
9905 returnStmt(forCallable(functionDecl(hasName("operator=
"))))
9906 matches 'return *this'
9907 but does not match 'return v > 0'
9912 dispatch_sync(queue, ^{ int y = 2; });
9914 declStmt(forCallable(objcMethodDecl()))
9916 but does not match 'int y = 2'.
9917 whereas declStmt(forCallable(blockDecl()))
9919 but does not match 'int x = 1'.
9923 <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>
9924 <tr><td colspan="4" class="doc
" id="forFunction0
"><pre>Matches declaration of the function the statement belongs to.
9926 Deprecated. Use forCallable() to correctly handle the situation when
9927 the declaration is not a function (but a block or an Objective-C method).
9928 forFunction() not only fails to take non-functions into account but also
9929 may match the wrong declaration in their presence.
9932 F& operator=(const F& o) {
9933 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
9936 returnStmt(forFunction(hasName("operator=
")))
9937 matches 'return *this'
9938 but does not match 'return v > 0'
9942 <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>
9943 <tr><td colspan="4" class="doc
" id="sizeOfExpr0
"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9948 <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>
9949 <tr><td colspan="4" class="doc
" id="hasReplacementType0
"><pre>Matches template type parameter substitutions that have a replacement
9950 type that matches the provided matcher.
9953 template <typename T>
9958 substTemplateTypeParmType(hasReplacementType(type())) matches int
9962 <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>
9963 <tr><td colspan="4" class="doc
" id="forEachSwitchCase0
"><pre>Matches each case or default statement belonging to the given switch
9964 statement. This matcher may produce multiple matches.
9967 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9968 switchStmt(forEachSwitchCase(caseStmt().bind("c
"))).bind("s
")
9969 matches four times, with "c
" binding each of "case
1:
", "case
2:
",
9970 "case
3:
" and "case
4:
", and "s
" respectively binding "switch (
1)
",
9971 "switch (
1)
", "switch (
2)
" and "switch (
2)
".
9975 <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>
9976 <tr><td colspan="4" class="doc
" id="hasCondition4
"><pre>Matches the condition expression of an if statement, for loop,
9977 switch statement or conditional operator.
9979 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9984 <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>
9985 <tr><td colspan="4" class="doc
" id="hasInitStatement1
"><pre>Matches selection statements with initializer.
9989 if (int i = foobar(); i > 0) {}
9990 switch (int i = foobar(); i) {}
9991 for (auto& a = get_range(); auto& x : a) {}
9994 if (foobar() > 0) {}
9995 switch (foobar()) {}
9996 for (auto& x : get_range()) {}
9998 ifStmt(hasInitStatement(anything()))
9999 matches the if statement in foo but not in bar.
10000 switchStmt(hasInitStatement(anything()))
10001 matches the switch statement in foo but not in bar.
10002 cxxForRangeStmt(hasInitStatement(anything()))
10003 matches the range for statement in foo but not in bar.
10007 <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>
10008 <tr><td colspan="4" class="doc
" id="hasDeclaration4
"><pre>Matches a node if the declaration associated with that node
10009 matches the given matcher.
10011 The associated declaration is:
10012 - for type nodes, the declaration of the underlying type
10013 - for CallExpr, the declaration of the callee
10014 - for MemberExpr, the declaration of the referenced member
10015 - for CXXConstructExpr, the declaration of the constructor
10016 - for CXXNewExpr, the declaration of the operator new
10017 - for ObjCIvarExpr, the declaration of the ivar
10019 For type nodes, hasDeclaration will generally match the declaration of the
10020 sugared type. Given
10024 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10025 typedefDecl. A common use case is to match the underlying, desugared type.
10026 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10027 varDecl(hasType(hasUnqualifiedDesugaredType(
10028 recordType(hasDeclaration(decl())))))
10029 In this matcher, the decl will match the CXXRecordDecl of class X.
10031 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>>,
10032 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>>,
10033 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>>,
10034 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>>,
10035 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>>,
10036 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>>,
10037 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10041 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</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>
10042 <tr><td colspan="4" class="doc
" id="hasTypeLoc11
"><pre>Matches if the type location of a node matches the inner matcher.
10046 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
10050 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
10053 struct Foo { Foo(int, int); };
10054 auto x = Foo(1, 2);
10055 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
10058 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>>,
10059 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>>,
10060 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>>,
10061 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
10062 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
10063 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>>,
10064 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>>,
10065 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
10069 <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>
10070 <tr><td colspan="4" class="doc
" id="isExpr0
"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
10073 struct B { int next; };
10074 template<int(B::*next_ptr)> struct A {};
10075 A<&B::next> a;
10076 templateSpecializationType(hasAnyTemplateArgument(
10077 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next
"))))))))
10078 matches the specialization A<&B::next> with fieldDecl(...) matching
10083 <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>
10084 <tr><td colspan="4" class="doc
" id="refersToDeclaration0
"><pre>Matches a canonical TemplateArgument that refers to a certain
10088 struct B { int next; };
10089 template<int(B::*next_ptr)> struct A {};
10090 A<&B::next> a;
10091 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10092 refersToDeclaration(fieldDecl(hasName("next
")))))
10093 matches the specialization A<&B::next> with fieldDecl(...) matching
10098 <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>
10099 <tr><td colspan="4" class="doc
" id="refersToIntegralType0
"><pre>Matches a TemplateArgument that refers to an integral type.
10102 template<int T> struct C {};
10104 classTemplateSpecializationDecl(
10105 hasAnyTemplateArgument(refersToIntegralType(asString("int
"))))
10106 matches the implicit instantiation of C in C<42>.
10110 <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>
10111 <tr><td colspan="4" class="doc
" id="refersToTemplate0
"><pre>Matches a TemplateArgument that refers to a certain template.
10114 template<template <typename> class S> class X {};
10115 template<typename T> class Y {};
10117 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10118 refersToTemplate(templateName())))
10119 matches the specialization X<Y>
10123 <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>
10124 <tr><td colspan="4" class="doc
" id="refersToType0
"><pre>Matches a TemplateArgument that refers to a certain type.
10128 template<typename T> struct A {};
10130 classTemplateSpecializationDecl(hasAnyTemplateArgument(refersToType(
10131 recordType(hasDeclaration(recordDecl(hasName("X
")))))))
10132 matches the specialization of struct A generated by A<X>.
10136 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html
">TemplateSpecializationTypeLoc</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc4')
"><a name="hasAnyTemplateArgumentLoc4Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10137 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc4
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10138 variable template specializations, and function template specializations
10139 that have at least one `TemplateArgumentLoc` matching the given
10143 template<typename T> class A {};
10145 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
10146 hasTypeLoc(loc(asString("int
")))))))
10147 matches `A<int> a`.
10151 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html
">TemplateSpecializationTypeLoc</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc4')
"><a name="hasTemplateArgumentLoc4Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10152 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc4
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10153 variable template specializations, and function template specializations
10154 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
10157 template<typename T, typename U> class A {};
10158 A<double, int> b;
10159 A<int, double> c;
10160 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
10161 hasTypeLoc(loc(asString("double
")))))))
10162 matches `A<double, int> b`, but not `A<int, double> c`.
10166 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument3')
"><a name="forEachTemplateArgument3Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10167 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument3
"><pre>Matches templateSpecializationType, class template specialization,
10168 variable template specialization, and function template specialization
10169 nodes where the template argument matches the inner matcher. This matcher
10170 may produce multiple matches.
10173 template <typename T, unsigned N, unsigned M>
10176 constexpr unsigned R = 2;
10177 Matrix<int, R * 2, R * 4> M;
10179 template <typename T, typename U>
10180 void f(T&& t, U&& u) {}
10184 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
10185 matches twice, with expr() matching 'R * 2' and 'R * 4'
10186 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
10187 matches the specialization f<unsigned, bool> twice, for 'unsigned'
10192 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgument3')
"><a name="hasAnyTemplateArgument3Anchor
">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10193 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument3
"><pre>Matches templateSpecializationTypes, class template specializations,
10194 variable template specializations, and function template specializations
10195 that have at least one TemplateArgument matching the given InnerMatcher.
10198 template<typename T> class A {};
10199 template<> class A<double> {};
10202 template<typename T> f() {};
10203 void func() { f<int>(); };
10205 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10206 refersToType(asString("int
"))))
10207 matches the specialization A<int>
10209 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
10210 matches the specialization f<int>
10214 <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>
10215 <tr><td colspan="4" class="doc
" id="hasDeclaration3
"><pre>Matches a node if the declaration associated with that node
10216 matches the given matcher.
10218 The associated declaration is:
10219 - for type nodes, the declaration of the underlying type
10220 - for CallExpr, the declaration of the callee
10221 - for MemberExpr, the declaration of the referenced member
10222 - for CXXConstructExpr, the declaration of the constructor
10223 - for CXXNewExpr, the declaration of the operator new
10224 - for ObjCIvarExpr, the declaration of the ivar
10226 For type nodes, hasDeclaration will generally match the declaration of the
10227 sugared type. Given
10231 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10232 typedefDecl. A common use case is to match the underlying, desugared type.
10233 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10234 varDecl(hasType(hasUnqualifiedDesugaredType(
10235 recordType(hasDeclaration(decl())))))
10236 In this matcher, the decl will match the CXXRecordDecl of class X.
10238 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>>,
10239 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>>,
10240 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>>,
10241 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>>,
10242 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>>,
10243 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>>,
10244 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10248 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('hasTemplateArgument3')
"><a name="hasTemplateArgument3Anchor
">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10249 <tr><td colspan="4" class="doc
" id="hasTemplateArgument3
"><pre>Matches templateSpecializationType, class template specializations,
10250 variable template specializations, and function template specializations
10251 where the n'th TemplateArgument matches the given InnerMatcher.
10254 template<typename T, typename U> class A {};
10255 A<bool, int> b;
10256 A<int, bool> c;
10258 template<typename T> void f() {}
10259 void func() { f<int>(); };
10260 classTemplateSpecializationDecl(hasTemplateArgument(
10261 1, refersToType(asString("int
"))))
10262 matches the specialization A<bool, int>
10264 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
10265 matches the specialization f<int>
10269 <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>
10270 <tr><td colspan="4" class="doc
" id="hasDeclaration2
"><pre>Matches a node if the declaration associated with that node
10271 matches the given matcher.
10273 The associated declaration is:
10274 - for type nodes, the declaration of the underlying type
10275 - for CallExpr, the declaration of the callee
10276 - for MemberExpr, the declaration of the referenced member
10277 - for CXXConstructExpr, the declaration of the constructor
10278 - for CXXNewExpr, the declaration of the operator new
10279 - for ObjCIvarExpr, the declaration of the ivar
10281 For type nodes, hasDeclaration will generally match the declaration of the
10282 sugared type. Given
10286 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10287 typedefDecl. A common use case is to match the underlying, desugared type.
10288 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10289 varDecl(hasType(hasUnqualifiedDesugaredType(
10290 recordType(hasDeclaration(decl())))))
10291 In this matcher, the decl will match the CXXRecordDecl of class X.
10293 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>>,
10294 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>>,
10295 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>>,
10296 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>>,
10297 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>>,
10298 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>>,
10299 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10303 <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>
10304 <tr><td colspan="4" class="doc
" id="loc0
"><pre>Matches TypeLocs for which the given inner
10305 QualType-matcher matches.
10309 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</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>
10310 <tr><td colspan="4" class="doc
" id="hasTypeLoc12
"><pre>Matches if the type location of a node matches the inner matcher.
10314 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
10318 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
10321 struct Foo { Foo(int, int); };
10322 auto x = Foo(1, 2);
10323 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
10326 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>>,
10327 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>>,
10328 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>>,
10329 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
10330 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
10331 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>>,
10332 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>>,
10333 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
10337 <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>
10338 <tr><td colspan="4" class="doc
" id="hasType2
"><pre>Matches if the expression's or declaration's type matches a type
10341 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
10342 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
10343 and U (matcher = typedefDecl(hasType(asString("int
")))
10344 and friend class X (matcher = friendDecl(hasType("X
"))
10345 and public virtual X (matcher = cxxBaseSpecifier(hasType(
10346 asString("class X
")))
10348 void y(X &x) { x; X z; }
10350 class Y { friend class X; };
10351 class Z : public virtual X {};
10355 <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>
10356 <tr><td colspan="4" class="doc
" id="hasDeclaration1
"><pre>Matches a node if the declaration associated with that node
10357 matches the given matcher.
10359 The associated declaration is:
10360 - for type nodes, the declaration of the underlying type
10361 - for CallExpr, the declaration of the callee
10362 - for MemberExpr, the declaration of the referenced member
10363 - for CXXConstructExpr, the declaration of the constructor
10364 - for CXXNewExpr, the declaration of the operator new
10365 - for ObjCIvarExpr, the declaration of the ivar
10367 For type nodes, hasDeclaration will generally match the declaration of the
10368 sugared type. Given
10372 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10373 typedefDecl. A common use case is to match the underlying, desugared type.
10374 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10375 varDecl(hasType(hasUnqualifiedDesugaredType(
10376 recordType(hasDeclaration(decl())))))
10377 In this matcher, the decl will match the CXXRecordDecl of class X.
10379 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>>,
10380 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>>,
10381 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>>,
10382 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>>,
10383 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>>,
10384 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>>,
10385 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10389 <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>
10390 <tr><td colspan="4" class="doc
" id="hasUnqualifiedDesugaredType0
"><pre>Matches if the matched type matches the unqualified desugared
10391 type of the matched node.
10396 The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
10401 <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>
10402 <tr><td colspan="4" class="doc
" id="hasArgumentOfType0
"><pre>Matches unary expressions that have a specific type of argument.
10405 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
10406 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int
"))
10407 matches sizeof(a) and alignof(c)
10411 <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>
10412 <tr><td colspan="4" class="doc
" id="hasUnaryOperand0
"><pre>Matches if the operand of a unary operator matches.
10414 Example matches true (matcher = hasUnaryOperand(
10415 cxxBoolLiteral(equals(true))))
10420 <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>
10421 <tr><td colspan="4" class="doc
" id="hasObjectExpression1
"><pre>Matches a member expression where the object expression is matched by a
10422 given matcher. Implicit object expressions are included; that is, it matches
10423 use of implicit `this`.
10428 int f(X x) { x.m; return m; }
10430 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X
")))))
10431 matches `x.m`, but not `m`; however,
10432 memberExpr(hasObjectExpression(hasType(pointsTo(
10433 cxxRecordDecl(hasName("X
"))))))
10434 matches `m` (aka. `this->m`), but not `x.m`.
10438 <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>
10439 <tr><td colspan="4" class="doc
" id="hasDeclaration0
"><pre>Matches a node if the declaration associated with that node
10440 matches the given matcher.
10442 The associated declaration is:
10443 - for type nodes, the declaration of the underlying type
10444 - for CallExpr, the declaration of the callee
10445 - for MemberExpr, the declaration of the referenced member
10446 - for CXXConstructExpr, the declaration of the constructor
10447 - for CXXNewExpr, the declaration of the operator new
10448 - for ObjCIvarExpr, the declaration of the ivar
10450 For type nodes, hasDeclaration will generally match the declaration of the
10451 sugared type. Given
10455 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10456 typedefDecl. A common use case is to match the underlying, desugared type.
10457 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10458 varDecl(hasType(hasUnqualifiedDesugaredType(
10459 recordType(hasDeclaration(decl())))))
10460 In this matcher, the decl will match the CXXRecordDecl of class X.
10462 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>>,
10463 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>>,
10464 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>>,
10465 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>>,
10466 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>>,
10467 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>>,
10468 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10472 <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>
10473 <tr><td colspan="4" class="doc
" id="hasTargetDecl0
"><pre>Matches a using shadow declaration where the target declaration is
10474 matched by the given matcher.
10477 namespace X { int a; void b(); }
10480 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
10481 matches using X::b but not using X::a </pre></td></tr>
10484 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>></td><td class="name
" onclick="toggle('hasUnderlyingType1')
"><a name="hasUnderlyingType1Anchor
">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
10485 <tr><td colspan="4" class="doc
" id="hasUnderlyingType1
"><pre>Matches DecltypeType or UsingType nodes to find the underlying type.
10489 decltype(2.0) b = 2.0;
10490 decltypeType(hasUnderlyingType(isInteger()))
10491 matches the type of "a
"
10493 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html
">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
10497 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>></td><td class="name
" onclick="toggle('throughUsingDecl1')
"><a name="throughUsingDecl1Anchor
">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html
">UsingShadowDecl</a>> Inner</td></tr>
10498 <tr><td colspan="4" class="doc
" id="throughUsingDecl1
"><pre>Matches if a node refers to a declaration through a specific
10499 using shadow declaration.
10502 namespace a { int f(); }
10505 declRefExpr(throughUsingDecl(anything()))
10508 namespace a { class X{}; }
10511 typeLoc(loc(usingType(throughUsingDecl(anything()))))
10514 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
10518 <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>
10519 <tr><td colspan="4" class="doc
" id="hasType7
"><pre>Overloaded to match the declaration of the expression's or value
10520 declaration's type.
10522 In case of a value declaration (for example a variable declaration),
10523 this resolves one layer of indirection. For example, in the value
10524 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
10525 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
10528 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
10529 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
10530 and friend class X (matcher = friendDecl(hasType("X
"))
10531 and public virtual X (matcher = cxxBaseSpecifier(hasType(
10532 cxxRecordDecl(hasName("X
"))))
10534 void y(X &x) { x; X z; }
10535 class Y { friend class X; };
10536 class Z : public virtual X {};
10538 Example matches class Derived
10539 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
10541 class Derived : Base {};
10543 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>>,
10544 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
10548 <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>
10549 <tr><td colspan="4" class="doc
" id="hasType3
"><pre>Matches if the expression's or declaration's type matches a type
10552 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
10553 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
10554 and U (matcher = typedefDecl(hasType(asString("int
")))
10555 and friend class X (matcher = friendDecl(hasType("X
"))
10556 and public virtual X (matcher = cxxBaseSpecifier(hasType(
10557 asString("class X
")))
10559 void y(X &x) { x; X z; }
10561 class Y { friend class X; };
10562 class Z : public virtual X {};
10566 <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>
10567 <tr><td colspan="4" class="doc
" id="hasInitializer0
"><pre>Matches a variable declaration that has an initializer expression
10568 that matches the given matcher.
10570 Example matches x (matcher = varDecl(hasInitializer(callExpr())))
10571 bool y() { return true; }
10576 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument1')
"><a name="forEachTemplateArgument1Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10577 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument1
"><pre>Matches templateSpecializationType, class template specialization,
10578 variable template specialization, and function template specialization
10579 nodes where the template argument matches the inner matcher. This matcher
10580 may produce multiple matches.
10583 template <typename T, unsigned N, unsigned M>
10586 constexpr unsigned R = 2;
10587 Matrix<int, R * 2, R * 4> M;
10589 template <typename T, typename U>
10590 void f(T&& t, U&& u) {}
10594 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
10595 matches twice, with expr() matching 'R * 2' and 'R * 4'
10596 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
10597 matches the specialization f<unsigned, bool> twice, for 'unsigned'
10602 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc1')
"><a name="hasAnyTemplateArgumentLoc1Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10603 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc1
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10604 variable template specializations, and function template specializations
10605 that have at least one `TemplateArgumentLoc` matching the given
10609 template<typename T> class A {};
10611 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
10612 hasTypeLoc(loc(asString("int
")))))))
10613 matches `A<int> a`.
10617 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</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>
10618 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument1
"><pre>Matches templateSpecializationTypes, class template specializations,
10619 variable template specializations, and function template specializations
10620 that have at least one TemplateArgument matching the given InnerMatcher.
10623 template<typename T> class A {};
10624 template<> class A<double> {};
10627 template<typename T> f() {};
10628 void func() { f<int>(); };
10630 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10631 refersToType(asString("int
"))))
10632 matches the specialization A<int>
10634 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
10635 matches the specialization f<int>
10639 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc1')
"><a name="hasTemplateArgumentLoc1Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10640 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc1
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10641 variable template specializations, and function template specializations
10642 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
10645 template<typename T, typename U> class A {};
10646 A<double, int> b;
10647 A<int, double> c;
10648 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
10649 hasTypeLoc(loc(asString("double
")))))))
10650 matches `A<double, int> b`, but not `A<int, double> c`.
10654 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</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>
10655 <tr><td colspan="4" class="doc
" id="hasTemplateArgument1
"><pre>Matches templateSpecializationType, class template specializations,
10656 variable template specializations, and function template specializations
10657 where the n'th TemplateArgument matches the given InnerMatcher.
10660 template<typename T, typename U> class A {};
10661 A<bool, int> b;
10662 A<int, bool> c;
10664 template<typename T> void f() {}
10665 void func() { f<int>(); };
10666 classTemplateSpecializationDecl(hasTemplateArgument(
10667 1, refersToType(asString("int
"))))
10668 matches the specialization A<bool, int>
10670 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
10671 matches the specialization f<int>
10675 <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>
10676 <tr><td colspan="4" class="doc
" id="hasSizeExpr0
"><pre>Matches VariableArrayType nodes that have a specific size
10683 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
10684 varDecl(hasName("b
")))))))
10689 <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>
10690 <tr><td colspan="4" class="doc
" id="hasBody2
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
10691 definition that has a given body. Note that in case of functions or
10692 coroutines this matcher only matches the definition itself and not the
10693 other declarations of the same function or coroutine.
10697 forStmt(hasBody(compoundStmt()))
10698 matches 'for (;;) {}'
10699 with compoundStmt()
10705 functionDecl(hasBody(compoundStmt()))
10706 matches 'void f() {}'
10707 with compoundStmt()
10709 but does not match 'void f();'
10713 <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>
10714 <tr><td colspan="4" class="doc
" id="hasCondition2
"><pre>Matches the condition expression of an if statement, for loop,
10715 switch statement or conditional operator.
10717 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
10721 <!--END_TRAVERSAL_MATCHERS -->