Home | History | Annotate | Line # | Download | only in docs
      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
      2           "http://www.w3.org/TR/html4/strict.dtd">
      3 <html>
      4 <head>
      5 <title>AST Matcher Reference</title>
      6 <link type="text/css" rel="stylesheet" href="../menu.css" />
      7 <link type="text/css" rel="stylesheet" href="../content.css" />
      8 <style type="text/css">
      9 td {
     10   padding: .33em;
     11 }
     12 td.doc {
     13   display: none;
     14   border-bottom: 1px solid black;
     15 }
     16 td.name:hover {
     17   color: blue;
     18   cursor: pointer;
     19 }
     20 span.mono { font-family: monospace; }
     21 
     22 .traverse_compare, .traverse_compare td, .traverse_compare th {
     23   border: 1px solid black;
     24   border-collapse: collapse;
     25 }
     26 </style>
     27 <script type="text/javascript">
     28 function toggle(id) {
     29   if (!id) return;
     30   row = document.getElementById(id);
     31   if (row.style.display != 'table-cell')
     32     row.style.display = 'table-cell';
     33   else
     34     row.style.display = 'none';
     35 }
     36 </script>
     37 </head>
     38 <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
     39 
     40 <!--#include virtual="../menu.html.incl"-->
     41 
     42 <div id="content">
     43 
     44 <h1>AST Matcher Reference</h1>
     45 
     46 <p>This document shows all currently implemented matchers. The matchers are grouped
     47 by category and node type they match. You can click on matcher names to show the
     48 matcher's source documentation.</p>
     49 
     50 <p>There are three different basic categories of matchers:
     51 <ul>
     52 <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
     53 <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
     54 <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
     55 </ul>
     56 </p>
     57 
     58 <p>Within each category the matchers are ordered by node type they match on.
     59 Note that if a matcher can match multiple node types, it will appear
     60 multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
     61 find all matchers that can be used to match on Stmt nodes.</p>
     62 
     63 <p>The exception to that rule are matchers that can match on any node. Those
     64 are marked with a * and are listed in the beginning of each category.</p>
     65 
     66 <p>Note that the categorization of matchers is a great help when you combine
     67 them into matcher expressions. You will usually want to form matcher expressions
     68 that read like english sentences by alternating between node matchers and
     69 narrowing or traversal matchers, like this:
     70 <pre>
     71 recordDecl(hasDescendant(
     72     ifStmt(hasTrueExpression(
     73         expr(hasDescendant(
     74             ifStmt()))))))
     75 </pre>
     76 </p>
     77 
     78 <!-- ======================================================================= -->
     79 <h2 id="traverse-mode">Traverse Mode</h2>
     80 <!-- ======================================================================= -->
     81 
     82 <p>The default mode of operation of AST Matchers visits all nodes in the AST,
     83 even if they are not spelled in the source. This is
     84 <span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
     85 that explicitly traverse or ignore implicit nodes, such as parentheses
     86 surrounding an expression or expressions with cleanups.  These implicit
     87 nodes are not always obvious from the syntax of the source code, and so this
     88 mode requires careful consideration and testing to get the desired behavior
     89 from an AST matcher.
     90 </p>
     91 
     92 <p>In addition, because template instantiations are matched in the default mode,
     93 transformations can be accidentally made to template declarations. Finally,
     94 because implicit nodes are matched by default, transformations can be made on
     95 entirely incorrect places in the code.</p>
     96 
     97 <p>For these reasons, it is possible to ignore AST nodes which are not spelled
     98 in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
     99 mode. This is likely to be far less error-prone for users who are not already
    100 very familiar with where implicit nodes appear in the AST. It is also likely
    101 to be less error-prone for experienced AST users, as difficult cases do not
    102 need to be encountered and matcher expressions adjusted for these cases.</p>
    103 
    104 <p>In clang-query, the mode can be changed with
    105 <pre>
    106 set traversal IgnoreUnlessSpelledInSource
    107 </pre>
    108 </p>
    109 This affects both matchers and AST dump output in results.
    110 
    111 <p>When using the C++ API such as in clang-tidy checks, the
    112 <span class="mono">traverse()</span> matcher is used to set the mode:
    113 <pre>
    114 Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
    115   returnStmt(hasReturnArgument(integerLiteral(equals(0))))
    116   ), this);
    117 </pre>
    118 </p>
    119 <p>The following table compares the <span class="mono">AsIs</span> mode with
    120 the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
    121 
    122 <table class="traverse_compare">
    123 <tr>
    124 <th></th>
    125 <th><span class="mono">AsIs</span></th>
    126 <th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
    127 </tr>
    128 <tr>
    129   <td>AST dump of <span class="mono">func1</span>:
    130 <pre>
    131 struct B {
    132   B(int);
    133 };
    134 
    135 B func1() { return 42; }
    136 </pre>
    137 
    138   </td>
    139   <td>
    140 C++98 dialect:
    141 <pre>
    142 FunctionDecl
    143 `-CompoundStmt
    144   `-ReturnStmt
    145     `-ExprWithCleanups
    146       `-CXXConstructExpr
    147         `-MaterializeTemporaryExpr
    148           `-ImplicitCastExpr
    149             `-ImplicitCastExpr
    150               `-CXXConstructExpr
    151                 `-IntegerLiteral 'int' 42
    152 </pre>
    153 C++11, C++14 dialect:
    154 <pre>
    155 FunctionDecl
    156 `-CompoundStmt
    157   `-ReturnStmt
    158     `-ExprWithCleanups
    159       `-CXXConstructExpr
    160         `-MaterializeTemporaryExpr
    161           `-ImplicitCastExpr
    162             `-CXXConstructExpr
    163               `-IntegerLiteral 'int' 42
    164 </pre>
    165 C++17, C++20 dialect:
    166 <pre>
    167 FunctionDecl
    168 `-CompoundStmt
    169   `-ReturnStmt
    170     `-ImplicitCastExpr
    171       `-CXXConstructExpr
    172         `-IntegerLiteral 'int' 42
    173 </pre>
    174 </td>
    175   <td>
    176 All dialects:
    177     <pre>
    178 FunctionDecl
    179 `-CompoundStmt
    180   `-ReturnStmt
    181     `-IntegerLiteral 'int' 42
    182 </pre></td>
    183 </tr>
    184 
    185 <tr>
    186 <td>Matcher for returned <span class="mono">42</span>:
    187 <pre>
    188 struct B {
    189   B(int);
    190 };
    191 
    192 B func1() { return 42; }
    193 </pre>
    194 
    195   </td>
    196   <td>
    197 All dialects:
    198 <pre>
    199 returnStmt(hasReturnValue(
    200     ignoringImplicit(
    201         ignoringElidableConstructorCall(
    202             ignoringImplicit(
    203                 cxxConstructExpr(hasArgument(0,
    204                     ignoringImplicit(
    205                         integerLiteral().bind("returnVal")
    206                         )
    207                     ))
    208                 )
    209             )
    210         )
    211     ))
    212 </pre></td>
    213   <td>
    214 All dialects:
    215 <pre>
    216 returnStmt(hasReturnValue(
    217     integerLiteral().bind("returnVal")
    218 ))
    219 </pre></td>
    220 </tr>
    221 <tr>
    222 <td>Match result for
    223 <pre>implicitCastExpr()</pre>
    224 given:
    225 <pre>
    226 struct B {
    227   B(int);
    228 };
    229 
    230 B func1() { return 42; }
    231 </pre>
    232 
    233 </td>
    234 <td>
    235 Match found.</td>
    236   <td>
    237 No match.</td>
    238 </tr>
    239 <tr>
    240   <td>Match result for:
    241 <pre>
    242 cxxConstructorDecl(
    243   isCopyConstructor()
    244   ).bind("prepend_explicit")
    245 </pre>
    246 given:
    247 <pre>
    248 struct Other {};
    249 struct Copyable {
    250   Other m_o;
    251   Copyable();
    252 };
    253 </pre>
    254 </td>
    255 <td>
    256 Match found. Insertion produces incorrect output:
    257 <pre>
    258 struct Other {};
    259 struct explicit Copyable {
    260   Other m_o;
    261   Copyable();
    262 };
    263 </pre>
    264 </td>
    265 <td>
    266 No match found. Incorrect replacement not possible.
    267 </td>
    268 </tr>
    269 <tr>
    270   <td>Replacement of <span class="mono">begin()</span>
    271     with <span class="mono">cbegin()</span>:
    272 <pre>
    273 cxxMemberCallExpr(
    274   on(ConstContainerExpr),
    275   callee(cxxMethodDecl(hasName("begin")))
    276   ).bind("replace_with_cbegin")
    277 </pre>
    278 given:
    279 <pre>
    280 void foo() {
    281   const Container c;
    282   c.begin();
    283 
    284   for (auto i : c) {
    285   }
    286 }
    287 </pre>
    288 </td>
    289 <td>
    290 2 matches found. Replacement produces incorrect output:
    291 <pre>
    292 void foo() {
    293   const Container c;
    294   c.cbegin();
    295 
    296   for (auto i :.cbegin() c) {
    297   }
    298 }
    299 </pre>
    300 </td>
    301 <td>
    302 1 match found. Replacement produces correct output:
    303 <pre>
    304 void foo() {
    305   const Container c;
    306   c.cbegin();
    307 
    308   for (auto i : c) {
    309   }
    310 }
    311 </pre>
    312 </td>
    313 </tr>
    314 <tr>
    315   <td>Replacement of <span class="mono">int</span> member
    316     with <span class="mono">safe_int</span>:
    317 <pre>
    318 fieldDecl(
    319   hasType(asString("int"))
    320   ).bind("use_safe_int")
    321 </pre>
    322 given:
    323 <pre>
    324 struct S {
    325   int m_i;
    326 };
    327 
    328 template &lt;typename T&gt; struct TemplStruct {
    329   TemplStruct() {}
    330   ~TemplStruct() {}
    331 
    332 private:
    333   T m_t;
    334 };
    335 
    336 void instantiate() { TemplStruct&lt;int&gt; ti; }
    337 </pre>
    338 </td>
    339 <td>
    340 2 matches found. Replacement produces incorrect output:
    341 <pre>
    342 struct S {
    343   safe_int m_i;
    344 };
    345 
    346 template &lt;typename T&gt; struct TemplStruct {
    347   TemplStruct() {}
    348   ~TemplStruct() {}
    349 
    350 private:
    351   safe_int m_t;
    352 };
    353 
    354 void instantiate() { TemplStruct&lt;int&gt; ti; }
    355 </pre>
    356 </td>
    357 <td>
    358 1 match found. Replacement produces correct output:
    359 <pre>
    360 struct S {
    361   safe_int m_i;
    362 };
    363 
    364 template &lt;typename T&gt; struct TemplStruct {
    365   TemplStruct() {}
    366   ~TemplStruct() {}
    367 
    368 private:
    369   T m_t;
    370 };
    371 
    372 void instantiate() { TemplStruct&lt;int&gt; ti; }
    373 </pre>
    374 </td>
    375 </tr>
    376 <tr>
    377   <td>Add prefix to member initializer
    378 <pre>
    379 cxxCtorInitializer(
    380   forField(fieldDecl())
    381   ).bind("add_prefix")
    382 </pre>
    383 given:
    384 <pre>
    385 struct Simple {};
    386 
    387 struct Record {
    388   Record() : i(42) {}
    389 private:
    390   int i;
    391   Simple s;
    392 };
    393 </pre>
    394 </td>
    395 <td>
    396 2 matches found. Replacement produces incorrect output:
    397 <pre>
    398 struct Simple {};
    399 
    400 struct Record {
    401   m_Record() : m_i(42) {}
    402 private:
    403   int i;
    404   Simple s;
    405 };
    406 </pre>
    407 </td>
    408 <td>
    409 1 match found. Replacement produces correct output:
    410 <pre>
    411 struct Simple {};
    412 
    413 struct Record {
    414   Record() : m_i(42) {}
    415 private:
    416   int i;
    417   Simple s;
    418 };
    419 </pre>
    420 </td>
    421 </tr>
    422 <tr>
    423   <td>Ignored default arguments
    424 <pre>
    425 callExpr(
    426   callee(functionDecl(
    427     hasName("hasDefaultArg")
    428     )),
    429   argumentCountIs(1)
    430   ).bind("add_prefix")
    431 </pre>
    432 given:
    433 <pre>
    434 void hasDefaultArg(int i, int j = 0) {}
    435 void callDefaultArg() { hasDefaultArg(42); }
    436 </pre>
    437 </td>
    438 <td>
    439 No match.
    440 </td>
    441 <td>
    442 1 match found.
    443 </td>
    444 </tr>
    445 <tr>
    446   <td>Lambda fields
    447 <pre>
    448 fieldDecl(
    449   hasType(asString("int"))
    450   ).bind("make_safe")
    451 </pre>
    452 given:
    453 <pre>
    454 struct S {
    455   int m_i;
    456 };
    457 
    458 void func() {
    459   int a = 0;
    460   int c = 0;
    461 
    462   auto l = [a, b = c](int d) { int e = d; };
    463   l(43);
    464 }
    465 </pre>
    466 </td>
    467 <td>
    468 2 matches found. Replacement produces incorrect output:
    469 <pre>
    470 struct S {
    471   safe_int m_i;
    472 };
    473 
    474 void func() {
    475   int a = 0;
    476   int c = 0;
    477 
    478   auto l = [safe_a, safe_b = c](int d) { int e = d; };
    479   l(43);
    480 }
    481 </pre>
    482 </td>
    483 <td>
    484 1 match found. Replacement produces correct output:
    485 <pre>
    486 struct S {
    487   safe_int m_i;
    488 };
    489 
    490 void func() {
    491   int a = 0;
    492   int c = 0;
    493 
    494   auto l = [a, b = c](int d) { int e = d; };
    495   l(43);
    496 }
    497 </pre>
    498 </td>
    499 
    500 </tr>
    501 
    502 
    503 
    504 
    505 
    506 <tr>
    507   <td>Rewritten binary operators
    508 <pre>
    509 binaryOperator(
    510   hasOperatorName("&lt;"),
    511   hasRHS(hasDescendant(integerLiteral(equals(0))))
    512   )
    513 </pre>
    514 given:
    515 <pre>
    516 #include &lt;compare&gt;
    517 
    518 class HasSpaceship {
    519 public:
    520    int x;
    521    bool operator==(const HasSpaceship&) const = default;
    522    std::strong_ordering operator<=>(const HasSpaceship&) const = default;
    523 };
    524 
    525 bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
    526    return a < b;
    527 }
    528 </pre>
    529 </td>
    530 <td>
    531 1 match found.
    532 
    533 <pre>
    534    return a < b;
    535           ^~~~~
    536 </pre>
    537 
    538 </td>
    539 <td>
    540 No match found.
    541 </td>
    542 </tr>
    543 </table>
    544 
    545 <!-- ======================================================================= -->
    546 <h2 id="decl-matchers">Node Matchers</h2>
    547 <!-- ======================================================================= -->
    548 
    549 <p>Node matchers are at the core of matcher expressions - they specify the type
    550 of node that is expected. Every match expression starts with a node matcher,
    551 which can then be further refined with a narrowing or traversal matcher. All
    552 traversal matchers take node matchers as their arguments.</p>
    553 
    554 <p>For convenience, all node matchers take an arbitrary number of arguments
    555 and implicitly act as allOf matchers.</p>
    556 
    557 <p>Node matchers are the only matchers that support the bind("id") call to
    558 bind the matched node to the given string, to be later retrieved from the
    559 match callback.</p>
    560 
    561 <p>It is important to remember that the arguments to node matchers are
    562 predicates on the same node, just with additional information about the type.
    563 This is often useful to make matcher expression more readable by inlining bind
    564 calls into redundant node matchers inside another node matcher:
    565 <pre>
    566 // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
    567 // the same node.
    568 recordDecl(decl().bind("id"), hasName("::MyClass"))
    569 </pre>
    570 </p>
    571 
    572 <table>
    573 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
    574 <!-- START_DECL_MATCHERS -->
    575 
    576 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;...</td></tr>
    577 <tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
    578 
    579 Examples matches public virtual B.
    580   class B {};
    581   class C : public virtual B {};
    582 </pre></td></tr>
    583 
    584 
    585 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
    586 <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
    587 
    588 Examples matches i(42).
    589   class C {
    590     C() : i(42) {}
    591     int i;
    592   };
    593 </pre></td></tr>
    594 
    595 
    596 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
    597 <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
    598 
    599 Given
    600   class C {
    601   public:
    602     int a;
    603   };
    604 accessSpecDecl()
    605   matches 'public:'
    606 </pre></td></tr>
    607 
    608 
    609 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;...</td></tr>
    610 <tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
    611 Example matches foo and bar
    612 (matcher = bindingDecl()
    613 
    614   auto [foo, bar] = std::make_pair{42, 42};
    615 </pre></td></tr>
    616 
    617 
    618 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
    619 <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
    620 
    621 Example matches the declaration of the nameless block printing an input
    622 integer.
    623 
    624   myFunc(^(int p) {
    625     printf("%d", p);
    626   })
    627 </pre></td></tr>
    628 
    629 
    630 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
    631 <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
    632 
    633 Example matches Z
    634   template&lt;class T&gt; class Z {};
    635 </pre></td></tr>
    636 
    637 
    638 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
    639 <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
    640 
    641 Given
    642   template&lt;class T1, class T2, int I&gt;
    643   class A {};
    644 
    645   template&lt;class T, int I&gt;
    646   class A&lt;T, T*, I&gt; {};
    647 
    648   template&lt;&gt;
    649   class A&lt;int, int, 1&gt; {};
    650 classTemplatePartialSpecializationDecl()
    651   matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
    652 </pre></td></tr>
    653 
    654 
    655 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
    656 <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
    657 
    658 Given
    659   template&lt;typename T&gt; class A {};
    660   template&lt;&gt; class A&lt;double&gt; {};
    661   A&lt;int&gt; a;
    662 classTemplateSpecializationDecl()
    663   matches the specializations A&lt;int&gt; and A&lt;double&gt;
    664 </pre></td></tr>
    665 
    666 
    667 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
    668 <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
    669 
    670 Example matches Foo::Foo() and Foo::Foo(int)
    671   class Foo {
    672    public:
    673     Foo();
    674     Foo(int);
    675     int DoSomething();
    676   };
    677 </pre></td></tr>
    678 
    679 
    680 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
    681 <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
    682 
    683 Example matches the operator.
    684   class X { operator int() const; };
    685 </pre></td></tr>
    686 
    687 
    688 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
    689 <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
    690 
    691 Example matches the deduction guide.
    692   template&lt;typename T&gt;
    693   class X { X(int) };
    694   X(int) -&gt; X&lt;int&gt;;
    695 </pre></td></tr>
    696 
    697 
    698 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
    699 <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
    700 
    701 Example matches Foo::~Foo()
    702   class Foo {
    703    public:
    704     virtual ~Foo();
    705   };
    706 </pre></td></tr>
    707 
    708 
    709 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
    710 <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
    711 
    712 Example matches y
    713   class X { void y(); };
    714 </pre></td></tr>
    715 
    716 
    717 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
    718 <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
    719 
    720 Example matches X, Z
    721   class X;
    722   template&lt;class T&gt; class Z {};
    723 </pre></td></tr>
    724 
    725 
    726 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
    727 <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
    728 
    729 Examples matches X, C, and the friend declaration inside C;
    730   void X();
    731   class C {
    732     friend X;
    733   };
    734 </pre></td></tr>
    735 
    736 
    737 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
    738 <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
    739 and non-type template parameter declarations).
    740 
    741 Given
    742   class X { int y; };
    743 declaratorDecl()
    744   matches int y.
    745 </pre></td></tr>
    746 
    747 
    748 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
    749 <tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
    750 
    751 Examples matches the declaration node with foo and bar, but not
    752 number.
    753 (matcher = declStmt(has(decompositionDecl())))
    754 
    755   int number = 42;
    756   auto [foo, bar] = std::make_pair{42, 42};
    757 </pre></td></tr>
    758 
    759 
    760 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
    761 <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
    762 
    763 Example matches A, B, C
    764   enum X {
    765     A, B, C
    766   };
    767 </pre></td></tr>
    768 
    769 
    770 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
    771 <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
    772 
    773 Example matches X
    774   enum X {
    775     A, B, C
    776   };
    777 </pre></td></tr>
    778 
    779 
    780 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
    781 <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
    782 
    783 Given
    784   class X { int m; };
    785 fieldDecl()
    786   matches 'm'.
    787 </pre></td></tr>
    788 
    789 
    790 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
    791 <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
    792 
    793 Given
    794   class X { friend void foo(); };
    795 friendDecl()
    796   matches 'friend void foo()'.
    797 </pre></td></tr>
    798 
    799 
    800 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
    801 <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
    802 
    803 Example matches f
    804   void f();
    805 </pre></td></tr>
    806 
    807 
    808 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
    809 <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
    810 
    811 Example matches f
    812   template&lt;class T&gt; void f(T t) {}
    813 </pre></td></tr>
    814 
    815 
    816 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
    817 <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
    818 
    819 Given
    820   struct X { struct { int a; }; };
    821 indirectFieldDecl()
    822   matches 'a'.
    823 </pre></td></tr>
    824 
    825 
    826 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
    827 <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
    828 
    829 Given
    830   goto FOO;
    831   FOO: bar();
    832 labelDecl()
    833   matches 'FOO:'
    834 </pre></td></tr>
    835 
    836 
    837 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
    838 <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
    839 
    840 Given
    841   extern "C" {}
    842 linkageSpecDecl()
    843   matches "extern "C" {}"
    844 </pre></td></tr>
    845 
    846 
    847 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
    848 <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
    849 
    850 Example matches X, S, the anonymous union type, i, and U;
    851   typedef int X;
    852   struct S {
    853     union {
    854       int i;
    855     } U;
    856   };
    857 </pre></td></tr>
    858 
    859 
    860 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
    861 <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
    862 
    863 Given
    864   namespace test {}
    865   namespace alias = ::test;
    866 namespaceAliasDecl()
    867   matches "namespace alias" but not "namespace test"
    868 </pre></td></tr>
    869 
    870 
    871 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
    872 <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
    873 
    874 Given
    875   namespace {}
    876   namespace test {}
    877 namespaceDecl()
    878   matches "namespace {}" and "namespace test {}"
    879 </pre></td></tr>
    880 
    881 
    882 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
    883 <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
    884 
    885 Given
    886   template &lt;typename T, int N&gt; struct C {};
    887 nonTypeTemplateParmDecl()
    888   matches 'N', but not 'T'.
    889 </pre></td></tr>
    890 
    891 
    892 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
    893 <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
    894 
    895 Example matches Foo (Additions)
    896   @interface Foo (Additions)
    897   @end
    898 </pre></td></tr>
    899 
    900 
    901 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
    902 <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
    903 
    904 Example matches Foo (Additions)
    905   @implementation Foo (Additions)
    906   @end
    907 </pre></td></tr>
    908 
    909 
    910 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
    911 <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
    912 
    913 Example matches Foo
    914   @implementation Foo
    915   @end
    916 </pre></td></tr>
    917 
    918 
    919 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
    920 <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
    921 
    922 Example matches Foo
    923   @interface Foo
    924   @end
    925 </pre></td></tr>
    926 
    927 
    928 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
    929 <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
    930 
    931 Example matches _enabled
    932   @implementation Foo {
    933     BOOL _enabled;
    934   }
    935   @end
    936 </pre></td></tr>
    937 
    938 
    939 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
    940 <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
    941 
    942 Example matches both declaration and definition of -[Foo method]
    943   @interface Foo
    944   - (void)method;
    945   @end
    946 
    947   @implementation Foo
    948   - (void)method {}
    949   @end
    950 </pre></td></tr>
    951 
    952 
    953 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
    954 <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
    955 
    956 Example matches enabled
    957   @interface Foo
    958   @property BOOL enabled;
    959   @end
    960 </pre></td></tr>
    961 
    962 
    963 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
    964 <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
    965 
    966 Example matches FooDelegate
    967   @protocol FooDelegate
    968   @end
    969 </pre></td></tr>
    970 
    971 
    972 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
    973 <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
    974 
    975 Given
    976   void f(int x);
    977 parmVarDecl()
    978   matches int x.
    979 </pre></td></tr>
    980 
    981 
    982 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
    983 <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
    984 
    985 Example matches X, Z, U, and S
    986   class X;
    987   template&lt;class T&gt; class Z {};
    988   struct S {};
    989   union U {};
    990 </pre></td></tr>
    991 
    992 
    993 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
    994 <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
    995 
    996 Example:
    997   staticAssertExpr()
    998 matches
    999   static_assert(sizeof(S) == sizeof(int))
   1000 in
   1001   struct S {
   1002     int x;
   1003   };
   1004   static_assert(sizeof(S) == sizeof(int));
   1005 </pre></td></tr>
   1006 
   1007 
   1008 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
   1009 <tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
   1010 
   1011 Example matches X, Z, U, S, E
   1012   class X;
   1013   template&lt;class T&gt; class Z {};
   1014   struct S {};
   1015   union U {};
   1016   enum E {
   1017     A, B, C
   1018   };
   1019 </pre></td></tr>
   1020 
   1021 
   1022 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
   1023 <tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
   1024 
   1025 Given
   1026   template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
   1027 templateTypeParmDecl()
   1028   matches 'Z', but not 'N'.
   1029 </pre></td></tr>
   1030 
   1031 
   1032 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
   1033 <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
   1034 
   1035 Given
   1036   template &lt;typename T, int N&gt; struct C {};
   1037 templateTypeParmDecl()
   1038   matches 'T', but not 'N'.
   1039 </pre></td></tr>
   1040 
   1041 
   1042 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
   1043 <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
   1044 
   1045 Given
   1046   int X;
   1047   namespace NS {
   1048   int Y;
   1049   }  // namespace NS
   1050 decl(hasDeclContext(translationUnitDecl()))
   1051   matches "int X", but not "int Y".
   1052 </pre></td></tr>
   1053 
   1054 
   1055 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
   1056 <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
   1057 
   1058 Given
   1059   typedef int X;
   1060   using Y = int;
   1061 typeAliasDecl()
   1062   matches "using Y = int", but not "typedef int X"
   1063 </pre></td></tr>
   1064 
   1065 
   1066 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
   1067 <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
   1068 
   1069 typeAliasTemplateDecl() matches
   1070   template &lt;typename T&gt;
   1071   using Y = X&lt;T&gt;;
   1072 </pre></td></tr>
   1073 
   1074 
   1075 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
   1076 <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
   1077 
   1078 Given
   1079   typedef int X;
   1080   using Y = int;
   1081 typedefDecl()
   1082   matches "typedef int X", but not "using Y = int"
   1083 </pre></td></tr>
   1084 
   1085 
   1086 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
   1087 <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
   1088 
   1089 Given
   1090   typedef int X;
   1091   using Y = int;
   1092 typedefNameDecl()
   1093   matches "typedef int X" and "using Y = int"
   1094 </pre></td></tr>
   1095 
   1096 
   1097 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
   1098 <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
   1099 typename.
   1100 
   1101 Given
   1102   template &lt;typename T&gt;
   1103   struct Base { typedef T Foo; };
   1104 
   1105   template&lt;typename T&gt;
   1106   struct S : private Base&lt;T&gt; {
   1107     using typename Base&lt;T&gt;::Foo;
   1108   };
   1109 unresolvedUsingTypenameDecl()
   1110   matches using Base&lt;T&gt;::Foo </pre></td></tr>
   1111 
   1112 
   1113 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
   1114 <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
   1115 
   1116 Given
   1117   template&lt;typename X&gt;
   1118   class C : private X {
   1119     using X::x;
   1120   };
   1121 unresolvedUsingValueDecl()
   1122   matches using X::x </pre></td></tr>
   1123 
   1124 
   1125 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
   1126 <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
   1127 
   1128 Given
   1129   namespace X { int x; }
   1130   using X::x;
   1131 usingDecl()
   1132   matches using X::x </pre></td></tr>
   1133 
   1134 
   1135 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
   1136 <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
   1137 
   1138 Given
   1139   namespace X { int x; }
   1140   using namespace X;
   1141 usingDirectiveDecl()
   1142   matches using namespace X </pre></td></tr>
   1143 
   1144 
   1145 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
   1146 <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
   1147 
   1148 Example matches A, B, C and F
   1149   enum X { A, B, C };
   1150   void F();
   1151 </pre></td></tr>
   1152 
   1153 
   1154 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
   1155 <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
   1156 
   1157 Note: this does not match declarations of member variables, which are
   1158 "field" declarations in Clang parlance.
   1159 
   1160 Example matches a
   1161   int a;
   1162 </pre></td></tr>
   1163 
   1164 
   1165 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
   1166 <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
   1167 </pre></td></tr>
   1168 
   1169 
   1170 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
   1171 <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
   1172 
   1173 Given
   1174   namespace ns {
   1175     struct A { static void f(); };
   1176     void A::f() {}
   1177     void g() { A::f(); }
   1178   }
   1179   ns::A a;
   1180 nestedNameSpecifier()
   1181   matches "ns::" and both "A::"
   1182 </pre></td></tr>
   1183 
   1184 
   1185 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
   1186 <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
   1187 
   1188 Given
   1189 
   1190   #pragma omp parallel default(none)
   1191   #pragma omp parallel default(shared)
   1192   #pragma omp parallel default(firstprivate)
   1193   #pragma omp parallel
   1194 
   1195 ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
   1196 ``default(firstprivate)``
   1197 </pre></td></tr>
   1198 
   1199 
   1200 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
   1201 <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
   1202 </pre></td></tr>
   1203 
   1204 
   1205 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
   1206 <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
   1207 
   1208 Given
   1209   FOO: bar();
   1210   void *ptr = &amp;&amp;FOO;
   1211   goto *bar;
   1212 addrLabelExpr()
   1213   matches '&amp;&amp;FOO'
   1214 </pre></td></tr>
   1215 
   1216 
   1217 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
   1218 <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
   1219 
   1220 Given
   1221   int i = a[1];
   1222 arraySubscriptExpr()
   1223   matches "a[1]"
   1224 </pre></td></tr>
   1225 
   1226 
   1227 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
   1228 <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
   1229 
   1230  int i = 100;
   1231   __asm("mov al, 2");
   1232 asmStmt()
   1233   matches '__asm("mov al, 2")'
   1234 </pre></td></tr>
   1235 
   1236 
   1237 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
   1238 <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
   1239 Example matches __atomic_load_n(ptr, 1)
   1240   void foo() { int *ptr; __atomic_load_n(ptr, 1); }
   1241 </pre></td></tr>
   1242 
   1243 
   1244 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
   1245 <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
   1246 
   1247 Given
   1248   @autoreleasepool {
   1249     int x = 0;
   1250   }
   1251 autoreleasePoolStmt(stmt()) matches the declaration of "x"
   1252 inside the autorelease pool.
   1253 </pre></td></tr>
   1254 
   1255 
   1256 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
   1257 <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
   1258 
   1259 Example matches a ?: b
   1260   (a ?: b) + 42;
   1261 </pre></td></tr>
   1262 
   1263 
   1264 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
   1265 <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
   1266 
   1267 Example matches a || b
   1268   !(a || b)
   1269 See also the binaryOperation() matcher for more-general matching.
   1270 </pre></td></tr>
   1271 
   1272 
   1273 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
   1274 <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
   1275 
   1276 Example: matches "^{}":
   1277   void f() { ^{}(); }
   1278 </pre></td></tr>
   1279 
   1280 
   1281 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
   1282 <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
   1283 
   1284 Given
   1285   while (true) { break; }
   1286 breakStmt()
   1287   matches 'break'
   1288 </pre></td></tr>
   1289 
   1290 
   1291 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
   1292 <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
   1293 
   1294 Example: Matches (int) 2.2f in
   1295   int i = (int) 2.2f;
   1296 </pre></td></tr>
   1297 
   1298 
   1299 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
   1300 <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
   1301 
   1302 Example matches x.y() and y()
   1303   X x;
   1304   x.y();
   1305   y();
   1306 </pre></td></tr>
   1307 
   1308 
   1309 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
   1310 <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
   1311 
   1312 Given
   1313   switch(a) { case 42: break; default: break; }
   1314 caseStmt()
   1315   matches 'case 42:'.
   1316 </pre></td></tr>
   1317 
   1318 
   1319 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
   1320 <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
   1321 
   1322 Example: castExpr() matches each of the following:
   1323   (int) 3;
   1324   const_cast&lt;Expr *&gt;(SubExpr);
   1325   char c = 0;
   1326 but does not match
   1327   int i = (0);
   1328   int k = 0;
   1329 </pre></td></tr>
   1330 
   1331 
   1332 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
   1333 <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
   1334 
   1335 Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
   1336 though.
   1337 
   1338 Example matches 'a', L'a'
   1339   char ch = 'a';
   1340   wchar_t chw = L'a';
   1341 </pre></td></tr>
   1342 
   1343 
   1344 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
   1345 <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
   1346 </pre></td></tr>
   1347 
   1348 
   1349 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>&gt;...</td></tr>
   1350 <tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
   1351 
   1352 Given
   1353   co_await 1;
   1354 coawaitExpr()
   1355   matches 'co_await 1'
   1356 </pre></td></tr>
   1357 
   1358 
   1359 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
   1360 <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
   1361 
   1362 Example match: {1}, (1, 2)
   1363   int array[4] = {1};
   1364   vector int myvec = (vector int)(1, 2);
   1365 </pre></td></tr>
   1366 
   1367 
   1368 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
   1369 <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
   1370 
   1371 Example matches '{}' and '{{}}' in 'for (;;) {{}}'
   1372   for (;;) {{}}
   1373 </pre></td></tr>
   1374 
   1375 
   1376 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
   1377 <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
   1378 
   1379 Example matches a ? b : c
   1380   (a ? b : c) + 42
   1381 </pre></td></tr>
   1382 
   1383 
   1384 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
   1385 <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
   1386 
   1387 Example matches the constant in the case statement:
   1388     (matcher = constantExpr())
   1389   switch (a) {
   1390   case 37: break;
   1391   }
   1392 </pre></td></tr>
   1393 
   1394 
   1395 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
   1396 <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
   1397 
   1398 Given
   1399   while (true) { continue; }
   1400 continueStmt()
   1401   matches 'continue'
   1402 </pre></td></tr>
   1403 
   1404 
   1405 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>&gt;...</td></tr>
   1406 <tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
   1407 
   1408 Given
   1409   while (true) { co_return; }
   1410 coreturnStmt()
   1411   matches 'co_return'
   1412 </pre></td></tr>
   1413 
   1414 
   1415 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>&gt;...</td></tr>
   1416 <tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
   1417 
   1418 Given
   1419   co_yield 1;
   1420 coyieldExpr()
   1421   matches 'co_yield 1'
   1422 </pre></td></tr>
   1423 
   1424 
   1425 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
   1426 <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
   1427 
   1428 Example matches,
   1429   kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
   1430 </pre></td></tr>
   1431 
   1432 
   1433 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
   1434 <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
   1435 
   1436 Example matches FunctionTakesString(GetStringByValue())
   1437     (matcher = cxxBindTemporaryExpr())
   1438   FunctionTakesString(GetStringByValue());
   1439   FunctionTakesStringByPointer(GetStringPointer());
   1440 </pre></td></tr>
   1441 
   1442 
   1443 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
   1444 <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
   1445 
   1446 Example matches true
   1447   true
   1448 </pre></td></tr>
   1449 
   1450 
   1451 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
   1452 <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
   1453 
   1454   try {} catch(int i) {}
   1455 cxxCatchStmt()
   1456   matches 'catch(int i)'
   1457 </pre></td></tr>
   1458 
   1459 
   1460 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
   1461 <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
   1462 
   1463 Example: Matches const_cast&lt;int*&gt;(&amp;r) in
   1464   int n = 42;
   1465   const int &amp;r(n);
   1466   int* p = const_cast&lt;int*&gt;(&amp;r);
   1467 </pre></td></tr>
   1468 
   1469 
   1470 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
   1471 <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
   1472 
   1473 Example matches string(ptr, n) and ptr within arguments of f
   1474     (matcher = cxxConstructExpr())
   1475   void f(const string &amp;a, const string &amp;b);
   1476   char *ptr;
   1477   int n;
   1478   f(string(ptr, n), ptr);
   1479 </pre></td></tr>
   1480 
   1481 
   1482 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
   1483 <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
   1484 
   1485 Example matches the CXXDefaultArgExpr placeholder inserted for the
   1486     default value of the second parameter in the call expression f(42)
   1487     (matcher = cxxDefaultArgExpr())
   1488   void f(int x, int y = 0);
   1489   f(42);
   1490 </pre></td></tr>
   1491 
   1492 
   1493 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
   1494 <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
   1495 
   1496 Given
   1497   delete X;
   1498 cxxDeleteExpr()
   1499   matches 'delete X'.
   1500 </pre></td></tr>
   1501 
   1502 
   1503 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
   1504 <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
   1505 resolved because the base expression or the member name was dependent.
   1506 
   1507 Given
   1508   template &lt;class T&gt; void f() { T t; t.g(); }
   1509 cxxDependentScopeMemberExpr()
   1510   matches t.g
   1511 </pre></td></tr>
   1512 
   1513 
   1514 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
   1515 <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
   1516 
   1517 Example:
   1518   cxxDynamicCastExpr()
   1519 matches
   1520   dynamic_cast&lt;D*&gt;(&amp;b);
   1521 in
   1522   struct B { virtual ~B() {} }; struct D : B {};
   1523   B b;
   1524   D* p = dynamic_cast&lt;D*&gt;(&amp;b);
   1525 </pre></td></tr>
   1526 
   1527 
   1528 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
   1529 <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
   1530 
   1531 cxxForRangeStmt() matches 'for (auto a : i)'
   1532   int i[] =  {1, 2, 3}; for (auto a : i);
   1533   for(int j = 0; j &lt; 5; ++j);
   1534 </pre></td></tr>
   1535 
   1536 
   1537 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
   1538 <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
   1539 
   1540 Example: Matches Foo(bar);
   1541   Foo f = bar;
   1542   Foo g = (Foo) bar;
   1543   Foo h = Foo(bar);
   1544 </pre></td></tr>
   1545 
   1546 
   1547 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
   1548 <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
   1549 
   1550 Example matches x.y()
   1551   X x;
   1552   x.y();
   1553 </pre></td></tr>
   1554 
   1555 
   1556 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
   1557 <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
   1558 
   1559 Given
   1560   new X;
   1561 cxxNewExpr()
   1562   matches 'new X'.
   1563 </pre></td></tr>
   1564 
   1565 
   1566 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>&gt;...</td></tr>
   1567 <tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
   1568 
   1569 Given
   1570   bool a() noexcept;
   1571   bool b() noexcept(true);
   1572   bool c() noexcept(false);
   1573   bool d() noexcept(noexcept(a()));
   1574   bool e = noexcept(b()) || noexcept(c());
   1575 cxxNoexceptExpr()
   1576   matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
   1577   doesn't match the noexcept specifier in the declarations a, b, c or d.
   1578 </pre></td></tr>
   1579 
   1580 
   1581 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
   1582 <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
   1583 </pre></td></tr>
   1584 
   1585 
   1586 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
   1587 <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
   1588 
   1589 Note that if an operator isn't overloaded, it won't match. Instead, use
   1590 binaryOperator matcher.
   1591 Currently it does not match operators such as new delete.
   1592 FIXME: figure out why these do not match?
   1593 
   1594 Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
   1595     (matcher = cxxOperatorCallExpr())
   1596   ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
   1597   ostream &amp;o; int b = 1, c = 1;
   1598   o &lt;&lt; b &lt;&lt; c;
   1599 See also the binaryOperation() matcher for more-general matching of binary
   1600 uses of this AST node.
   1601 </pre></td></tr>
   1602 
   1603 
   1604 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
   1605 <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
   1606 
   1607 Either the source expression or the destination type can be matched
   1608 using has(), but hasDestinationType() is more specific and can be
   1609 more readable.
   1610 
   1611 Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
   1612   void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
   1613 </pre></td></tr>
   1614 
   1615 
   1616 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;...</td></tr>
   1617 <tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
   1618 
   1619 Example matches use of "&lt;":
   1620   #include &lt;compare&gt;
   1621   struct HasSpaceshipMem {
   1622     int a;
   1623     constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
   1624   };
   1625   void compare() {
   1626     HasSpaceshipMem hs1, hs2;
   1627     if (hs1 &lt; hs2)
   1628         return;
   1629   }
   1630 See also the binaryOperation() matcher for more-general matching
   1631 of this AST node.
   1632 </pre></td></tr>
   1633 
   1634 
   1635 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
   1636 <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
   1637 
   1638 See also: hasDestinationType
   1639 See also: reinterpretCast
   1640 
   1641 Example:
   1642   cxxStaticCastExpr()
   1643 matches
   1644   static_cast&lt;long&gt;(8)
   1645 in
   1646   long eight(static_cast&lt;long&gt;(8));
   1647 </pre></td></tr>
   1648 
   1649 
   1650 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
   1651 <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
   1652 
   1653 Given
   1654   std::vector&lt;int&gt; a({ 1, 2, 3 });
   1655   std::vector&lt;int&gt; b = { 4, 5 };
   1656   int c[] = { 6, 7 };
   1657   std::pair&lt;int, int&gt; d = { 8, 9 };
   1658 cxxStdInitializerListExpr()
   1659   matches "{ 1, 2, 3 }" and "{ 4, 5 }"
   1660 </pre></td></tr>
   1661 
   1662 
   1663 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
   1664 <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
   1665 
   1666 Example: Matches Foo(bar, bar)
   1667   Foo h = Foo(bar, bar);
   1668 </pre></td></tr>
   1669 
   1670 
   1671 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
   1672 <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
   1673 
   1674 Example matches the implicit this expression in "return i".
   1675     (matcher = cxxThisExpr())
   1676 struct foo {
   1677   int i;
   1678   int f() { return i; }
   1679 };
   1680 </pre></td></tr>
   1681 
   1682 
   1683 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
   1684 <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
   1685 
   1686   try { throw 5; } catch(int i) {}
   1687 cxxThrowExpr()
   1688   matches 'throw 5'
   1689 </pre></td></tr>
   1690 
   1691 
   1692 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
   1693 <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
   1694 
   1695   try {} catch(int i) {}
   1696 cxxTryStmt()
   1697   matches 'try {}'
   1698 </pre></td></tr>
   1699 
   1700 
   1701 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
   1702 <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
   1703 
   1704 Example matches T(t) in return statement of f
   1705     (matcher = cxxUnresolvedConstructExpr())
   1706   template &lt;typename T&gt;
   1707   void f(const T&amp; t) { return T(t); }
   1708 </pre></td></tr>
   1709 
   1710 
   1711 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
   1712 <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
   1713 
   1714 Example matches x in if (x)
   1715   bool x;
   1716   if (x) {}
   1717 </pre></td></tr>
   1718 
   1719 
   1720 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
   1721 <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
   1722 
   1723 Given
   1724   int a;
   1725 declStmt()
   1726   matches 'int a'.
   1727 </pre></td></tr>
   1728 
   1729 
   1730 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
   1731 <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
   1732 
   1733 Given
   1734   switch(a) { case 42: break; default: break; }
   1735 defaultStmt()
   1736   matches 'default:'.
   1737 </pre></td></tr>
   1738 
   1739 
   1740 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>&gt;...</td></tr>
   1741 <tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
   1742 </pre></td></tr>
   1743 
   1744 
   1745 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
   1746 <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
   1747 
   1748 Example: Matches { [2].y = 1.0, [0].x = 1.0 }
   1749   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
   1750 </pre></td></tr>
   1751 
   1752 
   1753 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
   1754 <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
   1755 
   1756 Given
   1757   do {} while (true);
   1758 doStmt()
   1759   matches 'do {} while(true)'
   1760 </pre></td></tr>
   1761 
   1762 
   1763 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
   1764 <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
   1765 
   1766 Matches any cast expression written in user code, whether it be a
   1767 C-style cast, a functional-style cast, or a keyword cast.
   1768 
   1769 Does not match implicit conversions.
   1770 
   1771 Note: the name "explicitCast" is chosen to match Clang's terminology, as
   1772 Clang uses the term "cast" to apply to implicit conversions as well as to
   1773 actual cast expressions.
   1774 
   1775 See also: hasDestinationType.
   1776 
   1777 Example: matches all five of the casts in
   1778   int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
   1779 but does not match the implicit conversion in
   1780   long ell = 42;
   1781 </pre></td></tr>
   1782 
   1783 
   1784 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
   1785 <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
   1786 
   1787 Example matches x()
   1788   void f() { x(); }
   1789 </pre></td></tr>
   1790 
   1791 
   1792 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
   1793 <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
   1794 of the sub-expression's evaluation.
   1795 
   1796 Example matches std::string()
   1797   const std::string str = std::string();
   1798 </pre></td></tr>
   1799 
   1800 
   1801 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>&gt;...</td></tr>
   1802 <tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
   1803 </pre></td></tr>
   1804 
   1805 
   1806 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
   1807 <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
   1808 1.0, 1.0f, 1.0L and 1e10.
   1809 
   1810 Does not match implicit conversions such as
   1811   float a = 10;
   1812 </pre></td></tr>
   1813 
   1814 
   1815 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
   1816 <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
   1817 
   1818 Example matches 'for (;;) {}'
   1819   for (;;) {}
   1820   int i[] =  {1, 2, 3}; for (auto a : i);
   1821 </pre></td></tr>
   1822 
   1823 
   1824 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>&gt;...</td></tr>
   1825 <tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
   1826 </pre></td></tr>
   1827 
   1828 
   1829 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
   1830 <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
   1831 </pre></td></tr>
   1832 
   1833 
   1834 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
   1835 <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
   1836 
   1837 Given
   1838   goto FOO;
   1839   FOO: bar();
   1840 gotoStmt()
   1841   matches 'goto FOO'
   1842 </pre></td></tr>
   1843 
   1844 
   1845 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
   1846 <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
   1847 
   1848 Example matches 'if (x) {}'
   1849   if (x) {}
   1850 </pre></td></tr>
   1851 
   1852 
   1853 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
   1854 <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
   1855 point literals e.g.: 1i, 1.0i
   1856 </pre></td></tr>
   1857 
   1858 
   1859 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
   1860 <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
   1861 
   1862 This matches many different places, including function call return value
   1863 eliding, as well as any type conversions.
   1864 </pre></td></tr>
   1865 
   1866 
   1867 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
   1868 <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
   1869 
   1870 Given
   1871   point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
   1872 implicitValueInitExpr()
   1873   matches "[0].y" (implicitly)
   1874 </pre></td></tr>
   1875 
   1876 
   1877 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
   1878 <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
   1879 
   1880 Given
   1881   int a[] = { 1, 2 };
   1882   struct B { int x, y; };
   1883   B b = { 5, 6 };
   1884 initListExpr()
   1885   matches "{ 1, 2 }" and "{ 5, 6 }"
   1886 </pre></td></tr>
   1887 
   1888 
   1889 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
   1890 <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
   1891 1, 1L, 0x1 and 1U.
   1892 
   1893 Does not match character-encoded integers such as L'a'.
   1894 </pre></td></tr>
   1895 
   1896 
   1897 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
   1898 <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
   1899 
   1900 Given
   1901   goto FOO;
   1902   FOO: bar();
   1903 labelStmt()
   1904   matches 'FOO:'
   1905 </pre></td></tr>
   1906 
   1907 
   1908 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
   1909 <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
   1910 
   1911 Example matches [&amp;](){return 5;}
   1912   [&amp;](){return 5;}
   1913 </pre></td></tr>
   1914 
   1915 
   1916 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
   1917 <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
   1918 
   1919 Example: Given
   1920   struct T {void func();};
   1921   T f();
   1922   void g(T);
   1923 materializeTemporaryExpr() matches 'f()' in these statements
   1924   T u(f());
   1925   g(f());
   1926   f().func();
   1927 but does not match
   1928   f();
   1929 </pre></td></tr>
   1930 
   1931 
   1932 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
   1933 <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
   1934 
   1935 Given
   1936   class Y {
   1937     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   1938     int a; static int b;
   1939   };
   1940 memberExpr()
   1941   matches this-&gt;x, x, y.x, a, this-&gt;b
   1942 </pre></td></tr>
   1943 
   1944 
   1945 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
   1946 <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
   1947 
   1948   foo();;
   1949 nullStmt()
   1950   matches the second ';'
   1951 </pre></td></tr>
   1952 
   1953 
   1954 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
   1955 <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
   1956 
   1957 Example matches @catch
   1958   @try {}
   1959   @catch (...) {}
   1960 </pre></td></tr>
   1961 
   1962 
   1963 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
   1964 <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
   1965 
   1966 Example matches @finally
   1967   @try {}
   1968   @finally {}
   1969 </pre></td></tr>
   1970 
   1971 
   1972 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
   1973 <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
   1974 
   1975 Example: matches "a" in "init" method:
   1976 @implementation A {
   1977   NSString *a;
   1978 }
   1979 - (void) init {
   1980   a = @"hello";
   1981 }
   1982 </pre></td></tr>
   1983 
   1984 
   1985 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
   1986 <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
   1987 
   1988 The innermost message send invokes the "alloc" class method on the
   1989 NSString class, while the outermost message send invokes the
   1990 "initWithString" instance method on the object returned from
   1991 NSString's "alloc". This matcher should match both message sends.
   1992   [[NSString alloc] initWithString:@"Hello"]
   1993 </pre></td></tr>
   1994 
   1995 
   1996 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
   1997 <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
   1998 
   1999 Example matches @throw obj;
   2000 </pre></td></tr>
   2001 
   2002 
   2003 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
   2004 <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
   2005 
   2006 Example matches @try
   2007   @try {}
   2008   @catch (...) {}
   2009 </pre></td></tr>
   2010 
   2011 
   2012 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
   2013 <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
   2014 
   2015 Given
   2016 
   2017   #pragma omp parallel
   2018   #pragma omp parallel default(none)
   2019   #pragma omp taskyield
   2020 
   2021 ``ompExecutableDirective()`` matches ``omp parallel``,
   2022 ``omp parallel default(none)`` and ``omp taskyield``.
   2023 </pre></td></tr>
   2024 
   2025 
   2026 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
   2027 <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
   2028 to reference another expressions and can be met
   2029 in BinaryConditionalOperators, for example.
   2030 
   2031 Example matches 'a'
   2032   (a ?: c) + 42;
   2033 </pre></td></tr>
   2034 
   2035 
   2036 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
   2037 <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
   2038 
   2039 Example matches (foo() + 1)
   2040   int foo() { return 1; }
   2041   int a = (foo() + 1);
   2042 </pre></td></tr>
   2043 
   2044 
   2045 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
   2046 <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
   2047 ParenListExprs don't have a predefined type and are used for late parsing.
   2048 In the final AST, they can be met in template declarations.
   2049 
   2050 Given
   2051   template&lt;typename T&gt; class X {
   2052     void f() {
   2053       X x(*this);
   2054       int a = 0, b = 1; int i = (a, b);
   2055     }
   2056   };
   2057 parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
   2058 has a predefined type and is a ParenExpr, not a ParenListExpr.
   2059 </pre></td></tr>
   2060 
   2061 
   2062 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
   2063 <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
   2064 
   2065 Example: Matches __func__
   2066   printf("%s", __func__);
   2067 </pre></td></tr>
   2068 
   2069 
   2070 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
   2071 <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
   2072 
   2073 Given
   2074   return 1;
   2075 returnStmt()
   2076   matches 'return 1'
   2077 </pre></td></tr>
   2078 
   2079 
   2080 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
   2081 <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
   2082 
   2083 Given
   2084   { ++a; }
   2085 stmt()
   2086   matches both the compound statement '{ ++a; }' and '++a'.
   2087 </pre></td></tr>
   2088 
   2089 
   2090 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
   2091 <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
   2092 
   2093 Example match: ({ int X = 4; X; })
   2094   int C = ({ int X = 4; X; });
   2095 </pre></td></tr>
   2096 
   2097 
   2098 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
   2099 <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
   2100 
   2101 Example matches "abcd", L"abcd"
   2102   char *s = "abcd";
   2103   wchar_t *ws = L"abcd";
   2104 </pre></td></tr>
   2105 
   2106 
   2107 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
   2108 <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
   2109 
   2110 Given
   2111   template &lt;int N&gt;
   2112   struct A { static const int n = N; };
   2113   struct B : public A&lt;42&gt; {};
   2114 substNonTypeTemplateParmExpr()
   2115   matches "N" in the right-hand side of "static const int n = N;"
   2116 </pre></td></tr>
   2117 
   2118 
   2119 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
   2120 <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
   2121 
   2122 Given
   2123   switch(a) { case 42: break; default: break; }
   2124 switchCase()
   2125   matches 'case 42:' and 'default:'.
   2126 </pre></td></tr>
   2127 
   2128 
   2129 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
   2130 <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
   2131 
   2132 Given
   2133   switch(a) { case 42: break; default: break; }
   2134 switchStmt()
   2135   matches 'switch(a)'.
   2136 </pre></td></tr>
   2137 
   2138 
   2139 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
   2140 <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
   2141 
   2142 Given
   2143   Foo x = bar;
   2144   int y = sizeof(x) + alignof(x);
   2145 unaryExprOrTypeTraitExpr()
   2146   matches sizeof(x) and alignof(x)
   2147 </pre></td></tr>
   2148 
   2149 
   2150 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
   2151 <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
   2152 
   2153 Example matches !a
   2154   !a || b
   2155 </pre></td></tr>
   2156 
   2157 
   2158 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
   2159 <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
   2160 but could not be resolved to a specific declaration.
   2161 
   2162 Given
   2163   template&lt;typename T&gt;
   2164   T foo() { T a; return a; }
   2165   template&lt;typename T&gt;
   2166   void bar() {
   2167     foo&lt;T&gt;();
   2168   }
   2169 unresolvedLookupExpr()
   2170   matches foo&lt;T&gt;() </pre></td></tr>
   2171 
   2172 
   2173 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
   2174 <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
   2175 
   2176 Given
   2177   struct X {
   2178     template &lt;class T&gt; void f();
   2179     void g();
   2180   };
   2181   template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
   2182 unresolvedMemberExpr()
   2183   matches x.f&lt;T&gt;
   2184 </pre></td></tr>
   2185 
   2186 
   2187 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
   2188 <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
   2189 
   2190 Example match: "foo"_suffix
   2191 </pre></td></tr>
   2192 
   2193 
   2194 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
   2195 <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
   2196 
   2197 Given
   2198   while (true) {}
   2199 whileStmt()
   2200   matches 'while (true) {}'.
   2201 </pre></td></tr>
   2202 
   2203 
   2204 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;...</td></tr>
   2205 <tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
   2206 
   2207 Given
   2208   template &lt;typename T&gt; struct C {};
   2209   C&lt;int&gt; c;
   2210 templateArgumentLoc()
   2211   matches 'int' in C&lt;int&gt;.
   2212 </pre></td></tr>
   2213 
   2214 
   2215 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
   2216 <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
   2217 
   2218 Given
   2219   template &lt;typename T&gt; struct C {};
   2220   C&lt;int&gt; c;
   2221 templateArgument()
   2222   matches 'int' in C&lt;int&gt;.
   2223 </pre></td></tr>
   2224 
   2225 
   2226 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
   2227 <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
   2228 
   2229 Given
   2230   template &lt;typename T&gt; class X { };
   2231   X&lt;int&gt; xi;
   2232 templateName()
   2233   matches 'X' in X&lt;int&gt;.
   2234 </pre></td></tr>
   2235 
   2236 
   2237 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
   2238 <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
   2239 </pre></td></tr>
   2240 
   2241 
   2242 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
   2243 <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
   2244 
   2245 Given
   2246   int a[] = { 2, 3 };
   2247   int b[4];
   2248   void f() { int c[a[0]]; }
   2249 arrayType()
   2250   matches "int a[]", "int b[4]" and "int c[a[0]]";
   2251 </pre></td></tr>
   2252 
   2253 
   2254 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
   2255 <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
   2256 
   2257 Given
   2258   _Atomic(int) i;
   2259 atomicType()
   2260   matches "_Atomic(int) i"
   2261 </pre></td></tr>
   2262 
   2263 
   2264 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
   2265 <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
   2266 
   2267 Given:
   2268   auto n = 4;
   2269   int v[] = { 2, 3 }
   2270   for (auto i : v) { }
   2271 autoType()
   2272   matches "auto n" and "auto i"
   2273 </pre></td></tr>
   2274 
   2275 
   2276 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
   2277 <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
   2278 "void (^)(int)".
   2279 
   2280 The pointee is always required to be a FunctionType.
   2281 </pre></td></tr>
   2282 
   2283 
   2284 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
   2285 <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
   2286 
   2287 Given
   2288   struct A {};
   2289   A a;
   2290   int b;
   2291   float c;
   2292   bool d;
   2293 builtinType()
   2294   matches "int b", "float c" and "bool d"
   2295 </pre></td></tr>
   2296 
   2297 
   2298 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
   2299 <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
   2300 
   2301 Given
   2302   _Complex float f;
   2303 complexType()
   2304   matches "_Complex float f"
   2305 </pre></td></tr>
   2306 
   2307 
   2308 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
   2309 <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
   2310 
   2311 Given
   2312   void() {
   2313     int a[2];
   2314     int b[] = { 2, 3 };
   2315     int c[b[0]];
   2316   }
   2317 constantArrayType()
   2318   matches "int a[2]"
   2319 </pre></td></tr>
   2320 
   2321 
   2322 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
   2323 <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
   2324 Example matches i[] in declaration of f.
   2325     (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
   2326 Example matches i[1].
   2327     (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
   2328   void f(int i[]) {
   2329     i[1] = 0;
   2330   }
   2331 </pre></td></tr>
   2332 
   2333 
   2334 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
   2335 <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
   2336 
   2337 Given:
   2338   short i = 1;
   2339   int j = 42;
   2340   decltype(i + j) result = i + j;
   2341 decltypeType()
   2342   matches "decltype(i + j)"
   2343 </pre></td></tr>
   2344 
   2345 
   2346 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
   2347 <tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
   2348 template types.
   2349 
   2350 Given
   2351   template &lt;typename T&gt;
   2352   class C { public: C(T); };
   2353 
   2354   C c(123);
   2355 deducedTemplateSpecializationType() matches the type in the declaration
   2356 of the variable c.
   2357 </pre></td></tr>
   2358 
   2359 
   2360 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
   2361 <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
   2362 
   2363 Given
   2364   template&lt;typename T, int Size&gt;
   2365   class array {
   2366     T data[Size];
   2367   };
   2368 dependentSizedArrayType
   2369   matches "T data[Size]"
   2370 </pre></td></tr>
   2371 
   2372 
   2373 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
   2374 <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
   2375 qualified name.
   2376 
   2377 Given
   2378   namespace N {
   2379     namespace M {
   2380       class D {};
   2381     }
   2382   }
   2383   class C {};
   2384 
   2385   class C c;
   2386   N::M::D d;
   2387 
   2388 elaboratedType() matches the type of the variable declarations of both
   2389 c and d.
   2390 </pre></td></tr>
   2391 
   2392 
   2393 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
   2394 <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
   2395 
   2396 Given
   2397   enum C { Green };
   2398   enum class S { Red };
   2399 
   2400   C c;
   2401   S s;
   2402 
   2403 enumType() matches the type of the variable declarations of both c and
   2404 s.
   2405 </pre></td></tr>
   2406 
   2407 
   2408 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
   2409 <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
   2410 
   2411 Given
   2412   int (*f)(int);
   2413   void g();
   2414 functionProtoType()
   2415   matches "int (*f)(int)" and the type of "g" in C++ mode.
   2416   In C mode, "g" is not matched because it does not contain a prototype.
   2417 </pre></td></tr>
   2418 
   2419 
   2420 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
   2421 <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
   2422 
   2423 Given
   2424   int (*f)(int);
   2425   void g();
   2426 functionType()
   2427   matches "int (*f)(int)" and the type of "g".
   2428 </pre></td></tr>
   2429 
   2430 
   2431 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
   2432 <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
   2433 
   2434 Given
   2435   int a[] = { 2, 3 };
   2436   int b[42];
   2437   void f(int c[]) { int d[a[0]]; };
   2438 incompleteArrayType()
   2439   matches "int a[]" and "int c[]"
   2440 </pre></td></tr>
   2441 
   2442 
   2443 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
   2444 <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
   2445 
   2446 Example matches S s, but not S&lt;T&gt; s.
   2447     (matcher = parmVarDecl(hasType(injectedClassNameType())))
   2448   template &lt;typename T&gt; struct S {
   2449     void f(S s);
   2450     void g(S&lt;T&gt; s);
   2451   };
   2452 </pre></td></tr>
   2453 
   2454 
   2455 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
   2456 <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
   2457 
   2458 Given:
   2459   int *a;
   2460   int &amp;b = *a;
   2461   int &amp;&amp;c = 1;
   2462   auto &amp;d = b;
   2463   auto &amp;&amp;e = c;
   2464   auto &amp;&amp;f = 2;
   2465   int g = 5;
   2466 
   2467 lValueReferenceType() matches the types of b, d, and e. e is
   2468 matched since the type is deduced as int&amp; by reference collapsing rules.
   2469 </pre></td></tr>
   2470 
   2471 
   2472 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
   2473 <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
   2474 Given
   2475   struct A { int i; }
   2476   A::* ptr = A::i;
   2477 memberPointerType()
   2478   matches "A::* ptr"
   2479 </pre></td></tr>
   2480 
   2481 
   2482 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
   2483 <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
   2484 a pointer type, despite being syntactically similar.
   2485 
   2486 Given
   2487   int *a;
   2488 
   2489   @interface Foo
   2490   @end
   2491   Foo *f;
   2492 pointerType()
   2493   matches "Foo *f", but does not match "int *a".
   2494 </pre></td></tr>
   2495 
   2496 
   2497 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
   2498 <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
   2499 
   2500 Given
   2501   int (*ptr_to_array)[4];
   2502   int *array_of_ptrs[4];
   2503 
   2504 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
   2505 array_of_ptrs.
   2506 </pre></td></tr>
   2507 
   2508 
   2509 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
   2510 <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
   2511 types.
   2512 
   2513 Given
   2514   int *a;
   2515   int &amp;b = *a;
   2516   int c = 5;
   2517 
   2518   @interface Foo
   2519   @end
   2520   Foo *f;
   2521 pointerType()
   2522   matches "int *a", but does not match "Foo *f".
   2523 </pre></td></tr>
   2524 
   2525 
   2526 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
   2527 <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
   2528 
   2529 Given:
   2530   int *a;
   2531   int &amp;b = *a;
   2532   int &amp;&amp;c = 1;
   2533   auto &amp;d = b;
   2534   auto &amp;&amp;e = c;
   2535   auto &amp;&amp;f = 2;
   2536   int g = 5;
   2537 
   2538 rValueReferenceType() matches the types of c and f. e is not
   2539 matched as it is deduced to int&amp; by reference collapsing rules.
   2540 </pre></td></tr>
   2541 
   2542 
   2543 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
   2544 <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
   2545 
   2546 Given
   2547   class C {};
   2548   struct S {};
   2549 
   2550   C c;
   2551   S s;
   2552 
   2553 recordType() matches the type of the variable declarations of both c
   2554 and s.
   2555 </pre></td></tr>
   2556 
   2557 
   2558 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
   2559 <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
   2560 
   2561 Given
   2562   int *a;
   2563   int &amp;b = *a;
   2564   int &amp;&amp;c = 1;
   2565   auto &amp;d = b;
   2566   auto &amp;&amp;e = c;
   2567   auto &amp;&amp;f = 2;
   2568   int g = 5;
   2569 
   2570 referenceType() matches the types of b, c, d, e, and f.
   2571 </pre></td></tr>
   2572 
   2573 
   2574 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
   2575 <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
   2576 template type parameter.
   2577 
   2578 Given
   2579   template &lt;typename T&gt;
   2580   void F(T t) {
   2581     int i = 1 + t;
   2582   }
   2583 
   2584 substTemplateTypeParmType() matches the type of 't' but not '1'
   2585 </pre></td></tr>
   2586 
   2587 
   2588 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
   2589 <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
   2590 
   2591 Given
   2592   enum E {};
   2593   class C {};
   2594 
   2595   E e;
   2596   C c;
   2597 
   2598 tagType() matches the type of the variable declarations of both e
   2599 and c.
   2600 </pre></td></tr>
   2601 
   2602 
   2603 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
   2604 <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
   2605 
   2606 Given
   2607   template &lt;typename T&gt;
   2608   class C { };
   2609 
   2610   template class C&lt;int&gt;;  // A
   2611   C&lt;char&gt; var;            // B
   2612 
   2613 templateSpecializationType() matches the type of the explicit
   2614 instantiation in A and the type of the variable declaration in B.
   2615 </pre></td></tr>
   2616 
   2617 
   2618 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
   2619 <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
   2620 
   2621 Example matches T, but not int.
   2622     (matcher = templateTypeParmType())
   2623   template &lt;typename T&gt; void f(int i);
   2624 </pre></td></tr>
   2625 
   2626 
   2627 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
   2628 <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
   2629 </pre></td></tr>
   2630 
   2631 
   2632 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
   2633 <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
   2634 
   2635 Given
   2636   typedef int X;
   2637 typedefType()
   2638   matches "typedef int X"
   2639 </pre></td></tr>
   2640 
   2641 
   2642 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
   2643 <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
   2644 
   2645 Given:
   2646   typedef __underlying_type(T) type;
   2647 unaryTransformType()
   2648   matches "__underlying_type(T)"
   2649 </pre></td></tr>
   2650 
   2651 
   2652 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
   2653 <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
   2654 integer-constant-expression.
   2655 
   2656 Given
   2657   void f() {
   2658     int a[] = { 2, 3 }
   2659     int b[42];
   2660     int c[a[0]];
   2661   }
   2662 variableArrayType()
   2663   matches "int c[a[0]]"
   2664 </pre></td></tr>
   2665 
   2666 <!--END_DECL_MATCHERS -->
   2667 </table>
   2668 
   2669 <!-- ======================================================================= -->
   2670 <h2 id="narrowing-matchers">Narrowing Matchers</h2>
   2671 <!-- ======================================================================= -->
   2672 
   2673 <p>Narrowing matchers match certain attributes on the current node, thus
   2674 narrowing down the set of nodes of the current type to match on.</p>
   2675 
   2676 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
   2677 which allow users to create more powerful match expressions.</p>
   2678 
   2679 <table>
   2680 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
   2681 <!-- START_NARROWING_MATCHERS -->
   2682 
   2683 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
   2684 <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
   2685 
   2686 Usable as: Any Matcher
   2687 </pre></td></tr>
   2688 
   2689 
   2690 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
   2691 <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
   2692 
   2693 Usable as: Any Matcher
   2694 </pre></td></tr>
   2695 
   2696 
   2697 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
   2698 <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
   2699 
   2700 Useful when another matcher requires a child matcher, but there's no
   2701 additional constraint. This will often be used with an explicit conversion
   2702 to an internal::Matcher&lt;&gt; type such as TypeMatcher.
   2703 
   2704 Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
   2705 "int* p" and "void f()" in
   2706   int* p;
   2707   void f();
   2708 
   2709 Usable as: Any Matcher
   2710 </pre></td></tr>
   2711 
   2712 
   2713 <tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
   2714 <tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
   2715 
   2716 Given
   2717   if (true);
   2718   for (; true; );
   2719 with the matcher
   2720   mapAnyOf(ifStmt, forStmt).with(
   2721     hasCondition(cxxBoolLiteralExpr(equals(true)))
   2722     ).bind("trueCond")
   2723 matches the if and the for. It is equivalent to:
   2724   auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
   2725   anyOf(
   2726     ifStmt(trueCond).bind("trueCond"),
   2727     forStmt(trueCond).bind("trueCond")
   2728     );
   2729 
   2730 The with() chain-call accepts zero or more matchers which are combined
   2731 as-if with allOf() in each of the node matchers.
   2732 Usable as: Any Matcher
   2733 </pre></td></tr>
   2734 
   2735 
   2736 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
   2737 <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
   2738 
   2739 Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
   2740   class X {};
   2741   class Y {};
   2742 
   2743 Usable as: Any Matcher
   2744 </pre></td></tr>
   2745 
   2746 
   2747 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
   2748 <tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
   2749 specified names.
   2750 
   2751    hasAnyOperatorName("+", "-")
   2752  Is equivalent to
   2753    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   2754 </pre></td></tr>
   2755 
   2756 
   2757 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
   2758 <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
   2759 unary).
   2760 
   2761 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   2762   !(a || b)
   2763 </pre></td></tr>
   2764 
   2765 
   2766 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
   2767 <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
   2768 
   2769 Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   2770   if (a == b)
   2771     a += b;
   2772 
   2773 Example 2: matches s1 = s2
   2774            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   2775   struct S { S&amp; operator=(const S&amp;); };
   2776   void x() { S s1, s2; s1 = s2; }
   2777 </pre></td></tr>
   2778 
   2779 
   2780 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
   2781 <tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
   2782 
   2783 Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   2784   if (a == b)
   2785     a += b;
   2786 
   2787 Example 2: matches s1 &lt; s2
   2788            (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   2789   struct S { bool operator&lt;(const S&amp; other); };
   2790   void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
   2791 </pre></td></tr>
   2792 
   2793 
   2794 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
   2795 <tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
   2796 inheritance.
   2797 
   2798 Examples:
   2799   class C {
   2800   public:    int a;
   2801   protected: int b;
   2802   private:   int c; // fieldDecl(isPrivate()) matches 'c'
   2803   };
   2804 
   2805   struct Base {};
   2806   struct Derived1 : private Base {}; // matches 'Base'
   2807   class Derived2 : Base {}; // matches 'Base'
   2808 </pre></td></tr>
   2809 
   2810 
   2811 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
   2812 <tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
   2813 protected inheritance.
   2814 
   2815 Examples:
   2816   class C {
   2817   public:    int a;
   2818   protected: int b; // fieldDecl(isProtected()) matches 'b'
   2819   private:   int c;
   2820   };
   2821 
   2822   class Base {};
   2823   class Derived : protected Base {}; // matches 'Base'
   2824 </pre></td></tr>
   2825 
   2826 
   2827 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
   2828 <tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
   2829 inheritance.
   2830 
   2831 Examples:
   2832   class C {
   2833   public:    int a; // fieldDecl(isPublic()) matches 'a'
   2834   protected: int b;
   2835   private:   int c;
   2836   };
   2837 
   2838   class Base {};
   2839   class Derived1 : public Base {}; // matches 'Base'
   2840   struct Derived2 : Base {}; // matches 'Base'
   2841 </pre></td></tr>
   2842 
   2843 
   2844 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
   2845 <tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
   2846 virtual inheritance.
   2847 
   2848 Example:
   2849   class A {
   2850    public:
   2851     virtual void x(); // matches x
   2852   };
   2853 
   2854 Example:
   2855   class Base {};
   2856   class DirectlyDerived : virtual Base {}; // matches Base
   2857   class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
   2858 
   2859 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   2860 </pre></td></tr>
   2861 
   2862 
   2863 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
   2864 <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
   2865 
   2866 
   2867 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
   2868 <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
   2869 
   2870 Given
   2871   f('false, 3.14, 42);
   2872 characterLiteral(equals(0))
   2873   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   2874   match false
   2875 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   2876   match 3.14
   2877 integerLiteral(equals(42))
   2878   matches 42
   2879 
   2880 Note that you cannot directly match a negative numeric literal because the
   2881 minus sign is not part of the literal: It is a unary operator whose operand
   2882 is the positive numeric literal. Instead, you must use a unaryOperator()
   2883 matcher to match the minus sign:
   2884 
   2885 unaryOperator(hasOperatorName("-"),
   2886               hasUnaryOperand(integerLiteral(equals(13))))
   2887 
   2888 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
   2889            Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
   2890 </pre></td></tr>
   2891 
   2892 
   2893 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
   2894 <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
   2895 
   2896 
   2897 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
   2898 <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
   2899 
   2900 
   2901 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
   2902 <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
   2903 
   2904 Given
   2905   try {
   2906     // ...
   2907   } catch (int) {
   2908     // ...
   2909   } catch (...) {
   2910     // ...
   2911   }
   2912 cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
   2913 </pre></td></tr>
   2914 
   2915 
   2916 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
   2917 <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
   2918 a specific number of arguments (including absent default arguments).
   2919 
   2920 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   2921   void f(int x, int y);
   2922   f(0, 0);
   2923 </pre></td></tr>
   2924 
   2925 
   2926 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
   2927 <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
   2928 </pre></td></tr>
   2929 
   2930 
   2931 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
   2932 <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
   2933 zero initialization.
   2934 
   2935 Given
   2936 void foo() {
   2937   struct point { double x; double y; };
   2938   point pt[2] = { { 1.0, 2.0 } };
   2939 }
   2940 initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
   2941 will match the implicit array filler for pt[1].
   2942 </pre></td></tr>
   2943 
   2944 
   2945 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
   2946 <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
   2947 
   2948 Given
   2949   struct S {
   2950     S(); // #1
   2951     S(const S &amp;); // #2
   2952     S(S &amp;&amp;); // #3
   2953   };
   2954 cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
   2955 </pre></td></tr>
   2956 
   2957 
   2958 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
   2959 <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
   2960 
   2961 Given
   2962   struct S {
   2963     S(); // #1
   2964     S(const S &amp;); // #2
   2965     S(S &amp;&amp;); // #3
   2966   };
   2967 cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
   2968 </pre></td></tr>
   2969 
   2970 
   2971 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
   2972 <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
   2973 
   2974 Given
   2975   struct S {
   2976     S(); // #1
   2977     S(int) {} // #2
   2978     S(S &amp;&amp;) : S() {} // #3
   2979   };
   2980   S::S() : S(0) {} // #4
   2981 cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
   2982 #1 or #2.
   2983 </pre></td></tr>
   2984 
   2985 
   2986 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
   2987 <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
   2988 that have an explicit specifier if this explicit specifier is resolved to
   2989 true.
   2990 
   2991 Given
   2992   template&lt;bool b&gt;
   2993   struct S {
   2994     S(int); // #1
   2995     explicit S(double); // #2
   2996     operator int(); // #3
   2997     explicit operator bool(); // #4
   2998     explicit(false) S(bool) // # 7
   2999     explicit(true) S(char) // # 8
   3000     explicit(b) S(S) // # 9
   3001   };
   3002   S(int) -&gt; S&lt;true&gt; // #5
   3003   explicit S(double) -&gt; S&lt;false&gt; // #6
   3004 cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   3005 cxxConversionDecl(isExplicit()) will match #4, but not #3.
   3006 cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   3007 </pre></td></tr>
   3008 
   3009 
   3010 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
   3011 <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
   3012 
   3013 Given
   3014   struct S {
   3015     S(); // #1
   3016     S(const S &amp;); // #2
   3017     S(S &amp;&amp;); // #3
   3018   };
   3019 cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
   3020 </pre></td></tr>
   3021 
   3022 
   3023 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
   3024 <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
   3025 that have an explicit specifier if this explicit specifier is resolved to
   3026 true.
   3027 
   3028 Given
   3029   template&lt;bool b&gt;
   3030   struct S {
   3031     S(int); // #1
   3032     explicit S(double); // #2
   3033     operator int(); // #3
   3034     explicit operator bool(); // #4
   3035     explicit(false) S(bool) // # 7
   3036     explicit(true) S(char) // # 8
   3037     explicit(b) S(S) // # 9
   3038   };
   3039   S(int) -&gt; S&lt;true&gt; // #5
   3040   explicit S(double) -&gt; S&lt;false&gt; // #6
   3041 cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   3042 cxxConversionDecl(isExplicit()) will match #4, but not #3.
   3043 cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   3044 </pre></td></tr>
   3045 
   3046 
   3047 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
   3048 <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
   3049 opposed to a member.
   3050 
   3051 Given
   3052   struct B {};
   3053   struct D : B {
   3054     int I;
   3055     D(int i) : I(i) {}
   3056   };
   3057   struct E : B {
   3058     E() : B() {}
   3059   };
   3060 cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
   3061   will match E(), but not match D(int).
   3062 </pre></td></tr>
   3063 
   3064 
   3065 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
   3066 <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
   3067 opposed to a base.
   3068 
   3069 Given
   3070   struct B {};
   3071   struct D : B {
   3072     int I;
   3073     D(int i) : I(i) {}
   3074   };
   3075   struct E : B {
   3076     E() : B() {}
   3077   };
   3078 cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
   3079   will match D(int), but not match E().
   3080 </pre></td></tr>
   3081 
   3082 
   3083 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
   3084 <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
   3085 code (as opposed to implicitly added by the compiler).
   3086 
   3087 Given
   3088   struct Foo {
   3089     Foo() { }
   3090     Foo(int) : foo_("A") { }
   3091     string foo_;
   3092   };
   3093 cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
   3094   will match Foo(int), but not Foo()
   3095 </pre></td></tr>
   3096 
   3097 
   3098 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
   3099 <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
   3100 that have an explicit specifier if this explicit specifier is resolved to
   3101 true.
   3102 
   3103 Given
   3104   template&lt;bool b&gt;
   3105   struct S {
   3106     S(int); // #1
   3107     explicit S(double); // #2
   3108     operator int(); // #3
   3109     explicit operator bool(); // #4
   3110     explicit(false) S(bool) // # 7
   3111     explicit(true) S(char) // # 8
   3112     explicit(b) S(S) // # 9
   3113   };
   3114   S(int) -&gt; S&lt;true&gt; // #5
   3115   explicit S(double) -&gt; S&lt;false&gt; // #6
   3116 cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   3117 cxxConversionDecl(isExplicit()) will match #4, but not #3.
   3118 cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   3119 </pre></td></tr>
   3120 
   3121 
   3122 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr>
   3123 <tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
   3124 
   3125 In template declarations, dependent members are not resolved and so can
   3126 not be matched to particular named declarations.
   3127 
   3128 This matcher allows to match on the known name of members.
   3129 
   3130 Given
   3131   template &lt;typename T&gt;
   3132   struct S {
   3133       void mem();
   3134   };
   3135   template &lt;typename T&gt;
   3136   void x() {
   3137       S&lt;T&gt; s;
   3138       s.mem();
   3139   }
   3140 cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
   3141 </pre></td></tr>
   3142 
   3143 
   3144 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
   3145 <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
   3146 to '.'.
   3147 
   3148 Member calls on the implicit this pointer match as called with '-&gt;'.
   3149 
   3150 Given
   3151   class Y {
   3152     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   3153     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   3154     int a;
   3155     static int b;
   3156   };
   3157   template &lt;class T&gt;
   3158   class Z {
   3159     void x() { this-&gt;m; }
   3160   };
   3161 memberExpr(isArrow())
   3162   matches this-&gt;x, x, y.x, a, this-&gt;b
   3163 cxxDependentScopeMemberExpr(isArrow())
   3164   matches this-&gt;m
   3165 unresolvedMemberExpr(isArrow())
   3166   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   3167 </pre></td></tr>
   3168 
   3169 
   3170 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr>
   3171 <tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
   3172 node
   3173 
   3174 In template declarations, dependent members are not resolved and so can
   3175 not be matched to particular named declarations.
   3176 
   3177 This matcher allows to match on the name of already-bound VarDecl, FieldDecl
   3178 and CXXMethodDecl nodes.
   3179 
   3180 Given
   3181   template &lt;typename T&gt;
   3182   struct S {
   3183       void mem();
   3184   };
   3185   template &lt;typename T&gt;
   3186   void x() {
   3187       S&lt;T&gt; s;
   3188       s.mem();
   3189   }
   3190 The matcher
   3191 @code
   3192 cxxDependentScopeMemberExpr(
   3193   hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
   3194       hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
   3195           cxxMethodDecl(hasName("mem")).bind("templMem")
   3196           )))))
   3197       )))),
   3198   memberHasSameNameAsBoundNode("templMem")
   3199   )
   3200 @endcode
   3201 first matches and binds the @c mem member of the @c S template, then
   3202 compares its name to the usage in @c s.mem() in the @c x function template
   3203 </pre></td></tr>
   3204 
   3205 
   3206 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
   3207 <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
   3208 
   3209 Given
   3210 struct A {
   3211   void foo() const;
   3212   void bar();
   3213 };
   3214 
   3215 cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
   3216 </pre></td></tr>
   3217 
   3218 
   3219 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
   3220 <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
   3221 operator.
   3222 
   3223 Given
   3224 struct A {
   3225   A &amp;operator=(const A &amp;);
   3226   A &amp;operator=(A &amp;&amp;);
   3227 };
   3228 
   3229 cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
   3230 the second one.
   3231 </pre></td></tr>
   3232 
   3233 
   3234 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
   3235 <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
   3236 
   3237 Given:
   3238   class A final {};
   3239 
   3240   struct B {
   3241     virtual void f();
   3242   };
   3243 
   3244   struct C : B {
   3245     void f() final;
   3246   };
   3247 matches A and C::f, but not B, C, or B::f
   3248 </pre></td></tr>
   3249 
   3250 
   3251 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
   3252 <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
   3253 operator.
   3254 
   3255 Given
   3256 struct A {
   3257   A &amp;operator=(const A &amp;);
   3258   A &amp;operator=(A &amp;&amp;);
   3259 };
   3260 
   3261 cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
   3262 the first one.
   3263 </pre></td></tr>
   3264 
   3265 
   3266 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
   3267 <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
   3268 
   3269 Given
   3270   class A {
   3271    public:
   3272     virtual void x();
   3273   };
   3274   class B : public A {
   3275    public:
   3276     virtual void x();
   3277   };
   3278   matches B::x
   3279 </pre></td></tr>
   3280 
   3281 
   3282 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
   3283 <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
   3284 
   3285 Given
   3286   class A {
   3287    public:
   3288     virtual void x() = 0;
   3289   };
   3290   matches A::x
   3291 </pre></td></tr>
   3292 
   3293 
   3294 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
   3295 <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
   3296 
   3297 Given
   3298   struct S {
   3299     S(); // #1
   3300     S(const S &amp;) = default; // #2
   3301     S(S &amp;&amp;) = delete; // #3
   3302   };
   3303 cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
   3304 </pre></td></tr>
   3305 
   3306 
   3307 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
   3308 <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
   3309 virtual inheritance.
   3310 
   3311 Example:
   3312   class A {
   3313    public:
   3314     virtual void x(); // matches x
   3315   };
   3316 
   3317 Example:
   3318   class Base {};
   3319   class DirectlyDerived : virtual Base {}; // matches Base
   3320   class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
   3321 
   3322 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   3323 </pre></td></tr>
   3324 
   3325 
   3326 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
   3327 <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
   3328 
   3329 Given
   3330   class A {
   3331    public:
   3332     virtual void x();
   3333   };
   3334   class B : public A {
   3335    public:
   3336     void x();
   3337   };
   3338   matches A::x but not B::x
   3339 </pre></td></tr>
   3340 
   3341 
   3342 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
   3343 <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
   3344 
   3345 Given:
   3346   MyClass *p1 = new MyClass[10];
   3347 cxxNewExpr(isArray())
   3348   matches the expression 'new MyClass[10]'.
   3349 </pre></td></tr>
   3350 
   3351 
   3352 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
   3353 <tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
   3354 specified names.
   3355 
   3356    hasAnyOperatorName("+", "-")
   3357  Is equivalent to
   3358    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   3359 </pre></td></tr>
   3360 
   3361 
   3362 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
   3363 <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
   3364 
   3365 Matches overloaded operator names specified in strings without the
   3366 "operator" prefix: e.g. "&lt;&lt;".
   3367 
   3368   hasAnyOverloadedOperatorName("+", "-")
   3369 Is equivalent to
   3370   anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
   3371 </pre></td></tr>
   3372 
   3373 
   3374 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
   3375 <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
   3376 unary).
   3377 
   3378 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   3379   !(a || b)
   3380 </pre></td></tr>
   3381 
   3382 
   3383 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
   3384 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
   3385 
   3386 Matches overloaded operator names specified in strings without the
   3387 "operator" prefix: e.g. "&lt;&lt;".
   3388 
   3389 Given:
   3390   class A { int operator*(); };
   3391   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
   3392   A a;
   3393   a &lt;&lt; a;   // &lt;-- This matches
   3394 
   3395 cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
   3396 specified line and
   3397 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
   3398 matches the declaration of A.
   3399 
   3400 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
   3401 </pre></td></tr>
   3402 
   3403 
   3404 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
   3405 <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
   3406 
   3407 Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   3408   if (a == b)
   3409     a += b;
   3410 
   3411 Example 2: matches s1 = s2
   3412            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   3413   struct S { S&amp; operator=(const S&amp;); };
   3414   void x() { S s1, s2; s1 = s2; }
   3415 </pre></td></tr>
   3416 
   3417 
   3418 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
   3419 <tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
   3420 
   3421 Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   3422   if (a == b)
   3423     a += b;
   3424 
   3425 Example 2: matches s1 &lt; s2
   3426            (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   3427   struct S { bool operator&lt;(const S&amp; other); };
   3428   void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
   3429 </pre></td></tr>
   3430 
   3431 
   3432 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
   3433 <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
   3434 
   3435 Example matches x (matcher = cxxRecordDecl(hasDefinition()))
   3436 class x {};
   3437 class y;
   3438 </pre></td></tr>
   3439 
   3440 
   3441 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
   3442 <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
   3443 </pre></td></tr>
   3444 
   3445 
   3446 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
   3447 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
   3448 </pre></td></tr>
   3449 
   3450 
   3451 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
   3452 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
   3453 static member variable template instantiations.
   3454 
   3455 Given
   3456   template&lt;typename T&gt; void A(T t) { }
   3457   template&lt;&gt; void A(int N) { }
   3458 functionDecl(isExplicitTemplateSpecialization())
   3459   matches the specialization A&lt;int&gt;().
   3460 
   3461 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   3462 </pre></td></tr>
   3463 
   3464 
   3465 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
   3466 <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
   3467 
   3468 Given:
   3469   class A final {};
   3470 
   3471   struct B {
   3472     virtual void f();
   3473   };
   3474 
   3475   struct C : B {
   3476     void f() final;
   3477   };
   3478 matches A and C::f, but not B, C, or B::f
   3479 </pre></td></tr>
   3480 
   3481 
   3482 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
   3483 <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
   3484 
   3485 Given:
   3486   auto x = []{};
   3487 
   3488 cxxRecordDecl(isLambda()) matches the implicit class declaration of
   3489 decltype(x)
   3490 </pre></td></tr>
   3491 
   3492 
   3493 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
   3494 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
   3495 isSameOrDerivedFrom(hasName(...)).
   3496 </pre></td></tr>
   3497 
   3498 
   3499 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
   3500 <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
   3501 member variable template instantiations.
   3502 
   3503 Given
   3504   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   3505 or
   3506   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   3507 or
   3508   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   3509 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   3510   matches the template instantiation of X&lt;A&gt;.
   3511 
   3512 But given
   3513   template &lt;typename T&gt;  class X {}; class A {};
   3514   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   3515 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   3516   does not match, as X&lt;A&gt; is an explicit template specialization.
   3517 
   3518 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   3519 </pre></td></tr>
   3520 
   3521 
   3522 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
   3523 <tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
   3524 specified names.
   3525 
   3526    hasAnyOperatorName("+", "-")
   3527  Is equivalent to
   3528    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   3529 </pre></td></tr>
   3530 
   3531 
   3532 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
   3533 <tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
   3534 unary).
   3535 
   3536 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   3537   !(a || b)
   3538 </pre></td></tr>
   3539 
   3540 
   3541 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr>
   3542 <tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
   3543 
   3544 Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   3545   if (a == b)
   3546     a += b;
   3547 
   3548 Example 2: matches s1 = s2
   3549            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   3550   struct S { S&amp; operator=(const S&amp;); };
   3551   void x() { S s1, s2; s1 = s2; }
   3552 </pre></td></tr>
   3553 
   3554 
   3555 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
   3556 <tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
   3557 
   3558 Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   3559   if (a == b)
   3560     a += b;
   3561 
   3562 Example 2: matches s1 &lt; s2
   3563            (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   3564   struct S { bool operator&lt;(const S&amp; other); };
   3565   void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
   3566 </pre></td></tr>
   3567 
   3568 
   3569 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
   3570 <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
   3571 a specific number of arguments (including absent default arguments).
   3572 
   3573 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   3574   void f(int x, int y);
   3575   f(0, 0);
   3576 </pre></td></tr>
   3577 
   3578 
   3579 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
   3580 <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
   3581 a specific number of arguments (including absent default arguments).
   3582 
   3583 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   3584   void f(int x, int y);
   3585   f(0, 0);
   3586 </pre></td></tr>
   3587 
   3588 
   3589 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
   3590 <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
   3591 
   3592 Example matches y(x) but not y(42) or NS::y(x).
   3593   namespace NS {
   3594     struct X {};
   3595     void y(X);
   3596   }
   3597 
   3598   void y(...);
   3599 
   3600   void test() {
   3601     NS::X x;
   3602     y(x); // Matches
   3603     NS::y(x); // Doesn't match
   3604     y(42); // Doesn't match
   3605     using NS::y;
   3606     y(x); // Found by both unqualified lookup and ADL, doesn't match
   3607    }
   3608 </pre></td></tr>
   3609 
   3610 
   3611 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
   3612 <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
   3613 
   3614 Example: matches the implicit cast around 0
   3615 (matcher = castExpr(hasCastKind(CK_NullToPointer)))
   3616   int *p = 0;
   3617 
   3618 If the matcher is use from clang-query, CastKind parameter
   3619 should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
   3620 </pre></td></tr>
   3621 
   3622 
   3623 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
   3624 <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
   3625 
   3626 
   3627 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
   3628 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
   3629 
   3630 Given
   3631   f('false, 3.14, 42);
   3632 characterLiteral(equals(0))
   3633   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   3634   match false
   3635 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   3636   match 3.14
   3637 integerLiteral(equals(42))
   3638   matches 42
   3639 
   3640 Note that you cannot directly match a negative numeric literal because the
   3641 minus sign is not part of the literal: It is a unary operator whose operand
   3642 is the positive numeric literal. Instead, you must use a unaryOperator()
   3643 matcher to match the minus sign:
   3644 
   3645 unaryOperator(hasOperatorName("-"),
   3646               hasUnaryOperand(integerLiteral(equals(13))))
   3647 
   3648 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
   3649            Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
   3650 </pre></td></tr>
   3651 
   3652 
   3653 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
   3654 <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
   3655 
   3656 
   3657 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
   3658 <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
   3659 
   3660 
   3661 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
   3662 <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
   3663 
   3664 Given
   3665   template&lt;typename T&gt; struct C {};
   3666   C&lt;int&gt; c;
   3667 classTemplateSpecializationDecl(templateArgumentCountIs(1))
   3668   matches C&lt;int&gt;.
   3669 </pre></td></tr>
   3670 
   3671 
   3672 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
   3673 <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
   3674 child statements.
   3675 
   3676 Example: Given
   3677   { for (;;) {} }
   3678 compoundStmt(statementCountIs(0)))
   3679   matches '{}'
   3680   but does not match the outer compound statement.
   3681 </pre></td></tr>
   3682 
   3683 
   3684 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
   3685 <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
   3686 
   3687 Given
   3688   int a[42];
   3689   int b[2 * 21];
   3690   int c[41], d[43];
   3691   char *s = "abcd";
   3692   wchar_t *ws = L"abcd";
   3693   char *w = "a";
   3694 constantArrayType(hasSize(42))
   3695   matches "int a[42]" and "int b[2 * 21]"
   3696 stringLiteral(hasSize(4))
   3697   matches "abcd", L"abcd"
   3698 </pre></td></tr>
   3699 
   3700 
   3701 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
   3702 <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
   3703 declarations.
   3704 
   3705 Example: Given
   3706   int a, b;
   3707   int c;
   3708   int d = 2, e;
   3709 declCountIs(2)
   3710   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
   3711 </pre></td></tr>
   3712 
   3713 
   3714 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
   3715 <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
   3716 
   3717 Matches a node if it equals the node previously bound to ID.
   3718 
   3719 Given
   3720   class X { int a; int b; };
   3721 cxxRecordDecl(
   3722     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   3723     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   3724   matches the class X, as a and b have the same type.
   3725 
   3726 Note that when multiple matches are involved via forEach* matchers,
   3727 equalsBoundNodes acts as a filter.
   3728 For example:
   3729 compoundStmt(
   3730     forEachDescendant(varDecl().bind("d")),
   3731     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   3732 will trigger a match for each combination of variable declaration
   3733 and reference to that variable declaration within a compound statement.
   3734 </pre></td></tr>
   3735 
   3736 
   3737 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
   3738 <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
   3739 
   3740 Decl has pointer identity in the AST.
   3741 </pre></td></tr>
   3742 
   3743 
   3744 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
   3745 <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
   3746 
   3747 Given
   3748   __attribute__((device)) void f() { ... }
   3749 decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
   3750 f. If the matcher is used from clang-query, attr::Kind parameter should be
   3751 passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
   3752 </pre></td></tr>
   3753 
   3754 
   3755 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
   3756 <tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
   3757 Does not match if only part of the statement is expanded from that macro or
   3758 if different parts of the the statement are expanded from different
   3759 appearances of the macro.
   3760 </pre></td></tr>
   3761 
   3762 
   3763 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
   3764 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
   3765 partially matching a given regex.
   3766 
   3767 Example matches Y but not X
   3768     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   3769   #include "ASTMatcher.h"
   3770   class X {};
   3771 ASTMatcher.h:
   3772   class Y {};
   3773 
   3774 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   3775 
   3776 If the matcher is used in clang-query, RegexFlags parameter
   3777 should be passed as a quoted string. e.g: "NoFlags".
   3778 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   3779 </pre></td></tr>
   3780 
   3781 
   3782 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
   3783 <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
   3784 
   3785 Example matches X but not Y
   3786   (matcher = cxxRecordDecl(isExpansionInMainFile())
   3787   #include &lt;Y.h&gt;
   3788   class X {};
   3789 Y.h:
   3790   class Y {};
   3791 
   3792 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   3793 </pre></td></tr>
   3794 
   3795 
   3796 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
   3797 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
   3798 
   3799 Example matches Y but not X
   3800     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   3801   #include &lt;SystemHeader.h&gt;
   3802   class X {};
   3803 SystemHeader.h:
   3804   class Y {};
   3805 
   3806 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   3807 </pre></td></tr>
   3808 
   3809 
   3810 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
   3811 <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
   3812 by the compiler (eg. implicit default/copy constructors).
   3813 </pre></td></tr>
   3814 
   3815 
   3816 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
   3817 <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
   3818 
   3819 Given
   3820   class vector {};
   3821   namespace foo {
   3822     class vector {};
   3823     namespace std {
   3824       class vector {};
   3825     }
   3826   }
   3827   namespace std {
   3828     inline namespace __1 {
   3829       class vector {}; // #1
   3830       namespace experimental {
   3831         class vector {};
   3832       }
   3833     }
   3834   }
   3835 cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
   3836 </pre></td></tr>
   3837 
   3838 
   3839 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
   3840 <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
   3841 template instantiations.
   3842 
   3843 Given
   3844   template&lt;typename T&gt; void A(T t) { T i; }
   3845   A(0);
   3846   A(0U);
   3847 functionDecl(isInstantiated())
   3848   matches 'A(int) {...};' and 'A(unsigned) {...}'.
   3849 </pre></td></tr>
   3850 
   3851 
   3852 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
   3853 <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
   3854 inheritance.
   3855 
   3856 Examples:
   3857   class C {
   3858   public:    int a;
   3859   protected: int b;
   3860   private:   int c; // fieldDecl(isPrivate()) matches 'c'
   3861   };
   3862 
   3863   struct Base {};
   3864   struct Derived1 : private Base {}; // matches 'Base'
   3865   class Derived2 : Base {}; // matches 'Base'
   3866 </pre></td></tr>
   3867 
   3868 
   3869 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
   3870 <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
   3871 protected inheritance.
   3872 
   3873 Examples:
   3874   class C {
   3875   public:    int a;
   3876   protected: int b; // fieldDecl(isProtected()) matches 'b'
   3877   private:   int c;
   3878   };
   3879 
   3880   class Base {};
   3881   class Derived : protected Base {}; // matches 'Base'
   3882 </pre></td></tr>
   3883 
   3884 
   3885 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
   3886 <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
   3887 inheritance.
   3888 
   3889 Examples:
   3890   class C {
   3891   public:    int a; // fieldDecl(isPublic()) matches 'a'
   3892   protected: int b;
   3893   private:   int c;
   3894   };
   3895 
   3896   class Base {};
   3897   class Derived1 : public Base {}; // matches 'Base'
   3898   struct Derived2 : Base {}; // matches 'Base'
   3899 </pre></td></tr>
   3900 
   3901 
   3902 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
   3903 <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
   3904 a specific number of designators.
   3905 
   3906 Example: Given
   3907   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
   3908   point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
   3909 designatorCountIs(2)
   3910   matches '{ [2].y = 1.0, [0].x = 1.0 }',
   3911   but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
   3912 </pre></td></tr>
   3913 
   3914 
   3915 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
   3916 <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
   3917 
   3918 Example matches Y (matcher = enumDecl(isScoped()))
   3919 enum X {};
   3920 enum class Y {};
   3921 </pre></td></tr>
   3922 
   3923 
   3924 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
   3925 <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
   3926 neither type- nor value-dependent.
   3927 
   3928 In the following example, the expression sizeof(sizeof(T() + T()))
   3929 is instantiation-dependent (since it involves a template parameter T),
   3930 but is neither type- nor value-dependent, since the type of the inner
   3931 sizeof is known (std::size_t) and therefore the size of the outer
   3932 sizeof is known.
   3933   template&lt;typename T&gt;
   3934   void f(T x, T y) { sizeof(sizeof(T() + T()); }
   3935 expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
   3936 </pre></td></tr>
   3937 
   3938 
   3939 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
   3940 <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
   3941 is not yet instantiated.
   3942 
   3943 For example, the expressions "x" and "x + y" are type-dependent in
   3944 the following code, but "y" is not type-dependent:
   3945   template&lt;typename T&gt;
   3946   void add(T x, int y) {
   3947     x + y;
   3948   }
   3949 expr(isTypeDependent()) matches x + y
   3950 </pre></td></tr>
   3951 
   3952 
   3953 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
   3954 <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
   3955 non-type template parameter.
   3956 
   3957 For example, the array bound of "Chars" in the following example is
   3958 value-dependent.
   3959   template&lt;int Size&gt; int f() { return Size; }
   3960 expr(isValueDependent()) matches return Size
   3961 </pre></td></tr>
   3962 
   3963 
   3964 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
   3965 <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
   3966 GNU's __null, C++11's nullptr, or C's NULL macro.
   3967 
   3968 Given:
   3969   void *v1 = NULL;
   3970   void *v2 = nullptr;
   3971   void *v3 = __null; // GNU extension
   3972   char *cp = (char *)0;
   3973   int *ip = 0;
   3974   int i = 0;
   3975 expr(nullPointerConstant())
   3976   matches the initializer for v1, v2, v3, cp, and ip. Does not match the
   3977   initializer for i.
   3978 </pre></td></tr>
   3979 
   3980 
   3981 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
   3982 <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
   3983 bit width.
   3984 
   3985 Given
   3986   class C {
   3987     int a : 2;
   3988     int b : 4;
   3989     int c : 2;
   3990   };
   3991 fieldDecl(hasBitWidth(2))
   3992   matches 'int a;' and 'int c;' but not 'int b;'.
   3993 </pre></td></tr>
   3994 
   3995 
   3996 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
   3997 <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
   3998 
   3999 Given
   4000   class C {
   4001     int a : 2;
   4002     int b;
   4003   };
   4004 fieldDecl(isBitField())
   4005   matches 'int a;' but not 'int b;'.
   4006 </pre></td></tr>
   4007 
   4008 
   4009 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT  Value</td></tr>
   4010 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
   4011 
   4012 Given
   4013   f('false, 3.14, 42);
   4014 characterLiteral(equals(0))
   4015   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   4016   match false
   4017 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   4018   match 3.14
   4019 integerLiteral(equals(42))
   4020   matches 42
   4021 
   4022 Note that you cannot directly match a negative numeric literal because the
   4023 minus sign is not part of the literal: It is a unary operator whose operand
   4024 is the positive numeric literal. Instead, you must use a unaryOperator()
   4025 matcher to match the minus sign:
   4026 
   4027 unaryOperator(hasOperatorName("-"),
   4028               hasUnaryOperand(integerLiteral(equals(13))))
   4029 
   4030 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
   4031            Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
   4032 </pre></td></tr>
   4033 
   4034 
   4035 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
   4036 <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
   4037 
   4038 
   4039 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
   4040 <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
   4041 
   4042 Matches overloaded operator names specified in strings without the
   4043 "operator" prefix: e.g. "&lt;&lt;".
   4044 
   4045   hasAnyOverloadedOperatorName("+", "-")
   4046 Is equivalent to
   4047   anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
   4048 </pre></td></tr>
   4049 
   4050 
   4051 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
   4052 <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
   4053 
   4054 Given:
   4055   void f();
   4056   void g() noexcept;
   4057   void h() noexcept(true);
   4058   void i() noexcept(false);
   4059   void j() throw();
   4060   void k() throw(int);
   4061   void l() throw(...);
   4062 functionDecl(hasDynamicExceptionSpec()) and
   4063   functionProtoType(hasDynamicExceptionSpec())
   4064   match the declarations of j, k, and l, but not f, g, h, or i.
   4065 </pre></td></tr>
   4066 
   4067 
   4068 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
   4069 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
   4070 
   4071 Matches overloaded operator names specified in strings without the
   4072 "operator" prefix: e.g. "&lt;&lt;".
   4073 
   4074 Given:
   4075   class A { int operator*(); };
   4076   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
   4077   A a;
   4078   a &lt;&lt; a;   // &lt;-- This matches
   4079 
   4080 cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
   4081 specified line and
   4082 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
   4083 matches the declaration of A.
   4084 
   4085 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
   4086 </pre></td></tr>
   4087 
   4088 
   4089 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
   4090 <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
   4091 
   4092 Example matches Y (matcher = functionDecl(hasTrailingReturn()))
   4093 int X() {}
   4094 auto Y() -&gt; int {}
   4095 </pre></td></tr>
   4096 
   4097 
   4098 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
   4099 <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
   4100        and if constexpr.
   4101 
   4102 Given:
   4103   constexpr int foo = 42;
   4104   constexpr int bar();
   4105   void baz() { if constexpr(1 &gt; 0) {} }
   4106 varDecl(isConstexpr())
   4107   matches the declaration of foo.
   4108 functionDecl(isConstexpr())
   4109   matches the declaration of bar.
   4110 ifStmt(isConstexpr())
   4111   matches the if statement in baz.
   4112 </pre></td></tr>
   4113 
   4114 
   4115 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
   4116 <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
   4117 
   4118 Given:
   4119   class A { ~A(); };
   4120   class B { ~B() = default; };
   4121 functionDecl(isDefaulted())
   4122   matches the declaration of ~B, but not ~A.
   4123 </pre></td></tr>
   4124 
   4125 
   4126 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
   4127 <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
   4128 
   4129 Example matches A, va, fa
   4130   class A {};
   4131   class B;  // Doesn't match, as it has no body.
   4132   int va;
   4133   extern int vb;  // Doesn't match, as it doesn't define the variable.
   4134   void fa() {}
   4135   void fb();  // Doesn't match, as it has no body.
   4136   @interface X
   4137   - (void)ma; // Doesn't match, interface is declaration.
   4138   @end
   4139   @implementation X
   4140   - (void)ma {}
   4141   @end
   4142 
   4143 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
   4144   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   4145 </pre></td></tr>
   4146 
   4147 
   4148 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
   4149 <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
   4150 
   4151 Given:
   4152   void Func();
   4153   void DeletedFunc() = delete;
   4154 functionDecl(isDeleted())
   4155   matches the declaration of DeletedFunc, but not Func.
   4156 </pre></td></tr>
   4157 
   4158 
   4159 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
   4160 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
   4161 static member variable template instantiations.
   4162 
   4163 Given
   4164   template&lt;typename T&gt; void A(T t) { }
   4165   template&lt;&gt; void A(int N) { }
   4166 functionDecl(isExplicitTemplateSpecialization())
   4167   matches the specialization A&lt;int&gt;().
   4168 
   4169 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   4170 </pre></td></tr>
   4171 
   4172 
   4173 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
   4174 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
   4175 
   4176 Given:
   4177   extern "C" void f() {}
   4178   extern "C" { void g() {} }
   4179   void h() {}
   4180   extern "C" int x = 1;
   4181   extern "C" int y = 2;
   4182   int z = 3;
   4183 functionDecl(isExternC())
   4184   matches the declaration of f and g, but not the declaration of h.
   4185 varDecl(isExternC())
   4186   matches the declaration of x and y, but not the declaration of z.
   4187 </pre></td></tr>
   4188 
   4189 
   4190 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
   4191 <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
   4192 the inline keyword.
   4193 
   4194 Given
   4195   inline void f();
   4196   void g();
   4197   namespace n {
   4198   inline namespace m {}
   4199   }
   4200 functionDecl(isInline()) will match ::f().
   4201 namespaceDecl(isInline()) will match n::m.
   4202 </pre></td></tr>
   4203 
   4204 
   4205 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
   4206 <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
   4207 into an executable program.
   4208 </pre></td></tr>
   4209 
   4210 
   4211 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
   4212 <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
   4213 
   4214 Given
   4215   void nope();
   4216   [[noreturn]] void a();
   4217   __attribute__((noreturn)) void b();
   4218   struct c { [[noreturn]] c(); };
   4219 functionDecl(isNoReturn())
   4220   matches all of those except
   4221   void nope();
   4222 </pre></td></tr>
   4223 
   4224 
   4225 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
   4226 <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
   4227 
   4228 Given:
   4229   void f();
   4230   void g() noexcept;
   4231   void h() throw();
   4232   void i() throw(int);
   4233   void j() noexcept(false);
   4234 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
   4235   match the declarations of g, and h, but not f, i or j.
   4236 </pre></td></tr>
   4237 
   4238 
   4239 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
   4240 <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
   4241 class specifier ("static" keyword) written in the source.
   4242 
   4243 Given:
   4244   static void f() {}
   4245   static int i = 0;
   4246   extern int j;
   4247   int k;
   4248 functionDecl(isStaticStorageClass())
   4249   matches the function declaration f.
   4250 varDecl(isStaticStorageClass())
   4251   matches the variable declaration i.
   4252 </pre></td></tr>
   4253 
   4254 
   4255 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
   4256 <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
   4257 member variable template instantiations.
   4258 
   4259 Given
   4260   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   4261 or
   4262   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   4263 or
   4264   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   4265 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   4266   matches the template instantiation of X&lt;A&gt;.
   4267 
   4268 But given
   4269   template &lt;typename T&gt;  class X {}; class A {};
   4270   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   4271 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   4272   does not match, as X&lt;A&gt; is an explicit template specialization.
   4273 
   4274 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   4275 </pre></td></tr>
   4276 
   4277 
   4278 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
   4279 <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
   4280 
   4281 Example matches f, but not g or h. The function i will not match, even when
   4282 compiled in C mode.
   4283   void f(...);
   4284   void g(int);
   4285   template &lt;typename... Ts&gt; void h(Ts...);
   4286   void i();
   4287 </pre></td></tr>
   4288 
   4289 
   4290 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr>
   4291 <tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
   4292 
   4293 Given:
   4294   void foo() __attribute__((__weakref__("__foo")));
   4295   void bar();
   4296 functionDecl(isWeak())
   4297   matches the weak declaration "foo", but not "bar".
   4298 </pre></td></tr>
   4299 
   4300 
   4301 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
   4302 <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
   4303 specific parameter count.
   4304 
   4305 Given
   4306   void f(int i) {}
   4307   void g(int i, int j) {}
   4308   void h(int i, int j);
   4309   void j(int i);
   4310   void k(int x, int y, int z, ...);
   4311 functionDecl(parameterCountIs(2))
   4312   matches g and h
   4313 functionProtoType(parameterCountIs(2))
   4314   matches g and h
   4315 functionProtoType(parameterCountIs(3))
   4316   matches k
   4317 </pre></td></tr>
   4318 
   4319 
   4320 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
   4321 <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
   4322 
   4323 Given:
   4324   void f();
   4325   void g() noexcept;
   4326   void h() noexcept(true);
   4327   void i() noexcept(false);
   4328   void j() throw();
   4329   void k() throw(int);
   4330   void l() throw(...);
   4331 functionDecl(hasDynamicExceptionSpec()) and
   4332   functionProtoType(hasDynamicExceptionSpec())
   4333   match the declarations of j, k, and l, but not f, g, h, or i.
   4334 </pre></td></tr>
   4335 
   4336 
   4337 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
   4338 <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
   4339 
   4340 Given:
   4341   void f();
   4342   void g() noexcept;
   4343   void h() throw();
   4344   void i() throw(int);
   4345   void j() noexcept(false);
   4346 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
   4347   match the declarations of g, and h, but not f, i or j.
   4348 </pre></td></tr>
   4349 
   4350 
   4351 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
   4352 <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
   4353 specific parameter count.
   4354 
   4355 Given
   4356   void f(int i) {}
   4357   void g(int i, int j) {}
   4358   void h(int i, int j);
   4359   void j(int i);
   4360   void k(int x, int y, int z, ...);
   4361 functionDecl(parameterCountIs(2))
   4362   matches g and h
   4363 functionProtoType(parameterCountIs(2))
   4364   matches g and h
   4365 functionProtoType(parameterCountIs(3))
   4366   matches k
   4367 </pre></td></tr>
   4368 
   4369 
   4370 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
   4371 <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
   4372        and if constexpr.
   4373 
   4374 Given:
   4375   constexpr int foo = 42;
   4376   constexpr int bar();
   4377   void baz() { if constexpr(1 &gt; 0) {} }
   4378 varDecl(isConstexpr())
   4379   matches the declaration of foo.
   4380 functionDecl(isConstexpr())
   4381   matches the declaration of bar.
   4382 ifStmt(isConstexpr())
   4383   matches the if statement in baz.
   4384 </pre></td></tr>
   4385 
   4386 
   4387 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
   4388 <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
   4389 
   4390 
   4391 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr>
   4392 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
   4393 
   4394 Given
   4395   f('false, 3.14, 42);
   4396 characterLiteral(equals(0))
   4397   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   4398   match false
   4399 floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   4400   match 3.14
   4401 integerLiteral(equals(42))
   4402   matches 42
   4403 
   4404 Note that you cannot directly match a negative numeric literal because the
   4405 minus sign is not part of the literal: It is a unary operator whose operand
   4406 is the positive numeric literal. Instead, you must use a unaryOperator()
   4407 matcher to match the minus sign:
   4408 
   4409 unaryOperator(hasOperatorName("-"),
   4410               hasUnaryOperand(integerLiteral(equals(13))))
   4411 
   4412 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
   4413            Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
   4414 </pre></td></tr>
   4415 
   4416 
   4417 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
   4418 <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
   4419 
   4420 
   4421 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
   4422 <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
   4423 
   4424 
   4425 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
   4426 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
   4427 to '.'.
   4428 
   4429 Member calls on the implicit this pointer match as called with '-&gt;'.
   4430 
   4431 Given
   4432   class Y {
   4433     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   4434     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   4435     int a;
   4436     static int b;
   4437   };
   4438   template &lt;class T&gt;
   4439   class Z {
   4440     void x() { this-&gt;m; }
   4441   };
   4442 memberExpr(isArrow())
   4443   matches this-&gt;x, x, y.x, a, this-&gt;b
   4444 cxxDependentScopeMemberExpr(isArrow())
   4445   matches this-&gt;m
   4446 unresolvedMemberExpr(isArrow())
   4447   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   4448 </pre></td></tr>
   4449 
   4450 
   4451 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
   4452 <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
   4453 
   4454 This matcher is only provided as a performance optimization of hasName.
   4455     hasAnyName(a, b, c)
   4456  is equivalent to, but faster than
   4457     anyOf(hasName(a), hasName(b), hasName(c))
   4458 </pre></td></tr>
   4459 
   4460 
   4461 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
   4462 <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
   4463 
   4464 Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
   4465 void f() {
   4466   int x;
   4467   static int y;
   4468 }
   4469 int z;
   4470 
   4471 Example matches f() because it has external formal linkage despite being
   4472 unique to the translation unit as though it has internal likage
   4473 (matcher = functionDecl(hasExternalFormalLinkage()))
   4474 
   4475 namespace {
   4476 void f() {}
   4477 }
   4478 </pre></td></tr>
   4479 
   4480 
   4481 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr>
   4482 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
   4483 
   4484 Supports specifying enclosing namespaces or classes by prefixing the name
   4485 with '&lt;enclosing&gt;::'.
   4486 Does not match typedefs of an underlying type with the given name.
   4487 
   4488 Example matches X (Name == "X")
   4489   class X;
   4490 
   4491 Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
   4492   namespace a { namespace b { class X; } }
   4493 </pre></td></tr>
   4494 
   4495 
   4496 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
   4497 <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
   4498 a substring matched by the given RegExp.
   4499 
   4500 Supports specifying enclosing namespaces or classes by
   4501 prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
   4502 of an underlying type with the given name.
   4503 
   4504 Example matches X (regexp == "::X")
   4505   class X;
   4506 
   4507 Example matches X (regexp is one of "::X", "^foo::.*X", among others)
   4508   namespace foo { namespace bar { class X; } }
   4509 
   4510 If the matcher is used in clang-query, RegexFlags parameter
   4511 should be passed as a quoted string. e.g: "NoFlags".
   4512 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   4513 </pre></td></tr>
   4514 
   4515 
   4516 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
   4517 <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
   4518 
   4519 Given
   4520   namespace n {
   4521   namespace {} // #1
   4522   }
   4523 namespaceDecl(isAnonymous()) will match #1 but not ::n.
   4524 </pre></td></tr>
   4525 
   4526 
   4527 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
   4528 <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
   4529 the inline keyword.
   4530 
   4531 Given
   4532   inline void f();
   4533   void g();
   4534   namespace n {
   4535   inline namespace m {}
   4536   }
   4537 functionDecl(isInline()) will match ::f().
   4538 namespaceDecl(isInline()) will match n::m.
   4539 </pre></td></tr>
   4540 
   4541 
   4542 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr>
   4543 <tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
   4544 specified.
   4545 
   4546 Given
   4547 
   4548   #pragma omp parallel
   4549   #pragma omp parallel default(none)
   4550   #pragma omp parallel default(shared)
   4551   #pragma omp parallel default(firstprivate)
   4552 
   4553 ``ompDefaultClause(isFirstPrivateKind())`` matches only
   4554 ``default(firstprivate)``.
   4555 </pre></td></tr>
   4556 
   4557 
   4558 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
   4559 <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
   4560 
   4561 Given
   4562 
   4563   #pragma omp parallel
   4564   #pragma omp parallel default(none)
   4565   #pragma omp parallel default(shared)
   4566   #pragma omp parallel default(firstprivate)
   4567 
   4568 ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
   4569 </pre></td></tr>
   4570 
   4571 
   4572 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
   4573 <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
   4574 
   4575 Given
   4576 
   4577   #pragma omp parallel
   4578   #pragma omp parallel default(none)
   4579   #pragma omp parallel default(shared)
   4580   #pragma omp parallel default(firstprivate)
   4581 
   4582 ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
   4583 </pre></td></tr>
   4584 
   4585 
   4586 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
   4587 <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
   4588 clause kind.
   4589 
   4590 Given
   4591 
   4592   #pragma omp parallel
   4593   #pragma omp parallel for
   4594   #pragma omp          for
   4595 
   4596 `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
   4597 ``omp parallel`` and ``omp parallel for``.
   4598 
   4599 If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
   4600 should be passed as a quoted string. e.g.,
   4601 ``isAllowedToContainClauseKind("OMPC_default").``
   4602 </pre></td></tr>
   4603 
   4604 
   4605 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
   4606 <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
   4607 i.e., directives that can't have a structured block.
   4608 
   4609 Given
   4610 
   4611   #pragma omp parallel
   4612   {}
   4613   #pragma omp taskyield
   4614 
   4615 ``ompExecutableDirective(isStandaloneDirective()))`` matches
   4616 ``omp taskyield``.
   4617 </pre></td></tr>
   4618 
   4619 
   4620 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
   4621 <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
   4622 </pre></td></tr>
   4623 
   4624 
   4625 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
   4626 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
   4627 </pre></td></tr>
   4628 
   4629 
   4630 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
   4631 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
   4632 isSameOrDerivedFrom(hasName(...)).
   4633 </pre></td></tr>
   4634 
   4635 
   4636 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
   4637 <tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
   4638 a specific number of arguments (including absent default arguments).
   4639 
   4640 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   4641   void f(int x, int y);
   4642   f(0, 0);
   4643 </pre></td></tr>
   4644 
   4645 
   4646 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
   4647 <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
   4648 Selector.getAsString()
   4649 
   4650  matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
   4651  matches both of the expressions below:
   4652     [myObj methodA:argA];
   4653     [myObj methodB:argB];
   4654 </pre></td></tr>
   4655 
   4656 
   4657 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
   4658 <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
   4659 
   4660 objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
   4661 message expression in
   4662 
   4663   UIWebView *webView = ...;
   4664   CGRect bodyFrame = webView.frame;
   4665   bodyFrame.size.height = self.bodyContentHeight;
   4666   webView.frame = bodyFrame;
   4667   //     ^---- matches here
   4668 </pre></td></tr>
   4669 
   4670 
   4671 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
   4672 <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
   4673 
   4674 Matches only when the selector of the objCMessageExpr is NULL. This may
   4675 represent an error condition in the tree!
   4676 </pre></td></tr>
   4677 
   4678 
   4679 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
   4680 <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
   4681 
   4682  matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
   4683  matches the outer message expr in the code below, but NOT the message
   4684  invocation for self.bodyView.
   4685     [self.bodyView loadHTMLString:html baseURL:NULL];
   4686 </pre></td></tr>
   4687 
   4688 
   4689 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
   4690 <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
   4691 
   4692  matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
   4693  matches self.bodyView in the code below, but NOT the outer message
   4694  invocation of "loadHTMLString:baseURL:".
   4695     [self.bodyView loadHTMLString:html baseURL:NULL];
   4696 </pre></td></tr>
   4697 
   4698 
   4699 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
   4700 <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
   4701 
   4702 Example
   4703 matcher = objcMessageExpr(isClassMessage())
   4704 matches
   4705   [NSString stringWithFormat:@"format"];
   4706 but not
   4707   NSString *x = @"hello";
   4708   [x containsString:@"h"];
   4709 </pre></td></tr>
   4710 
   4711 
   4712 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
   4713 <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
   4714 
   4715 Example
   4716 matcher = objcMessageExpr(isInstanceMessage())
   4717 matches
   4718   NSString *x = @"hello";
   4719   [x containsString:@"h"];
   4720 but not
   4721   [NSString stringWithFormat:@"format"];
   4722 </pre></td></tr>
   4723 
   4724 
   4725 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
   4726 <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
   4727 a substring matched by the given RegExp.
   4728  matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
   4729  invocation for self.bodyView.
   4730     [self.bodyView loadHTMLString:html baseURL:NULL];
   4731 
   4732 If the matcher is used in clang-query, RegexFlags parameter
   4733 should be passed as a quoted string. e.g: "NoFlags".
   4734 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   4735 </pre></td></tr>
   4736 
   4737 
   4738 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
   4739 <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
   4740 
   4741  matcher = objCMessageExpr(numSelectorArgs(0));
   4742  matches self.bodyView in the code below
   4743 
   4744  matcher = objCMessageExpr(numSelectorArgs(2));
   4745  matches the invocation of "loadHTMLString:baseURL:" but not that
   4746  of self.bodyView
   4747     [self.bodyView loadHTMLString:html baseURL:NULL];
   4748 </pre></td></tr>
   4749 
   4750 
   4751 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
   4752 <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
   4753 
   4754 Example
   4755 matcher = objcMethodDecl(isClassMethod())
   4756 matches
   4757 @interface I + (void)foo; @end
   4758 but not
   4759 @interface I - (void)bar; @end
   4760 </pre></td></tr>
   4761 
   4762 
   4763 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
   4764 <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
   4765 
   4766 Example matches A, va, fa
   4767   class A {};
   4768   class B;  // Doesn't match, as it has no body.
   4769   int va;
   4770   extern int vb;  // Doesn't match, as it doesn't define the variable.
   4771   void fa() {}
   4772   void fb();  // Doesn't match, as it has no body.
   4773   @interface X
   4774   - (void)ma; // Doesn't match, interface is declaration.
   4775   @end
   4776   @implementation X
   4777   - (void)ma {}
   4778   @end
   4779 
   4780 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
   4781   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   4782 </pre></td></tr>
   4783 
   4784 
   4785 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr>
   4786 <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
   4787 
   4788 Example
   4789 matcher = objcMethodDecl(isInstanceMethod())
   4790 matches
   4791 @interface I - (void)bar; @end
   4792 but not
   4793 @interface I + (void)foo; @end
   4794 </pre></td></tr>
   4795 
   4796 
   4797 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
   4798 <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
   4799 
   4800 Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
   4801 void x(int val) {}
   4802 void y(int val = 0) {}
   4803 
   4804 Deprecated. Use hasInitializer() instead to be able to
   4805 match on the contents of the default argument.  For example:
   4806 
   4807 void x(int val = 7) {}
   4808 void y(int val = 42) {}
   4809 parmVarDecl(hasInitializer(integerLiteral(equals(42))))
   4810   matches the parameter of y
   4811 
   4812 A matcher such as
   4813   parmVarDecl(hasInitializer(anything()))
   4814 is equivalent to parmVarDecl(hasDefaultArgument()).
   4815 </pre></td></tr>
   4816 
   4817 
   4818 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr>
   4819 <tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
   4820 list. The parameter list could be that of either a block, function, or
   4821 objc-method.
   4822 
   4823 
   4824 Given
   4825 
   4826 void f(int a, int b, int c) {
   4827 }
   4828 
   4829 ``parmVarDecl(isAtPosition(0))`` matches ``int a``.
   4830 
   4831 ``parmVarDecl(isAtPosition(1))`` matches ``int b``.
   4832 </pre></td></tr>
   4833 
   4834 
   4835 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
   4836 <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
   4837 
   4838 Given
   4839   class Y { public: void x(); };
   4840   void z() { Y* y; y-&gt;x(); }
   4841 cxxMemberCallExpr(on(hasType(asString("class Y *"))))
   4842   matches y-&gt;x()
   4843 </pre></td></tr>
   4844 
   4845 
   4846 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
   4847 <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
   4848 
   4849 Matches a node if it equals the node previously bound to ID.
   4850 
   4851 Given
   4852   class X { int a; int b; };
   4853 cxxRecordDecl(
   4854     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   4855     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   4856   matches the class X, as a and b have the same type.
   4857 
   4858 Note that when multiple matches are involved via forEach* matchers,
   4859 equalsBoundNodes acts as a filter.
   4860 For example:
   4861 compoundStmt(
   4862     forEachDescendant(varDecl().bind("d")),
   4863     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   4864 will trigger a match for each combination of variable declaration
   4865 and reference to that variable declaration within a compound statement.
   4866 </pre></td></tr>
   4867 
   4868 
   4869 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
   4870 <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
   4871 the node, not hidden within a typedef.
   4872 
   4873 Given
   4874   typedef const int const_int;
   4875   const_int i;
   4876   int *const j;
   4877   int *volatile k;
   4878   int m;
   4879 varDecl(hasType(hasLocalQualifiers())) matches only j and k.
   4880 i is const-qualified but the qualifier is not local.
   4881 </pre></td></tr>
   4882 
   4883 
   4884 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
   4885 <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
   4886 
   4887 Given
   4888   void a(char);
   4889   void b(wchar_t);
   4890   void c(double);
   4891 functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
   4892 matches "a(char)", "b(wchar_t)", but not "c(double)".
   4893 </pre></td></tr>
   4894 
   4895 
   4896 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
   4897 <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
   4898 the Objective-C object pointer type, which is different despite being
   4899 syntactically similar.
   4900 
   4901 Given
   4902   int *i = nullptr;
   4903 
   4904   @interface Foo
   4905   @end
   4906   Foo *f;
   4907 
   4908   int j;
   4909 varDecl(hasType(isAnyPointer()))
   4910   matches "int *i" and "Foo *f", but not "int j".
   4911 </pre></td></tr>
   4912 
   4913 
   4914 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
   4915 <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
   4916 include "top-level" const.
   4917 
   4918 Given
   4919   void a(int);
   4920   void b(int const);
   4921   void c(const int);
   4922   void d(const int*);
   4923   void e(int const) {};
   4924 functionDecl(hasAnyParameter(hasType(isConstQualified())))
   4925   matches "void b(int const)", "void c(const int)" and
   4926   "void e(int const) {}". It does not match d as there
   4927   is no top-level const on the parameter type "const int *".
   4928 </pre></td></tr>
   4929 
   4930 
   4931 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
   4932 <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
   4933 
   4934 Given
   4935   void a(int);
   4936   void b(long);
   4937   void c(double);
   4938 functionDecl(hasAnyParameter(hasType(isInteger())))
   4939 matches "a(int)", "b(long)", but not "c(double)".
   4940 </pre></td></tr>
   4941 
   4942 
   4943 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
   4944 <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
   4945 
   4946 Given
   4947   void a(int);
   4948   void b(unsigned long);
   4949   void c(double);
   4950 functionDecl(hasAnyParameter(hasType(isSignedInteger())))
   4951 matches "a(int)", but not "b(unsigned long)" and "c(double)".
   4952 </pre></td></tr>
   4953 
   4954 
   4955 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
   4956 <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
   4957 
   4958 Given
   4959   void a(int);
   4960   void b(unsigned long);
   4961   void c(double);
   4962 functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
   4963 matches "b(unsigned long)", but not "a(int)" and "c(double)".
   4964 </pre></td></tr>
   4965 
   4966 
   4967 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
   4968 <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
   4969 include "top-level" volatile.
   4970 
   4971 Given
   4972   void a(int);
   4973   void b(int volatile);
   4974   void c(volatile int);
   4975   void d(volatile int*);
   4976   void e(int volatile) {};
   4977 functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
   4978   matches "void b(int volatile)", "void c(volatile int)" and
   4979   "void e(int volatile) {}". It does not match d as there
   4980   is no top-level volatile on the parameter type "volatile int *".
   4981 </pre></td></tr>
   4982 
   4983 
   4984 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
   4985 <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
   4986 
   4987 Matches a node if it equals the node previously bound to ID.
   4988 
   4989 Given
   4990   class X { int a; int b; };
   4991 cxxRecordDecl(
   4992     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   4993     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   4994   matches the class X, as a and b have the same type.
   4995 
   4996 Note that when multiple matches are involved via forEach* matchers,
   4997 equalsBoundNodes acts as a filter.
   4998 For example:
   4999 compoundStmt(
   5000     forEachDescendant(varDecl().bind("d")),
   5001     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   5002 will trigger a match for each combination of variable declaration
   5003 and reference to that variable declaration within a compound statement.
   5004 </pre></td></tr>
   5005 
   5006 
   5007 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
   5008 <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
   5009 
   5010 Stmt has pointer identity in the AST.
   5011 </pre></td></tr>
   5012 
   5013 
   5014 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
   5015 <tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
   5016 Does not match if only part of the statement is expanded from that macro or
   5017 if different parts of the the statement are expanded from different
   5018 appearances of the macro.
   5019 </pre></td></tr>
   5020 
   5021 
   5022 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
   5023 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
   5024 partially matching a given regex.
   5025 
   5026 Example matches Y but not X
   5027     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   5028   #include "ASTMatcher.h"
   5029   class X {};
   5030 ASTMatcher.h:
   5031   class Y {};
   5032 
   5033 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   5034 
   5035 If the matcher is used in clang-query, RegexFlags parameter
   5036 should be passed as a quoted string. e.g: "NoFlags".
   5037 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   5038 </pre></td></tr>
   5039 
   5040 
   5041 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
   5042 <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
   5043 
   5044 Example matches X but not Y
   5045   (matcher = cxxRecordDecl(isExpansionInMainFile())
   5046   #include &lt;Y.h&gt;
   5047   class X {};
   5048 Y.h:
   5049   class Y {};
   5050 
   5051 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   5052 </pre></td></tr>
   5053 
   5054 
   5055 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
   5056 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
   5057 
   5058 Example matches Y but not X
   5059     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   5060   #include &lt;SystemHeader.h&gt;
   5061   class X {};
   5062 SystemHeader.h:
   5063   class Y {};
   5064 
   5065 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   5066 </pre></td></tr>
   5067 
   5068 
   5069 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
   5070 <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
   5071 
   5072 Given
   5073   int j;
   5074   template&lt;typename T&gt; void A(T t) { T i; j += 42;}
   5075   A(0);
   5076   A(0U);
   5077 declStmt(isInTemplateInstantiation())
   5078   matches 'int i;' and 'unsigned i'.
   5079 unless(stmt(isInTemplateInstantiation()))
   5080   will NOT match j += 42; as it's shared between the template definition and
   5081   instantiation.
   5082 </pre></td></tr>
   5083 
   5084 
   5085 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
   5086 <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
   5087 
   5088 Given
   5089   int a[42];
   5090   int b[2 * 21];
   5091   int c[41], d[43];
   5092   char *s = "abcd";
   5093   wchar_t *ws = L"abcd";
   5094   char *w = "a";
   5095 constantArrayType(hasSize(42))
   5096   matches "int a[42]" and "int b[2 * 21]"
   5097 stringLiteral(hasSize(4))
   5098   matches "abcd", L"abcd"
   5099 </pre></td></tr>
   5100 
   5101 
   5102 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
   5103 <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
   5104 
   5105 Example matches C, but not S, U or E.
   5106   struct S {};
   5107   class C {};
   5108   union U {};
   5109   enum E {};
   5110 </pre></td></tr>
   5111 
   5112 
   5113 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
   5114 <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
   5115 
   5116 Example matches A, va, fa
   5117   class A {};
   5118   class B;  // Doesn't match, as it has no body.
   5119   int va;
   5120   extern int vb;  // Doesn't match, as it doesn't define the variable.
   5121   void fa() {}
   5122   void fb();  // Doesn't match, as it has no body.
   5123   @interface X
   5124   - (void)ma; // Doesn't match, interface is declaration.
   5125   @end
   5126   @implementation X
   5127   - (void)ma {}
   5128   @end
   5129 
   5130 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
   5131   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   5132 </pre></td></tr>
   5133 
   5134 
   5135 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr>
   5136 <tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
   5137 
   5138 Example matches E, but not C, S or U.
   5139   struct S {};
   5140   class C {};
   5141   union U {};
   5142   enum E {};
   5143 </pre></td></tr>
   5144 
   5145 
   5146 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
   5147 <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
   5148 
   5149 Example matches S, but not C, U or E.
   5150   struct S {};
   5151   class C {};
   5152   union U {};
   5153   enum E {};
   5154 </pre></td></tr>
   5155 
   5156 
   5157 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
   5158 <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
   5159 
   5160 Example matches U, but not C, S or E.
   5161   struct S {};
   5162   class C {};
   5163   union U {};
   5164   enum E {};
   5165 </pre></td></tr>
   5166 
   5167 
   5168 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
   5169 <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
   5170 
   5171 Note that 'Value' is a string as the template argument's value is
   5172 an arbitrary precision integer. 'Value' must be euqal to the canonical
   5173 representation of that integral value in base 10.
   5174 
   5175 Given
   5176   template&lt;int T&gt; struct C {};
   5177   C&lt;42&gt; c;
   5178 classTemplateSpecializationDecl(
   5179   hasAnyTemplateArgument(equalsIntegralValue("42")))
   5180   matches the implicit instantiation of C in C&lt;42&gt;.
   5181 </pre></td></tr>
   5182 
   5183 
   5184 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
   5185 <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
   5186 
   5187 Given
   5188   template&lt;int T&gt; struct C {};
   5189   C&lt;42&gt; c;
   5190 classTemplateSpecializationDecl(
   5191   hasAnyTemplateArgument(isIntegral()))
   5192   matches the implicit instantiation of C in C&lt;42&gt;
   5193   with isIntegral() matching 42.
   5194 </pre></td></tr>
   5195 
   5196 
   5197 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
   5198 <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
   5199 
   5200 Given
   5201   template&lt;typename T&gt; struct C {};
   5202   C&lt;int&gt; c;
   5203 classTemplateSpecializationDecl(templateArgumentCountIs(1))
   5204   matches C&lt;int&gt;.
   5205 </pre></td></tr>
   5206 
   5207 
   5208 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
   5209 <tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
   5210 Does not match if only part of the statement is expanded from that macro or
   5211 if different parts of the the statement are expanded from different
   5212 appearances of the macro.
   5213 </pre></td></tr>
   5214 
   5215 
   5216 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
   5217 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
   5218 partially matching a given regex.
   5219 
   5220 Example matches Y but not X
   5221     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   5222   #include "ASTMatcher.h"
   5223   class X {};
   5224 ASTMatcher.h:
   5225   class Y {};
   5226 
   5227 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   5228 
   5229 If the matcher is used in clang-query, RegexFlags parameter
   5230 should be passed as a quoted string. e.g: "NoFlags".
   5231 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   5232 </pre></td></tr>
   5233 
   5234 
   5235 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
   5236 <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
   5237 
   5238 Example matches X but not Y
   5239   (matcher = cxxRecordDecl(isExpansionInMainFile())
   5240   #include &lt;Y.h&gt;
   5241   class X {};
   5242 Y.h:
   5243   class Y {};
   5244 
   5245 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   5246 </pre></td></tr>
   5247 
   5248 
   5249 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
   5250 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
   5251 
   5252 Example matches Y but not X
   5253     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   5254   #include &lt;SystemHeader.h&gt;
   5255   class X {};
   5256 SystemHeader.h:
   5257   class Y {};
   5258 
   5259 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
   5260 </pre></td></tr>
   5261 
   5262 
   5263 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
   5264 <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
   5265 
   5266 Given
   5267  struct S { bool func(); };
   5268 functionDecl(returns(booleanType()))
   5269   matches "bool func();"
   5270 </pre></td></tr>
   5271 
   5272 
   5273 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
   5274 <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
   5275 
   5276 Matches a node if it equals the node previously bound to ID.
   5277 
   5278 Given
   5279   class X { int a; int b; };
   5280 cxxRecordDecl(
   5281     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   5282     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   5283   matches the class X, as a and b have the same type.
   5284 
   5285 Note that when multiple matches are involved via forEach* matchers,
   5286 equalsBoundNodes acts as a filter.
   5287 For example:
   5288 compoundStmt(
   5289     forEachDescendant(varDecl().bind("d")),
   5290     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   5291 will trigger a match for each combination of variable declaration
   5292 and reference to that variable declaration within a compound statement.
   5293 </pre></td></tr>
   5294 
   5295 
   5296 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
   5297 <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
   5298 
   5299 Type has pointer identity in the AST.
   5300 </pre></td></tr>
   5301 
   5302 
   5303 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
   5304 <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
   5305 
   5306 Given
   5307   int i;
   5308   float f;
   5309 realFloatingPointType()
   5310   matches "float f" but not "int i"
   5311 </pre></td></tr>
   5312 
   5313 
   5314 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
   5315 <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
   5316 
   5317 Given
   5318  struct S { void func(); };
   5319 functionDecl(returns(voidType()))
   5320   matches "void func();"
   5321 </pre></td></tr>
   5322 
   5323 
   5324 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
   5325 <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
   5326 
   5327 Given
   5328   int x;
   5329   int s = sizeof(x) + alignof(x)
   5330 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
   5331   matches sizeof(x)
   5332 
   5333 If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
   5334 should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
   5335 </pre></td></tr>
   5336 
   5337 
   5338 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
   5339 <tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
   5340 specified names.
   5341 
   5342    hasAnyOperatorName("+", "-")
   5343  Is equivalent to
   5344    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   5345 </pre></td></tr>
   5346 
   5347 
   5348 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
   5349 <tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
   5350 unary).
   5351 
   5352 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   5353   !(a || b)
   5354 </pre></td></tr>
   5355 
   5356 
   5357 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
   5358 <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
   5359 to '.'.
   5360 
   5361 Member calls on the implicit this pointer match as called with '-&gt;'.
   5362 
   5363 Given
   5364   class Y {
   5365     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   5366     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   5367     int a;
   5368     static int b;
   5369   };
   5370   template &lt;class T&gt;
   5371   class Z {
   5372     void x() { this-&gt;m; }
   5373   };
   5374 memberExpr(isArrow())
   5375   matches this-&gt;x, x, y.x, a, this-&gt;b
   5376 cxxDependentScopeMemberExpr(isArrow())
   5377   matches this-&gt;m
   5378 unresolvedMemberExpr(isArrow())
   5379   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   5380 </pre></td></tr>
   5381 
   5382 
   5383 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
   5384 <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
   5385 
   5386 Example matches x, but not y, z, or a.
   5387 (matcher = varDecl(hasAutomaticStorageDuration())
   5388 void f() {
   5389   int x;
   5390   static int y;
   5391   thread_local int z;
   5392 }
   5393 int a;
   5394 </pre></td></tr>
   5395 
   5396 
   5397 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
   5398 <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
   5399 
   5400 Example matches y and z (matcher = varDecl(hasGlobalStorage())
   5401 void f() {
   5402   int x;
   5403   static int y;
   5404 }
   5405 int z;
   5406 </pre></td></tr>
   5407 
   5408 
   5409 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
   5410 <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
   5411 non-static local variable.
   5412 
   5413 Example matches x (matcher = varDecl(hasLocalStorage())
   5414 void f() {
   5415   int x;
   5416   static int y;
   5417 }
   5418 int z;
   5419 </pre></td></tr>
   5420 
   5421 
   5422 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
   5423 <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
   5424 It includes the variable declared at namespace scope and those declared
   5425 with "static" and "extern" storage class specifiers.
   5426 
   5427 void f() {
   5428   int x;
   5429   static int y;
   5430   thread_local int z;
   5431 }
   5432 int a;
   5433 static int b;
   5434 extern int c;
   5435 varDecl(hasStaticStorageDuration())
   5436   matches the function declaration y, a, b and c.
   5437 </pre></td></tr>
   5438 
   5439 
   5440 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
   5441 <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
   5442 
   5443 Example matches z, but not x, z, or a.
   5444 (matcher = varDecl(hasThreadStorageDuration())
   5445 void f() {
   5446   int x;
   5447   static int y;
   5448   thread_local int z;
   5449 }
   5450 int a;
   5451 </pre></td></tr>
   5452 
   5453 
   5454 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
   5455 <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
   5456        and if constexpr.
   5457 
   5458 Given:
   5459   constexpr int foo = 42;
   5460   constexpr int bar();
   5461   void baz() { if constexpr(1 &gt; 0) {} }
   5462 varDecl(isConstexpr())
   5463   matches the declaration of foo.
   5464 functionDecl(isConstexpr())
   5465   matches the declaration of bar.
   5466 ifStmt(isConstexpr())
   5467   matches the if statement in baz.
   5468 </pre></td></tr>
   5469 
   5470 
   5471 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
   5472 <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
   5473 
   5474 Example matches A, va, fa
   5475   class A {};
   5476   class B;  // Doesn't match, as it has no body.
   5477   int va;
   5478   extern int vb;  // Doesn't match, as it doesn't define the variable.
   5479   void fa() {}
   5480   void fb();  // Doesn't match, as it has no body.
   5481   @interface X
   5482   - (void)ma; // Doesn't match, interface is declaration.
   5483   @end
   5484   @implementation X
   5485   - (void)ma {}
   5486   @end
   5487 
   5488 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
   5489   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   5490 </pre></td></tr>
   5491 
   5492 
   5493 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
   5494 <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
   5495 a C++ catch block, or an Objective-C statement.
   5496 
   5497 Example matches x (matcher = varDecl(isExceptionVariable())
   5498 void f(int y) {
   5499   try {
   5500   } catch (int x) {
   5501   }
   5502 }
   5503 </pre></td></tr>
   5504 
   5505 
   5506 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
   5507 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
   5508 static member variable template instantiations.
   5509 
   5510 Given
   5511   template&lt;typename T&gt; void A(T t) { }
   5512   template&lt;&gt; void A(int N) { }
   5513 functionDecl(isExplicitTemplateSpecialization())
   5514   matches the specialization A&lt;int&gt;().
   5515 
   5516 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   5517 </pre></td></tr>
   5518 
   5519 
   5520 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
   5521 <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
   5522 
   5523 Given:
   5524   extern "C" void f() {}
   5525   extern "C" { void g() {} }
   5526   void h() {}
   5527   extern "C" int x = 1;
   5528   extern "C" int y = 2;
   5529   int z = 3;
   5530 functionDecl(isExternC())
   5531   matches the declaration of f and g, but not the declaration of h.
   5532 varDecl(isExternC())
   5533   matches the declaration of x and y, but not the declaration of z.
   5534 </pre></td></tr>
   5535 
   5536 
   5537 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
   5538 <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
   5539 
   5540 Example matches y (matcher = varDecl(isStaticLocal()))
   5541 void f() {
   5542   int x;
   5543   static int y;
   5544 }
   5545 static int z;
   5546 </pre></td></tr>
   5547 
   5548 
   5549 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
   5550 <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
   5551 class specifier ("static" keyword) written in the source.
   5552 
   5553 Given:
   5554   static void f() {}
   5555   static int i = 0;
   5556   extern int j;
   5557   int k;
   5558 functionDecl(isStaticStorageClass())
   5559   matches the function declaration f.
   5560 varDecl(isStaticStorageClass())
   5561   matches the variable declaration i.
   5562 </pre></td></tr>
   5563 
   5564 
   5565 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
   5566 <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
   5567 member variable template instantiations.
   5568 
   5569 Given
   5570   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   5571 or
   5572   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   5573 or
   5574   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   5575 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   5576   matches the template instantiation of X&lt;A&gt;.
   5577 
   5578 But given
   5579   template &lt;typename T&gt;  class X {}; class A {};
   5580   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   5581 cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   5582   does not match, as X&lt;A&gt; is an explicit template specialization.
   5583 
   5584 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   5585 </pre></td></tr>
   5586 
   5587 <!--END_NARROWING_MATCHERS -->
   5588 </table>
   5589 
   5590 <!-- ======================================================================= -->
   5591 <h2 id="traversal-matchers">AST Traversal Matchers</h2>
   5592 <!-- ======================================================================= -->
   5593 
   5594 <p>Traversal matchers specify the relationship to other nodes that are
   5595 reachable from the current node.</p>
   5596 
   5597 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
   5598 forEachDescendant) which work on all nodes and allow users to write more generic
   5599 match expressions.</p>
   5600 
   5601 <table>
   5602 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
   5603 <!-- START_TRAVERSAL_MATCHERS -->
   5604 
   5605 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
   5606 <tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
   5607 
   5608 The code
   5609   var1 != var2;
   5610 might be represented in the clang AST as a binaryOperator, a
   5611 cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
   5612 
   5613 * whether the types of var1 and var2 are fundamental (binaryOperator) or at
   5614   least one is a class type (cxxOperatorCallExpr)
   5615 * whether the code appears in a template declaration, if at least one of the
   5616   vars is a dependent-type (binaryOperator)
   5617 * whether the code relies on a rewritten binary operator, such as a
   5618 spaceship operator or an inverted equality operator
   5619 (cxxRewrittenBinaryOperator)
   5620 
   5621 This matcher elides details in places where the matchers for the nodes are
   5622 compatible.
   5623 
   5624 Given
   5625   binaryOperation(
   5626     hasOperatorName("!="),
   5627     hasLHS(expr().bind("lhs")),
   5628     hasRHS(expr().bind("rhs"))
   5629   )
   5630 matches each use of "!=" in:
   5631   struct S{
   5632       bool operator!=(const S&amp;) const;
   5633   };
   5634 
   5635   void foo()
   5636   {
   5637      1 != 2;
   5638      S() != S();
   5639   }
   5640 
   5641   template&lt;typename T&gt;
   5642   void templ()
   5643   {
   5644      1 != 2;
   5645      T() != S();
   5646   }
   5647   struct HasOpEq
   5648   {
   5649       bool operator==(const HasOpEq &amp;) const;
   5650   };
   5651 
   5652   void inverse()
   5653   {
   5654       HasOpEq s1;
   5655       HasOpEq s2;
   5656       if (s1 != s2)
   5657           return;
   5658   }
   5659 
   5660   struct HasSpaceship
   5661   {
   5662       bool operator&lt;=&gt;(const HasOpEq &amp;) const;
   5663   };
   5664 
   5665   void use_spaceship()
   5666   {
   5667       HasSpaceship s1;
   5668       HasSpaceship s2;
   5669       if (s1 != s2)
   5670           return;
   5671   }
   5672 </pre></td></tr>
   5673 
   5674 
   5675 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
   5676 <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
   5677 
   5678 Unlike anyOf, eachOf will generate a match result for each
   5679 matching submatcher.
   5680 
   5681 For example, in:
   5682   class A { int a; int b; };
   5683 The matcher:
   5684   cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
   5685                        has(fieldDecl(hasName("b")).bind("v"))))
   5686 will generate two results binding "v", the first of which binds
   5687 the field declaration of a, the second the field declaration of
   5688 b.
   5689 
   5690 Usable as: Any Matcher
   5691 </pre></td></tr>
   5692 
   5693 
   5694 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;*&gt;  Matcher</td></tr>
   5695 <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
   5696 
   5697 Generates results for each match.
   5698 
   5699 For example, in:
   5700   class A { class B {}; class C {}; };
   5701 The matcher:
   5702   cxxRecordDecl(hasName("::A"),
   5703                 findAll(cxxRecordDecl(isDefinition()).bind("m")))
   5704 will generate results for A, B and C.
   5705 
   5706 Usable as: Any Matcher
   5707 </pre></td></tr>
   5708 
   5709 
   5710 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
   5711 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   5712 provided matcher.
   5713 
   5714 Example matches X, A, A::X, B, B::C, B::C::X
   5715   (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
   5716   class X {};
   5717   class A { class X {}; };  // Matches A, because A::X is a class of name
   5718                             // X inside A.
   5719   class B { class C { class X {}; }; };
   5720 
   5721 DescendantT must be an AST base type.
   5722 
   5723 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
   5724 each result that matches instead of only on the first one.
   5725 
   5726 Note: Recursively combined ForEachDescendant can cause many matches:
   5727   cxxRecordDecl(forEachDescendant(cxxRecordDecl(
   5728     forEachDescendant(cxxRecordDecl())
   5729   )))
   5730 will match 10 times (plus injected class name matches) on:
   5731   class A { class B { class C { class D { class E {}; }; }; }; };
   5732 
   5733 Usable as: Any Matcher
   5734 </pre></td></tr>
   5735 
   5736 
   5737 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
   5738 <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
   5739 provided matcher.
   5740 
   5741 Example matches X, Y, Y::X, Z::Y, Z::Y::X
   5742   (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
   5743   class X {};
   5744   class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
   5745                             // inside Y.
   5746   class Z { class Y { class X {}; }; };  // Does not match Z.
   5747 
   5748 ChildT must be an AST base type.
   5749 
   5750 As opposed to 'has', 'forEach' will cause a match for each result that
   5751 matches instead of only on the first one.
   5752 
   5753 Usable as: Any Matcher
   5754 </pre></td></tr>
   5755 
   5756 
   5757 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
   5758 <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
   5759 matcher.
   5760 
   5761 Given
   5762 void f() { if (true) { int x = 42; } }
   5763 void g() { for (;;) { int x = 43; } }
   5764 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
   5765 
   5766 Usable as: Any Matcher
   5767 </pre></td></tr>
   5768 
   5769 
   5770 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
   5771 <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   5772 provided matcher.
   5773 
   5774 Example matches X, Y, Z
   5775     (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
   5776   class X {};  // Matches X, because X::X is a class of name X inside X.
   5777   class Y { class X {}; };
   5778   class Z { class Y { class X {}; }; };
   5779 
   5780 DescendantT must be an AST base type.
   5781 
   5782 Usable as: Any Matcher
   5783 </pre></td></tr>
   5784 
   5785 
   5786 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
   5787 <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
   5788 provided matcher.
   5789 
   5790 Example matches X, Y
   5791   (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
   5792   class X {};  // Matches X, because X::X is a class of name X inside X.
   5793   class Y { class X {}; };
   5794   class Z { class Y { class X {}; }; };  // Does not match Z.
   5795 
   5796 ChildT must be an AST base type.
   5797 
   5798 Usable as: Any Matcher
   5799 Note that has is direct matcher, so it also matches things like implicit
   5800 casts and paren casts. If you are matching with expr then you should
   5801 probably consider using ignoringParenImpCasts like:
   5802 has(ignoringParenImpCasts(expr())).
   5803 </pre></td></tr>
   5804 
   5805 
   5806 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
   5807 <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
   5808 matcher.
   5809 
   5810 Given
   5811 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
   5812 compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
   5813 
   5814 Usable as: Any Matcher
   5815 </pre></td></tr>
   5816 
   5817 
   5818 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
   5819 <tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
   5820 
   5821 Because CallExpr and CXXConstructExpr do not share a common
   5822 base class with API accessing arguments etc, AST Matchers for code
   5823 which should match both are typically duplicated. This matcher
   5824 removes the need for duplication.
   5825 
   5826 Given code
   5827 struct ConstructorTakesInt
   5828 {
   5829   ConstructorTakesInt(int i) {}
   5830 };
   5831 
   5832 void callTakesInt(int i)
   5833 {
   5834 }
   5835 
   5836 void doCall()
   5837 {
   5838   callTakesInt(42);
   5839 }
   5840 
   5841 void doConstruct()
   5842 {
   5843   ConstructorTakesInt cti(42);
   5844 }
   5845 
   5846 The matcher
   5847 invocation(hasArgument(0, integerLiteral(equals(42))))
   5848 matches the expression in both doCall and doConstruct
   5849 </pre></td></tr>
   5850 
   5851 
   5852 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
   5853 <tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
   5854 
   5855 However, optionally will retain any bindings generated by the submatcher.
   5856 Useful when additional information which may or may not present about a main
   5857 matching node is desired.
   5858 
   5859 For example, in:
   5860   class Foo {
   5861     int bar;
   5862   }
   5863 The matcher:
   5864   cxxRecordDecl(
   5865     optionally(has(
   5866       fieldDecl(hasName("bar")).bind("var")
   5867   ))).bind("record")
   5868 will produce a result binding for both "record" and "var".
   5869 The matcher will produce a "record" binding for even if there is no data
   5870 member named "bar" in that class.
   5871 
   5872 Usable as: Any Matcher
   5873 </pre></td></tr>
   5874 
   5875 
   5876 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher&lt;*&gt;  InnerMatcher</td></tr>
   5877 <tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
   5878 
   5879 Given
   5880   void foo()
   5881   {
   5882       int i = 3.0;
   5883   }
   5884 The matcher
   5885   traverse(TK_IgnoreUnlessSpelledInSource,
   5886     varDecl(hasInitializer(floatLiteral().bind("init")))
   5887   )
   5888 matches the variable declaration with "init" bound to the "3.0".
   5889 </pre></td></tr>
   5890 
   5891 
   5892 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   5893 <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
   5894 switch statement or conditional operator.
   5895 
   5896 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   5897   if (true) {}
   5898 </pre></td></tr>
   5899 
   5900 
   5901 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   5902 <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
   5903 (binary or ternary).
   5904 
   5905 Example matches b
   5906   condition ? a : b
   5907   condition ?: b
   5908 </pre></td></tr>
   5909 
   5910 
   5911 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   5912 <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
   5913 
   5914 Example 1 (conditional ternary operator): matches a
   5915   condition ? a : b
   5916 
   5917 Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
   5918   condition ?: b
   5919 </pre></td></tr>
   5920 
   5921 
   5922 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   5923 <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
   5924 matches the given matcher.
   5925 
   5926 The associated declaration is:
   5927 - for type nodes, the declaration of the underlying type
   5928 - for CallExpr, the declaration of the callee
   5929 - for MemberExpr, the declaration of the referenced member
   5930 - for CXXConstructExpr, the declaration of the constructor
   5931 - for CXXNewExpr, the declaration of the operator new
   5932 - for ObjCIvarExpr, the declaration of the ivar
   5933 
   5934 For type nodes, hasDeclaration will generally match the declaration of the
   5935 sugared type. Given
   5936   class X {};
   5937   typedef X Y;
   5938   Y y;
   5939 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   5940 typedefDecl. A common use case is to match the underlying, desugared type.
   5941 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   5942   varDecl(hasType(hasUnqualifiedDesugaredType(
   5943       recordType(hasDeclaration(decl())))))
   5944 In this matcher, the decl will match the CXXRecordDecl of class X.
   5945 
   5946 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   5947   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   5948   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   5949   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   5950   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   5951   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   5952   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   5953 </pre></td></tr>
   5954 
   5955 
   5956 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   5957 <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
   5958 
   5959 Given
   5960   int i[5];
   5961   void f() { i[1] = 42; }
   5962 arraySubscriptExpression(hasBase(implicitCastExpr(
   5963     hasSourceExpression(declRefExpr()))))
   5964   matches i[1] with the declRefExpr() matching i
   5965 </pre></td></tr>
   5966 
   5967 
   5968 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   5969 <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
   5970 
   5971 Given
   5972   int i[5];
   5973   void f() { i[1] = 42; }
   5974 arraySubscriptExpression(hasIndex(integerLiteral()))
   5975   matches i[1] with the integerLiteral() matching 1
   5976 </pre></td></tr>
   5977 
   5978 
   5979 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   5980 <tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
   5981 
   5982 Example matches a (matcher = binaryOperator(hasLHS()))
   5983   a || b
   5984 </pre></td></tr>
   5985 
   5986 
   5987 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   5988 <tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
   5989 
   5990 Example matches b (matcher = binaryOperator(hasRHS()))
   5991   a || b
   5992 </pre></td></tr>
   5993 
   5994 
   5995 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;</td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   5996 <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
   5997 type.
   5998 
   5999 Given
   6000   struct A {};
   6001   A a[7];
   6002   int b[7];
   6003 arrayType(hasElementType(builtinType()))
   6004   matches "int b[7]"
   6005 
   6006 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
   6007 </pre></td></tr>
   6008 
   6009 
   6010 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;</td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   6011 <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
   6012 
   6013 Given
   6014   _Atomic(int) i;
   6015   _Atomic(float) f;
   6016 atomicType(hasValueType(isInteger()))
   6017  matches "_Atomic(int) i"
   6018 
   6019 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
   6020 </pre></td></tr>
   6021 
   6022 
   6023 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;</td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   6024 <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
   6025 
   6026 Note: There is no TypeLoc for the deduced type and thus no
   6027 getDeducedLoc() matcher.
   6028 
   6029 Given
   6030   auto a = 1;
   6031   auto b = 2.0;
   6032 autoType(hasDeducedType(isInteger()))
   6033   matches "auto a"
   6034 
   6035 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
   6036 </pre></td></tr>
   6037 
   6038 
   6039 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6040 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
   6041 binary operator matches.
   6042 </pre></td></tr>
   6043 
   6044 
   6045 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6046 <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
   6047 
   6048 Example matches a (matcher = binaryOperator(hasLHS()))
   6049   a || b
   6050 </pre></td></tr>
   6051 
   6052 
   6053 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
   6054 <tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
   6055 
   6056 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
   6057                                              integerLiteral(equals(2)))
   6058   1 + 2 // Match
   6059   2 + 1 // Match
   6060   1 + 1 // No match
   6061   2 + 2 // No match
   6062 </pre></td></tr>
   6063 
   6064 
   6065 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6066 <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
   6067 
   6068 Example matches b (matcher = binaryOperator(hasRHS()))
   6069   a || b
   6070 </pre></td></tr>
   6071 
   6072 
   6073 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;</td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
   6074 <tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
   6075 
   6076 For example, in:
   6077 void foo()
   6078 {
   6079     int arr[3];
   6080     auto &amp;[f, s, t] = arr;
   6081 
   6082     f = 42;
   6083 }
   6084 The matcher:
   6085   bindingDecl(hasName("f"),
   6086                 forDecomposition(decompositionDecl())
   6087 matches 'f' in 'auto &amp;[f, s, t]'.
   6088 </pre></td></tr>
   6089 
   6090 
   6091 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   6092 <tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
   6093 block.
   6094 
   6095 Does not match the 'this' parameter of a method.
   6096 
   6097 Given
   6098   class X { void f(int x, int y, int z) {} };
   6099 cxxMethodDecl(hasAnyParameter(hasName("y")))
   6100   matches f(int x, int y, int z) {}
   6101 with hasAnyParameter(...)
   6102   matching int y
   6103 
   6104 For ObjectiveC, given
   6105   @interface I - (void) f:(int) y; @end
   6106 
   6107 the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   6108 matches the declaration of method f with hasParameter
   6109 matching y.
   6110 
   6111 For blocks, given
   6112   b = ^(int y) { printf("%d", y) };
   6113 
   6114 the matcher blockDecl(hasAnyParameter(hasName("y")))
   6115 matches the declaration of the block b with hasParameter
   6116 matching y.
   6117 </pre></td></tr>
   6118 
   6119 
   6120 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   6121 <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
   6122 declaration or a block.
   6123 
   6124 Given
   6125   class X { void f(int x) {} };
   6126 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   6127   matches f(int x) {}
   6128 with hasParameter(...)
   6129   matching int x
   6130 
   6131 For ObjectiveC, given
   6132   @interface I - (void) f:(int) y; @end
   6133 
   6134 the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   6135 matches the declaration of method f with hasParameter
   6136 matching y.
   6137 </pre></td></tr>
   6138 
   6139 
   6140 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   6141 <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
   6142 
   6143 Examples:
   6144   int x;
   6145 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6146   matches int x
   6147 
   6148 auto x = int(3);
   6149 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6150   matches int(3)
   6151 
   6152 struct Foo { Foo(int, int); };
   6153 auto x = Foo(1, 2);
   6154 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6155   matches Foo(1, 2)
   6156 
   6157 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   6158   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   6159   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   6160   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6161   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   6162   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   6163   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   6164   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6165 </pre></td></tr>
   6166 
   6167 
   6168 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   6169 <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
   6170 pointee matches a given matcher.
   6171 
   6172 Given
   6173   int *a;
   6174   int const *b;
   6175   float const *f;
   6176 pointerType(pointee(isConstQualified(), isInteger()))
   6177   matches "int const *b"
   6178 
   6179 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
   6180   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
   6181 </pre></td></tr>
   6182 
   6183 
   6184 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   6185 <tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
   6186 
   6187 Examples:
   6188   int x;
   6189 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6190   matches int x
   6191 
   6192 auto x = int(3);
   6193 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6194   matches int(3)
   6195 
   6196 struct Foo { Foo(int, int); };
   6197 auto x = Foo(1, 2);
   6198 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6199   matches Foo(1, 2)
   6200 
   6201 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   6202   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   6203   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   6204   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6205   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   6206   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   6207   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   6208   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6209 </pre></td></tr>
   6210 
   6211 
   6212 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   6213 <tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
   6214 declaration's type.
   6215 
   6216 In case of a value declaration (for example a variable declaration),
   6217 this resolves one layer of indirection. For example, in the value
   6218 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   6219 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   6220 declaration of x.
   6221 
   6222 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   6223             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   6224             and friend class X (matcher = friendDecl(hasType("X"))
   6225             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   6226                                               cxxRecordDecl(hasName("X"))))
   6227  class X {};
   6228  void y(X &amp;x) { x; X z; }
   6229  class Y { friend class X; };
   6230  class Z : public virtual X {};
   6231 
   6232 Example matches class Derived
   6233 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   6234 class Base {};
   6235 class Derived : Base {};
   6236 
   6237 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
   6238 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   6239 </pre></td></tr>
   6240 
   6241 
   6242 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   6243 <tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
   6244 matcher.
   6245 
   6246 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   6247             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   6248             and U (matcher = typedefDecl(hasType(asString("int")))
   6249             and friend class X (matcher = friendDecl(hasType("X"))
   6250             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   6251                                               asString("class X")))
   6252  class X {};
   6253  void y(X &amp;x) { x; X z; }
   6254  typedef int U;
   6255  class Y { friend class X; };
   6256  class Z : public virtual X {};
   6257 </pre></td></tr>
   6258 
   6259 
   6260 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
   6261 <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
   6262 
   6263 Given
   6264   void f(int i);
   6265   int y;
   6266   f(y);
   6267 callExpr(
   6268   forEachArgumentWithParam(
   6269     declRefExpr(to(varDecl(hasName("y")))),
   6270     parmVarDecl(hasType(isInteger()))
   6271 ))
   6272   matches f(y);
   6273 with declRefExpr(...)
   6274   matching int y
   6275 and parmVarDecl(...)
   6276   matching int i
   6277 </pre></td></tr>
   6278 
   6279 
   6280 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParamType1')"><a name="forEachArgumentWithParamType1Anchor">forEachArgumentWithParamType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; ParamMatcher</td></tr>
   6281 <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
   6282 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
   6283 it works on calls through function pointers as well.
   6284 
   6285 The difference is, that function pointers do not provide access to a
   6286 ParmVarDecl, but only the QualType for each argument.
   6287 
   6288 Given
   6289   void f(int i);
   6290   int y;
   6291   f(y);
   6292   void (*f_ptr)(int) = f;
   6293   f_ptr(y);
   6294 callExpr(
   6295   forEachArgumentWithParamType(
   6296     declRefExpr(to(varDecl(hasName("y")))),
   6297     qualType(isInteger()).bind("type)
   6298 ))
   6299   matches f(y) and f_ptr(y)
   6300 with declRefExpr(...)
   6301   matching int y
   6302 and qualType(...)
   6303   matching int
   6304 </pre></td></tr>
   6305 
   6306 
   6307 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6308 <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
   6309 expression, or an ObjC-message-send expression.
   6310 
   6311 Given
   6312   void x(int, int, int) { int y; x(1, y, 42); }
   6313 callExpr(hasAnyArgument(declRefExpr()))
   6314   matches x(1, y, 42)
   6315 with hasAnyArgument(...)
   6316   matching y
   6317 
   6318 For ObjectiveC, given
   6319   @interface I - (void) f:(int) y; @end
   6320   void foo(I *i) { [i f:12]; }
   6321 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   6322   matches [i f:12]
   6323 </pre></td></tr>
   6324 
   6325 
   6326 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6327 <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
   6328 call expression.
   6329 
   6330 Example matches y in x(y)
   6331     (matcher = callExpr(hasArgument(0, declRefExpr())))
   6332   void x(int) { int y; x(y); }
   6333 </pre></td></tr>
   6334 
   6335 
   6336 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6337 <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
   6338 matches the given matcher.
   6339 
   6340 The associated declaration is:
   6341 - for type nodes, the declaration of the underlying type
   6342 - for CallExpr, the declaration of the callee
   6343 - for MemberExpr, the declaration of the referenced member
   6344 - for CXXConstructExpr, the declaration of the constructor
   6345 - for CXXNewExpr, the declaration of the operator new
   6346 - for ObjCIvarExpr, the declaration of the ivar
   6347 
   6348 For type nodes, hasDeclaration will generally match the declaration of the
   6349 sugared type. Given
   6350   class X {};
   6351   typedef X Y;
   6352   Y y;
   6353 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6354 typedefDecl. A common use case is to match the underlying, desugared type.
   6355 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6356   varDecl(hasType(hasUnqualifiedDesugaredType(
   6357       recordType(hasDeclaration(decl())))))
   6358 In this matcher, the decl will match the CXXRecordDecl of class X.
   6359 
   6360 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   6361   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   6362   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   6363   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   6364   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   6365   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   6366   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6367 </pre></td></tr>
   6368 
   6369 
   6370 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
   6371 <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
   6372 
   6373 Given
   6374   class A { A() : i(42), j(42) {} int i; int j; };
   6375 cxxConstructorDecl(forEachConstructorInitializer(
   6376   forField(decl().bind("x"))
   6377 ))
   6378   will trigger two matches, binding for 'i' and 'j' respectively.
   6379 </pre></td></tr>
   6380 
   6381 
   6382 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
   6383 <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
   6384 
   6385 Given
   6386   struct Foo {
   6387     Foo() : foo_(1) { }
   6388     int foo_;
   6389   };
   6390 cxxRecordDecl(has(cxxConstructorDecl(
   6391   hasAnyConstructorInitializer(anything())
   6392 )))
   6393   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
   6394 </pre></td></tr>
   6395 
   6396 
   6397 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt; InnerMatcher</td></tr>
   6398 <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
   6399 
   6400 Given
   6401   struct Foo {
   6402     Foo() : foo_(1) { }
   6403     int foo_;
   6404   };
   6405 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
   6406     forField(hasName("foo_"))))))
   6407   matches Foo
   6408 with forField matching foo_
   6409 </pre></td></tr>
   6410 
   6411 
   6412 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   6413 <tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
   6414 
   6415 Examples:
   6416   int x;
   6417 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6418   matches int x
   6419 
   6420 auto x = int(3);
   6421 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6422   matches int(3)
   6423 
   6424 struct Foo { Foo(int, int); };
   6425 auto x = Foo(1, 2);
   6426 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6427   matches Foo(1, 2)
   6428 
   6429 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   6430   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   6431   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   6432   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6433   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   6434   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   6435   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   6436   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6437 </pre></td></tr>
   6438 
   6439 
   6440 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6441 <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
   6442 
   6443 Given
   6444   struct Foo {
   6445     Foo() : foo_(1) { }
   6446     int foo_;
   6447   };
   6448 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
   6449     withInitializer(integerLiteral(equals(1)))))))
   6450   matches Foo
   6451 with withInitializer matching (1)
   6452 </pre></td></tr>
   6453 
   6454 
   6455 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6456 <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
   6457 given matcher. Implicit object expressions are included; that is, it matches
   6458 use of implicit `this`.
   6459 
   6460 Given
   6461   struct X {
   6462     int m;
   6463     int f(X x) { x.m; return m; }
   6464   };
   6465 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   6466   matches `x.m`, but not `m`; however,
   6467 memberExpr(hasObjectExpression(hasType(pointsTo(
   6468      cxxRecordDecl(hasName("X"))))))
   6469   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   6470 </pre></td></tr>
   6471 
   6472 
   6473 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   6474 <tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
   6475 
   6476 
   6477 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasInitStatement2')"><a name="hasInitStatement2Anchor">hasInitStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   6478 <tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
   6479 
   6480 Given:
   6481  void foo() {
   6482    if (int i = foobar(); i &gt; 0) {}
   6483    switch (int i = foobar(); i) {}
   6484    for (auto&amp; a = get_range(); auto&amp; x : a) {}
   6485  }
   6486  void bar() {
   6487    if (foobar() &gt; 0) {}
   6488    switch (foobar()) {}
   6489    for (auto&amp; x : get_range()) {}
   6490  }
   6491 ifStmt(hasInitStatement(anything()))
   6492   matches the if statement in foo but not in bar.
   6493 switchStmt(hasInitStatement(anything()))
   6494   matches the switch statement in foo but not in bar.
   6495 cxxForRangeStmt(hasInitStatement(anything()))
   6496   matches the range for statement in foo but not in bar.
   6497 </pre></td></tr>
   6498 
   6499 
   6500 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
   6501 <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
   6502 
   6503 Example:
   6504     forStmt(hasLoopVariable(anything()))
   6505 matches 'int x' in
   6506     for (int x : a) { }
   6507 </pre></td></tr>
   6508 
   6509 
   6510 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6511 <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
   6512 
   6513 Example:
   6514     forStmt(hasRangeInit(anything()))
   6515 matches 'a' in
   6516     for (int x : a) { }
   6517 </pre></td></tr>
   6518 
   6519 
   6520 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   6521 <tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
   6522 
   6523 Examples:
   6524   int x;
   6525 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6526   matches int x
   6527 
   6528 auto x = int(3);
   6529 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6530   matches int(3)
   6531 
   6532 struct Foo { Foo(int, int); };
   6533 auto x = Foo(1, 2);
   6534 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6535   matches Foo(1, 2)
   6536 
   6537 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   6538   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   6539   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   6540   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6541   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   6542   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   6543   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   6544   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6545 </pre></td></tr>
   6546 
   6547 
   6548 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6549 <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
   6550 `on`, matches the argument directly without stripping away anything.
   6551 
   6552 Given
   6553   class Y { public: void m(); };
   6554   Y g();
   6555   class X : public Y { void g(); };
   6556   void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
   6557 cxxMemberCallExpr(onImplicitObjectArgument(hasType(
   6558     cxxRecordDecl(hasName("Y")))))
   6559   matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
   6560 cxxMemberCallExpr(on(callExpr()))
   6561   does not match `(g()).m()`, because the parens are not ignored.
   6562 
   6563 FIXME: Overload to allow directly matching types?
   6564 </pre></td></tr>
   6565 
   6566 
   6567 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6568 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
   6569 stripping off any parentheses or implicit casts.
   6570 
   6571 Given
   6572   class Y { public: void m(); };
   6573   Y g();
   6574   class X : public Y {};
   6575   void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
   6576 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
   6577   matches `y.m()` and `(g()).m()`.
   6578 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
   6579   matches `x.m()`.
   6580 cxxMemberCallExpr(on(callExpr()))
   6581   matches `(g()).m()`.
   6582 
   6583 FIXME: Overload to allow directly matching types?
   6584 </pre></td></tr>
   6585 
   6586 
   6587 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   6588 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
   6589 </pre></td></tr>
   6590 
   6591 
   6592 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   6593 <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
   6594 matches the InnerMatcher, or is a pointer to a type that matches the
   6595 InnerMatcher.
   6596 
   6597 Given
   6598   class Y { public: void m(); };
   6599   class X : public Y { void g(); };
   6600   void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
   6601 cxxMemberCallExpr(thisPointerType(hasDeclaration(
   6602     cxxRecordDecl(hasName("Y")))))
   6603   matches `y.m()`, `p-&gt;m()` and `x.m()`.
   6604 cxxMemberCallExpr(thisPointerType(hasDeclaration(
   6605     cxxRecordDecl(hasName("X")))))
   6606   matches `x.g()`.
   6607 </pre></td></tr>
   6608 
   6609 
   6610 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
   6611 <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
   6612 produce multiple matches.
   6613 
   6614 Given
   6615   class A { virtual void f(); };
   6616   class B : public A { void f(); };
   6617   class C : public B { void f(); };
   6618 cxxMethodDecl(ofClass(hasName("C")),
   6619               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
   6620   matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
   6621   that B::f is not overridden by C::f).
   6622 
   6623 The check can produce multiple matches in case of multiple inheritance, e.g.
   6624   class A1 { virtual void f(); };
   6625   class A2 { virtual void f(); };
   6626   class C : public A1, public A2 { void f(); };
   6627 cxxMethodDecl(ofClass(hasName("C")),
   6628               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
   6629   matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
   6630   once with "b" binding "A2::f" and "d" binding "C::f".
   6631 </pre></td></tr>
   6632 
   6633 
   6634 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt; InnerMatcher</td></tr>
   6635 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
   6636 belongs to.
   6637 
   6638 FIXME: Generalize this for other kinds of declarations.
   6639 FIXME: What other kind of declarations would we need to generalize
   6640 this to?
   6641 
   6642 Example matches A() in the last line
   6643     (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
   6644         ofClass(hasName("A"))))))
   6645   class A {
   6646    public:
   6647     A();
   6648   };
   6649   A a = A();
   6650 </pre></td></tr>
   6651 
   6652 
   6653 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyPlacementArg0')"><a name="hasAnyPlacementArg0Anchor">hasAnyPlacementArg</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6654 <tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
   6655 
   6656 Given:
   6657   MyClass *p1 = new (Storage) MyClass();
   6658 cxxNewExpr(hasAnyPlacementArg(anything()))
   6659   matches the expression 'new (Storage, 16) MyClass()'.
   6660 </pre></td></tr>
   6661 
   6662 
   6663 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6664 <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
   6665 
   6666 Given:
   6667   MyClass *p1 = new MyClass[10];
   6668 cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
   6669   matches the expression 'new MyClass[10]'.
   6670 </pre></td></tr>
   6671 
   6672 
   6673 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6674 <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
   6675 matches the given matcher.
   6676 
   6677 The associated declaration is:
   6678 - for type nodes, the declaration of the underlying type
   6679 - for CallExpr, the declaration of the callee
   6680 - for MemberExpr, the declaration of the referenced member
   6681 - for CXXConstructExpr, the declaration of the constructor
   6682 - for CXXNewExpr, the declaration of the operator new
   6683 - for ObjCIvarExpr, the declaration of the ivar
   6684 
   6685 For type nodes, hasDeclaration will generally match the declaration of the
   6686 sugared type. Given
   6687   class X {};
   6688   typedef X Y;
   6689   Y y;
   6690 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6691 typedefDecl. A common use case is to match the underlying, desugared type.
   6692 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6693   varDecl(hasType(hasUnqualifiedDesugaredType(
   6694       recordType(hasDeclaration(decl())))))
   6695 In this matcher, the decl will match the CXXRecordDecl of class X.
   6696 
   6697 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   6698   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   6699   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   6700   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   6701   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   6702   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   6703   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6704 </pre></td></tr>
   6705 
   6706 
   6707 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasPlacementArg0')"><a name="hasPlacementArg0Anchor">hasPlacementArg</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6708 <tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
   6709 
   6710 Given:
   6711   MyClass *p1 = new (Storage, 16) MyClass();
   6712 cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
   6713   matches the expression 'new (Storage, 16) MyClass()'.
   6714 </pre></td></tr>
   6715 
   6716 
   6717 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   6718 <tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
   6719 
   6720 Examples:
   6721   int x;
   6722 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6723   matches int x
   6724 
   6725 auto x = int(3);
   6726 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6727   matches int(3)
   6728 
   6729 struct Foo { Foo(int, int); };
   6730 auto x = Foo(1, 2);
   6731 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6732   matches Foo(1, 2)
   6733 
   6734 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   6735   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   6736   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   6737   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6738   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   6739   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   6740   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   6741   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6742 </pre></td></tr>
   6743 
   6744 
   6745 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6746 <tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
   6747 binary operator matches.
   6748 </pre></td></tr>
   6749 
   6750 
   6751 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6752 <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
   6753 
   6754 Example matches a (matcher = binaryOperator(hasLHS()))
   6755   a || b
   6756 </pre></td></tr>
   6757 
   6758 
   6759 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperands1')"><a name="hasOperands1Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
   6760 <tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
   6761 
   6762 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
   6763                                              integerLiteral(equals(2)))
   6764   1 + 2 // Match
   6765   2 + 1 // Match
   6766   1 + 1 // No match
   6767   2 + 2 // No match
   6768 </pre></td></tr>
   6769 
   6770 
   6771 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6772 <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
   6773 
   6774 Example matches b (matcher = binaryOperator(hasRHS()))
   6775   a || b
   6776 </pre></td></tr>
   6777 
   6778 
   6779 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand1')"><a name="hasUnaryOperand1Anchor">hasUnaryOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6780 <tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
   6781 
   6782 Example matches true (matcher = hasUnaryOperand(
   6783                                   cxxBoolLiteral(equals(true))))
   6784   !true
   6785 </pre></td></tr>
   6786 
   6787 
   6788 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBase0')"><a name="hasAnyBase0Anchor">hasAnyBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt; BaseSpecMatcher</td></tr>
   6789 <tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
   6790 
   6791 Example:
   6792 matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
   6793   class Foo;
   6794   class Bar : Foo {};
   6795   class Baz : Bar {};
   6796   class SpecialBase;
   6797   class Proxy : SpecialBase {};  // matches Proxy
   6798   class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
   6799 
   6800 FIXME: Refactor this and isDerivedFrom to reuse implementation.
   6801 </pre></td></tr>
   6802 
   6803 
   6804 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDirectBase0')"><a name="hasDirectBase0Anchor">hasDirectBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt; BaseSpecMatcher</td></tr>
   6805 <tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
   6806 
   6807 Example:
   6808 matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
   6809   class Foo;
   6810   class Bar : Foo {};
   6811   class Baz : Bar {};
   6812   class SpecialBase;
   6813   class Proxy : SpecialBase {};  // matches Proxy
   6814   class IndirectlyDerived : Proxy {};  // doesn't match
   6815 </pre></td></tr>
   6816 
   6817 
   6818 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
   6819 <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
   6820 
   6821 Given:
   6822   class A { void func(); };
   6823   class B { void member(); };
   6824 
   6825 cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
   6826 A but not B.
   6827 </pre></td></tr>
   6828 
   6829 
   6830 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   6831 <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
   6832 matching Base, or Objective-C classes that directly or indirectly
   6833 subclass a class matching Base.
   6834 
   6835 Note that a class is not considered to be derived from itself.
   6836 
   6837 Example matches Y, Z, C (Base == hasName("X"))
   6838   class X;
   6839   class Y : public X {};  // directly derived
   6840   class Z : public Y {};  // indirectly derived
   6841   typedef X A;
   6842   typedef A B;
   6843   class C : public B {};  // derived from a typedef of X
   6844 
   6845 In the following example, Bar matches isDerivedFrom(hasName("X")):
   6846   class Foo;
   6847   typedef Foo X;
   6848   class Bar : public Foo {};  // derived from a type that X is a typedef of
   6849 
   6850 In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
   6851   @interface NSObject @end
   6852   @interface Bar : NSObject @end
   6853 
   6854 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;
   6855 </pre></td></tr>
   6856 
   6857 
   6858 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   6859 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
   6860 matching Base.
   6861 
   6862 Note that a class is not considered to be derived from itself.
   6863 
   6864 Example matches Y, C (Base == hasName("X"))
   6865   class X;
   6866   class Y : public X {};  // directly derived
   6867   class Z : public Y {};  // indirectly derived
   6868   typedef X A;
   6869   typedef A B;
   6870   class C : public B {};  // derived from a typedef of X
   6871 
   6872 In the following example, Bar matches isDerivedFrom(hasName("X")):
   6873   class Foo;
   6874   typedef Foo X;
   6875   class Bar : public Foo {};  // derived from a type that X is a typedef of
   6876 </pre></td></tr>
   6877 
   6878 
   6879 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   6880 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
   6881 match Base.
   6882 </pre></td></tr>
   6883 
   6884 
   6885 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand2')"><a name="hasEitherOperand2Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6886 <tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
   6887 binary operator matches.
   6888 </pre></td></tr>
   6889 
   6890 
   6891 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS2')"><a name="hasLHS2Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6892 <tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
   6893 
   6894 Example matches a (matcher = binaryOperator(hasLHS()))
   6895   a || b
   6896 </pre></td></tr>
   6897 
   6898 
   6899 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperands2')"><a name="hasOperands2Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
   6900 <tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
   6901 
   6902 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
   6903                                              integerLiteral(equals(2)))
   6904   1 + 2 // Match
   6905   2 + 1 // Match
   6906   1 + 1 // No match
   6907   2 + 2 // No match
   6908 </pre></td></tr>
   6909 
   6910 
   6911 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS2')"><a name="hasRHS2Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6912 <tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
   6913 
   6914 Example matches b (matcher = binaryOperator(hasRHS()))
   6915   a || b
   6916 </pre></td></tr>
   6917 
   6918 
   6919 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   6920 <tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
   6921 
   6922 Examples:
   6923   int x;
   6924 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6925   matches int x
   6926 
   6927 auto x = int(3);
   6928 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6929   matches int(3)
   6930 
   6931 struct Foo { Foo(int, int); };
   6932 auto x = Foo(1, 2);
   6933 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6934   matches Foo(1, 2)
   6935 
   6936 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   6937   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   6938   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   6939   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6940   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   6941   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   6942   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   6943   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6944 </pre></td></tr>
   6945 
   6946 
   6947 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6948 <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
   6949 expression, or an ObjC-message-send expression.
   6950 
   6951 Given
   6952   void x(int, int, int) { int y; x(1, y, 42); }
   6953 callExpr(hasAnyArgument(declRefExpr()))
   6954   matches x(1, y, 42)
   6955 with hasAnyArgument(...)
   6956   matching y
   6957 
   6958 For ObjectiveC, given
   6959   @interface I - (void) f:(int) y; @end
   6960   void foo(I *i) { [i f:12]; }
   6961 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   6962   matches [i f:12]
   6963 </pre></td></tr>
   6964 
   6965 
   6966 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   6967 <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
   6968 call expression.
   6969 
   6970 Example matches y in x(y)
   6971     (matcher = callExpr(hasArgument(0, declRefExpr())))
   6972   void x(int) { int y; x(y); }
   6973 </pre></td></tr>
   6974 
   6975 
   6976 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   6977 <tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
   6978 
   6979 Examples:
   6980   int x;
   6981 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6982   matches int x
   6983 
   6984 auto x = int(3);
   6985 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6986   matches int(3)
   6987 
   6988 struct Foo { Foo(int, int); };
   6989 auto x = Foo(1, 2);
   6990 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6991   matches Foo(1, 2)
   6992 
   6993 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   6994   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   6995   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   6996   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6997   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   6998   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   6999   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   7000   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7001 </pre></td></tr>
   7002 
   7003 
   7004 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   7005 <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
   7006 given matcher.
   7007 
   7008 Example matches y.x() (matcher = callExpr(callee(
   7009                                    cxxMethodDecl(hasName("x")))))
   7010   class Y { public: void x(); };
   7011   void z() { Y y; y.x(); }
   7012 </pre></td></tr>
   7013 
   7014 
   7015 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7016 <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
   7017 
   7018 Given
   7019   class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
   7020   void f() { f(); }
   7021 callExpr(callee(expr()))
   7022   matches this-&gt;x(), x(), y.x(), f()
   7023 with callee(...)
   7024   matching this-&gt;x, x, y.x, f respectively
   7025 
   7026 Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
   7027 because this introduces ambiguous overloads with calls to Callee taking a
   7028 internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
   7029 implemented in terms of implicit casts.
   7030 </pre></td></tr>
   7031 
   7032 
   7033 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
   7034 <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
   7035 
   7036 Given
   7037   void f(int i);
   7038   int y;
   7039   f(y);
   7040 callExpr(
   7041   forEachArgumentWithParam(
   7042     declRefExpr(to(varDecl(hasName("y")))),
   7043     parmVarDecl(hasType(isInteger()))
   7044 ))
   7045   matches f(y);
   7046 with declRefExpr(...)
   7047   matching int y
   7048 and parmVarDecl(...)
   7049   matching int i
   7050 </pre></td></tr>
   7051 
   7052 
   7053 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParamType0')"><a name="forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; ParamMatcher</td></tr>
   7054 <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
   7055 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
   7056 it works on calls through function pointers as well.
   7057 
   7058 The difference is, that function pointers do not provide access to a
   7059 ParmVarDecl, but only the QualType for each argument.
   7060 
   7061 Given
   7062   void f(int i);
   7063   int y;
   7064   f(y);
   7065   void (*f_ptr)(int) = f;
   7066   f_ptr(y);
   7067 callExpr(
   7068   forEachArgumentWithParamType(
   7069     declRefExpr(to(varDecl(hasName("y")))),
   7070     qualType(isInteger()).bind("type)
   7071 ))
   7072   matches f(y) and f_ptr(y)
   7073 with declRefExpr(...)
   7074   matching int y
   7075 and qualType(...)
   7076   matching int
   7077 </pre></td></tr>
   7078 
   7079 
   7080 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7081 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
   7082 expression, or an ObjC-message-send expression.
   7083 
   7084 Given
   7085   void x(int, int, int) { int y; x(1, y, 42); }
   7086 callExpr(hasAnyArgument(declRefExpr()))
   7087   matches x(1, y, 42)
   7088 with hasAnyArgument(...)
   7089   matching y
   7090 
   7091 For ObjectiveC, given
   7092   @interface I - (void) f:(int) y; @end
   7093   void foo(I *i) { [i f:12]; }
   7094 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   7095   matches [i f:12]
   7096 </pre></td></tr>
   7097 
   7098 
   7099 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7100 <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
   7101 call expression.
   7102 
   7103 Example matches y in x(y)
   7104     (matcher = callExpr(hasArgument(0, declRefExpr())))
   7105   void x(int) { int y; x(y); }
   7106 </pre></td></tr>
   7107 
   7108 
   7109 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   7110 <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
   7111 matches the given matcher.
   7112 
   7113 The associated declaration is:
   7114 - for type nodes, the declaration of the underlying type
   7115 - for CallExpr, the declaration of the callee
   7116 - for MemberExpr, the declaration of the referenced member
   7117 - for CXXConstructExpr, the declaration of the constructor
   7118 - for CXXNewExpr, the declaration of the operator new
   7119 - for ObjCIvarExpr, the declaration of the ivar
   7120 
   7121 For type nodes, hasDeclaration will generally match the declaration of the
   7122 sugared type. Given
   7123   class X {};
   7124   typedef X Y;
   7125   Y y;
   7126 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7127 typedefDecl. A common use case is to match the underlying, desugared type.
   7128 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7129   varDecl(hasType(hasUnqualifiedDesugaredType(
   7130       recordType(hasDeclaration(decl())))))
   7131 In this matcher, the decl will match the CXXRecordDecl of class X.
   7132 
   7133 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   7134   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   7135   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   7136   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   7137   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   7138   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   7139   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7140 </pre></td></tr>
   7141 
   7142 
   7143 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;</td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7144 <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
   7145 extension, matches the constant given in the statement.
   7146 
   7147 Given
   7148   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
   7149 caseStmt(hasCaseConstant(integerLiteral()))
   7150   matches "case 1:"
   7151 </pre></td></tr>
   7152 
   7153 
   7154 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7155 <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
   7156 or opaque value's source expression matches the given matcher.
   7157 
   7158 Example 1: matches "a string"
   7159 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
   7160 class URL { URL(string); };
   7161 URL url = "a string";
   7162 
   7163 Example 2: matches 'b' (matcher =
   7164 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
   7165 int a = b ?: 1;
   7166 </pre></td></tr>
   7167 
   7168 
   7169 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   7170 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7171 functionDecl that have at least one TemplateArgument matching the given
   7172 InnerMatcher.
   7173 
   7174 Given
   7175   template&lt;typename T&gt; class A {};
   7176   template&lt;&gt; class A&lt;double&gt; {};
   7177   A&lt;int&gt; a;
   7178 
   7179   template&lt;typename T&gt; f() {};
   7180   void func() { f&lt;int&gt;(); };
   7181 
   7182 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7183     refersToType(asString("int"))))
   7184   matches the specialization A&lt;int&gt;
   7185 
   7186 functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   7187   matches the specialization f&lt;int&gt;
   7188 </pre></td></tr>
   7189 
   7190 
   7191 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
   7192 <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
   7193 
   7194 Given
   7195   template&lt;typename T&gt; class A {}; #1
   7196   template&lt;&gt; class A&lt;int&gt; {}; #2
   7197 classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
   7198   matches '#2' with classTemplateDecl() matching the class template
   7199   declaration of 'A' at #1.
   7200 </pre></td></tr>
   7201 
   7202 
   7203 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   7204 <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7205 functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   7206 
   7207 Given
   7208   template&lt;typename T, typename U&gt; class A {};
   7209   A&lt;bool, int&gt; b;
   7210   A&lt;int, bool&gt; c;
   7211 
   7212   template&lt;typename T&gt; void f() {}
   7213   void func() { f&lt;int&gt;(); };
   7214 classTemplateSpecializationDecl(hasTemplateArgument(
   7215     1, refersToType(asString("int"))))
   7216   matches the specialization A&lt;bool, int&gt;
   7217 
   7218 functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   7219   matches the specialization f&lt;int&gt;
   7220 </pre></td></tr>
   7221 
   7222 
   7223 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   7224 <tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
   7225 
   7226 Examples:
   7227   int x;
   7228 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7229   matches int x
   7230 
   7231 auto x = int(3);
   7232 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7233   matches int(3)
   7234 
   7235 struct Foo { Foo(int, int); };
   7236 auto x = Foo(1, 2);
   7237 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7238   matches Foo(1, 2)
   7239 
   7240 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   7241   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   7242   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   7243   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7244   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   7245   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   7246   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   7247   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7248 </pre></td></tr>
   7249 
   7250 
   7251 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;</td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   7252 <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
   7253 type.
   7254 
   7255 Given
   7256   struct A {};
   7257   A a[7];
   7258   int b[7];
   7259 arrayType(hasElementType(builtinType()))
   7260   matches "int b[7]"
   7261 
   7262 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
   7263 </pre></td></tr>
   7264 
   7265 
   7266 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   7267 <tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
   7268 
   7269 Examples:
   7270   int x;
   7271 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7272   matches int x
   7273 
   7274 auto x = int(3);
   7275 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7276   matches int(3)
   7277 
   7278 struct Foo { Foo(int, int); };
   7279 auto x = Foo(1, 2);
   7280 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7281   matches Foo(1, 2)
   7282 
   7283 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   7284   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   7285   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   7286   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7287   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   7288   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   7289   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   7290   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7291 </pre></td></tr>
   7292 
   7293 
   7294 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7295 <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
   7296 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
   7297 
   7298 Given
   7299   { {}; 1+2; }
   7300 hasAnySubstatement(compoundStmt())
   7301   matches '{ {}; 1+2; }'
   7302 with compoundStmt()
   7303   matching '{}'
   7304 </pre></td></tr>
   7305 
   7306 
   7307 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
   7308 <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
   7309 </pre></td></tr>
   7310 
   7311 
   7312 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   7313 <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
   7314 matches the given matcher.
   7315 
   7316 The associated declaration is:
   7317 - for type nodes, the declaration of the underlying type
   7318 - for CallExpr, the declaration of the callee
   7319 - for MemberExpr, the declaration of the referenced member
   7320 - for CXXConstructExpr, the declaration of the constructor
   7321 - for CXXNewExpr, the declaration of the operator new
   7322 - for ObjCIvarExpr, the declaration of the ivar
   7323 
   7324 For type nodes, hasDeclaration will generally match the declaration of the
   7325 sugared type. Given
   7326   class X {};
   7327   typedef X Y;
   7328   Y y;
   7329 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7330 typedefDecl. A common use case is to match the underlying, desugared type.
   7331 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7332   varDecl(hasType(hasUnqualifiedDesugaredType(
   7333       recordType(hasDeclaration(decl())))))
   7334 In this matcher, the decl will match the CXXRecordDecl of class X.
   7335 
   7336 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   7337   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   7338   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   7339   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   7340   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   7341   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   7342   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7343 </pre></td></tr>
   7344 
   7345 
   7346 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
   7347 <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
   7348 specific using shadow declaration.
   7349 
   7350 Given
   7351   namespace a { void f() {} }
   7352   using a::f;
   7353   void g() {
   7354     f();     // Matches this ..
   7355     a::f();  // .. but not this.
   7356   }
   7357 declRefExpr(throughUsingDecl(anything()))
   7358   matches f()
   7359 </pre></td></tr>
   7360 
   7361 
   7362 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   7363 <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
   7364 specified matcher.
   7365 
   7366 Example matches x in if(x)
   7367     (matcher = declRefExpr(to(varDecl(hasName("x")))))
   7368   bool x;
   7369   if (x) {}
   7370 </pre></td></tr>
   7371 
   7372 
   7373 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   7374 <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
   7375 
   7376 Note that this does not work for global declarations because the AST
   7377 breaks up multiple-declaration DeclStmt's into multiple single-declaration
   7378 DeclStmt's.
   7379 Example: Given non-global declarations
   7380   int a, b = 0;
   7381   int c;
   7382   int d = 2, e;
   7383 declStmt(containsDeclaration(
   7384       0, varDecl(hasInitializer(anything()))))
   7385   matches only 'int d = 2, e;', and
   7386 declStmt(containsDeclaration(1, varDecl()))
   7387   matches 'int a, b = 0' as well as 'int d = 2, e;'
   7388   but 'int c;' is not matched.
   7389 </pre></td></tr>
   7390 
   7391 
   7392 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   7393 <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
   7394 
   7395 Given
   7396   int a, b;
   7397   int c;
   7398 declStmt(hasSingleDecl(anything()))
   7399   matches 'int c;' but not 'int a, b;'.
   7400 </pre></td></tr>
   7401 
   7402 
   7403 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   7404 <tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
   7405 
   7406 Examples:
   7407   int x;
   7408 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7409   matches int x
   7410 
   7411 auto x = int(3);
   7412 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7413   matches int(3)
   7414 
   7415 struct Foo { Foo(int, int); };
   7416 auto x = Foo(1, 2);
   7417 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7418   matches Foo(1, 2)
   7419 
   7420 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   7421   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   7422   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   7423   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7424   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   7425   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   7426   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   7427   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7428 </pre></td></tr>
   7429 
   7430 
   7431 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   7432 <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
   7433 Decl, matches InnerMatcher.
   7434 
   7435 Given
   7436   namespace N {
   7437     namespace M {
   7438       class D {};
   7439     }
   7440   }
   7441 
   7442 cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
   7443 declaration of class D.
   7444 </pre></td></tr>
   7445 
   7446 
   7447 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   7448 <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
   7449 
   7450 Given
   7451   decltype(1) a = 1;
   7452   decltype(2.0) b = 2.0;
   7453 decltypeType(hasUnderlyingType(isInteger()))
   7454   matches the type of "a"
   7455 
   7456 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
   7457 </pre></td></tr>
   7458 
   7459 
   7460 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBinding0')"><a name="hasAnyBinding0Anchor">hasAnyBinding</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt; InnerMatcher</td></tr>
   7461 <tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
   7462 
   7463 For example, in:
   7464 void foo()
   7465 {
   7466     int arr[3];
   7467     auto &amp;[f, s, t] = arr;
   7468 
   7469     f = 42;
   7470 }
   7471 The matcher:
   7472   decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
   7473 matches the decomposition decl with 'f' bound to "fBinding".
   7474 </pre></td></tr>
   7475 
   7476 
   7477 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBinding0')"><a name="hasBinding0Anchor">hasBinding</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt; InnerMatcher</td></tr>
   7478 <tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
   7479 
   7480 For example, in:
   7481 void foo()
   7482 {
   7483     int arr[3];
   7484     auto &amp;[f, s, t] = arr;
   7485 
   7486     f = 42;
   7487 }
   7488 The matcher:
   7489   decompositionDecl(hasBinding(0,
   7490   bindingDecl(hasName("f").bind("fBinding"))))
   7491 matches the decomposition decl with 'f' bound to "fBinding".
   7492 </pre></td></tr>
   7493 
   7494 
   7495 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7496 <tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
   7497 
   7498 
   7499 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7500 <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
   7501 switch statement or conditional operator.
   7502 
   7503 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   7504   if (true) {}
   7505 </pre></td></tr>
   7506 
   7507 
   7508 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
   7509 <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
   7510 matches InnerMatcher if the qualifier exists.
   7511 
   7512 Given
   7513   namespace N {
   7514     namespace M {
   7515       class D {};
   7516     }
   7517   }
   7518   N::M::D d;
   7519 
   7520 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
   7521 matches the type of the variable declaration of d.
   7522 </pre></td></tr>
   7523 
   7524 
   7525 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   7526 <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
   7527 
   7528 Given
   7529   namespace N {
   7530     namespace M {
   7531       class D {};
   7532     }
   7533   }
   7534   N::M::D d;
   7535 
   7536 elaboratedType(namesType(recordType(
   7537 hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
   7538 declaration of d.
   7539 </pre></td></tr>
   7540 
   7541 
   7542 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   7543 <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
   7544 matches the given matcher.
   7545 
   7546 The associated declaration is:
   7547 - for type nodes, the declaration of the underlying type
   7548 - for CallExpr, the declaration of the callee
   7549 - for MemberExpr, the declaration of the referenced member
   7550 - for CXXConstructExpr, the declaration of the constructor
   7551 - for CXXNewExpr, the declaration of the operator new
   7552 - for ObjCIvarExpr, the declaration of the ivar
   7553 
   7554 For type nodes, hasDeclaration will generally match the declaration of the
   7555 sugared type. Given
   7556   class X {};
   7557   typedef X Y;
   7558   Y y;
   7559 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7560 typedefDecl. A common use case is to match the underlying, desugared type.
   7561 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7562   varDecl(hasType(hasUnqualifiedDesugaredType(
   7563       recordType(hasDeclaration(decl())))))
   7564 In this matcher, the decl will match the CXXRecordDecl of class X.
   7565 
   7566 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   7567   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   7568   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   7569   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   7570   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   7571   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   7572   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7573 </pre></td></tr>
   7574 
   7575 
   7576 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   7577 <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
   7578 
   7579 (Note: Clang's AST refers to other conversions as "casts" too, and calls
   7580 actual casts "explicit" casts.)
   7581 </pre></td></tr>
   7582 
   7583 
   7584 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   7585 <tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
   7586 
   7587 Examples:
   7588   int x;
   7589 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7590   matches int x
   7591 
   7592 auto x = int(3);
   7593 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7594   matches int(3)
   7595 
   7596 struct Foo { Foo(int, int); };
   7597 auto x = Foo(1, 2);
   7598 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7599   matches Foo(1, 2)
   7600 
   7601 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   7602   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   7603   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   7604   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7605   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   7606   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   7607   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   7608   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7609 </pre></td></tr>
   7610 
   7611 
   7612 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   7613 <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
   7614 declaration's type.
   7615 
   7616 In case of a value declaration (for example a variable declaration),
   7617 this resolves one layer of indirection. For example, in the value
   7618 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   7619 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   7620 declaration of x.
   7621 
   7622 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7623             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7624             and friend class X (matcher = friendDecl(hasType("X"))
   7625             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7626                                               cxxRecordDecl(hasName("X"))))
   7627  class X {};
   7628  void y(X &amp;x) { x; X z; }
   7629  class Y { friend class X; };
   7630  class Z : public virtual X {};
   7631 
   7632 Example matches class Derived
   7633 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   7634 class Base {};
   7635 class Derived : Base {};
   7636 
   7637 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
   7638 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   7639 </pre></td></tr>
   7640 
   7641 
   7642 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   7643 <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
   7644 matcher.
   7645 
   7646 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7647             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7648             and U (matcher = typedefDecl(hasType(asString("int")))
   7649             and friend class X (matcher = friendDecl(hasType("X"))
   7650             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7651                                               asString("class X")))
   7652  class X {};
   7653  void y(X &amp;x) { x; X z; }
   7654  typedef int U;
   7655  class Y { friend class X; };
   7656  class Z : public virtual X {};
   7657 </pre></td></tr>
   7658 
   7659 
   7660 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7661 <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
   7662 elidable constructor and other corresponding bookkeeping nodes.
   7663 
   7664 In C++17, elidable copy constructors are no longer being generated in the
   7665 AST as it is not permitted by the standard. They are, however, part of the
   7666 AST in C++14 and earlier. So, a matcher must abstract over these differences
   7667 to work in all language modes. This matcher skips elidable constructor-call
   7668 AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
   7669 various implicit nodes inside the constructor calls, all of which will not
   7670 appear in the C++17 AST.
   7671 
   7672 Given
   7673 
   7674 struct H {};
   7675 H G();
   7676 void f() {
   7677   H D = G();
   7678 }
   7679 
   7680 ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
   7681 matches ``H D = G()`` in C++11 through C++17 (and beyond).
   7682 </pre></td></tr>
   7683 
   7684 
   7685 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7686 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
   7687 are stripped off.
   7688 
   7689 Parentheses and explicit casts are not discarded.
   7690 Given
   7691   int arr[5];
   7692   int a = 0;
   7693   char b = 0;
   7694   const int c = a;
   7695   int *d = arr;
   7696   long e = (long) 0l;
   7697 The matchers
   7698    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
   7699    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
   7700 would match the declarations for a, b, c, and d, but not e.
   7701 While
   7702    varDecl(hasInitializer(integerLiteral()))
   7703    varDecl(hasInitializer(declRefExpr()))
   7704 only match the declarations for b, c, and d.
   7705 </pre></td></tr>
   7706 
   7707 
   7708 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7709 <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
   7710 nodes are stripped off.
   7711 
   7712 Parentheses and explicit casts are not discarded.
   7713 Given
   7714   class C {};
   7715   C a = C();
   7716   C b;
   7717   C c = b;
   7718 The matchers
   7719    varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
   7720 would match the declarations for a, b, and c.
   7721 While
   7722    varDecl(hasInitializer(cxxConstructExpr()))
   7723 only match the declarations for b and c.
   7724 </pre></td></tr>
   7725 
   7726 
   7727 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7728 <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
   7729 casts are stripped off.
   7730 
   7731 Implicit and non-C Style casts are also discarded.
   7732 Given
   7733   int a = 0;
   7734   char b = (0);
   7735   void* c = reinterpret_cast&lt;char*&gt;(0);
   7736   char d = char(0);
   7737 The matcher
   7738    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
   7739 would match the declarations for a, b, c, and d.
   7740 while
   7741    varDecl(hasInitializer(integerLiteral()))
   7742 only match the declaration for a.
   7743 </pre></td></tr>
   7744 
   7745 
   7746 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7747 <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
   7748 parentheses are stripped off.
   7749 
   7750 Explicit casts are not discarded.
   7751 Given
   7752   int arr[5];
   7753   int a = 0;
   7754   char b = (0);
   7755   const int c = a;
   7756   int *d = (arr);
   7757   long e = ((long) 0l);
   7758 The matchers
   7759    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
   7760    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
   7761 would match the declarations for a, b, c, and d, but not e.
   7762 while
   7763    varDecl(hasInitializer(integerLiteral()))
   7764    varDecl(hasInitializer(declRefExpr()))
   7765 would only match the declaration for a.
   7766 </pre></td></tr>
   7767 
   7768 
   7769 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7770 <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
   7771 
   7772 Given
   7773   const char* str = ("my-string");
   7774 The matcher
   7775   implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
   7776 would match the implicit cast resulting from the assignment.
   7777 </pre></td></tr>
   7778 
   7779 
   7780 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7781 <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
   7782 
   7783 Given
   7784   class C {
   7785     int a = 2;
   7786     int b = 3;
   7787     int c;
   7788   };
   7789 fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
   7790   matches 'int a;' but not 'int b;'.
   7791 fieldDecl(hasInClassInitializer(anything()))
   7792   matches 'int a;' and 'int b;' but not 'int c;'.
   7793 </pre></td></tr>
   7794 
   7795 
   7796 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7797 <tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
   7798 
   7799 
   7800 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7801 <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
   7802 switch statement or conditional operator.
   7803 
   7804 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   7805   if (true) {}
   7806 </pre></td></tr>
   7807 
   7808 
   7809 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7810 <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
   7811 
   7812 Example:
   7813     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
   7814 matches '++x' in
   7815     for (x; x &lt; N; ++x) { }
   7816 </pre></td></tr>
   7817 
   7818 
   7819 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7820 <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
   7821 
   7822 Example:
   7823     forStmt(hasLoopInit(declStmt()))
   7824 matches 'int x = 0' in
   7825     for (int x = 0; x &lt; N; ++x) { }
   7826 </pre></td></tr>
   7827 
   7828 
   7829 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;</td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   7830 <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
   7831 declaration's type.
   7832 
   7833 In case of a value declaration (for example a variable declaration),
   7834 this resolves one layer of indirection. For example, in the value
   7835 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   7836 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   7837 declaration of x.
   7838 
   7839 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7840             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7841             and friend class X (matcher = friendDecl(hasType("X"))
   7842             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7843                                               cxxRecordDecl(hasName("X"))))
   7844  class X {};
   7845  void y(X &amp;x) { x; X z; }
   7846  class Y { friend class X; };
   7847  class Z : public virtual X {};
   7848 
   7849 Example matches class Derived
   7850 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   7851 class Base {};
   7852 class Derived : Base {};
   7853 
   7854 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
   7855 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   7856 </pre></td></tr>
   7857 
   7858 
   7859 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   7860 <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
   7861 matcher.
   7862 
   7863 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7864             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7865             and U (matcher = typedefDecl(hasType(asString("int")))
   7866             and friend class X (matcher = friendDecl(hasType("X"))
   7867             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7868                                               asString("class X")))
   7869  class X {};
   7870  void y(X &amp;x) { x; X z; }
   7871  typedef int U;
   7872  class Y { friend class X; };
   7873  class Z : public virtual X {};
   7874 </pre></td></tr>
   7875 
   7876 
   7877 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7878 <tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
   7879 Note that this matcher matches all the declarations of a function whose
   7880 body is present in the AST.
   7881 
   7882 Given
   7883   void f();
   7884   void f() {}
   7885   void g();
   7886 functionDecl(hasAnyBody(compoundStmt()))
   7887   matches both 'void f();'
   7888   and 'void f() {}'
   7889 with compoundStmt()
   7890   matching '{}'
   7891   but does not match 'void g();'
   7892 </pre></td></tr>
   7893 
   7894 
   7895 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   7896 <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
   7897 block.
   7898 
   7899 Does not match the 'this' parameter of a method.
   7900 
   7901 Given
   7902   class X { void f(int x, int y, int z) {} };
   7903 cxxMethodDecl(hasAnyParameter(hasName("y")))
   7904   matches f(int x, int y, int z) {}
   7905 with hasAnyParameter(...)
   7906   matching int y
   7907 
   7908 For ObjectiveC, given
   7909   @interface I - (void) f:(int) y; @end
   7910 
   7911 the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   7912 matches the declaration of method f with hasParameter
   7913 matching y.
   7914 
   7915 For blocks, given
   7916   b = ^(int y) { printf("%d", y) };
   7917 
   7918 the matcher blockDecl(hasAnyParameter(hasName("y")))
   7919 matches the declaration of the block b with hasParameter
   7920 matching y.
   7921 </pre></td></tr>
   7922 
   7923 
   7924 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   7925 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7926 functionDecl that have at least one TemplateArgument matching the given
   7927 InnerMatcher.
   7928 
   7929 Given
   7930   template&lt;typename T&gt; class A {};
   7931   template&lt;&gt; class A&lt;double&gt; {};
   7932   A&lt;int&gt; a;
   7933 
   7934   template&lt;typename T&gt; f() {};
   7935   void func() { f&lt;int&gt;(); };
   7936 
   7937 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7938     refersToType(asString("int"))))
   7939   matches the specialization A&lt;int&gt;
   7940 
   7941 functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   7942   matches the specialization f&lt;int&gt;
   7943 </pre></td></tr>
   7944 
   7945 
   7946 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   7947 <tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
   7948 
   7949 
   7950 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   7951 <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
   7952 declaration.
   7953 
   7954 Given
   7955   template&lt;bool b&gt;
   7956   struct S {
   7957     S(int); // #1
   7958     explicit S(double); // #2
   7959     operator int(); // #3
   7960     explicit operator bool(); // #4
   7961     explicit(false) S(bool) // # 7
   7962     explicit(true) S(char) // # 8
   7963     explicit(b) S(S) // # 9
   7964   };
   7965   S(int) -&gt; S&lt;true&gt; // #5
   7966   explicit S(double) -&gt; S&lt;false&gt; // #6
   7967 cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
   7968 cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
   7969 cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
   7970 </pre></td></tr>
   7971 
   7972 
   7973 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   7974 <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
   7975 declaration or a block.
   7976 
   7977 Given
   7978   class X { void f(int x) {} };
   7979 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   7980   matches f(int x) {}
   7981 with hasParameter(...)
   7982   matching int x
   7983 
   7984 For ObjectiveC, given
   7985   @interface I - (void) f:(int) y; @end
   7986 
   7987 the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   7988 matches the declaration of method f with hasParameter
   7989 matching y.
   7990 </pre></td></tr>
   7991 
   7992 
   7993 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   7994 <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7995 functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   7996 
   7997 Given
   7998   template&lt;typename T, typename U&gt; class A {};
   7999   A&lt;bool, int&gt; b;
   8000   A&lt;int, bool&gt; c;
   8001 
   8002   template&lt;typename T&gt; void f() {}
   8003   void func() { f&lt;int&gt;(); };
   8004 classTemplateSpecializationDecl(hasTemplateArgument(
   8005     1, refersToType(asString("int"))))
   8006   matches the specialization A&lt;bool, int&gt;
   8007 
   8008 functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   8009   matches the specialization f&lt;int&gt;
   8010 </pre></td></tr>
   8011 
   8012 
   8013 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8014 <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
   8015 
   8016 Given:
   8017   class X { int f() { return 1; } };
   8018 cxxMethodDecl(returns(asString("int")))
   8019   matches int f() { return 1; }
   8020 </pre></td></tr>
   8021 
   8022 
   8023 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8024 <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
   8025 switch statement or conditional operator.
   8026 
   8027 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   8028   if (true) {}
   8029 </pre></td></tr>
   8030 
   8031 
   8032 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt; InnerMatcher</td></tr>
   8033 <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
   8034 
   8035 Given
   8036   if (A* a = GetAPointer()) {}
   8037 hasConditionVariableStatement(...)
   8038   matches 'A* a = GetAPointer()'.
   8039 </pre></td></tr>
   8040 
   8041 
   8042 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   8043 <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
   8044 
   8045 Examples matches the if statement
   8046   (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
   8047   if (false) false; else true;
   8048 </pre></td></tr>
   8049 
   8050 
   8051 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasInitStatement0')"><a name="hasInitStatement0Anchor">hasInitStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   8052 <tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
   8053 
   8054 Given:
   8055  void foo() {
   8056    if (int i = foobar(); i &gt; 0) {}
   8057    switch (int i = foobar(); i) {}
   8058    for (auto&amp; a = get_range(); auto&amp; x : a) {}
   8059  }
   8060  void bar() {
   8061    if (foobar() &gt; 0) {}
   8062    switch (foobar()) {}
   8063    for (auto&amp; x : get_range()) {}
   8064  }
   8065 ifStmt(hasInitStatement(anything()))
   8066   matches the if statement in foo but not in bar.
   8067 switchStmt(hasInitStatement(anything()))
   8068   matches the switch statement in foo but not in bar.
   8069 cxxForRangeStmt(hasInitStatement(anything()))
   8070   matches the range for statement in foo but not in bar.
   8071 </pre></td></tr>
   8072 
   8073 
   8074 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   8075 <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
   8076 
   8077 Examples matches the if statement
   8078   (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
   8079   if (false) true; else false;
   8080 </pre></td></tr>
   8081 
   8082 
   8083 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8084 <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
   8085 matcher.
   8086 
   8087 FIXME: Unit test this matcher
   8088 </pre></td></tr>
   8089 
   8090 
   8091 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8092 <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
   8093 
   8094 Example matches y.
   8095     (matcher = initListExpr(hasInit(0, expr())))
   8096   int x{y}.
   8097 </pre></td></tr>
   8098 
   8099 
   8100 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8101 <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
   8102 (if expression have it).
   8103 </pre></td></tr>
   8104 
   8105 
   8106 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   8107 <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
   8108 matches the given matcher.
   8109 
   8110 The associated declaration is:
   8111 - for type nodes, the declaration of the underlying type
   8112 - for CallExpr, the declaration of the callee
   8113 - for MemberExpr, the declaration of the referenced member
   8114 - for CXXConstructExpr, the declaration of the constructor
   8115 - for CXXNewExpr, the declaration of the operator new
   8116 - for ObjCIvarExpr, the declaration of the ivar
   8117 
   8118 For type nodes, hasDeclaration will generally match the declaration of the
   8119 sugared type. Given
   8120   class X {};
   8121   typedef X Y;
   8122   Y y;
   8123 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8124 typedefDecl. A common use case is to match the underlying, desugared type.
   8125 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8126   varDecl(hasType(hasUnqualifiedDesugaredType(
   8127       recordType(hasDeclaration(decl())))))
   8128 In this matcher, the decl will match the CXXRecordDecl of class X.
   8129 
   8130 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   8131   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   8132   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   8133   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   8134   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   8135   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   8136   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8137 </pre></td></tr>
   8138 
   8139 
   8140 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   8141 <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
   8142 matches the given matcher.
   8143 
   8144 The associated declaration is:
   8145 - for type nodes, the declaration of the underlying type
   8146 - for CallExpr, the declaration of the callee
   8147 - for MemberExpr, the declaration of the referenced member
   8148 - for CXXConstructExpr, the declaration of the constructor
   8149 - for CXXNewExpr, the declaration of the operator new
   8150 - for ObjCIvarExpr, the declaration of the ivar
   8151 
   8152 For type nodes, hasDeclaration will generally match the declaration of the
   8153 sugared type. Given
   8154   class X {};
   8155   typedef X Y;
   8156   Y y;
   8157 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8158 typedefDecl. A common use case is to match the underlying, desugared type.
   8159 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8160   varDecl(hasType(hasUnqualifiedDesugaredType(
   8161       recordType(hasDeclaration(decl())))))
   8162 In this matcher, the decl will match the CXXRecordDecl of class X.
   8163 
   8164 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   8165   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   8166   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   8167   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   8168   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   8169   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   8170   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8171 </pre></td></tr>
   8172 
   8173 
   8174 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt; InnerMatcher</td></tr>
   8175 <tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
   8176 
   8177 Given
   8178   struct foo {
   8179     void bar() {
   8180       auto f = [this](){};
   8181     }
   8182   }
   8183 lambdaExpr(hasAnyCapture(cxxThisExpr()))
   8184   matches [this](){};
   8185 </pre></td></tr>
   8186 
   8187 
   8188 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
   8189 <tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
   8190 
   8191 Given
   8192   void foo() {
   8193     int x;
   8194     auto f = [x](){};
   8195   }
   8196 lambdaExpr(hasAnyCapture(anything()))
   8197   matches [x](){};
   8198 </pre></td></tr>
   8199 
   8200 
   8201 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   8202 <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
   8203 matches the given matcher.
   8204 
   8205 The associated declaration is:
   8206 - for type nodes, the declaration of the underlying type
   8207 - for CallExpr, the declaration of the callee
   8208 - for MemberExpr, the declaration of the referenced member
   8209 - for CXXConstructExpr, the declaration of the constructor
   8210 - for CXXNewExpr, the declaration of the operator new
   8211 - for ObjCIvarExpr, the declaration of the ivar
   8212 
   8213 For type nodes, hasDeclaration will generally match the declaration of the
   8214 sugared type. Given
   8215   class X {};
   8216   typedef X Y;
   8217   Y y;
   8218 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8219 typedefDecl. A common use case is to match the underlying, desugared type.
   8220 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8221   varDecl(hasType(hasUnqualifiedDesugaredType(
   8222       recordType(hasDeclaration(decl())))))
   8223 In this matcher, the decl will match the CXXRecordDecl of class X.
   8224 
   8225 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   8226   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   8227   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   8228   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   8229   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   8230   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   8231   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8232 </pre></td></tr>
   8233 
   8234 
   8235 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8236 <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
   8237 given matcher. Implicit object expressions are included; that is, it matches
   8238 use of implicit `this`.
   8239 
   8240 Given
   8241   struct X {
   8242     int m;
   8243     int f(X x) { x.m; return m; }
   8244   };
   8245 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   8246   matches `x.m`, but not `m`; however,
   8247 memberExpr(hasObjectExpression(hasType(pointsTo(
   8248      cxxRecordDecl(hasName("X"))))))
   8249   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   8250 </pre></td></tr>
   8251 
   8252 
   8253 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
   8254 <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
   8255 given matcher.
   8256 
   8257 Given
   8258   struct { int first, second; } first, second;
   8259   int i(second.first);
   8260   int j(first.second);
   8261 memberExpr(member(hasName("first")))
   8262   matches second.first
   8263   but not first.second (because the member name there is "second").
   8264 </pre></td></tr>
   8265 
   8266 
   8267 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   8268 <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
   8269 pointee matches a given matcher.
   8270 
   8271 Given
   8272   int *a;
   8273   int const *b;
   8274   float const *f;
   8275 pointerType(pointee(isConstQualified(), isInteger()))
   8276   matches "int const *b"
   8277 
   8278 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
   8279   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
   8280 </pre></td></tr>
   8281 
   8282 
   8283 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
   8284 <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
   8285 matcher.
   8286 
   8287 Given
   8288   namespace N { template&lt;class T&gt; void f(T t); }
   8289   template &lt;class T&gt; void g() { using N::f; f(T()); }
   8290 unresolvedLookupExpr(hasAnyDeclaration(
   8291     namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
   8292   matches the use of f in g() .
   8293 </pre></td></tr>
   8294 
   8295 
   8296 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt; InnerMatcher</td></tr>
   8297 <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
   8298 
   8299 Given
   8300   struct A { struct B { struct C {}; }; };
   8301   A::B::C c;
   8302 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
   8303   matches "A::"
   8304 </pre></td></tr>
   8305 
   8306 
   8307 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
   8308 <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
   8309 NestedNameSpecifier-matcher matches.
   8310 </pre></td></tr>
   8311 
   8312 
   8313 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
   8314 <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
   8315 given TypeLoc.
   8316 
   8317 Given
   8318   struct A { struct B { struct C {}; }; };
   8319   A::B::C c;
   8320 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
   8321   hasDeclaration(cxxRecordDecl(hasName("A")))))))
   8322   matches "A::"
   8323 </pre></td></tr>
   8324 
   8325 
   8326 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
   8327 <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
   8328 
   8329 Given
   8330   struct A { struct B { struct C {}; }; };
   8331   A::B::C c;
   8332 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
   8333   matches "A::"
   8334 </pre></td></tr>
   8335 
   8336 
   8337 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt; InnerMatcher</td></tr>
   8338 <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
   8339 given namespace matcher.
   8340 
   8341 Given
   8342   namespace ns { struct A {}; }
   8343   ns::A a;
   8344 nestedNameSpecifier(specifiesNamespace(hasName("ns")))
   8345   matches "ns::"
   8346 </pre></td></tr>
   8347 
   8348 
   8349 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8350 <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
   8351 given QualType matcher without qualifiers.
   8352 
   8353 Given
   8354   struct A { struct B { struct C {}; }; };
   8355   A::B::C c;
   8356 nestedNameSpecifier(specifiesType(
   8357   hasDeclaration(cxxRecordDecl(hasName("A")))
   8358 ))
   8359   matches "A::"
   8360 </pre></td></tr>
   8361 
   8362 
   8363 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt; InnerMatcher</td></tr>
   8364 <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
   8365 
   8366 Given
   8367 
   8368   #pragma omp parallel
   8369   #pragma omp parallel default(none)
   8370 
   8371 ``ompExecutableDirective(hasAnyClause(anything()))`` matches
   8372 ``omp parallel default(none)``.
   8373 </pre></td></tr>
   8374 
   8375 
   8376 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   8377 <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
   8378 
   8379 Prerequisite: the executable directive must not be standalone directive.
   8380 If it is, it will never match.
   8381 
   8382 Given
   8383 
   8384    #pragma omp parallel
   8385    ;
   8386    #pragma omp parallel
   8387    {}
   8388 
   8389 ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
   8390 </pre></td></tr>
   8391 
   8392 
   8393 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   8394 <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
   8395 matching Base, or Objective-C classes that directly or indirectly
   8396 subclass a class matching Base.
   8397 
   8398 Note that a class is not considered to be derived from itself.
   8399 
   8400 Example matches Y, Z, C (Base == hasName("X"))
   8401   class X;
   8402   class Y : public X {};  // directly derived
   8403   class Z : public Y {};  // indirectly derived
   8404   typedef X A;
   8405   typedef A B;
   8406   class C : public B {};  // derived from a typedef of X
   8407 
   8408 In the following example, Bar matches isDerivedFrom(hasName("X")):
   8409   class Foo;
   8410   typedef Foo X;
   8411   class Bar : public Foo {};  // derived from a type that X is a typedef of
   8412 
   8413 In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
   8414   @interface NSObject @end
   8415   @interface Bar : NSObject @end
   8416 
   8417 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;
   8418 </pre></td></tr>
   8419 
   8420 
   8421 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   8422 <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
   8423 matching Base.
   8424 
   8425 Note that a class is not considered to be derived from itself.
   8426 
   8427 Example matches Y, C (Base == hasName("X"))
   8428   class X;
   8429   class Y : public X {};  // directly derived
   8430   class Z : public Y {};  // indirectly derived
   8431   typedef X A;
   8432   typedef A B;
   8433   class C : public B {};  // derived from a typedef of X
   8434 
   8435 In the following example, Bar matches isDerivedFrom(hasName("X")):
   8436   class Foo;
   8437   typedef Foo X;
   8438   class Bar : public Foo {};  // derived from a type that X is a typedef of
   8439 </pre></td></tr>
   8440 
   8441 
   8442 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   8443 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
   8444 match Base.
   8445 </pre></td></tr>
   8446 
   8447 
   8448 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8449 <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
   8450 expression, or an ObjC-message-send expression.
   8451 
   8452 Given
   8453   void x(int, int, int) { int y; x(1, y, 42); }
   8454 callExpr(hasAnyArgument(declRefExpr()))
   8455   matches x(1, y, 42)
   8456 with hasAnyArgument(...)
   8457   matching y
   8458 
   8459 For ObjectiveC, given
   8460   @interface I - (void) f:(int) y; @end
   8461   void foo(I *i) { [i f:12]; }
   8462 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   8463   matches [i f:12]
   8464 </pre></td></tr>
   8465 
   8466 
   8467 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument3')"><a name="hasArgument3Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8468 <tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
   8469 call expression.
   8470 
   8471 Example matches y in x(y)
   8472     (matcher = callExpr(hasArgument(0, declRefExpr())))
   8473   void x(int) { int y; x(y); }
   8474 </pre></td></tr>
   8475 
   8476 
   8477 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8478 <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
   8479 and the inner matcher matches on that instance.
   8480 
   8481 For example the method call in
   8482   NSString *x = @"hello";
   8483   [x containsString:@"h"];
   8484 is matched by
   8485 objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
   8486 </pre></td></tr>
   8487 
   8488 
   8489 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8490 <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
   8491 
   8492 Example
   8493 matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
   8494 matches the [webView ...] message invocation.
   8495   NSString *webViewJavaScript = ...
   8496   UIWebView *webView = ...
   8497   [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
   8498 </pre></td></tr>
   8499 
   8500 
   8501 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   8502 <tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
   8503 block.
   8504 
   8505 Does not match the 'this' parameter of a method.
   8506 
   8507 Given
   8508   class X { void f(int x, int y, int z) {} };
   8509 cxxMethodDecl(hasAnyParameter(hasName("y")))
   8510   matches f(int x, int y, int z) {}
   8511 with hasAnyParameter(...)
   8512   matching int y
   8513 
   8514 For ObjectiveC, given
   8515   @interface I - (void) f:(int) y; @end
   8516 
   8517 the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   8518 matches the declaration of method f with hasParameter
   8519 matching y.
   8520 
   8521 For blocks, given
   8522   b = ^(int y) { printf("%d", y) };
   8523 
   8524 the matcher blockDecl(hasAnyParameter(hasName("y")))
   8525 matches the declaration of the block b with hasParameter
   8526 matching y.
   8527 </pre></td></tr>
   8528 
   8529 
   8530 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   8531 <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
   8532 declaration or a block.
   8533 
   8534 Given
   8535   class X { void f(int x) {} };
   8536 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   8537   matches f(int x) {}
   8538 with hasParameter(...)
   8539   matching int x
   8540 
   8541 For ObjectiveC, given
   8542   @interface I - (void) f:(int) y; @end
   8543 
   8544 the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   8545 matches the declaration of method f with hasParameter
   8546 matching y.
   8547 </pre></td></tr>
   8548 
   8549 
   8550 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   8551 <tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
   8552 
   8553 Examples:
   8554   int x;
   8555 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   8556   matches int x
   8557 
   8558 auto x = int(3);
   8559 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   8560   matches int(3)
   8561 
   8562 struct Foo { Foo(int, int); };
   8563 auto x = Foo(1, 2);
   8564 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   8565   matches Foo(1, 2)
   8566 
   8567 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   8568   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   8569   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   8570   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   8571   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   8572   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   8573   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   8574   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   8575 </pre></td></tr>
   8576 
   8577 
   8578 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8579 <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
   8580 or opaque value's source expression matches the given matcher.
   8581 
   8582 Example 1: matches "a string"
   8583 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
   8584 class URL { URL(string); };
   8585 URL url = "a string";
   8586 
   8587 Example 2: matches 'b' (matcher =
   8588 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
   8589 int a = b ?: 1;
   8590 </pre></td></tr>
   8591 
   8592 
   8593 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   8594 <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
   8595 overloads matches the given matcher.
   8596 
   8597 Given
   8598   template &lt;typename T&gt; void foo(T);
   8599   template &lt;typename T&gt; void bar(T);
   8600   template &lt;typename T&gt; void baz(T t) {
   8601     foo(t);
   8602     bar(t);
   8603   }
   8604 unresolvedLookupExpr(hasAnyDeclaration(
   8605     functionTemplateDecl(hasName("foo"))))
   8606   matches foo in foo(t); but not bar in bar(t);
   8607 </pre></td></tr>
   8608 
   8609 
   8610 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;</td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   8611 <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
   8612 
   8613 Given
   8614   int (*ptr_to_array)[4];
   8615   int (*ptr_to_func)(int);
   8616 
   8617 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
   8618 ptr_to_func but not ptr_to_array.
   8619 
   8620 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
   8621 </pre></td></tr>
   8622 
   8623 
   8624 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;</td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   8625 <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
   8626 pointee matches a given matcher.
   8627 
   8628 Given
   8629   int *a;
   8630   int const *b;
   8631   float const *f;
   8632 pointerType(pointee(isConstQualified(), isInteger()))
   8633   matches "int const *b"
   8634 
   8635 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
   8636   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
   8637 </pre></td></tr>
   8638 
   8639 
   8640 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8641 <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
   8642 
   8643 Given:
   8644   typedef int &amp;int_ref;
   8645   int a;
   8646   int_ref b = a;
   8647 
   8648 varDecl(hasType(qualType(referenceType()))))) will not match the
   8649 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
   8650 </pre></td></tr>
   8651 
   8652 
   8653 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   8654 <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
   8655 matches the given matcher.
   8656 
   8657 The associated declaration is:
   8658 - for type nodes, the declaration of the underlying type
   8659 - for CallExpr, the declaration of the callee
   8660 - for MemberExpr, the declaration of the referenced member
   8661 - for CXXConstructExpr, the declaration of the constructor
   8662 - for CXXNewExpr, the declaration of the operator new
   8663 - for ObjCIvarExpr, the declaration of the ivar
   8664 
   8665 For type nodes, hasDeclaration will generally match the declaration of the
   8666 sugared type. Given
   8667   class X {};
   8668   typedef X Y;
   8669   Y y;
   8670 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8671 typedefDecl. A common use case is to match the underlying, desugared type.
   8672 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8673   varDecl(hasType(hasUnqualifiedDesugaredType(
   8674       recordType(hasDeclaration(decl())))))
   8675 In this matcher, the decl will match the CXXRecordDecl of class X.
   8676 
   8677 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   8678   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   8679   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   8680   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   8681   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   8682   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   8683   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8684 </pre></td></tr>
   8685 
   8686 
   8687 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8688 <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
   8689 
   8690 Given
   8691   void (*fp)(void);
   8692 The matcher
   8693   varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
   8694 would match the declaration for fp.
   8695 </pre></td></tr>
   8696 
   8697 
   8698 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   8699 <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
   8700 </pre></td></tr>
   8701 
   8702 
   8703 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8704 <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
   8705 matches the specified matcher.
   8706 
   8707 Example matches y-&gt;x()
   8708   (matcher = cxxMemberCallExpr(on(hasType(pointsTo
   8709      cxxRecordDecl(hasName("Y")))))))
   8710   class Y { public: void x(); };
   8711   void z() { Y *y; y-&gt;x(); }
   8712 </pre></td></tr>
   8713 
   8714 
   8715 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   8716 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
   8717 </pre></td></tr>
   8718 
   8719 
   8720 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   8721 <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
   8722 type matches the specified matcher.
   8723 
   8724 Example matches X &amp;x and const X &amp;y
   8725     (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
   8726   class X {
   8727     void a(X b) {
   8728       X &amp;x = b;
   8729       const X &amp;y = b;
   8730     }
   8731   };
   8732 </pre></td></tr>
   8733 
   8734 
   8735 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   8736 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
   8737 matches the given matcher.
   8738 
   8739 The associated declaration is:
   8740 - for type nodes, the declaration of the underlying type
   8741 - for CallExpr, the declaration of the callee
   8742 - for MemberExpr, the declaration of the referenced member
   8743 - for CXXConstructExpr, the declaration of the constructor
   8744 - for CXXNewExpr, the declaration of the operator new
   8745 - for ObjCIvarExpr, the declaration of the ivar
   8746 
   8747 For type nodes, hasDeclaration will generally match the declaration of the
   8748 sugared type. Given
   8749   class X {};
   8750   typedef X Y;
   8751   Y y;
   8752 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8753 typedefDecl. A common use case is to match the underlying, desugared type.
   8754 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8755   varDecl(hasType(hasUnqualifiedDesugaredType(
   8756       recordType(hasDeclaration(decl())))))
   8757 In this matcher, the decl will match the CXXRecordDecl of class X.
   8758 
   8759 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   8760   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   8761   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   8762   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   8763   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   8764   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   8765   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8766 </pre></td></tr>
   8767 
   8768 
   8769 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;</td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   8770 <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
   8771 pointee matches a given matcher.
   8772 
   8773 Given
   8774   int *a;
   8775   int const *b;
   8776   float const *f;
   8777 pointerType(pointee(isConstQualified(), isInteger()))
   8778   matches "int const *b"
   8779 
   8780 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
   8781   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
   8782 </pre></td></tr>
   8783 
   8784 
   8785 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8786 <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
   8787 
   8788 Given
   8789   return a + b;
   8790 hasReturnValue(binaryOperator())
   8791   matches 'return a + b'
   8792 with binaryOperator()
   8793   matching 'a + b'
   8794 </pre></td></tr>
   8795 
   8796 
   8797 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   8798 <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
   8799 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
   8800 
   8801 Given
   8802   { {}; 1+2; }
   8803 hasAnySubstatement(compoundStmt())
   8804   matches '{ {}; 1+2; }'
   8805 with compoundStmt()
   8806   matching '{}'
   8807 </pre></td></tr>
   8808 
   8809 
   8810 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
   8811 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   8812 alignof.
   8813 </pre></td></tr>
   8814 
   8815 
   8816 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   8817 <tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
   8818 belongs to.
   8819 
   8820 Given:
   8821 F&amp; operator=(const F&amp; o) {
   8822   std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
   8823   return *this;
   8824 }
   8825 returnStmt(forCallable(functionDecl(hasName("operator="))))
   8826   matches 'return *this'
   8827   but does not match 'return v &gt; 0'
   8828 
   8829 Given:
   8830 -(void) foo {
   8831   int x = 1;
   8832   dispatch_sync(queue, ^{ int y = 2; });
   8833 }
   8834 declStmt(forCallable(objcMethodDecl()))
   8835   matches 'int x = 1'
   8836   but does not match 'int y = 2'.
   8837 whereas declStmt(forCallable(blockDecl()))
   8838   matches 'int y = 2'
   8839   but does not match 'int x = 1'.
   8840 </pre></td></tr>
   8841 
   8842 
   8843 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
   8844 <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
   8845 
   8846 Deprecated. Use forCallable() to correctly handle the situation when
   8847 the declaration is not a function (but a block or an Objective-C method).
   8848 forFunction() not only fails to take non-functions into account but also
   8849 may match the wrong declaration in their presence.
   8850 
   8851 Given:
   8852 F&amp; operator=(const F&amp; o) {
   8853   std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
   8854   return *this;
   8855 }
   8856 returnStmt(forFunction(hasName("operator=")))
   8857   matches 'return *this'
   8858   but does not match 'return v &gt; 0'
   8859 </pre></td></tr>
   8860 
   8861 
   8862 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
   8863 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   8864 sizeof.
   8865 </pre></td></tr>
   8866 
   8867 
   8868 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
   8869 <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
   8870 type that matches the provided matcher.
   8871 
   8872 Given
   8873   template &lt;typename T&gt;
   8874   double F(T t);
   8875   int i;
   8876   double j = F(i);
   8877 
   8878 substTemplateTypeParmType(hasReplacementType(type())) matches int
   8879 </pre></td></tr>
   8880 
   8881 
   8882 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
   8883 <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
   8884 statement. This matcher may produce multiple matches.
   8885 
   8886 Given
   8887   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
   8888 switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
   8889   matches four times, with "c" binding each of "case 1:", "case 2:",
   8890 "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
   8891 "switch (1)", "switch (2)" and "switch (2)".
   8892 </pre></td></tr>
   8893 
   8894 
   8895 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8896 <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
   8897 switch statement or conditional operator.
   8898 
   8899 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   8900   if (true) {}
   8901 </pre></td></tr>
   8902 
   8903 
   8904 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   8905 <tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
   8906 
   8907 Given:
   8908  void foo() {
   8909    if (int i = foobar(); i &gt; 0) {}
   8910    switch (int i = foobar(); i) {}
   8911    for (auto&amp; a = get_range(); auto&amp; x : a) {}
   8912  }
   8913  void bar() {
   8914    if (foobar() &gt; 0) {}
   8915    switch (foobar()) {}
   8916    for (auto&amp; x : get_range()) {}
   8917  }
   8918 ifStmt(hasInitStatement(anything()))
   8919   matches the if statement in foo but not in bar.
   8920 switchStmt(hasInitStatement(anything()))
   8921   matches the switch statement in foo but not in bar.
   8922 cxxForRangeStmt(hasInitStatement(anything()))
   8923   matches the range for statement in foo but not in bar.
   8924 </pre></td></tr>
   8925 
   8926 
   8927 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   8928 <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
   8929 matches the given matcher.
   8930 
   8931 The associated declaration is:
   8932 - for type nodes, the declaration of the underlying type
   8933 - for CallExpr, the declaration of the callee
   8934 - for MemberExpr, the declaration of the referenced member
   8935 - for CXXConstructExpr, the declaration of the constructor
   8936 - for CXXNewExpr, the declaration of the operator new
   8937 - for ObjCIvarExpr, the declaration of the ivar
   8938 
   8939 For type nodes, hasDeclaration will generally match the declaration of the
   8940 sugared type. Given
   8941   class X {};
   8942   typedef X Y;
   8943   Y y;
   8944 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8945 typedefDecl. A common use case is to match the underlying, desugared type.
   8946 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8947   varDecl(hasType(hasUnqualifiedDesugaredType(
   8948       recordType(hasDeclaration(decl())))))
   8949 In this matcher, the decl will match the CXXRecordDecl of class X.
   8950 
   8951 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   8952   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   8953   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   8954   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   8955   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   8956   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   8957   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8958 </pre></td></tr>
   8959 
   8960 
   8961 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   8962 <tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
   8963 
   8964 Examples:
   8965   int x;
   8966 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   8967   matches int x
   8968 
   8969 auto x = int(3);
   8970 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   8971   matches int(3)
   8972 
   8973 struct Foo { Foo(int, int); };
   8974 auto x = Foo(1, 2);
   8975 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   8976   matches Foo(1, 2)
   8977 
   8978 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   8979   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   8980   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   8981   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   8982   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   8983   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   8984   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   8985   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   8986 </pre></td></tr>
   8987 
   8988 
   8989 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   8990 <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
   8991 
   8992 Given
   8993   struct B { int next; };
   8994   template&lt;int(B::*next_ptr)&gt; struct A {};
   8995   A&lt;&amp;B::next&gt; a;
   8996 templateSpecializationType(hasAnyTemplateArgument(
   8997   isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
   8998   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
   8999     B::next
   9000 </pre></td></tr>
   9001 
   9002 
   9003 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   9004 <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
   9005 declaration.
   9006 
   9007 Given
   9008   struct B { int next; };
   9009   template&lt;int(B::*next_ptr)&gt; struct A {};
   9010   A&lt;&amp;B::next&gt; a;
   9011 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9012     refersToDeclaration(fieldDecl(hasName("next")))))
   9013   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
   9014     B::next
   9015 </pre></td></tr>
   9016 
   9017 
   9018 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   9019 <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
   9020 
   9021 Given
   9022   template&lt;int T&gt; struct C {};
   9023   C&lt;42&gt; c;
   9024 classTemplateSpecializationDecl(
   9025   hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
   9026   matches the implicit instantiation of C in C&lt;42&gt;.
   9027 </pre></td></tr>
   9028 
   9029 
   9030 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
   9031 <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
   9032 
   9033 Given
   9034   template&lt;template &lt;typename&gt; class S&gt; class X {};
   9035   template&lt;typename T&gt; class Y {};
   9036   X&lt;Y&gt; xi;
   9037 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9038     refersToTemplate(templateName())))
   9039   matches the specialization X&lt;Y&gt;
   9040 </pre></td></tr>
   9041 
   9042 
   9043 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   9044 <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
   9045 
   9046 Given
   9047   struct X {};
   9048   template&lt;typename T&gt; struct A {};
   9049   A&lt;X&gt; a;
   9050 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9051     refersToType(class(hasName("X")))))
   9052   matches the specialization A&lt;X&gt;
   9053 </pre></td></tr>
   9054 
   9055 
   9056 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   9057 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   9058 functionDecl that have at least one TemplateArgument matching the given
   9059 InnerMatcher.
   9060 
   9061 Given
   9062   template&lt;typename T&gt; class A {};
   9063   template&lt;&gt; class A&lt;double&gt; {};
   9064   A&lt;int&gt; a;
   9065 
   9066   template&lt;typename T&gt; f() {};
   9067   void func() { f&lt;int&gt;(); };
   9068 
   9069 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9070     refersToType(asString("int"))))
   9071   matches the specialization A&lt;int&gt;
   9072 
   9073 functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   9074   matches the specialization f&lt;int&gt;
   9075 </pre></td></tr>
   9076 
   9077 
   9078 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   9079 <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
   9080 matches the given matcher.
   9081 
   9082 The associated declaration is:
   9083 - for type nodes, the declaration of the underlying type
   9084 - for CallExpr, the declaration of the callee
   9085 - for MemberExpr, the declaration of the referenced member
   9086 - for CXXConstructExpr, the declaration of the constructor
   9087 - for CXXNewExpr, the declaration of the operator new
   9088 - for ObjCIvarExpr, the declaration of the ivar
   9089 
   9090 For type nodes, hasDeclaration will generally match the declaration of the
   9091 sugared type. Given
   9092   class X {};
   9093   typedef X Y;
   9094   Y y;
   9095 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9096 typedefDecl. A common use case is to match the underlying, desugared type.
   9097 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9098   varDecl(hasType(hasUnqualifiedDesugaredType(
   9099       recordType(hasDeclaration(decl())))))
   9100 In this matcher, the decl will match the CXXRecordDecl of class X.
   9101 
   9102 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   9103   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   9104   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   9105   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   9106   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   9107   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   9108   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9109 </pre></td></tr>
   9110 
   9111 
   9112 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   9113 <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   9114 functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   9115 
   9116 Given
   9117   template&lt;typename T, typename U&gt; class A {};
   9118   A&lt;bool, int&gt; b;
   9119   A&lt;int, bool&gt; c;
   9120 
   9121   template&lt;typename T&gt; void f() {}
   9122   void func() { f&lt;int&gt;(); };
   9123 classTemplateSpecializationDecl(hasTemplateArgument(
   9124     1, refersToType(asString("int"))))
   9125   matches the specialization A&lt;bool, int&gt;
   9126 
   9127 functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   9128   matches the specialization f&lt;int&gt;
   9129 </pre></td></tr>
   9130 
   9131 
   9132 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   9133 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
   9134 matches the given matcher.
   9135 
   9136 The associated declaration is:
   9137 - for type nodes, the declaration of the underlying type
   9138 - for CallExpr, the declaration of the callee
   9139 - for MemberExpr, the declaration of the referenced member
   9140 - for CXXConstructExpr, the declaration of the constructor
   9141 - for CXXNewExpr, the declaration of the operator new
   9142 - for ObjCIvarExpr, the declaration of the ivar
   9143 
   9144 For type nodes, hasDeclaration will generally match the declaration of the
   9145 sugared type. Given
   9146   class X {};
   9147   typedef X Y;
   9148   Y y;
   9149 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9150 typedefDecl. A common use case is to match the underlying, desugared type.
   9151 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9152   varDecl(hasType(hasUnqualifiedDesugaredType(
   9153       recordType(hasDeclaration(decl())))))
   9154 In this matcher, the decl will match the CXXRecordDecl of class X.
   9155 
   9156 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   9157   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   9158   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   9159   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   9160   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   9161   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   9162   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9163 </pre></td></tr>
   9164 
   9165 
   9166 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   9167 <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
   9168 QualType-matcher matches.
   9169 </pre></td></tr>
   9170 
   9171 
   9172 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
   9173 <tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
   9174 
   9175 Examples:
   9176   int x;
   9177 declaratorDecl(hasTypeLoc(loc(asString("int"))))
   9178   matches int x
   9179 
   9180 auto x = int(3);
   9181 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   9182   matches int(3)
   9183 
   9184 struct Foo { Foo(int, int); };
   9185 auto x = Foo(1, 2);
   9186 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   9187   matches Foo(1, 2)
   9188 
   9189 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
   9190   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
   9191   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
   9192   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   9193   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
   9194   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
   9195   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
   9196   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   9197 </pre></td></tr>
   9198 
   9199 
   9200 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   9201 <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
   9202 matcher.
   9203 
   9204 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   9205             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   9206             and U (matcher = typedefDecl(hasType(asString("int")))
   9207             and friend class X (matcher = friendDecl(hasType("X"))
   9208             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   9209                                               asString("class X")))
   9210  class X {};
   9211  void y(X &amp;x) { x; X z; }
   9212  typedef int U;
   9213  class Y { friend class X; };
   9214  class Z : public virtual X {};
   9215 </pre></td></tr>
   9216 
   9217 
   9218 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   9219 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
   9220 matches the given matcher.
   9221 
   9222 The associated declaration is:
   9223 - for type nodes, the declaration of the underlying type
   9224 - for CallExpr, the declaration of the callee
   9225 - for MemberExpr, the declaration of the referenced member
   9226 - for CXXConstructExpr, the declaration of the constructor
   9227 - for CXXNewExpr, the declaration of the operator new
   9228 - for ObjCIvarExpr, the declaration of the ivar
   9229 
   9230 For type nodes, hasDeclaration will generally match the declaration of the
   9231 sugared type. Given
   9232   class X {};
   9233   typedef X Y;
   9234   Y y;
   9235 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9236 typedefDecl. A common use case is to match the underlying, desugared type.
   9237 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9238   varDecl(hasType(hasUnqualifiedDesugaredType(
   9239       recordType(hasDeclaration(decl())))))
   9240 In this matcher, the decl will match the CXXRecordDecl of class X.
   9241 
   9242 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   9243   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   9244   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   9245   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   9246   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   9247   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   9248   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9249 </pre></td></tr>
   9250 
   9251 
   9252 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
   9253 <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
   9254 type of the matched node.
   9255 
   9256 For example, in:
   9257   class A {};
   9258   using B = A;
   9259 The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
   9260 both B and A.
   9261 </pre></td></tr>
   9262 
   9263 
   9264 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   9265 <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
   9266 
   9267 Given
   9268   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
   9269 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
   9270   matches sizeof(a) and alignof(c)
   9271 </pre></td></tr>
   9272 
   9273 
   9274 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   9275 <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
   9276 
   9277 Example matches true (matcher = hasUnaryOperand(
   9278                                   cxxBoolLiteral(equals(true))))
   9279   !true
   9280 </pre></td></tr>
   9281 
   9282 
   9283 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   9284 <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
   9285 given matcher. Implicit object expressions are included; that is, it matches
   9286 use of implicit `this`.
   9287 
   9288 Given
   9289   struct X {
   9290     int m;
   9291     int f(X x) { x.m; return m; }
   9292   };
   9293 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   9294   matches `x.m`, but not `m`; however,
   9295 memberExpr(hasObjectExpression(hasType(pointsTo(
   9296      cxxRecordDecl(hasName("X"))))))
   9297   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   9298 </pre></td></tr>
   9299 
   9300 
   9301 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   9302 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
   9303 matches the given matcher.
   9304 
   9305 The associated declaration is:
   9306 - for type nodes, the declaration of the underlying type
   9307 - for CallExpr, the declaration of the callee
   9308 - for MemberExpr, the declaration of the referenced member
   9309 - for CXXConstructExpr, the declaration of the constructor
   9310 - for CXXNewExpr, the declaration of the operator new
   9311 - for ObjCIvarExpr, the declaration of the ivar
   9312 
   9313 For type nodes, hasDeclaration will generally match the declaration of the
   9314 sugared type. Given
   9315   class X {};
   9316   typedef X Y;
   9317   Y y;
   9318 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9319 typedefDecl. A common use case is to match the underlying, desugared type.
   9320 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9321   varDecl(hasType(hasUnqualifiedDesugaredType(
   9322       recordType(hasDeclaration(decl())))))
   9323 In this matcher, the decl will match the CXXRecordDecl of class X.
   9324 
   9325 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
   9326   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
   9327   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
   9328   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
   9329   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
   9330   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
   9331   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9332 </pre></td></tr>
   9333 
   9334 
   9335 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
   9336 <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
   9337 
   9338 Given
   9339   namespace X { void b(); }
   9340   using X::b;
   9341 usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
   9342   matches using X::b </pre></td></tr>
   9343 
   9344 
   9345 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt;</td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
   9346 <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
   9347 matched by the given matcher.
   9348 
   9349 Given
   9350   namespace X { int a; void b(); }
   9351   using X::a;
   9352   using X::b;
   9353 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
   9354   matches using X::b but not using X::a </pre></td></tr>
   9355 
   9356 
   9357 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   9358 <tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
   9359 declaration's type.
   9360 
   9361 In case of a value declaration (for example a variable declaration),
   9362 this resolves one layer of indirection. For example, in the value
   9363 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   9364 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   9365 declaration of x.
   9366 
   9367 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   9368             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   9369             and friend class X (matcher = friendDecl(hasType("X"))
   9370             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   9371                                               cxxRecordDecl(hasName("X"))))
   9372  class X {};
   9373  void y(X &amp;x) { x; X z; }
   9374  class Y { friend class X; };
   9375  class Z : public virtual X {};
   9376 
   9377 Example matches class Derived
   9378 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   9379 class Base {};
   9380 class Derived : Base {};
   9381 
   9382 Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
   9383 Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   9384 </pre></td></tr>
   9385 
   9386 
   9387 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   9388 <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
   9389 matcher.
   9390 
   9391 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   9392             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   9393             and U (matcher = typedefDecl(hasType(asString("int")))
   9394             and friend class X (matcher = friendDecl(hasType("X"))
   9395             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   9396                                               asString("class X")))
   9397  class X {};
   9398  void y(X &amp;x) { x; X z; }
   9399  typedef int U;
   9400  class Y { friend class X; };
   9401  class Z : public virtual X {};
   9402 </pre></td></tr>
   9403 
   9404 
   9405 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   9406 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
   9407 that matches the given matcher.
   9408 
   9409 Example matches x (matcher = varDecl(hasInitializer(callExpr())))
   9410   bool y() { return true; }
   9411   bool x = y();
   9412 </pre></td></tr>
   9413 
   9414 
   9415 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   9416 <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
   9417 expression.
   9418 
   9419 Given
   9420   void f(int b) {
   9421     int a[b];
   9422   }
   9423 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
   9424   varDecl(hasName("b")))))))
   9425   matches "int a[b]"
   9426 </pre></td></tr>
   9427 
   9428 
   9429 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   9430 <tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
   9431 
   9432 
   9433 <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   9434 <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
   9435 switch statement or conditional operator.
   9436 
   9437 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   9438   if (true) {}
   9439 </pre></td></tr>
   9440 
   9441 <!--END_TRAVERSAL_MATCHERS -->
   9442 </table>
   9443 
   9444 </div>
   9445 </body>
   9446 </html>
   9447 
   9448 
   9449