Home | History | Annotate | Line # | Download | only in docs
      1      1.1  joerg <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
      2      1.1  joerg           "http://www.w3.org/TR/html4/strict.dtd">
      3      1.1  joerg <html>
      4      1.1  joerg <head>
      5      1.1  joerg <title>AST Matcher Reference</title>
      6      1.1  joerg <link type="text/css" rel="stylesheet" href="../menu.css" />
      7      1.1  joerg <link type="text/css" rel="stylesheet" href="../content.css" />
      8      1.1  joerg <style type="text/css">
      9      1.1  joerg td {
     10      1.1  joerg   padding: .33em;
     11      1.1  joerg }
     12      1.1  joerg td.doc {
     13      1.1  joerg   display: none;
     14      1.1  joerg   border-bottom: 1px solid black;
     15      1.1  joerg }
     16      1.1  joerg td.name:hover {
     17      1.1  joerg   color: blue;
     18      1.1  joerg   cursor: pointer;
     19      1.1  joerg }
     20  1.1.1.2  joerg span.mono { font-family: monospace; }
     21  1.1.1.2  joerg 
     22  1.1.1.2  joerg .traverse_compare, .traverse_compare td, .traverse_compare th {
     23  1.1.1.2  joerg   border: 1px solid black;
     24  1.1.1.2  joerg   border-collapse: collapse;
     25  1.1.1.2  joerg }
     26      1.1  joerg </style>
     27      1.1  joerg <script type="text/javascript">
     28      1.1  joerg function toggle(id) {
     29      1.1  joerg   if (!id) return;
     30      1.1  joerg   row = document.getElementById(id);
     31      1.1  joerg   if (row.style.display != 'table-cell')
     32      1.1  joerg     row.style.display = 'table-cell';
     33      1.1  joerg   else
     34      1.1  joerg     row.style.display = 'none';
     35      1.1  joerg }
     36      1.1  joerg </script>
     37      1.1  joerg </head>
     38      1.1  joerg <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
     39      1.1  joerg 
     40      1.1  joerg <!--#include virtual="../menu.html.incl"-->
     41      1.1  joerg 
     42      1.1  joerg <div id="content">
     43      1.1  joerg 
     44      1.1  joerg <h1>AST Matcher Reference</h1>
     45      1.1  joerg 
     46      1.1  joerg <p>This document shows all currently implemented matchers. The matchers are grouped
     47      1.1  joerg by category and node type they match. You can click on matcher names to show the
     48      1.1  joerg matcher's source documentation.</p>
     49      1.1  joerg 
     50      1.1  joerg <p>There are three different basic categories of matchers:
     51      1.1  joerg <ul>
     52      1.1  joerg <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
     53      1.1  joerg <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
     54      1.1  joerg <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
     55      1.1  joerg </ul>
     56      1.1  joerg </p>
     57      1.1  joerg 
     58      1.1  joerg <p>Within each category the matchers are ordered by node type they match on.
     59  1.1.1.2  joerg Note that if a matcher can match multiple node types, it will appear
     60      1.1  joerg multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
     61      1.1  joerg find all matchers that can be used to match on Stmt nodes.</p>
     62      1.1  joerg 
     63      1.1  joerg <p>The exception to that rule are matchers that can match on any node. Those
     64      1.1  joerg are marked with a * and are listed in the beginning of each category.</p>
     65      1.1  joerg 
     66      1.1  joerg <p>Note that the categorization of matchers is a great help when you combine
     67      1.1  joerg them into matcher expressions. You will usually want to form matcher expressions
     68      1.1  joerg that read like english sentences by alternating between node matchers and
     69      1.1  joerg narrowing or traversal matchers, like this:
     70      1.1  joerg <pre>
     71      1.1  joerg recordDecl(hasDescendant(
     72      1.1  joerg     ifStmt(hasTrueExpression(
     73      1.1  joerg         expr(hasDescendant(
     74      1.1  joerg             ifStmt()))))))
     75      1.1  joerg </pre>
     76      1.1  joerg </p>
     77      1.1  joerg 
     78      1.1  joerg <!-- ======================================================================= -->
     79  1.1.1.2  joerg <h2 id="traverse-mode">Traverse Mode</h2>
     80  1.1.1.2  joerg <!-- ======================================================================= -->
     81  1.1.1.2  joerg 
     82  1.1.1.2  joerg <p>The default mode of operation of AST Matchers visits all nodes in the AST,
     83  1.1.1.2  joerg even if they are not spelled in the source. This is
     84  1.1.1.2  joerg <span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
     85  1.1.1.2  joerg that explicitly traverse or ignore implicit nodes, such as parentheses
     86  1.1.1.2  joerg surrounding an expression or expressions with cleanups.  These implicit
     87  1.1.1.2  joerg nodes are not always obvious from the syntax of the source code, and so this
     88  1.1.1.2  joerg mode requires careful consideration and testing to get the desired behavior
     89  1.1.1.2  joerg from an AST matcher.
     90  1.1.1.2  joerg </p>
     91  1.1.1.2  joerg 
     92  1.1.1.2  joerg <p>In addition, because template instantiations are matched in the default mode,
     93  1.1.1.2  joerg transformations can be accidentally made to template declarations. Finally,
     94  1.1.1.2  joerg because implicit nodes are matched by default, transformations can be made on
     95  1.1.1.2  joerg entirely incorrect places in the code.</p>
     96  1.1.1.2  joerg 
     97  1.1.1.2  joerg <p>For these reasons, it is possible to ignore AST nodes which are not spelled
     98  1.1.1.2  joerg in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
     99  1.1.1.2  joerg mode. This is likely to be far less error-prone for users who are not already
    100  1.1.1.2  joerg very familiar with where implicit nodes appear in the AST. It is also likely
    101  1.1.1.2  joerg to be less error-prone for experienced AST users, as difficult cases do not
    102  1.1.1.2  joerg need to be encountered and matcher expressions adjusted for these cases.</p>
    103  1.1.1.2  joerg 
    104  1.1.1.2  joerg <p>In clang-query, the mode can be changed with
    105  1.1.1.2  joerg <pre>
    106  1.1.1.2  joerg set traversal IgnoreUnlessSpelledInSource
    107  1.1.1.2  joerg </pre>
    108  1.1.1.2  joerg </p>
    109  1.1.1.2  joerg This affects both matchers and AST dump output in results.
    110  1.1.1.2  joerg 
    111  1.1.1.2  joerg <p>When using the C++ API such as in clang-tidy checks, the
    112  1.1.1.2  joerg <span class="mono">traverse()</span> matcher is used to set the mode:
    113  1.1.1.2  joerg <pre>
    114  1.1.1.2  joerg Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
    115  1.1.1.2  joerg   returnStmt(hasReturnArgument(integerLiteral(equals(0))))
    116  1.1.1.2  joerg   ), this);
    117  1.1.1.2  joerg </pre>
    118  1.1.1.2  joerg </p>
    119  1.1.1.2  joerg <p>The following table compares the <span class="mono">AsIs</span> mode with
    120  1.1.1.2  joerg the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
    121  1.1.1.2  joerg 
    122  1.1.1.2  joerg <table class="traverse_compare">
    123  1.1.1.2  joerg <tr>
    124  1.1.1.2  joerg <th></th>
    125  1.1.1.2  joerg <th><span class="mono">AsIs</span></th>
    126  1.1.1.2  joerg <th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
    127  1.1.1.2  joerg </tr>
    128  1.1.1.2  joerg <tr>
    129  1.1.1.2  joerg   <td>AST dump of <span class="mono">func1</span>:
    130  1.1.1.2  joerg <pre>
    131  1.1.1.2  joerg struct B {
    132  1.1.1.2  joerg   B(int);
    133  1.1.1.2  joerg };
    134  1.1.1.2  joerg 
    135  1.1.1.2  joerg B func1() { return 42; }
    136  1.1.1.2  joerg </pre>
    137  1.1.1.2  joerg 
    138  1.1.1.2  joerg   </td>
    139  1.1.1.2  joerg   <td>
    140  1.1.1.2  joerg C++98 dialect:
    141  1.1.1.2  joerg <pre>
    142  1.1.1.2  joerg FunctionDecl
    143  1.1.1.2  joerg `-CompoundStmt
    144  1.1.1.2  joerg   `-ReturnStmt
    145  1.1.1.2  joerg     `-ExprWithCleanups
    146  1.1.1.2  joerg       `-CXXConstructExpr
    147  1.1.1.2  joerg         `-MaterializeTemporaryExpr
    148  1.1.1.2  joerg           `-ImplicitCastExpr
    149  1.1.1.2  joerg             `-ImplicitCastExpr
    150  1.1.1.2  joerg               `-CXXConstructExpr
    151  1.1.1.2  joerg                 `-IntegerLiteral 'int' 42
    152  1.1.1.2  joerg </pre>
    153  1.1.1.2  joerg C++11, C++14 dialect:
    154  1.1.1.2  joerg <pre>
    155  1.1.1.2  joerg FunctionDecl
    156  1.1.1.2  joerg `-CompoundStmt
    157  1.1.1.2  joerg   `-ReturnStmt
    158  1.1.1.2  joerg     `-ExprWithCleanups
    159  1.1.1.2  joerg       `-CXXConstructExpr
    160  1.1.1.2  joerg         `-MaterializeTemporaryExpr
    161  1.1.1.2  joerg           `-ImplicitCastExpr
    162  1.1.1.2  joerg             `-CXXConstructExpr
    163  1.1.1.2  joerg               `-IntegerLiteral 'int' 42
    164  1.1.1.2  joerg </pre>
    165  1.1.1.2  joerg C++17, C++20 dialect:
    166  1.1.1.2  joerg <pre>
    167  1.1.1.2  joerg FunctionDecl
    168  1.1.1.2  joerg `-CompoundStmt
    169  1.1.1.2  joerg   `-ReturnStmt
    170  1.1.1.2  joerg     `-ImplicitCastExpr
    171  1.1.1.2  joerg       `-CXXConstructExpr
    172  1.1.1.2  joerg         `-IntegerLiteral 'int' 42
    173  1.1.1.2  joerg </pre>
    174  1.1.1.2  joerg </td>
    175  1.1.1.2  joerg   <td>
    176  1.1.1.2  joerg All dialects:
    177  1.1.1.2  joerg     <pre>
    178  1.1.1.2  joerg FunctionDecl
    179  1.1.1.2  joerg `-CompoundStmt
    180  1.1.1.2  joerg   `-ReturnStmt
    181  1.1.1.2  joerg     `-IntegerLiteral 'int' 42
    182  1.1.1.2  joerg </pre></td>
    183  1.1.1.2  joerg </tr>
    184  1.1.1.2  joerg 
    185  1.1.1.2  joerg <tr>
    186  1.1.1.2  joerg <td>Matcher for returned <span class="mono">42</span>:
    187  1.1.1.2  joerg <pre>
    188  1.1.1.2  joerg struct B {
    189  1.1.1.2  joerg   B(int);
    190  1.1.1.2  joerg };
    191  1.1.1.2  joerg 
    192  1.1.1.2  joerg B func1() { return 42; }
    193  1.1.1.2  joerg </pre>
    194  1.1.1.2  joerg 
    195  1.1.1.2  joerg   </td>
    196  1.1.1.2  joerg   <td>
    197  1.1.1.2  joerg All dialects:
    198  1.1.1.2  joerg <pre>
    199  1.1.1.2  joerg returnStmt(hasReturnValue(
    200  1.1.1.2  joerg     ignoringImplicit(
    201  1.1.1.2  joerg         ignoringElidableConstructorCall(
    202  1.1.1.2  joerg             ignoringImplicit(
    203  1.1.1.2  joerg                 cxxConstructExpr(hasArgument(0,
    204  1.1.1.2  joerg                     ignoringImplicit(
    205  1.1.1.2  joerg                         integerLiteral().bind("returnVal")
    206  1.1.1.2  joerg                         )
    207  1.1.1.2  joerg                     ))
    208  1.1.1.2  joerg                 )
    209  1.1.1.2  joerg             )
    210  1.1.1.2  joerg         )
    211  1.1.1.2  joerg     ))
    212  1.1.1.2  joerg </pre></td>
    213  1.1.1.2  joerg   <td>
    214  1.1.1.2  joerg All dialects:
    215  1.1.1.2  joerg <pre>
    216  1.1.1.2  joerg returnStmt(hasReturnValue(
    217  1.1.1.2  joerg     integerLiteral().bind("returnVal")
    218  1.1.1.2  joerg ))
    219  1.1.1.2  joerg </pre></td>
    220  1.1.1.2  joerg </tr>
    221  1.1.1.2  joerg <tr>
    222  1.1.1.2  joerg <td>Match result for
    223  1.1.1.2  joerg <pre>implicitCastExpr()</pre>
    224  1.1.1.2  joerg given:
    225  1.1.1.2  joerg <pre>
    226  1.1.1.2  joerg struct B {
    227  1.1.1.2  joerg   B(int);
    228  1.1.1.2  joerg };
    229  1.1.1.2  joerg 
    230  1.1.1.2  joerg B func1() { return 42; }
    231  1.1.1.2  joerg </pre>
    232  1.1.1.2  joerg 
    233  1.1.1.2  joerg </td>
    234  1.1.1.2  joerg <td>
    235  1.1.1.2  joerg Match found.</td>
    236  1.1.1.2  joerg   <td>
    237  1.1.1.2  joerg No match.</td>
    238  1.1.1.2  joerg </tr>
    239  1.1.1.2  joerg <tr>
    240  1.1.1.2  joerg   <td>Match result for:
    241  1.1.1.2  joerg <pre>
    242  1.1.1.2  joerg cxxConstructorDecl(
    243  1.1.1.2  joerg   isCopyConstructor()
    244  1.1.1.2  joerg   ).bind("prepend_explicit")
    245  1.1.1.2  joerg </pre>
    246  1.1.1.2  joerg given:
    247  1.1.1.2  joerg <pre>
    248  1.1.1.2  joerg struct Other {};
    249  1.1.1.2  joerg struct Copyable {
    250  1.1.1.2  joerg   Other m_o;
    251  1.1.1.2  joerg   Copyable();
    252  1.1.1.2  joerg };
    253  1.1.1.2  joerg </pre>
    254  1.1.1.2  joerg </td>
    255  1.1.1.2  joerg <td>
    256  1.1.1.2  joerg Match found. Insertion produces incorrect output:
    257  1.1.1.2  joerg <pre>
    258  1.1.1.2  joerg struct Other {};
    259  1.1.1.2  joerg struct explicit Copyable {
    260  1.1.1.2  joerg   Other m_o;
    261  1.1.1.2  joerg   Copyable();
    262  1.1.1.2  joerg };
    263  1.1.1.2  joerg </pre>
    264  1.1.1.2  joerg </td>
    265  1.1.1.2  joerg <td>
    266  1.1.1.2  joerg No match found. Incorrect replacement not possible.
    267  1.1.1.2  joerg </td>
    268  1.1.1.2  joerg </tr>
    269  1.1.1.2  joerg <tr>
    270  1.1.1.2  joerg   <td>Replacement of <span class="mono">begin()</span>
    271  1.1.1.2  joerg     with <span class="mono">cbegin()</span>:
    272  1.1.1.2  joerg <pre>
    273  1.1.1.2  joerg cxxMemberCallExpr(
    274  1.1.1.2  joerg   on(ConstContainerExpr),
    275  1.1.1.2  joerg   callee(cxxMethodDecl(hasName("begin")))
    276  1.1.1.2  joerg   ).bind("replace_with_cbegin")
    277  1.1.1.2  joerg </pre>
    278  1.1.1.2  joerg given:
    279  1.1.1.2  joerg <pre>
    280  1.1.1.2  joerg void foo() {
    281  1.1.1.2  joerg   const Container c;
    282  1.1.1.2  joerg   c.begin();
    283  1.1.1.2  joerg 
    284  1.1.1.2  joerg   for (auto i : c) {
    285  1.1.1.2  joerg   }
    286  1.1.1.2  joerg }
    287  1.1.1.2  joerg </pre>
    288  1.1.1.2  joerg </td>
    289  1.1.1.2  joerg <td>
    290  1.1.1.2  joerg 2 matches found. Replacement produces incorrect output:
    291  1.1.1.2  joerg <pre>
    292  1.1.1.2  joerg void foo() {
    293  1.1.1.2  joerg   const Container c;
    294  1.1.1.2  joerg   c.cbegin();
    295  1.1.1.2  joerg 
    296  1.1.1.2  joerg   for (auto i :.cbegin() c) {
    297  1.1.1.2  joerg   }
    298  1.1.1.2  joerg }
    299  1.1.1.2  joerg </pre>
    300  1.1.1.2  joerg </td>
    301  1.1.1.2  joerg <td>
    302  1.1.1.2  joerg 1 match found. Replacement produces correct output:
    303  1.1.1.2  joerg <pre>
    304  1.1.1.2  joerg void foo() {
    305  1.1.1.2  joerg   const Container c;
    306  1.1.1.2  joerg   c.cbegin();
    307  1.1.1.2  joerg 
    308  1.1.1.2  joerg   for (auto i : c) {
    309  1.1.1.2  joerg   }
    310  1.1.1.2  joerg }
    311  1.1.1.2  joerg </pre>
    312  1.1.1.2  joerg </td>
    313  1.1.1.2  joerg </tr>
    314  1.1.1.2  joerg <tr>
    315  1.1.1.2  joerg   <td>Replacement of <span class="mono">int</span> member
    316  1.1.1.2  joerg     with <span class="mono">safe_int</span>:
    317  1.1.1.2  joerg <pre>
    318  1.1.1.2  joerg fieldDecl(
    319  1.1.1.2  joerg   hasType(asString("int"))
    320  1.1.1.2  joerg   ).bind("use_safe_int")
    321  1.1.1.2  joerg </pre>
    322  1.1.1.2  joerg given:
    323  1.1.1.2  joerg <pre>
    324  1.1.1.2  joerg struct S {
    325  1.1.1.2  joerg   int m_i;
    326  1.1.1.2  joerg };
    327  1.1.1.2  joerg 
    328  1.1.1.2  joerg template &lt;typename T&gt; struct TemplStruct {
    329  1.1.1.2  joerg   TemplStruct() {}
    330  1.1.1.2  joerg   ~TemplStruct() {}
    331  1.1.1.2  joerg 
    332  1.1.1.2  joerg private:
    333  1.1.1.2  joerg   T m_t;
    334  1.1.1.2  joerg };
    335  1.1.1.2  joerg 
    336  1.1.1.2  joerg void instantiate() { TemplStruct&lt;int&gt; ti; }
    337  1.1.1.2  joerg </pre>
    338  1.1.1.2  joerg </td>
    339  1.1.1.2  joerg <td>
    340  1.1.1.2  joerg 2 matches found. Replacement produces incorrect output:
    341  1.1.1.2  joerg <pre>
    342  1.1.1.2  joerg struct S {
    343  1.1.1.2  joerg   safe_int m_i;
    344  1.1.1.2  joerg };
    345  1.1.1.2  joerg 
    346  1.1.1.2  joerg template &lt;typename T&gt; struct TemplStruct {
    347  1.1.1.2  joerg   TemplStruct() {}
    348  1.1.1.2  joerg   ~TemplStruct() {}
    349  1.1.1.2  joerg 
    350  1.1.1.2  joerg private:
    351  1.1.1.2  joerg   safe_int m_t;
    352  1.1.1.2  joerg };
    353  1.1.1.2  joerg 
    354  1.1.1.2  joerg void instantiate() { TemplStruct&lt;int&gt; ti; }
    355  1.1.1.2  joerg </pre>
    356  1.1.1.2  joerg </td>
    357  1.1.1.2  joerg <td>
    358  1.1.1.2  joerg 1 match found. Replacement produces correct output:
    359  1.1.1.2  joerg <pre>
    360  1.1.1.2  joerg struct S {
    361  1.1.1.2  joerg   safe_int m_i;
    362  1.1.1.2  joerg };
    363  1.1.1.2  joerg 
    364  1.1.1.2  joerg template &lt;typename T&gt; struct TemplStruct {
    365  1.1.1.2  joerg   TemplStruct() {}
    366  1.1.1.2  joerg   ~TemplStruct() {}
    367  1.1.1.2  joerg 
    368  1.1.1.2  joerg private:
    369  1.1.1.2  joerg   T m_t;
    370  1.1.1.2  joerg };
    371  1.1.1.2  joerg 
    372  1.1.1.2  joerg void instantiate() { TemplStruct&lt;int&gt; ti; }
    373  1.1.1.2  joerg </pre>
    374  1.1.1.2  joerg </td>
    375  1.1.1.2  joerg </tr>
    376  1.1.1.2  joerg <tr>
    377  1.1.1.2  joerg   <td>Add prefix to member initializer
    378  1.1.1.2  joerg <pre>
    379  1.1.1.2  joerg cxxCtorInitializer(
    380  1.1.1.2  joerg   forField(fieldDecl())
    381  1.1.1.2  joerg   ).bind("add_prefix")
    382  1.1.1.2  joerg </pre>
    383  1.1.1.2  joerg given:
    384  1.1.1.2  joerg <pre>
    385  1.1.1.2  joerg struct Simple {};
    386  1.1.1.2  joerg 
    387  1.1.1.2  joerg struct Record {
    388  1.1.1.2  joerg   Record() : i(42) {}
    389  1.1.1.2  joerg private:
    390  1.1.1.2  joerg   int i;
    391  1.1.1.2  joerg   Simple s;
    392  1.1.1.2  joerg };
    393  1.1.1.2  joerg </pre>
    394  1.1.1.2  joerg </td>
    395  1.1.1.2  joerg <td>
    396  1.1.1.2  joerg 2 matches found. Replacement produces incorrect output:
    397  1.1.1.2  joerg <pre>
    398  1.1.1.2  joerg struct Simple {};
    399  1.1.1.2  joerg 
    400  1.1.1.2  joerg struct Record {
    401  1.1.1.2  joerg   m_Record() : m_i(42) {}
    402  1.1.1.2  joerg private:
    403  1.1.1.2  joerg   int i;
    404  1.1.1.2  joerg   Simple s;
    405  1.1.1.2  joerg };
    406  1.1.1.2  joerg </pre>
    407  1.1.1.2  joerg </td>
    408  1.1.1.2  joerg <td>
    409  1.1.1.2  joerg 1 match found. Replacement produces correct output:
    410  1.1.1.2  joerg <pre>
    411  1.1.1.2  joerg struct Simple {};
    412  1.1.1.2  joerg 
    413  1.1.1.2  joerg struct Record {
    414  1.1.1.2  joerg   Record() : m_i(42) {}
    415  1.1.1.2  joerg private:
    416  1.1.1.2  joerg   int i;
    417  1.1.1.2  joerg   Simple s;
    418  1.1.1.2  joerg };
    419  1.1.1.2  joerg </pre>
    420  1.1.1.2  joerg </td>
    421  1.1.1.2  joerg </tr>
    422  1.1.1.2  joerg <tr>
    423  1.1.1.2  joerg   <td>Ignored default arguments
    424  1.1.1.2  joerg <pre>
    425  1.1.1.2  joerg callExpr(
    426  1.1.1.2  joerg   callee(functionDecl(
    427  1.1.1.2  joerg     hasName("hasDefaultArg")
    428  1.1.1.2  joerg     )),
    429  1.1.1.2  joerg   argumentCountIs(1)
    430  1.1.1.2  joerg   ).bind("add_prefix")
    431  1.1.1.2  joerg </pre>
    432  1.1.1.2  joerg given:
    433  1.1.1.2  joerg <pre>
    434  1.1.1.2  joerg void hasDefaultArg(int i, int j = 0) {}
    435  1.1.1.2  joerg void callDefaultArg() { hasDefaultArg(42); }
    436  1.1.1.2  joerg </pre>
    437  1.1.1.2  joerg </td>
    438  1.1.1.2  joerg <td>
    439  1.1.1.2  joerg No match.
    440  1.1.1.2  joerg </td>
    441  1.1.1.2  joerg <td>
    442  1.1.1.2  joerg 1 match found.
    443  1.1.1.2  joerg </td>
    444  1.1.1.2  joerg </tr>
    445  1.1.1.2  joerg <tr>
    446  1.1.1.2  joerg   <td>Lambda fields
    447  1.1.1.2  joerg <pre>
    448  1.1.1.2  joerg fieldDecl(
    449  1.1.1.2  joerg   hasType(asString("int"))
    450  1.1.1.2  joerg   ).bind("make_safe")
    451  1.1.1.2  joerg </pre>
    452  1.1.1.2  joerg given:
    453  1.1.1.2  joerg <pre>
    454  1.1.1.2  joerg struct S {
    455  1.1.1.2  joerg   int m_i;
    456  1.1.1.2  joerg };
    457  1.1.1.2  joerg 
    458  1.1.1.2  joerg void func() {
    459  1.1.1.2  joerg   int a = 0;
    460  1.1.1.2  joerg   int c = 0;
    461  1.1.1.2  joerg 
    462  1.1.1.2  joerg   auto l = [a, b = c](int d) { int e = d; };
    463  1.1.1.2  joerg   l(43);
    464  1.1.1.2  joerg }
    465  1.1.1.2  joerg </pre>
    466  1.1.1.2  joerg </td>
    467  1.1.1.2  joerg <td>
    468  1.1.1.2  joerg 2 matches found. Replacement produces incorrect output:
    469  1.1.1.2  joerg <pre>
    470  1.1.1.2  joerg struct S {
    471  1.1.1.2  joerg   safe_int m_i;
    472  1.1.1.2  joerg };
    473  1.1.1.2  joerg 
    474  1.1.1.2  joerg void func() {
    475  1.1.1.2  joerg   int a = 0;
    476  1.1.1.2  joerg   int c = 0;
    477  1.1.1.2  joerg 
    478  1.1.1.2  joerg   auto l = [safe_a, safe_b = c](int d) { int e = d; };
    479  1.1.1.2  joerg   l(43);
    480  1.1.1.2  joerg }
    481  1.1.1.2  joerg </pre>
    482  1.1.1.2  joerg </td>
    483  1.1.1.2  joerg <td>
    484  1.1.1.2  joerg 1 match found. Replacement produces correct output:
    485  1.1.1.2  joerg <pre>
    486  1.1.1.2  joerg struct S {
    487  1.1.1.2  joerg   safe_int m_i;
    488  1.1.1.2  joerg };
    489  1.1.1.2  joerg 
    490  1.1.1.2  joerg void func() {
    491  1.1.1.2  joerg   int a = 0;
    492  1.1.1.2  joerg   int c = 0;
    493  1.1.1.2  joerg 
    494  1.1.1.2  joerg   auto l = [a, b = c](int d) { int e = d; };
    495  1.1.1.2  joerg   l(43);
    496  1.1.1.2  joerg }
    497  1.1.1.2  joerg </pre>
    498  1.1.1.2  joerg </td>
    499  1.1.1.2  joerg 
    500  1.1.1.2  joerg </tr>
    501  1.1.1.2  joerg 
    502  1.1.1.2  joerg 
    503  1.1.1.2  joerg 
    504  1.1.1.2  joerg 
    505  1.1.1.2  joerg 
    506  1.1.1.2  joerg <tr>
    507  1.1.1.2  joerg   <td>Rewritten binary operators
    508  1.1.1.2  joerg <pre>
    509  1.1.1.2  joerg binaryOperator(
    510  1.1.1.2  joerg   hasOperatorName("&lt;"),
    511  1.1.1.2  joerg   hasRHS(hasDescendant(integerLiteral(equals(0))))
    512  1.1.1.2  joerg   )
    513  1.1.1.2  joerg </pre>
    514  1.1.1.2  joerg given:
    515  1.1.1.2  joerg <pre>
    516  1.1.1.2  joerg #include &lt;compare&gt;
    517  1.1.1.2  joerg 
    518  1.1.1.2  joerg class HasSpaceship {
    519  1.1.1.2  joerg public:
    520  1.1.1.2  joerg    int x;
    521  1.1.1.2  joerg    bool operator==(const HasSpaceship&) const = default;
    522  1.1.1.2  joerg    std::strong_ordering operator<=>(const HasSpaceship&) const = default;
    523  1.1.1.2  joerg };
    524  1.1.1.2  joerg 
    525  1.1.1.2  joerg bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
    526  1.1.1.2  joerg    return a < b;
    527  1.1.1.2  joerg }
    528  1.1.1.2  joerg </pre>
    529  1.1.1.2  joerg </td>
    530  1.1.1.2  joerg <td>
    531  1.1.1.2  joerg 1 match found.
    532  1.1.1.2  joerg 
    533  1.1.1.2  joerg <pre>
    534  1.1.1.2  joerg    return a < b;
    535  1.1.1.2  joerg           ^~~~~
    536  1.1.1.2  joerg </pre>
    537  1.1.1.2  joerg 
    538  1.1.1.2  joerg </td>
    539  1.1.1.2  joerg <td>
    540  1.1.1.2  joerg No match found.
    541  1.1.1.2  joerg </td>
    542  1.1.1.2  joerg </tr>
    543  1.1.1.2  joerg </table>
    544  1.1.1.2  joerg 
    545  1.1.1.2  joerg <!-- ======================================================================= -->
    546      1.1  joerg <h2 id="decl-matchers">Node Matchers</h2>
    547      1.1  joerg <!-- ======================================================================= -->
    548      1.1  joerg 
    549      1.1  joerg <p>Node matchers are at the core of matcher expressions - they specify the type
    550      1.1  joerg of node that is expected. Every match expression starts with a node matcher,
    551      1.1  joerg which can then be further refined with a narrowing or traversal matcher. All
    552      1.1  joerg traversal matchers take node matchers as their arguments.</p>
    553      1.1  joerg 
    554      1.1  joerg <p>For convenience, all node matchers take an arbitrary number of arguments
    555      1.1  joerg and implicitly act as allOf matchers.</p>
    556      1.1  joerg 
    557      1.1  joerg <p>Node matchers are the only matchers that support the bind("id") call to
    558      1.1  joerg bind the matched node to the given string, to be later retrieved from the
    559      1.1  joerg match callback.</p>
    560      1.1  joerg 
    561      1.1  joerg <p>It is important to remember that the arguments to node matchers are
    562      1.1  joerg predicates on the same node, just with additional information about the type.
    563      1.1  joerg This is often useful to make matcher expression more readable by inlining bind
    564      1.1  joerg calls into redundant node matchers inside another node matcher:
    565      1.1  joerg <pre>
    566      1.1  joerg // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
    567      1.1  joerg // the same node.
    568      1.1  joerg recordDecl(decl().bind("id"), hasName("::MyClass"))
    569      1.1  joerg </pre>
    570      1.1  joerg </p>
    571      1.1  joerg 
    572      1.1  joerg <table>
    573      1.1  joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
    574      1.1  joerg <!-- START_DECL_MATCHERS -->
    575      1.1  joerg 
    576  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
    578  1.1.1.2  joerg 
    579  1.1.1.2  joerg Examples matches public virtual B.
    580  1.1.1.2  joerg   class B {};
    581  1.1.1.2  joerg   class C : public virtual B {};
    582  1.1.1.2  joerg </pre></td></tr>
    583  1.1.1.2  joerg 
    584  1.1.1.2  joerg 
    585      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
    587      1.1  joerg 
    588      1.1  joerg Examples matches i(42).
    589      1.1  joerg   class C {
    590      1.1  joerg     C() : i(42) {}
    591      1.1  joerg     int i;
    592      1.1  joerg   };
    593      1.1  joerg </pre></td></tr>
    594      1.1  joerg 
    595      1.1  joerg 
    596      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
    598      1.1  joerg 
    599      1.1  joerg Given
    600      1.1  joerg   class C {
    601      1.1  joerg   public:
    602      1.1  joerg     int a;
    603      1.1  joerg   };
    604      1.1  joerg accessSpecDecl()
    605      1.1  joerg   matches 'public:'
    606      1.1  joerg </pre></td></tr>
    607      1.1  joerg 
    608      1.1  joerg 
    609  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
    611  1.1.1.2  joerg Example matches foo and bar
    612  1.1.1.2  joerg (matcher = bindingDecl()
    613  1.1.1.2  joerg 
    614  1.1.1.2  joerg   auto [foo, bar] = std::make_pair{42, 42};
    615  1.1.1.2  joerg </pre></td></tr>
    616  1.1.1.2  joerg 
    617  1.1.1.2  joerg 
    618      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
    620      1.1  joerg 
    621      1.1  joerg Example matches the declaration of the nameless block printing an input
    622      1.1  joerg integer.
    623      1.1  joerg 
    624      1.1  joerg   myFunc(^(int p) {
    625      1.1  joerg     printf("%d", p);
    626      1.1  joerg   })
    627      1.1  joerg </pre></td></tr>
    628      1.1  joerg 
    629      1.1  joerg 
    630      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
    632      1.1  joerg 
    633      1.1  joerg Example matches Z
    634      1.1  joerg   template&lt;class T&gt; class Z {};
    635      1.1  joerg </pre></td></tr>
    636      1.1  joerg 
    637      1.1  joerg 
    638      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
    640      1.1  joerg 
    641      1.1  joerg Given
    642      1.1  joerg   template&lt;class T1, class T2, int I&gt;
    643      1.1  joerg   class A {};
    644      1.1  joerg 
    645      1.1  joerg   template&lt;class T, int I&gt;
    646      1.1  joerg   class A&lt;T, T*, I&gt; {};
    647      1.1  joerg 
    648      1.1  joerg   template&lt;&gt;
    649      1.1  joerg   class A&lt;int, int, 1&gt; {};
    650      1.1  joerg classTemplatePartialSpecializationDecl()
    651      1.1  joerg   matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
    652      1.1  joerg </pre></td></tr>
    653      1.1  joerg 
    654      1.1  joerg 
    655      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
    657      1.1  joerg 
    658      1.1  joerg Given
    659      1.1  joerg   template&lt;typename T&gt; class A {};
    660      1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
    661      1.1  joerg   A&lt;int&gt; a;
    662      1.1  joerg classTemplateSpecializationDecl()
    663      1.1  joerg   matches the specializations A&lt;int&gt; and A&lt;double&gt;
    664      1.1  joerg </pre></td></tr>
    665      1.1  joerg 
    666      1.1  joerg 
    667      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
    669      1.1  joerg 
    670      1.1  joerg Example matches Foo::Foo() and Foo::Foo(int)
    671      1.1  joerg   class Foo {
    672      1.1  joerg    public:
    673      1.1  joerg     Foo();
    674      1.1  joerg     Foo(int);
    675      1.1  joerg     int DoSomething();
    676      1.1  joerg   };
    677      1.1  joerg </pre></td></tr>
    678      1.1  joerg 
    679      1.1  joerg 
    680      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
    682      1.1  joerg 
    683      1.1  joerg Example matches the operator.
    684      1.1  joerg   class X { operator int() const; };
    685      1.1  joerg </pre></td></tr>
    686      1.1  joerg 
    687      1.1  joerg 
    688      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
    690      1.1  joerg 
    691      1.1  joerg Example matches the deduction guide.
    692      1.1  joerg   template&lt;typename T&gt;
    693      1.1  joerg   class X { X(int) };
    694      1.1  joerg   X(int) -&gt; X&lt;int&gt;;
    695      1.1  joerg </pre></td></tr>
    696      1.1  joerg 
    697      1.1  joerg 
    698      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
    700      1.1  joerg 
    701      1.1  joerg Example matches Foo::~Foo()
    702      1.1  joerg   class Foo {
    703      1.1  joerg    public:
    704      1.1  joerg     virtual ~Foo();
    705      1.1  joerg   };
    706      1.1  joerg </pre></td></tr>
    707      1.1  joerg 
    708      1.1  joerg 
    709      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
    711      1.1  joerg 
    712      1.1  joerg Example matches y
    713      1.1  joerg   class X { void y(); };
    714      1.1  joerg </pre></td></tr>
    715      1.1  joerg 
    716      1.1  joerg 
    717      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
    719      1.1  joerg 
    720      1.1  joerg Example matches X, Z
    721      1.1  joerg   class X;
    722      1.1  joerg   template&lt;class T&gt; class Z {};
    723      1.1  joerg </pre></td></tr>
    724      1.1  joerg 
    725      1.1  joerg 
    726      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
    728      1.1  joerg 
    729      1.1  joerg Examples matches X, C, and the friend declaration inside C;
    730      1.1  joerg   void X();
    731      1.1  joerg   class C {
    732      1.1  joerg     friend X;
    733      1.1  joerg   };
    734      1.1  joerg </pre></td></tr>
    735      1.1  joerg 
    736      1.1  joerg 
    737      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
    739      1.1  joerg and non-type template parameter declarations).
    740      1.1  joerg 
    741      1.1  joerg Given
    742      1.1  joerg   class X { int y; };
    743      1.1  joerg declaratorDecl()
    744      1.1  joerg   matches int y.
    745      1.1  joerg </pre></td></tr>
    746      1.1  joerg 
    747      1.1  joerg 
    748  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
    750  1.1.1.2  joerg 
    751  1.1.1.2  joerg Examples matches the declaration node with foo and bar, but not
    752  1.1.1.2  joerg number.
    753  1.1.1.2  joerg (matcher = declStmt(has(decompositionDecl())))
    754  1.1.1.2  joerg 
    755  1.1.1.2  joerg   int number = 42;
    756  1.1.1.2  joerg   auto [foo, bar] = std::make_pair{42, 42};
    757  1.1.1.2  joerg </pre></td></tr>
    758  1.1.1.2  joerg 
    759  1.1.1.2  joerg 
    760      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
    762      1.1  joerg 
    763      1.1  joerg Example matches A, B, C
    764      1.1  joerg   enum X {
    765      1.1  joerg     A, B, C
    766      1.1  joerg   };
    767      1.1  joerg </pre></td></tr>
    768      1.1  joerg 
    769      1.1  joerg 
    770      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
    772      1.1  joerg 
    773      1.1  joerg Example matches X
    774      1.1  joerg   enum X {
    775      1.1  joerg     A, B, C
    776      1.1  joerg   };
    777      1.1  joerg </pre></td></tr>
    778      1.1  joerg 
    779      1.1  joerg 
    780      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
    782      1.1  joerg 
    783      1.1  joerg Given
    784      1.1  joerg   class X { int m; };
    785      1.1  joerg fieldDecl()
    786      1.1  joerg   matches 'm'.
    787      1.1  joerg </pre></td></tr>
    788      1.1  joerg 
    789      1.1  joerg 
    790      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
    792      1.1  joerg 
    793      1.1  joerg Given
    794      1.1  joerg   class X { friend void foo(); };
    795      1.1  joerg friendDecl()
    796      1.1  joerg   matches 'friend void foo()'.
    797      1.1  joerg </pre></td></tr>
    798      1.1  joerg 
    799      1.1  joerg 
    800      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
    802      1.1  joerg 
    803      1.1  joerg Example matches f
    804      1.1  joerg   void f();
    805      1.1  joerg </pre></td></tr>
    806      1.1  joerg 
    807      1.1  joerg 
    808      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
    810      1.1  joerg 
    811      1.1  joerg Example matches f
    812      1.1  joerg   template&lt;class T&gt; void f(T t) {}
    813      1.1  joerg </pre></td></tr>
    814      1.1  joerg 
    815      1.1  joerg 
    816      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
    818      1.1  joerg 
    819      1.1  joerg Given
    820      1.1  joerg   struct X { struct { int a; }; };
    821      1.1  joerg indirectFieldDecl()
    822      1.1  joerg   matches 'a'.
    823      1.1  joerg </pre></td></tr>
    824      1.1  joerg 
    825      1.1  joerg 
    826      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
    828      1.1  joerg 
    829      1.1  joerg Given
    830      1.1  joerg   goto FOO;
    831      1.1  joerg   FOO: bar();
    832      1.1  joerg labelDecl()
    833      1.1  joerg   matches 'FOO:'
    834      1.1  joerg </pre></td></tr>
    835      1.1  joerg 
    836      1.1  joerg 
    837      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
    839      1.1  joerg 
    840      1.1  joerg Given
    841      1.1  joerg   extern "C" {}
    842      1.1  joerg linkageSpecDecl()
    843      1.1  joerg   matches "extern "C" {}"
    844      1.1  joerg </pre></td></tr>
    845      1.1  joerg 
    846      1.1  joerg 
    847      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
    849      1.1  joerg 
    850      1.1  joerg Example matches X, S, the anonymous union type, i, and U;
    851      1.1  joerg   typedef int X;
    852      1.1  joerg   struct S {
    853      1.1  joerg     union {
    854      1.1  joerg       int i;
    855      1.1  joerg     } U;
    856      1.1  joerg   };
    857      1.1  joerg </pre></td></tr>
    858      1.1  joerg 
    859      1.1  joerg 
    860      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
    862      1.1  joerg 
    863      1.1  joerg Given
    864      1.1  joerg   namespace test {}
    865      1.1  joerg   namespace alias = ::test;
    866      1.1  joerg namespaceAliasDecl()
    867      1.1  joerg   matches "namespace alias" but not "namespace test"
    868      1.1  joerg </pre></td></tr>
    869      1.1  joerg 
    870      1.1  joerg 
    871      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
    873      1.1  joerg 
    874      1.1  joerg Given
    875      1.1  joerg   namespace {}
    876      1.1  joerg   namespace test {}
    877      1.1  joerg namespaceDecl()
    878      1.1  joerg   matches "namespace {}" and "namespace test {}"
    879      1.1  joerg </pre></td></tr>
    880      1.1  joerg 
    881      1.1  joerg 
    882      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
    884      1.1  joerg 
    885      1.1  joerg Given
    886      1.1  joerg   template &lt;typename T, int N&gt; struct C {};
    887      1.1  joerg nonTypeTemplateParmDecl()
    888      1.1  joerg   matches 'N', but not 'T'.
    889      1.1  joerg </pre></td></tr>
    890      1.1  joerg 
    891      1.1  joerg 
    892      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
    894      1.1  joerg 
    895      1.1  joerg Example matches Foo (Additions)
    896      1.1  joerg   @interface Foo (Additions)
    897      1.1  joerg   @end
    898      1.1  joerg </pre></td></tr>
    899      1.1  joerg 
    900      1.1  joerg 
    901      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
    903      1.1  joerg 
    904      1.1  joerg Example matches Foo (Additions)
    905      1.1  joerg   @implementation Foo (Additions)
    906      1.1  joerg   @end
    907      1.1  joerg </pre></td></tr>
    908      1.1  joerg 
    909      1.1  joerg 
    910      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
    912      1.1  joerg 
    913      1.1  joerg Example matches Foo
    914      1.1  joerg   @implementation Foo
    915      1.1  joerg   @end
    916      1.1  joerg </pre></td></tr>
    917      1.1  joerg 
    918      1.1  joerg 
    919      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
    921      1.1  joerg 
    922      1.1  joerg Example matches Foo
    923      1.1  joerg   @interface Foo
    924      1.1  joerg   @end
    925      1.1  joerg </pre></td></tr>
    926      1.1  joerg 
    927      1.1  joerg 
    928      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
    930      1.1  joerg 
    931      1.1  joerg Example matches _enabled
    932      1.1  joerg   @implementation Foo {
    933      1.1  joerg     BOOL _enabled;
    934      1.1  joerg   }
    935      1.1  joerg   @end
    936      1.1  joerg </pre></td></tr>
    937      1.1  joerg 
    938      1.1  joerg 
    939      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
    941      1.1  joerg 
    942      1.1  joerg Example matches both declaration and definition of -[Foo method]
    943      1.1  joerg   @interface Foo
    944      1.1  joerg   - (void)method;
    945      1.1  joerg   @end
    946      1.1  joerg 
    947      1.1  joerg   @implementation Foo
    948      1.1  joerg   - (void)method {}
    949      1.1  joerg   @end
    950      1.1  joerg </pre></td></tr>
    951      1.1  joerg 
    952      1.1  joerg 
    953      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
    955      1.1  joerg 
    956      1.1  joerg Example matches enabled
    957      1.1  joerg   @interface Foo
    958      1.1  joerg   @property BOOL enabled;
    959      1.1  joerg   @end
    960      1.1  joerg </pre></td></tr>
    961      1.1  joerg 
    962      1.1  joerg 
    963      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
    965      1.1  joerg 
    966      1.1  joerg Example matches FooDelegate
    967      1.1  joerg   @protocol FooDelegate
    968      1.1  joerg   @end
    969      1.1  joerg </pre></td></tr>
    970      1.1  joerg 
    971      1.1  joerg 
    972      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
    974      1.1  joerg 
    975      1.1  joerg Given
    976      1.1  joerg   void f(int x);
    977      1.1  joerg parmVarDecl()
    978      1.1  joerg   matches int x.
    979      1.1  joerg </pre></td></tr>
    980      1.1  joerg 
    981      1.1  joerg 
    982      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
    984      1.1  joerg 
    985      1.1  joerg Example matches X, Z, U, and S
    986      1.1  joerg   class X;
    987      1.1  joerg   template&lt;class T&gt; class Z {};
    988      1.1  joerg   struct S {};
    989      1.1  joerg   union U {};
    990      1.1  joerg </pre></td></tr>
    991      1.1  joerg 
    992      1.1  joerg 
    993      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
    995      1.1  joerg 
    996      1.1  joerg Example:
    997      1.1  joerg   staticAssertExpr()
    998      1.1  joerg matches
    999      1.1  joerg   static_assert(sizeof(S) == sizeof(int))
   1000      1.1  joerg in
   1001      1.1  joerg   struct S {
   1002      1.1  joerg     int x;
   1003      1.1  joerg   };
   1004      1.1  joerg   static_assert(sizeof(S) == sizeof(int));
   1005      1.1  joerg </pre></td></tr>
   1006      1.1  joerg 
   1007      1.1  joerg 
   1008  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
   1010  1.1.1.2  joerg 
   1011  1.1.1.2  joerg Example matches X, Z, U, S, E
   1012  1.1.1.2  joerg   class X;
   1013  1.1.1.2  joerg   template&lt;class T&gt; class Z {};
   1014  1.1.1.2  joerg   struct S {};
   1015  1.1.1.2  joerg   union U {};
   1016  1.1.1.2  joerg   enum E {
   1017  1.1.1.2  joerg     A, B, C
   1018  1.1.1.2  joerg   };
   1019  1.1.1.2  joerg </pre></td></tr>
   1020  1.1.1.2  joerg 
   1021  1.1.1.2  joerg 
   1022  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
   1024  1.1.1.2  joerg 
   1025  1.1.1.2  joerg Given
   1026  1.1.1.2  joerg   template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
   1027  1.1.1.2  joerg templateTypeParmDecl()
   1028  1.1.1.2  joerg   matches 'Z', but not 'N'.
   1029  1.1.1.2  joerg </pre></td></tr>
   1030  1.1.1.2  joerg 
   1031  1.1.1.2  joerg 
   1032      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
   1034      1.1  joerg 
   1035      1.1  joerg Given
   1036      1.1  joerg   template &lt;typename T, int N&gt; struct C {};
   1037      1.1  joerg templateTypeParmDecl()
   1038      1.1  joerg   matches 'T', but not 'N'.
   1039      1.1  joerg </pre></td></tr>
   1040      1.1  joerg 
   1041      1.1  joerg 
   1042      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
   1044      1.1  joerg 
   1045      1.1  joerg Given
   1046      1.1  joerg   int X;
   1047      1.1  joerg   namespace NS {
   1048      1.1  joerg   int Y;
   1049      1.1  joerg   }  // namespace NS
   1050      1.1  joerg decl(hasDeclContext(translationUnitDecl()))
   1051      1.1  joerg   matches "int X", but not "int Y".
   1052      1.1  joerg </pre></td></tr>
   1053      1.1  joerg 
   1054      1.1  joerg 
   1055      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
   1057      1.1  joerg 
   1058      1.1  joerg Given
   1059      1.1  joerg   typedef int X;
   1060      1.1  joerg   using Y = int;
   1061      1.1  joerg typeAliasDecl()
   1062      1.1  joerg   matches "using Y = int", but not "typedef int X"
   1063      1.1  joerg </pre></td></tr>
   1064      1.1  joerg 
   1065      1.1  joerg 
   1066      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
   1068      1.1  joerg 
   1069      1.1  joerg typeAliasTemplateDecl() matches
   1070      1.1  joerg   template &lt;typename T&gt;
   1071      1.1  joerg   using Y = X&lt;T&gt;;
   1072      1.1  joerg </pre></td></tr>
   1073      1.1  joerg 
   1074      1.1  joerg 
   1075      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
   1077      1.1  joerg 
   1078      1.1  joerg Given
   1079      1.1  joerg   typedef int X;
   1080      1.1  joerg   using Y = int;
   1081      1.1  joerg typedefDecl()
   1082      1.1  joerg   matches "typedef int X", but not "using Y = int"
   1083      1.1  joerg </pre></td></tr>
   1084      1.1  joerg 
   1085      1.1  joerg 
   1086      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
   1088      1.1  joerg 
   1089      1.1  joerg Given
   1090      1.1  joerg   typedef int X;
   1091      1.1  joerg   using Y = int;
   1092      1.1  joerg typedefNameDecl()
   1093      1.1  joerg   matches "typedef int X" and "using Y = int"
   1094      1.1  joerg </pre></td></tr>
   1095      1.1  joerg 
   1096      1.1  joerg 
   1097      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
   1099      1.1  joerg typename.
   1100      1.1  joerg 
   1101      1.1  joerg Given
   1102      1.1  joerg   template &lt;typename T&gt;
   1103      1.1  joerg   struct Base { typedef T Foo; };
   1104      1.1  joerg 
   1105      1.1  joerg   template&lt;typename T&gt;
   1106      1.1  joerg   struct S : private Base&lt;T&gt; {
   1107      1.1  joerg     using typename Base&lt;T&gt;::Foo;
   1108      1.1  joerg   };
   1109      1.1  joerg unresolvedUsingTypenameDecl()
   1110      1.1  joerg   matches using Base&lt;T&gt;::Foo </pre></td></tr>
   1111      1.1  joerg 
   1112      1.1  joerg 
   1113      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
   1115      1.1  joerg 
   1116      1.1  joerg Given
   1117      1.1  joerg   template&lt;typename X&gt;
   1118      1.1  joerg   class C : private X {
   1119      1.1  joerg     using X::x;
   1120      1.1  joerg   };
   1121      1.1  joerg unresolvedUsingValueDecl()
   1122      1.1  joerg   matches using X::x </pre></td></tr>
   1123      1.1  joerg 
   1124      1.1  joerg 
   1125      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
   1127      1.1  joerg 
   1128      1.1  joerg Given
   1129      1.1  joerg   namespace X { int x; }
   1130      1.1  joerg   using X::x;
   1131      1.1  joerg usingDecl()
   1132      1.1  joerg   matches using X::x </pre></td></tr>
   1133      1.1  joerg 
   1134      1.1  joerg 
   1135      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
   1137      1.1  joerg 
   1138      1.1  joerg Given
   1139      1.1  joerg   namespace X { int x; }
   1140      1.1  joerg   using namespace X;
   1141      1.1  joerg usingDirectiveDecl()
   1142      1.1  joerg   matches using namespace X </pre></td></tr>
   1143      1.1  joerg 
   1144      1.1  joerg 
   1145      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
   1147      1.1  joerg 
   1148      1.1  joerg Example matches A, B, C and F
   1149      1.1  joerg   enum X { A, B, C };
   1150      1.1  joerg   void F();
   1151      1.1  joerg </pre></td></tr>
   1152      1.1  joerg 
   1153      1.1  joerg 
   1154      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
   1156      1.1  joerg 
   1157      1.1  joerg Note: this does not match declarations of member variables, which are
   1158      1.1  joerg "field" declarations in Clang parlance.
   1159      1.1  joerg 
   1160      1.1  joerg Example matches a
   1161      1.1  joerg   int a;
   1162      1.1  joerg </pre></td></tr>
   1163      1.1  joerg 
   1164      1.1  joerg 
   1165      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
   1167      1.1  joerg </pre></td></tr>
   1168      1.1  joerg 
   1169      1.1  joerg 
   1170      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
   1172      1.1  joerg 
   1173      1.1  joerg Given
   1174      1.1  joerg   namespace ns {
   1175      1.1  joerg     struct A { static void f(); };
   1176      1.1  joerg     void A::f() {}
   1177      1.1  joerg     void g() { A::f(); }
   1178      1.1  joerg   }
   1179      1.1  joerg   ns::A a;
   1180      1.1  joerg nestedNameSpecifier()
   1181      1.1  joerg   matches "ns::" and both "A::"
   1182      1.1  joerg </pre></td></tr>
   1183      1.1  joerg 
   1184      1.1  joerg 
   1185      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
   1187      1.1  joerg 
   1188      1.1  joerg Given
   1189      1.1  joerg 
   1190      1.1  joerg   #pragma omp parallel default(none)
   1191      1.1  joerg   #pragma omp parallel default(shared)
   1192  1.1.1.2  joerg   #pragma omp parallel default(firstprivate)
   1193      1.1  joerg   #pragma omp parallel
   1194      1.1  joerg 
   1195  1.1.1.2  joerg ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
   1196  1.1.1.2  joerg ``default(firstprivate)``
   1197      1.1  joerg </pre></td></tr>
   1198      1.1  joerg 
   1199      1.1  joerg 
   1200      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
   1202      1.1  joerg </pre></td></tr>
   1203      1.1  joerg 
   1204      1.1  joerg 
   1205      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
   1207      1.1  joerg 
   1208      1.1  joerg Given
   1209      1.1  joerg   FOO: bar();
   1210      1.1  joerg   void *ptr = &amp;&amp;FOO;
   1211      1.1  joerg   goto *bar;
   1212      1.1  joerg addrLabelExpr()
   1213      1.1  joerg   matches '&amp;&amp;FOO'
   1214      1.1  joerg </pre></td></tr>
   1215      1.1  joerg 
   1216      1.1  joerg 
   1217      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
   1219      1.1  joerg 
   1220      1.1  joerg Given
   1221      1.1  joerg   int i = a[1];
   1222      1.1  joerg arraySubscriptExpr()
   1223      1.1  joerg   matches "a[1]"
   1224      1.1  joerg </pre></td></tr>
   1225      1.1  joerg 
   1226      1.1  joerg 
   1227      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
   1229      1.1  joerg 
   1230      1.1  joerg  int i = 100;
   1231      1.1  joerg   __asm("mov al, 2");
   1232      1.1  joerg asmStmt()
   1233      1.1  joerg   matches '__asm("mov al, 2")'
   1234      1.1  joerg </pre></td></tr>
   1235      1.1  joerg 
   1236      1.1  joerg 
   1237      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
   1239      1.1  joerg Example matches __atomic_load_n(ptr, 1)
   1240      1.1  joerg   void foo() { int *ptr; __atomic_load_n(ptr, 1); }
   1241      1.1  joerg </pre></td></tr>
   1242      1.1  joerg 
   1243      1.1  joerg 
   1244      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
   1246      1.1  joerg 
   1247      1.1  joerg Given
   1248      1.1  joerg   @autoreleasepool {
   1249      1.1  joerg     int x = 0;
   1250      1.1  joerg   }
   1251      1.1  joerg autoreleasePoolStmt(stmt()) matches the declaration of "x"
   1252      1.1  joerg inside the autorelease pool.
   1253      1.1  joerg </pre></td></tr>
   1254      1.1  joerg 
   1255      1.1  joerg 
   1256      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
   1258      1.1  joerg 
   1259      1.1  joerg Example matches a ?: b
   1260      1.1  joerg   (a ?: b) + 42;
   1261      1.1  joerg </pre></td></tr>
   1262      1.1  joerg 
   1263      1.1  joerg 
   1264      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
   1266      1.1  joerg 
   1267      1.1  joerg Example matches a || b
   1268      1.1  joerg   !(a || b)
   1269  1.1.1.2  joerg See also the binaryOperation() matcher for more-general matching.
   1270      1.1  joerg </pre></td></tr>
   1271      1.1  joerg 
   1272      1.1  joerg 
   1273      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
   1275      1.1  joerg 
   1276      1.1  joerg Example: matches "^{}":
   1277      1.1  joerg   void f() { ^{}(); }
   1278      1.1  joerg </pre></td></tr>
   1279      1.1  joerg 
   1280      1.1  joerg 
   1281      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
   1283      1.1  joerg 
   1284      1.1  joerg Given
   1285      1.1  joerg   while (true) { break; }
   1286      1.1  joerg breakStmt()
   1287      1.1  joerg   matches 'break'
   1288      1.1  joerg </pre></td></tr>
   1289      1.1  joerg 
   1290      1.1  joerg 
   1291      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
   1293      1.1  joerg 
   1294      1.1  joerg Example: Matches (int) 2.2f in
   1295      1.1  joerg   int i = (int) 2.2f;
   1296      1.1  joerg </pre></td></tr>
   1297      1.1  joerg 
   1298      1.1  joerg 
   1299      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
   1301      1.1  joerg 
   1302      1.1  joerg Example matches x.y() and y()
   1303      1.1  joerg   X x;
   1304      1.1  joerg   x.y();
   1305      1.1  joerg   y();
   1306      1.1  joerg </pre></td></tr>
   1307      1.1  joerg 
   1308      1.1  joerg 
   1309      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
   1311      1.1  joerg 
   1312      1.1  joerg Given
   1313      1.1  joerg   switch(a) { case 42: break; default: break; }
   1314      1.1  joerg caseStmt()
   1315      1.1  joerg   matches 'case 42:'.
   1316      1.1  joerg </pre></td></tr>
   1317      1.1  joerg 
   1318      1.1  joerg 
   1319      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
   1321      1.1  joerg 
   1322      1.1  joerg Example: castExpr() matches each of the following:
   1323      1.1  joerg   (int) 3;
   1324      1.1  joerg   const_cast&lt;Expr *&gt;(SubExpr);
   1325      1.1  joerg   char c = 0;
   1326      1.1  joerg but does not match
   1327      1.1  joerg   int i = (0);
   1328      1.1  joerg   int k = 0;
   1329      1.1  joerg </pre></td></tr>
   1330      1.1  joerg 
   1331      1.1  joerg 
   1332      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
   1334      1.1  joerg 
   1335      1.1  joerg Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
   1336      1.1  joerg though.
   1337      1.1  joerg 
   1338      1.1  joerg Example matches 'a', L'a'
   1339      1.1  joerg   char ch = 'a';
   1340      1.1  joerg   wchar_t chw = L'a';
   1341      1.1  joerg </pre></td></tr>
   1342      1.1  joerg 
   1343      1.1  joerg 
   1344      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
   1346      1.1  joerg </pre></td></tr>
   1347      1.1  joerg 
   1348      1.1  joerg 
   1349  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
   1351  1.1.1.2  joerg 
   1352  1.1.1.2  joerg Given
   1353  1.1.1.2  joerg   co_await 1;
   1354  1.1.1.2  joerg coawaitExpr()
   1355  1.1.1.2  joerg   matches 'co_await 1'
   1356  1.1.1.2  joerg </pre></td></tr>
   1357  1.1.1.2  joerg 
   1358  1.1.1.2  joerg 
   1359      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
   1361      1.1  joerg 
   1362      1.1  joerg Example match: {1}, (1, 2)
   1363      1.1  joerg   int array[4] = {1};
   1364      1.1  joerg   vector int myvec = (vector int)(1, 2);
   1365      1.1  joerg </pre></td></tr>
   1366      1.1  joerg 
   1367      1.1  joerg 
   1368      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
   1370      1.1  joerg 
   1371      1.1  joerg Example matches '{}' and '{{}}' in 'for (;;) {{}}'
   1372      1.1  joerg   for (;;) {{}}
   1373      1.1  joerg </pre></td></tr>
   1374      1.1  joerg 
   1375      1.1  joerg 
   1376      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
   1378      1.1  joerg 
   1379      1.1  joerg Example matches a ? b : c
   1380      1.1  joerg   (a ? b : c) + 42
   1381      1.1  joerg </pre></td></tr>
   1382      1.1  joerg 
   1383      1.1  joerg 
   1384      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
   1386      1.1  joerg 
   1387      1.1  joerg Example matches the constant in the case statement:
   1388      1.1  joerg     (matcher = constantExpr())
   1389      1.1  joerg   switch (a) {
   1390      1.1  joerg   case 37: break;
   1391      1.1  joerg   }
   1392      1.1  joerg </pre></td></tr>
   1393      1.1  joerg 
   1394      1.1  joerg 
   1395      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
   1397      1.1  joerg 
   1398      1.1  joerg Given
   1399      1.1  joerg   while (true) { continue; }
   1400      1.1  joerg continueStmt()
   1401      1.1  joerg   matches 'continue'
   1402      1.1  joerg </pre></td></tr>
   1403      1.1  joerg 
   1404      1.1  joerg 
   1405  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
   1407  1.1.1.2  joerg 
   1408  1.1.1.2  joerg Given
   1409  1.1.1.2  joerg   while (true) { co_return; }
   1410  1.1.1.2  joerg coreturnStmt()
   1411  1.1.1.2  joerg   matches 'co_return'
   1412  1.1.1.2  joerg </pre></td></tr>
   1413  1.1.1.2  joerg 
   1414  1.1.1.2  joerg 
   1415  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
   1417  1.1.1.2  joerg 
   1418  1.1.1.2  joerg Given
   1419  1.1.1.2  joerg   co_yield 1;
   1420  1.1.1.2  joerg coyieldExpr()
   1421  1.1.1.2  joerg   matches 'co_yield 1'
   1422  1.1.1.2  joerg </pre></td></tr>
   1423  1.1.1.2  joerg 
   1424  1.1.1.2  joerg 
   1425      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
   1427      1.1  joerg 
   1428      1.1  joerg Example matches,
   1429      1.1  joerg   kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
   1430      1.1  joerg </pre></td></tr>
   1431      1.1  joerg 
   1432      1.1  joerg 
   1433      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
   1435      1.1  joerg 
   1436      1.1  joerg Example matches FunctionTakesString(GetStringByValue())
   1437      1.1  joerg     (matcher = cxxBindTemporaryExpr())
   1438      1.1  joerg   FunctionTakesString(GetStringByValue());
   1439      1.1  joerg   FunctionTakesStringByPointer(GetStringPointer());
   1440      1.1  joerg </pre></td></tr>
   1441      1.1  joerg 
   1442      1.1  joerg 
   1443      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
   1445      1.1  joerg 
   1446      1.1  joerg Example matches true
   1447      1.1  joerg   true
   1448      1.1  joerg </pre></td></tr>
   1449      1.1  joerg 
   1450      1.1  joerg 
   1451      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
   1453      1.1  joerg 
   1454      1.1  joerg   try {} catch(int i) {}
   1455      1.1  joerg cxxCatchStmt()
   1456      1.1  joerg   matches 'catch(int i)'
   1457      1.1  joerg </pre></td></tr>
   1458      1.1  joerg 
   1459      1.1  joerg 
   1460      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
   1462      1.1  joerg 
   1463      1.1  joerg Example: Matches const_cast&lt;int*&gt;(&amp;r) in
   1464      1.1  joerg   int n = 42;
   1465      1.1  joerg   const int &amp;r(n);
   1466      1.1  joerg   int* p = const_cast&lt;int*&gt;(&amp;r);
   1467      1.1  joerg </pre></td></tr>
   1468      1.1  joerg 
   1469      1.1  joerg 
   1470      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
   1472      1.1  joerg 
   1473      1.1  joerg Example matches string(ptr, n) and ptr within arguments of f
   1474      1.1  joerg     (matcher = cxxConstructExpr())
   1475      1.1  joerg   void f(const string &amp;a, const string &amp;b);
   1476      1.1  joerg   char *ptr;
   1477      1.1  joerg   int n;
   1478      1.1  joerg   f(string(ptr, n), ptr);
   1479      1.1  joerg </pre></td></tr>
   1480      1.1  joerg 
   1481      1.1  joerg 
   1482      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
   1484      1.1  joerg 
   1485      1.1  joerg Example matches the CXXDefaultArgExpr placeholder inserted for the
   1486      1.1  joerg     default value of the second parameter in the call expression f(42)
   1487      1.1  joerg     (matcher = cxxDefaultArgExpr())
   1488      1.1  joerg   void f(int x, int y = 0);
   1489      1.1  joerg   f(42);
   1490      1.1  joerg </pre></td></tr>
   1491      1.1  joerg 
   1492      1.1  joerg 
   1493      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
   1495      1.1  joerg 
   1496      1.1  joerg Given
   1497      1.1  joerg   delete X;
   1498      1.1  joerg cxxDeleteExpr()
   1499      1.1  joerg   matches 'delete X'.
   1500      1.1  joerg </pre></td></tr>
   1501      1.1  joerg 
   1502      1.1  joerg 
   1503      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
   1505      1.1  joerg resolved because the base expression or the member name was dependent.
   1506      1.1  joerg 
   1507      1.1  joerg Given
   1508      1.1  joerg   template &lt;class T&gt; void f() { T t; t.g(); }
   1509      1.1  joerg cxxDependentScopeMemberExpr()
   1510      1.1  joerg   matches t.g
   1511      1.1  joerg </pre></td></tr>
   1512      1.1  joerg 
   1513      1.1  joerg 
   1514      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
   1516      1.1  joerg 
   1517      1.1  joerg Example:
   1518      1.1  joerg   cxxDynamicCastExpr()
   1519      1.1  joerg matches
   1520      1.1  joerg   dynamic_cast&lt;D*&gt;(&amp;b);
   1521      1.1  joerg in
   1522      1.1  joerg   struct B { virtual ~B() {} }; struct D : B {};
   1523      1.1  joerg   B b;
   1524      1.1  joerg   D* p = dynamic_cast&lt;D*&gt;(&amp;b);
   1525      1.1  joerg </pre></td></tr>
   1526      1.1  joerg 
   1527      1.1  joerg 
   1528      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
   1530      1.1  joerg 
   1531      1.1  joerg cxxForRangeStmt() matches 'for (auto a : i)'
   1532      1.1  joerg   int i[] =  {1, 2, 3}; for (auto a : i);
   1533      1.1  joerg   for(int j = 0; j &lt; 5; ++j);
   1534      1.1  joerg </pre></td></tr>
   1535      1.1  joerg 
   1536      1.1  joerg 
   1537      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
   1539      1.1  joerg 
   1540      1.1  joerg Example: Matches Foo(bar);
   1541      1.1  joerg   Foo f = bar;
   1542      1.1  joerg   Foo g = (Foo) bar;
   1543      1.1  joerg   Foo h = Foo(bar);
   1544      1.1  joerg </pre></td></tr>
   1545      1.1  joerg 
   1546      1.1  joerg 
   1547      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
   1549      1.1  joerg 
   1550      1.1  joerg Example matches x.y()
   1551      1.1  joerg   X x;
   1552      1.1  joerg   x.y();
   1553      1.1  joerg </pre></td></tr>
   1554      1.1  joerg 
   1555      1.1  joerg 
   1556      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
   1558      1.1  joerg 
   1559      1.1  joerg Given
   1560      1.1  joerg   new X;
   1561      1.1  joerg cxxNewExpr()
   1562      1.1  joerg   matches 'new X'.
   1563      1.1  joerg </pre></td></tr>
   1564      1.1  joerg 
   1565      1.1  joerg 
   1566  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
   1568  1.1.1.2  joerg 
   1569  1.1.1.2  joerg Given
   1570  1.1.1.2  joerg   bool a() noexcept;
   1571  1.1.1.2  joerg   bool b() noexcept(true);
   1572  1.1.1.2  joerg   bool c() noexcept(false);
   1573  1.1.1.2  joerg   bool d() noexcept(noexcept(a()));
   1574  1.1.1.2  joerg   bool e = noexcept(b()) || noexcept(c());
   1575  1.1.1.2  joerg cxxNoexceptExpr()
   1576  1.1.1.2  joerg   matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
   1577  1.1.1.2  joerg   doesn't match the noexcept specifier in the declarations a, b, c or d.
   1578  1.1.1.2  joerg </pre></td></tr>
   1579  1.1.1.2  joerg 
   1580  1.1.1.2  joerg 
   1581      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
   1583      1.1  joerg </pre></td></tr>
   1584      1.1  joerg 
   1585      1.1  joerg 
   1586      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
   1588      1.1  joerg 
   1589      1.1  joerg Note that if an operator isn't overloaded, it won't match. Instead, use
   1590      1.1  joerg binaryOperator matcher.
   1591      1.1  joerg Currently it does not match operators such as new delete.
   1592      1.1  joerg FIXME: figure out why these do not match?
   1593      1.1  joerg 
   1594      1.1  joerg Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
   1595      1.1  joerg     (matcher = cxxOperatorCallExpr())
   1596      1.1  joerg   ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
   1597      1.1  joerg   ostream &amp;o; int b = 1, c = 1;
   1598      1.1  joerg   o &lt;&lt; b &lt;&lt; c;
   1599  1.1.1.2  joerg See also the binaryOperation() matcher for more-general matching of binary
   1600  1.1.1.2  joerg uses of this AST node.
   1601      1.1  joerg </pre></td></tr>
   1602      1.1  joerg 
   1603      1.1  joerg 
   1604      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
   1606      1.1  joerg 
   1607      1.1  joerg Either the source expression or the destination type can be matched
   1608      1.1  joerg using has(), but hasDestinationType() is more specific and can be
   1609      1.1  joerg more readable.
   1610      1.1  joerg 
   1611      1.1  joerg Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
   1612      1.1  joerg   void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
   1613      1.1  joerg </pre></td></tr>
   1614      1.1  joerg 
   1615      1.1  joerg 
   1616  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
   1618  1.1.1.2  joerg 
   1619  1.1.1.2  joerg Example matches use of "&lt;":
   1620  1.1.1.2  joerg   #include &lt;compare&gt;
   1621  1.1.1.2  joerg   struct HasSpaceshipMem {
   1622  1.1.1.2  joerg     int a;
   1623  1.1.1.2  joerg     constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
   1624  1.1.1.2  joerg   };
   1625  1.1.1.2  joerg   void compare() {
   1626  1.1.1.2  joerg     HasSpaceshipMem hs1, hs2;
   1627  1.1.1.2  joerg     if (hs1 &lt; hs2)
   1628  1.1.1.2  joerg         return;
   1629  1.1.1.2  joerg   }
   1630  1.1.1.2  joerg See also the binaryOperation() matcher for more-general matching
   1631  1.1.1.2  joerg of this AST node.
   1632  1.1.1.2  joerg </pre></td></tr>
   1633  1.1.1.2  joerg 
   1634  1.1.1.2  joerg 
   1635      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
   1637      1.1  joerg 
   1638      1.1  joerg See also: hasDestinationType
   1639      1.1  joerg See also: reinterpretCast
   1640      1.1  joerg 
   1641      1.1  joerg Example:
   1642      1.1  joerg   cxxStaticCastExpr()
   1643      1.1  joerg matches
   1644      1.1  joerg   static_cast&lt;long&gt;(8)
   1645      1.1  joerg in
   1646      1.1  joerg   long eight(static_cast&lt;long&gt;(8));
   1647      1.1  joerg </pre></td></tr>
   1648      1.1  joerg 
   1649      1.1  joerg 
   1650      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
   1652      1.1  joerg 
   1653      1.1  joerg Given
   1654      1.1  joerg   std::vector&lt;int&gt; a({ 1, 2, 3 });
   1655      1.1  joerg   std::vector&lt;int&gt; b = { 4, 5 };
   1656      1.1  joerg   int c[] = { 6, 7 };
   1657      1.1  joerg   std::pair&lt;int, int&gt; d = { 8, 9 };
   1658      1.1  joerg cxxStdInitializerListExpr()
   1659      1.1  joerg   matches "{ 1, 2, 3 }" and "{ 4, 5 }"
   1660      1.1  joerg </pre></td></tr>
   1661      1.1  joerg 
   1662      1.1  joerg 
   1663      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
   1665      1.1  joerg 
   1666      1.1  joerg Example: Matches Foo(bar, bar)
   1667      1.1  joerg   Foo h = Foo(bar, bar);
   1668      1.1  joerg </pre></td></tr>
   1669      1.1  joerg 
   1670      1.1  joerg 
   1671      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
   1673      1.1  joerg 
   1674      1.1  joerg Example matches the implicit this expression in "return i".
   1675      1.1  joerg     (matcher = cxxThisExpr())
   1676      1.1  joerg struct foo {
   1677      1.1  joerg   int i;
   1678      1.1  joerg   int f() { return i; }
   1679      1.1  joerg };
   1680      1.1  joerg </pre></td></tr>
   1681      1.1  joerg 
   1682      1.1  joerg 
   1683      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
   1685      1.1  joerg 
   1686      1.1  joerg   try { throw 5; } catch(int i) {}
   1687      1.1  joerg cxxThrowExpr()
   1688      1.1  joerg   matches 'throw 5'
   1689      1.1  joerg </pre></td></tr>
   1690      1.1  joerg 
   1691      1.1  joerg 
   1692      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
   1694      1.1  joerg 
   1695      1.1  joerg   try {} catch(int i) {}
   1696      1.1  joerg cxxTryStmt()
   1697      1.1  joerg   matches 'try {}'
   1698      1.1  joerg </pre></td></tr>
   1699      1.1  joerg 
   1700      1.1  joerg 
   1701      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
   1703      1.1  joerg 
   1704      1.1  joerg Example matches T(t) in return statement of f
   1705      1.1  joerg     (matcher = cxxUnresolvedConstructExpr())
   1706      1.1  joerg   template &lt;typename T&gt;
   1707      1.1  joerg   void f(const T&amp; t) { return T(t); }
   1708      1.1  joerg </pre></td></tr>
   1709      1.1  joerg 
   1710      1.1  joerg 
   1711      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
   1713      1.1  joerg 
   1714      1.1  joerg Example matches x in if (x)
   1715      1.1  joerg   bool x;
   1716      1.1  joerg   if (x) {}
   1717      1.1  joerg </pre></td></tr>
   1718      1.1  joerg 
   1719      1.1  joerg 
   1720      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
   1722      1.1  joerg 
   1723      1.1  joerg Given
   1724      1.1  joerg   int a;
   1725      1.1  joerg declStmt()
   1726      1.1  joerg   matches 'int a'.
   1727      1.1  joerg </pre></td></tr>
   1728      1.1  joerg 
   1729      1.1  joerg 
   1730      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
   1732      1.1  joerg 
   1733      1.1  joerg Given
   1734      1.1  joerg   switch(a) { case 42: break; default: break; }
   1735      1.1  joerg defaultStmt()
   1736      1.1  joerg   matches 'default:'.
   1737      1.1  joerg </pre></td></tr>
   1738      1.1  joerg 
   1739      1.1  joerg 
   1740  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
   1742  1.1.1.2  joerg </pre></td></tr>
   1743  1.1.1.2  joerg 
   1744  1.1.1.2  joerg 
   1745      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
   1747      1.1  joerg 
   1748      1.1  joerg Example: Matches { [2].y = 1.0, [0].x = 1.0 }
   1749      1.1  joerg   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
   1750      1.1  joerg </pre></td></tr>
   1751      1.1  joerg 
   1752      1.1  joerg 
   1753      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
   1755      1.1  joerg 
   1756      1.1  joerg Given
   1757      1.1  joerg   do {} while (true);
   1758      1.1  joerg doStmt()
   1759      1.1  joerg   matches 'do {} while(true)'
   1760      1.1  joerg </pre></td></tr>
   1761      1.1  joerg 
   1762      1.1  joerg 
   1763      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
   1765      1.1  joerg 
   1766      1.1  joerg Matches any cast expression written in user code, whether it be a
   1767      1.1  joerg C-style cast, a functional-style cast, or a keyword cast.
   1768      1.1  joerg 
   1769      1.1  joerg Does not match implicit conversions.
   1770      1.1  joerg 
   1771      1.1  joerg Note: the name "explicitCast" is chosen to match Clang's terminology, as
   1772      1.1  joerg Clang uses the term "cast" to apply to implicit conversions as well as to
   1773      1.1  joerg actual cast expressions.
   1774      1.1  joerg 
   1775      1.1  joerg See also: hasDestinationType.
   1776      1.1  joerg 
   1777      1.1  joerg Example: matches all five of the casts in
   1778      1.1  joerg   int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
   1779      1.1  joerg but does not match the implicit conversion in
   1780      1.1  joerg   long ell = 42;
   1781      1.1  joerg </pre></td></tr>
   1782      1.1  joerg 
   1783      1.1  joerg 
   1784      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
   1786      1.1  joerg 
   1787      1.1  joerg Example matches x()
   1788      1.1  joerg   void f() { x(); }
   1789      1.1  joerg </pre></td></tr>
   1790      1.1  joerg 
   1791      1.1  joerg 
   1792      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
   1794      1.1  joerg of the sub-expression's evaluation.
   1795      1.1  joerg 
   1796      1.1  joerg Example matches std::string()
   1797      1.1  joerg   const std::string str = std::string();
   1798      1.1  joerg </pre></td></tr>
   1799      1.1  joerg 
   1800      1.1  joerg 
   1801  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
   1803  1.1.1.2  joerg </pre></td></tr>
   1804  1.1.1.2  joerg 
   1805  1.1.1.2  joerg 
   1806      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
   1808      1.1  joerg 1.0, 1.0f, 1.0L and 1e10.
   1809      1.1  joerg 
   1810      1.1  joerg Does not match implicit conversions such as
   1811      1.1  joerg   float a = 10;
   1812      1.1  joerg </pre></td></tr>
   1813      1.1  joerg 
   1814      1.1  joerg 
   1815      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
   1817      1.1  joerg 
   1818      1.1  joerg Example matches 'for (;;) {}'
   1819      1.1  joerg   for (;;) {}
   1820      1.1  joerg   int i[] =  {1, 2, 3}; for (auto a : i);
   1821      1.1  joerg </pre></td></tr>
   1822      1.1  joerg 
   1823      1.1  joerg 
   1824  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
   1826  1.1.1.2  joerg </pre></td></tr>
   1827  1.1.1.2  joerg 
   1828  1.1.1.2  joerg 
   1829      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
   1831      1.1  joerg </pre></td></tr>
   1832      1.1  joerg 
   1833      1.1  joerg 
   1834      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
   1836      1.1  joerg 
   1837      1.1  joerg Given
   1838      1.1  joerg   goto FOO;
   1839      1.1  joerg   FOO: bar();
   1840      1.1  joerg gotoStmt()
   1841      1.1  joerg   matches 'goto FOO'
   1842      1.1  joerg </pre></td></tr>
   1843      1.1  joerg 
   1844      1.1  joerg 
   1845      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
   1847      1.1  joerg 
   1848      1.1  joerg Example matches 'if (x) {}'
   1849      1.1  joerg   if (x) {}
   1850      1.1  joerg </pre></td></tr>
   1851      1.1  joerg 
   1852      1.1  joerg 
   1853      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
   1855      1.1  joerg point literals e.g.: 1i, 1.0i
   1856      1.1  joerg </pre></td></tr>
   1857      1.1  joerg 
   1858      1.1  joerg 
   1859      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
   1861      1.1  joerg 
   1862      1.1  joerg This matches many different places, including function call return value
   1863      1.1  joerg eliding, as well as any type conversions.
   1864      1.1  joerg </pre></td></tr>
   1865      1.1  joerg 
   1866      1.1  joerg 
   1867      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
   1869      1.1  joerg 
   1870      1.1  joerg Given
   1871      1.1  joerg   point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
   1872      1.1  joerg implicitValueInitExpr()
   1873      1.1  joerg   matches "[0].y" (implicitly)
   1874      1.1  joerg </pre></td></tr>
   1875      1.1  joerg 
   1876      1.1  joerg 
   1877      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
   1879      1.1  joerg 
   1880      1.1  joerg Given
   1881      1.1  joerg   int a[] = { 1, 2 };
   1882      1.1  joerg   struct B { int x, y; };
   1883      1.1  joerg   B b = { 5, 6 };
   1884      1.1  joerg initListExpr()
   1885      1.1  joerg   matches "{ 1, 2 }" and "{ 5, 6 }"
   1886      1.1  joerg </pre></td></tr>
   1887      1.1  joerg 
   1888      1.1  joerg 
   1889      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
   1891      1.1  joerg 1, 1L, 0x1 and 1U.
   1892      1.1  joerg 
   1893      1.1  joerg Does not match character-encoded integers such as L'a'.
   1894      1.1  joerg </pre></td></tr>
   1895      1.1  joerg 
   1896      1.1  joerg 
   1897      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
   1899      1.1  joerg 
   1900      1.1  joerg Given
   1901      1.1  joerg   goto FOO;
   1902      1.1  joerg   FOO: bar();
   1903      1.1  joerg labelStmt()
   1904      1.1  joerg   matches 'FOO:'
   1905      1.1  joerg </pre></td></tr>
   1906      1.1  joerg 
   1907      1.1  joerg 
   1908      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
   1910      1.1  joerg 
   1911      1.1  joerg Example matches [&amp;](){return 5;}
   1912      1.1  joerg   [&amp;](){return 5;}
   1913      1.1  joerg </pre></td></tr>
   1914      1.1  joerg 
   1915      1.1  joerg 
   1916      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
   1918      1.1  joerg 
   1919      1.1  joerg Example: Given
   1920      1.1  joerg   struct T {void func();};
   1921      1.1  joerg   T f();
   1922      1.1  joerg   void g(T);
   1923      1.1  joerg materializeTemporaryExpr() matches 'f()' in these statements
   1924      1.1  joerg   T u(f());
   1925      1.1  joerg   g(f());
   1926      1.1  joerg   f().func();
   1927      1.1  joerg but does not match
   1928      1.1  joerg   f();
   1929      1.1  joerg </pre></td></tr>
   1930      1.1  joerg 
   1931      1.1  joerg 
   1932      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
   1934      1.1  joerg 
   1935      1.1  joerg Given
   1936      1.1  joerg   class Y {
   1937      1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   1938      1.1  joerg     int a; static int b;
   1939      1.1  joerg   };
   1940      1.1  joerg memberExpr()
   1941      1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   1942      1.1  joerg </pre></td></tr>
   1943      1.1  joerg 
   1944      1.1  joerg 
   1945      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
   1947      1.1  joerg 
   1948      1.1  joerg   foo();;
   1949      1.1  joerg nullStmt()
   1950      1.1  joerg   matches the second ';'
   1951      1.1  joerg </pre></td></tr>
   1952      1.1  joerg 
   1953      1.1  joerg 
   1954      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
   1956      1.1  joerg 
   1957      1.1  joerg Example matches @catch
   1958      1.1  joerg   @try {}
   1959      1.1  joerg   @catch (...) {}
   1960      1.1  joerg </pre></td></tr>
   1961      1.1  joerg 
   1962      1.1  joerg 
   1963      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
   1965      1.1  joerg 
   1966      1.1  joerg Example matches @finally
   1967      1.1  joerg   @try {}
   1968      1.1  joerg   @finally {}
   1969      1.1  joerg </pre></td></tr>
   1970      1.1  joerg 
   1971      1.1  joerg 
   1972      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
   1974      1.1  joerg 
   1975      1.1  joerg Example: matches "a" in "init" method:
   1976      1.1  joerg @implementation A {
   1977      1.1  joerg   NSString *a;
   1978      1.1  joerg }
   1979      1.1  joerg - (void) init {
   1980      1.1  joerg   a = @"hello";
   1981      1.1  joerg }
   1982      1.1  joerg </pre></td></tr>
   1983      1.1  joerg 
   1984      1.1  joerg 
   1985      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
   1987      1.1  joerg 
   1988      1.1  joerg The innermost message send invokes the "alloc" class method on the
   1989      1.1  joerg NSString class, while the outermost message send invokes the
   1990      1.1  joerg "initWithString" instance method on the object returned from
   1991      1.1  joerg NSString's "alloc". This matcher should match both message sends.
   1992      1.1  joerg   [[NSString alloc] initWithString:@"Hello"]
   1993      1.1  joerg </pre></td></tr>
   1994      1.1  joerg 
   1995      1.1  joerg 
   1996      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
   1998      1.1  joerg 
   1999      1.1  joerg Example matches @throw obj;
   2000      1.1  joerg </pre></td></tr>
   2001      1.1  joerg 
   2002      1.1  joerg 
   2003      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
   2005      1.1  joerg 
   2006      1.1  joerg Example matches @try
   2007      1.1  joerg   @try {}
   2008      1.1  joerg   @catch (...) {}
   2009      1.1  joerg </pre></td></tr>
   2010      1.1  joerg 
   2011      1.1  joerg 
   2012      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
   2014      1.1  joerg 
   2015      1.1  joerg Given
   2016      1.1  joerg 
   2017      1.1  joerg   #pragma omp parallel
   2018      1.1  joerg   #pragma omp parallel default(none)
   2019      1.1  joerg   #pragma omp taskyield
   2020      1.1  joerg 
   2021      1.1  joerg ``ompExecutableDirective()`` matches ``omp parallel``,
   2022      1.1  joerg ``omp parallel default(none)`` and ``omp taskyield``.
   2023      1.1  joerg </pre></td></tr>
   2024      1.1  joerg 
   2025      1.1  joerg 
   2026      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
   2028      1.1  joerg to reference another expressions and can be met
   2029      1.1  joerg in BinaryConditionalOperators, for example.
   2030      1.1  joerg 
   2031      1.1  joerg Example matches 'a'
   2032      1.1  joerg   (a ?: c) + 42;
   2033      1.1  joerg </pre></td></tr>
   2034      1.1  joerg 
   2035      1.1  joerg 
   2036      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
   2038      1.1  joerg 
   2039      1.1  joerg Example matches (foo() + 1)
   2040      1.1  joerg   int foo() { return 1; }
   2041      1.1  joerg   int a = (foo() + 1);
   2042      1.1  joerg </pre></td></tr>
   2043      1.1  joerg 
   2044      1.1  joerg 
   2045      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
   2047      1.1  joerg ParenListExprs don't have a predefined type and are used for late parsing.
   2048      1.1  joerg In the final AST, they can be met in template declarations.
   2049      1.1  joerg 
   2050      1.1  joerg Given
   2051      1.1  joerg   template&lt;typename T&gt; class X {
   2052      1.1  joerg     void f() {
   2053      1.1  joerg       X x(*this);
   2054      1.1  joerg       int a = 0, b = 1; int i = (a, b);
   2055      1.1  joerg     }
   2056      1.1  joerg   };
   2057      1.1  joerg parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
   2058      1.1  joerg has a predefined type and is a ParenExpr, not a ParenListExpr.
   2059      1.1  joerg </pre></td></tr>
   2060      1.1  joerg 
   2061      1.1  joerg 
   2062      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
   2064      1.1  joerg 
   2065      1.1  joerg Example: Matches __func__
   2066      1.1  joerg   printf("%s", __func__);
   2067      1.1  joerg </pre></td></tr>
   2068      1.1  joerg 
   2069      1.1  joerg 
   2070      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
   2072      1.1  joerg 
   2073      1.1  joerg Given
   2074      1.1  joerg   return 1;
   2075      1.1  joerg returnStmt()
   2076      1.1  joerg   matches 'return 1'
   2077      1.1  joerg </pre></td></tr>
   2078      1.1  joerg 
   2079      1.1  joerg 
   2080      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
   2082      1.1  joerg 
   2083      1.1  joerg Given
   2084      1.1  joerg   { ++a; }
   2085      1.1  joerg stmt()
   2086      1.1  joerg   matches both the compound statement '{ ++a; }' and '++a'.
   2087      1.1  joerg </pre></td></tr>
   2088      1.1  joerg 
   2089      1.1  joerg 
   2090      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
   2092      1.1  joerg 
   2093      1.1  joerg Example match: ({ int X = 4; X; })
   2094      1.1  joerg   int C = ({ int X = 4; X; });
   2095      1.1  joerg </pre></td></tr>
   2096      1.1  joerg 
   2097      1.1  joerg 
   2098      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
   2100      1.1  joerg 
   2101      1.1  joerg Example matches "abcd", L"abcd"
   2102      1.1  joerg   char *s = "abcd";
   2103      1.1  joerg   wchar_t *ws = L"abcd";
   2104      1.1  joerg </pre></td></tr>
   2105      1.1  joerg 
   2106      1.1  joerg 
   2107      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
   2109      1.1  joerg 
   2110      1.1  joerg Given
   2111      1.1  joerg   template &lt;int N&gt;
   2112      1.1  joerg   struct A { static const int n = N; };
   2113      1.1  joerg   struct B : public A&lt;42&gt; {};
   2114      1.1  joerg substNonTypeTemplateParmExpr()
   2115      1.1  joerg   matches "N" in the right-hand side of "static const int n = N;"
   2116      1.1  joerg </pre></td></tr>
   2117      1.1  joerg 
   2118      1.1  joerg 
   2119      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
   2121      1.1  joerg 
   2122      1.1  joerg Given
   2123      1.1  joerg   switch(a) { case 42: break; default: break; }
   2124      1.1  joerg switchCase()
   2125      1.1  joerg   matches 'case 42:' and 'default:'.
   2126      1.1  joerg </pre></td></tr>
   2127      1.1  joerg 
   2128      1.1  joerg 
   2129      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
   2131      1.1  joerg 
   2132      1.1  joerg Given
   2133      1.1  joerg   switch(a) { case 42: break; default: break; }
   2134      1.1  joerg switchStmt()
   2135      1.1  joerg   matches 'switch(a)'.
   2136      1.1  joerg </pre></td></tr>
   2137      1.1  joerg 
   2138      1.1  joerg 
   2139      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
   2141      1.1  joerg 
   2142      1.1  joerg Given
   2143      1.1  joerg   Foo x = bar;
   2144      1.1  joerg   int y = sizeof(x) + alignof(x);
   2145      1.1  joerg unaryExprOrTypeTraitExpr()
   2146      1.1  joerg   matches sizeof(x) and alignof(x)
   2147      1.1  joerg </pre></td></tr>
   2148      1.1  joerg 
   2149      1.1  joerg 
   2150      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
   2152      1.1  joerg 
   2153      1.1  joerg Example matches !a
   2154      1.1  joerg   !a || b
   2155      1.1  joerg </pre></td></tr>
   2156      1.1  joerg 
   2157      1.1  joerg 
   2158      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
   2160      1.1  joerg but could not be resolved to a specific declaration.
   2161      1.1  joerg 
   2162      1.1  joerg Given
   2163      1.1  joerg   template&lt;typename T&gt;
   2164      1.1  joerg   T foo() { T a; return a; }
   2165      1.1  joerg   template&lt;typename T&gt;
   2166      1.1  joerg   void bar() {
   2167      1.1  joerg     foo&lt;T&gt;();
   2168      1.1  joerg   }
   2169      1.1  joerg unresolvedLookupExpr()
   2170      1.1  joerg   matches foo&lt;T&gt;() </pre></td></tr>
   2171      1.1  joerg 
   2172      1.1  joerg 
   2173      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
   2175      1.1  joerg 
   2176      1.1  joerg Given
   2177      1.1  joerg   struct X {
   2178      1.1  joerg     template &lt;class T&gt; void f();
   2179      1.1  joerg     void g();
   2180      1.1  joerg   };
   2181      1.1  joerg   template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
   2182      1.1  joerg unresolvedMemberExpr()
   2183      1.1  joerg   matches x.f&lt;T&gt;
   2184      1.1  joerg </pre></td></tr>
   2185      1.1  joerg 
   2186      1.1  joerg 
   2187      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
   2189      1.1  joerg 
   2190      1.1  joerg Example match: "foo"_suffix
   2191      1.1  joerg </pre></td></tr>
   2192      1.1  joerg 
   2193      1.1  joerg 
   2194      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
   2196      1.1  joerg 
   2197      1.1  joerg Given
   2198      1.1  joerg   while (true) {}
   2199      1.1  joerg whileStmt()
   2200      1.1  joerg   matches 'while (true) {}'.
   2201      1.1  joerg </pre></td></tr>
   2202      1.1  joerg 
   2203      1.1  joerg 
   2204  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
   2206  1.1.1.2  joerg 
   2207  1.1.1.2  joerg Given
   2208  1.1.1.2  joerg   template &lt;typename T&gt; struct C {};
   2209  1.1.1.2  joerg   C&lt;int&gt; c;
   2210  1.1.1.2  joerg templateArgumentLoc()
   2211  1.1.1.2  joerg   matches 'int' in C&lt;int&gt;.
   2212  1.1.1.2  joerg </pre></td></tr>
   2213  1.1.1.2  joerg 
   2214  1.1.1.2  joerg 
   2215      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
   2217      1.1  joerg 
   2218      1.1  joerg Given
   2219      1.1  joerg   template &lt;typename T&gt; struct C {};
   2220      1.1  joerg   C&lt;int&gt; c;
   2221      1.1  joerg templateArgument()
   2222      1.1  joerg   matches 'int' in C&lt;int&gt;.
   2223      1.1  joerg </pre></td></tr>
   2224      1.1  joerg 
   2225      1.1  joerg 
   2226      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
   2228      1.1  joerg 
   2229      1.1  joerg Given
   2230      1.1  joerg   template &lt;typename T&gt; class X { };
   2231      1.1  joerg   X&lt;int&gt; xi;
   2232      1.1  joerg templateName()
   2233      1.1  joerg   matches 'X' in X&lt;int&gt;.
   2234      1.1  joerg </pre></td></tr>
   2235      1.1  joerg 
   2236      1.1  joerg 
   2237      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
   2239      1.1  joerg </pre></td></tr>
   2240      1.1  joerg 
   2241      1.1  joerg 
   2242      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
   2244      1.1  joerg 
   2245      1.1  joerg Given
   2246      1.1  joerg   int a[] = { 2, 3 };
   2247      1.1  joerg   int b[4];
   2248      1.1  joerg   void f() { int c[a[0]]; }
   2249      1.1  joerg arrayType()
   2250      1.1  joerg   matches "int a[]", "int b[4]" and "int c[a[0]]";
   2251      1.1  joerg </pre></td></tr>
   2252      1.1  joerg 
   2253      1.1  joerg 
   2254      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
   2256      1.1  joerg 
   2257      1.1  joerg Given
   2258      1.1  joerg   _Atomic(int) i;
   2259      1.1  joerg atomicType()
   2260      1.1  joerg   matches "_Atomic(int) i"
   2261      1.1  joerg </pre></td></tr>
   2262      1.1  joerg 
   2263      1.1  joerg 
   2264      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
   2266      1.1  joerg 
   2267      1.1  joerg Given:
   2268      1.1  joerg   auto n = 4;
   2269      1.1  joerg   int v[] = { 2, 3 }
   2270      1.1  joerg   for (auto i : v) { }
   2271      1.1  joerg autoType()
   2272      1.1  joerg   matches "auto n" and "auto i"
   2273      1.1  joerg </pre></td></tr>
   2274      1.1  joerg 
   2275      1.1  joerg 
   2276      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
   2278      1.1  joerg "void (^)(int)".
   2279      1.1  joerg 
   2280      1.1  joerg The pointee is always required to be a FunctionType.
   2281      1.1  joerg </pre></td></tr>
   2282      1.1  joerg 
   2283      1.1  joerg 
   2284      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
   2286      1.1  joerg 
   2287      1.1  joerg Given
   2288      1.1  joerg   struct A {};
   2289      1.1  joerg   A a;
   2290      1.1  joerg   int b;
   2291      1.1  joerg   float c;
   2292      1.1  joerg   bool d;
   2293      1.1  joerg builtinType()
   2294      1.1  joerg   matches "int b", "float c" and "bool d"
   2295      1.1  joerg </pre></td></tr>
   2296      1.1  joerg 
   2297      1.1  joerg 
   2298      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
   2300      1.1  joerg 
   2301      1.1  joerg Given
   2302      1.1  joerg   _Complex float f;
   2303      1.1  joerg complexType()
   2304      1.1  joerg   matches "_Complex float f"
   2305      1.1  joerg </pre></td></tr>
   2306      1.1  joerg 
   2307      1.1  joerg 
   2308      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
   2310      1.1  joerg 
   2311      1.1  joerg Given
   2312      1.1  joerg   void() {
   2313      1.1  joerg     int a[2];
   2314      1.1  joerg     int b[] = { 2, 3 };
   2315      1.1  joerg     int c[b[0]];
   2316      1.1  joerg   }
   2317      1.1  joerg constantArrayType()
   2318      1.1  joerg   matches "int a[2]"
   2319      1.1  joerg </pre></td></tr>
   2320      1.1  joerg 
   2321      1.1  joerg 
   2322      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
   2324      1.1  joerg Example matches i[] in declaration of f.
   2325      1.1  joerg     (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
   2326      1.1  joerg Example matches i[1].
   2327      1.1  joerg     (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
   2328      1.1  joerg   void f(int i[]) {
   2329      1.1  joerg     i[1] = 0;
   2330      1.1  joerg   }
   2331      1.1  joerg </pre></td></tr>
   2332      1.1  joerg 
   2333      1.1  joerg 
   2334      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
   2336      1.1  joerg 
   2337      1.1  joerg Given:
   2338      1.1  joerg   short i = 1;
   2339      1.1  joerg   int j = 42;
   2340      1.1  joerg   decltype(i + j) result = i + j;
   2341      1.1  joerg decltypeType()
   2342      1.1  joerg   matches "decltype(i + j)"
   2343      1.1  joerg </pre></td></tr>
   2344      1.1  joerg 
   2345      1.1  joerg 
   2346  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
   2348  1.1.1.2  joerg template types.
   2349  1.1.1.2  joerg 
   2350  1.1.1.2  joerg Given
   2351  1.1.1.2  joerg   template &lt;typename T&gt;
   2352  1.1.1.2  joerg   class C { public: C(T); };
   2353  1.1.1.2  joerg 
   2354  1.1.1.2  joerg   C c(123);
   2355  1.1.1.2  joerg deducedTemplateSpecializationType() matches the type in the declaration
   2356  1.1.1.2  joerg of the variable c.
   2357  1.1.1.2  joerg </pre></td></tr>
   2358  1.1.1.2  joerg 
   2359  1.1.1.2  joerg 
   2360      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
   2362      1.1  joerg 
   2363      1.1  joerg Given
   2364      1.1  joerg   template&lt;typename T, int Size&gt;
   2365      1.1  joerg   class array {
   2366      1.1  joerg     T data[Size];
   2367      1.1  joerg   };
   2368      1.1  joerg dependentSizedArrayType
   2369      1.1  joerg   matches "T data[Size]"
   2370      1.1  joerg </pre></td></tr>
   2371      1.1  joerg 
   2372      1.1  joerg 
   2373      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
   2375      1.1  joerg qualified name.
   2376      1.1  joerg 
   2377      1.1  joerg Given
   2378      1.1  joerg   namespace N {
   2379      1.1  joerg     namespace M {
   2380      1.1  joerg       class D {};
   2381      1.1  joerg     }
   2382      1.1  joerg   }
   2383      1.1  joerg   class C {};
   2384      1.1  joerg 
   2385      1.1  joerg   class C c;
   2386      1.1  joerg   N::M::D d;
   2387      1.1  joerg 
   2388      1.1  joerg elaboratedType() matches the type of the variable declarations of both
   2389      1.1  joerg c and d.
   2390      1.1  joerg </pre></td></tr>
   2391      1.1  joerg 
   2392      1.1  joerg 
   2393      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
   2395      1.1  joerg 
   2396      1.1  joerg Given
   2397      1.1  joerg   enum C { Green };
   2398      1.1  joerg   enum class S { Red };
   2399      1.1  joerg 
   2400      1.1  joerg   C c;
   2401      1.1  joerg   S s;
   2402      1.1  joerg 
   2403      1.1  joerg enumType() matches the type of the variable declarations of both c and
   2404      1.1  joerg s.
   2405      1.1  joerg </pre></td></tr>
   2406      1.1  joerg 
   2407      1.1  joerg 
   2408      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
   2410      1.1  joerg 
   2411      1.1  joerg Given
   2412      1.1  joerg   int (*f)(int);
   2413      1.1  joerg   void g();
   2414      1.1  joerg functionProtoType()
   2415      1.1  joerg   matches "int (*f)(int)" and the type of "g" in C++ mode.
   2416      1.1  joerg   In C mode, "g" is not matched because it does not contain a prototype.
   2417      1.1  joerg </pre></td></tr>
   2418      1.1  joerg 
   2419      1.1  joerg 
   2420      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
   2422      1.1  joerg 
   2423      1.1  joerg Given
   2424      1.1  joerg   int (*f)(int);
   2425      1.1  joerg   void g();
   2426      1.1  joerg functionType()
   2427      1.1  joerg   matches "int (*f)(int)" and the type of "g".
   2428      1.1  joerg </pre></td></tr>
   2429      1.1  joerg 
   2430      1.1  joerg 
   2431      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
   2433      1.1  joerg 
   2434      1.1  joerg Given
   2435      1.1  joerg   int a[] = { 2, 3 };
   2436      1.1  joerg   int b[42];
   2437      1.1  joerg   void f(int c[]) { int d[a[0]]; };
   2438      1.1  joerg incompleteArrayType()
   2439      1.1  joerg   matches "int a[]" and "int c[]"
   2440      1.1  joerg </pre></td></tr>
   2441      1.1  joerg 
   2442      1.1  joerg 
   2443      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
   2445      1.1  joerg 
   2446      1.1  joerg Example matches S s, but not S&lt;T&gt; s.
   2447      1.1  joerg     (matcher = parmVarDecl(hasType(injectedClassNameType())))
   2448      1.1  joerg   template &lt;typename T&gt; struct S {
   2449      1.1  joerg     void f(S s);
   2450      1.1  joerg     void g(S&lt;T&gt; s);
   2451      1.1  joerg   };
   2452      1.1  joerg </pre></td></tr>
   2453      1.1  joerg 
   2454      1.1  joerg 
   2455      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
   2457      1.1  joerg 
   2458      1.1  joerg Given:
   2459      1.1  joerg   int *a;
   2460      1.1  joerg   int &amp;b = *a;
   2461      1.1  joerg   int &amp;&amp;c = 1;
   2462      1.1  joerg   auto &amp;d = b;
   2463      1.1  joerg   auto &amp;&amp;e = c;
   2464      1.1  joerg   auto &amp;&amp;f = 2;
   2465      1.1  joerg   int g = 5;
   2466      1.1  joerg 
   2467      1.1  joerg lValueReferenceType() matches the types of b, d, and e. e is
   2468      1.1  joerg matched since the type is deduced as int&amp; by reference collapsing rules.
   2469      1.1  joerg </pre></td></tr>
   2470      1.1  joerg 
   2471      1.1  joerg 
   2472      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
   2474      1.1  joerg Given
   2475      1.1  joerg   struct A { int i; }
   2476      1.1  joerg   A::* ptr = A::i;
   2477      1.1  joerg memberPointerType()
   2478      1.1  joerg   matches "A::* ptr"
   2479      1.1  joerg </pre></td></tr>
   2480      1.1  joerg 
   2481      1.1  joerg 
   2482      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
   2484      1.1  joerg a pointer type, despite being syntactically similar.
   2485      1.1  joerg 
   2486      1.1  joerg Given
   2487      1.1  joerg   int *a;
   2488      1.1  joerg 
   2489      1.1  joerg   @interface Foo
   2490      1.1  joerg   @end
   2491      1.1  joerg   Foo *f;
   2492      1.1  joerg pointerType()
   2493      1.1  joerg   matches "Foo *f", but does not match "int *a".
   2494      1.1  joerg </pre></td></tr>
   2495      1.1  joerg 
   2496      1.1  joerg 
   2497      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
   2499      1.1  joerg 
   2500      1.1  joerg Given
   2501      1.1  joerg   int (*ptr_to_array)[4];
   2502      1.1  joerg   int *array_of_ptrs[4];
   2503      1.1  joerg 
   2504      1.1  joerg varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
   2505      1.1  joerg array_of_ptrs.
   2506      1.1  joerg </pre></td></tr>
   2507      1.1  joerg 
   2508      1.1  joerg 
   2509      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
   2511      1.1  joerg types.
   2512      1.1  joerg 
   2513      1.1  joerg Given
   2514      1.1  joerg   int *a;
   2515      1.1  joerg   int &amp;b = *a;
   2516      1.1  joerg   int c = 5;
   2517      1.1  joerg 
   2518      1.1  joerg   @interface Foo
   2519      1.1  joerg   @end
   2520      1.1  joerg   Foo *f;
   2521      1.1  joerg pointerType()
   2522      1.1  joerg   matches "int *a", but does not match "Foo *f".
   2523      1.1  joerg </pre></td></tr>
   2524      1.1  joerg 
   2525      1.1  joerg 
   2526      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
   2528      1.1  joerg 
   2529      1.1  joerg Given:
   2530      1.1  joerg   int *a;
   2531      1.1  joerg   int &amp;b = *a;
   2532      1.1  joerg   int &amp;&amp;c = 1;
   2533      1.1  joerg   auto &amp;d = b;
   2534      1.1  joerg   auto &amp;&amp;e = c;
   2535      1.1  joerg   auto &amp;&amp;f = 2;
   2536      1.1  joerg   int g = 5;
   2537      1.1  joerg 
   2538      1.1  joerg rValueReferenceType() matches the types of c and f. e is not
   2539      1.1  joerg matched as it is deduced to int&amp; by reference collapsing rules.
   2540      1.1  joerg </pre></td></tr>
   2541      1.1  joerg 
   2542      1.1  joerg 
   2543      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
   2545      1.1  joerg 
   2546      1.1  joerg Given
   2547      1.1  joerg   class C {};
   2548      1.1  joerg   struct S {};
   2549      1.1  joerg 
   2550      1.1  joerg   C c;
   2551      1.1  joerg   S s;
   2552      1.1  joerg 
   2553      1.1  joerg recordType() matches the type of the variable declarations of both c
   2554      1.1  joerg and s.
   2555      1.1  joerg </pre></td></tr>
   2556      1.1  joerg 
   2557      1.1  joerg 
   2558      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
   2560      1.1  joerg 
   2561      1.1  joerg Given
   2562      1.1  joerg   int *a;
   2563      1.1  joerg   int &amp;b = *a;
   2564      1.1  joerg   int &amp;&amp;c = 1;
   2565      1.1  joerg   auto &amp;d = b;
   2566      1.1  joerg   auto &amp;&amp;e = c;
   2567      1.1  joerg   auto &amp;&amp;f = 2;
   2568      1.1  joerg   int g = 5;
   2569      1.1  joerg 
   2570      1.1  joerg referenceType() matches the types of b, c, d, e, and f.
   2571      1.1  joerg </pre></td></tr>
   2572      1.1  joerg 
   2573      1.1  joerg 
   2574      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
   2576      1.1  joerg template type parameter.
   2577      1.1  joerg 
   2578      1.1  joerg Given
   2579      1.1  joerg   template &lt;typename T&gt;
   2580      1.1  joerg   void F(T t) {
   2581      1.1  joerg     int i = 1 + t;
   2582      1.1  joerg   }
   2583      1.1  joerg 
   2584      1.1  joerg substTemplateTypeParmType() matches the type of 't' but not '1'
   2585      1.1  joerg </pre></td></tr>
   2586      1.1  joerg 
   2587      1.1  joerg 
   2588      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
   2590      1.1  joerg 
   2591      1.1  joerg Given
   2592      1.1  joerg   enum E {};
   2593      1.1  joerg   class C {};
   2594      1.1  joerg 
   2595      1.1  joerg   E e;
   2596      1.1  joerg   C c;
   2597      1.1  joerg 
   2598      1.1  joerg tagType() matches the type of the variable declarations of both e
   2599      1.1  joerg and c.
   2600      1.1  joerg </pre></td></tr>
   2601      1.1  joerg 
   2602      1.1  joerg 
   2603      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
   2605      1.1  joerg 
   2606      1.1  joerg Given
   2607      1.1  joerg   template &lt;typename T&gt;
   2608      1.1  joerg   class C { };
   2609      1.1  joerg 
   2610      1.1  joerg   template class C&lt;int&gt;;  // A
   2611      1.1  joerg   C&lt;char&gt; var;            // B
   2612      1.1  joerg 
   2613      1.1  joerg templateSpecializationType() matches the type of the explicit
   2614      1.1  joerg instantiation in A and the type of the variable declaration in B.
   2615      1.1  joerg </pre></td></tr>
   2616      1.1  joerg 
   2617      1.1  joerg 
   2618      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
   2620      1.1  joerg 
   2621      1.1  joerg Example matches T, but not int.
   2622      1.1  joerg     (matcher = templateTypeParmType())
   2623      1.1  joerg   template &lt;typename T&gt; void f(int i);
   2624      1.1  joerg </pre></td></tr>
   2625      1.1  joerg 
   2626      1.1  joerg 
   2627      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
   2629      1.1  joerg </pre></td></tr>
   2630      1.1  joerg 
   2631      1.1  joerg 
   2632      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
   2634      1.1  joerg 
   2635      1.1  joerg Given
   2636      1.1  joerg   typedef int X;
   2637      1.1  joerg typedefType()
   2638      1.1  joerg   matches "typedef int X"
   2639      1.1  joerg </pre></td></tr>
   2640      1.1  joerg 
   2641      1.1  joerg 
   2642      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
   2644      1.1  joerg 
   2645      1.1  joerg Given:
   2646      1.1  joerg   typedef __underlying_type(T) type;
   2647      1.1  joerg unaryTransformType()
   2648      1.1  joerg   matches "__underlying_type(T)"
   2649      1.1  joerg </pre></td></tr>
   2650      1.1  joerg 
   2651      1.1  joerg 
   2652      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
   2654      1.1  joerg integer-constant-expression.
   2655      1.1  joerg 
   2656      1.1  joerg Given
   2657      1.1  joerg   void f() {
   2658      1.1  joerg     int a[] = { 2, 3 }
   2659      1.1  joerg     int b[42];
   2660      1.1  joerg     int c[a[0]];
   2661      1.1  joerg   }
   2662      1.1  joerg variableArrayType()
   2663      1.1  joerg   matches "int c[a[0]]"
   2664      1.1  joerg </pre></td></tr>
   2665      1.1  joerg 
   2666      1.1  joerg <!--END_DECL_MATCHERS -->
   2667      1.1  joerg </table>
   2668      1.1  joerg 
   2669      1.1  joerg <!-- ======================================================================= -->
   2670      1.1  joerg <h2 id="narrowing-matchers">Narrowing Matchers</h2>
   2671      1.1  joerg <!-- ======================================================================= -->
   2672      1.1  joerg 
   2673      1.1  joerg <p>Narrowing matchers match certain attributes on the current node, thus
   2674      1.1  joerg narrowing down the set of nodes of the current type to match on.</p>
   2675      1.1  joerg 
   2676      1.1  joerg <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
   2677      1.1  joerg which allow users to create more powerful match expressions.</p>
   2678      1.1  joerg 
   2679      1.1  joerg <table>
   2680      1.1  joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
   2681      1.1  joerg <!-- START_NARROWING_MATCHERS -->
   2682      1.1  joerg 
   2683      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
   2685      1.1  joerg 
   2686      1.1  joerg Usable as: Any Matcher
   2687      1.1  joerg </pre></td></tr>
   2688      1.1  joerg 
   2689      1.1  joerg 
   2690      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
   2692      1.1  joerg 
   2693      1.1  joerg Usable as: Any Matcher
   2694      1.1  joerg </pre></td></tr>
   2695      1.1  joerg 
   2696      1.1  joerg 
   2697      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
   2698      1.1  joerg <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
   2699      1.1  joerg 
   2700      1.1  joerg Useful when another matcher requires a child matcher, but there's no
   2701      1.1  joerg additional constraint. This will often be used with an explicit conversion
   2702      1.1  joerg to an internal::Matcher&lt;&gt; type such as TypeMatcher.
   2703      1.1  joerg 
   2704      1.1  joerg Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
   2705      1.1  joerg "int* p" and "void f()" in
   2706      1.1  joerg   int* p;
   2707      1.1  joerg   void f();
   2708      1.1  joerg 
   2709      1.1  joerg Usable as: Any Matcher
   2710      1.1  joerg </pre></td></tr>
   2711      1.1  joerg 
   2712      1.1  joerg 
   2713  1.1.1.2  joerg <tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
   2714  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
   2715  1.1.1.2  joerg 
   2716  1.1.1.2  joerg Given
   2717  1.1.1.2  joerg   if (true);
   2718  1.1.1.2  joerg   for (; true; );
   2719  1.1.1.2  joerg with the matcher
   2720  1.1.1.2  joerg   mapAnyOf(ifStmt, forStmt).with(
   2721  1.1.1.2  joerg     hasCondition(cxxBoolLiteralExpr(equals(true)))
   2722  1.1.1.2  joerg     ).bind("trueCond")
   2723  1.1.1.2  joerg matches the if and the for. It is equivalent to:
   2724  1.1.1.2  joerg   auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
   2725  1.1.1.2  joerg   anyOf(
   2726  1.1.1.2  joerg     ifStmt(trueCond).bind("trueCond"),
   2727  1.1.1.2  joerg     forStmt(trueCond).bind("trueCond")
   2728  1.1.1.2  joerg     );
   2729  1.1.1.2  joerg 
   2730  1.1.1.2  joerg The with() chain-call accepts zero or more matchers which are combined
   2731  1.1.1.2  joerg as-if with allOf() in each of the node matchers.
   2732  1.1.1.2  joerg Usable as: Any Matcher
   2733  1.1.1.2  joerg </pre></td></tr>
   2734  1.1.1.2  joerg 
   2735  1.1.1.2  joerg 
   2736      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
   2737      1.1  joerg <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
   2738      1.1  joerg 
   2739      1.1  joerg Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
   2740      1.1  joerg   class X {};
   2741      1.1  joerg   class Y {};
   2742      1.1  joerg 
   2743      1.1  joerg Usable as: Any Matcher
   2744      1.1  joerg </pre></td></tr>
   2745      1.1  joerg 
   2746      1.1  joerg 
   2747  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
   2749  1.1.1.2  joerg specified names.
   2750  1.1.1.2  joerg 
   2751  1.1.1.2  joerg    hasAnyOperatorName("+", "-")
   2752  1.1.1.2  joerg  Is equivalent to
   2753  1.1.1.2  joerg    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   2754  1.1.1.2  joerg </pre></td></tr>
   2755  1.1.1.2  joerg 
   2756  1.1.1.2  joerg 
   2757      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
   2759      1.1  joerg unary).
   2760      1.1  joerg 
   2761      1.1  joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   2762      1.1  joerg   !(a || b)
   2763      1.1  joerg </pre></td></tr>
   2764      1.1  joerg 
   2765      1.1  joerg 
   2766      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
   2768      1.1  joerg 
   2769      1.1  joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   2770      1.1  joerg   if (a == b)
   2771      1.1  joerg     a += b;
   2772      1.1  joerg 
   2773      1.1  joerg Example 2: matches s1 = s2
   2774      1.1  joerg            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   2775      1.1  joerg   struct S { S&amp; operator=(const S&amp;); };
   2776  1.1.1.2  joerg   void x() { S s1, s2; s1 = s2; }
   2777      1.1  joerg </pre></td></tr>
   2778      1.1  joerg 
   2779      1.1  joerg 
   2780  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
   2782      1.1  joerg 
   2783  1.1.1.2  joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   2784  1.1.1.2  joerg   if (a == b)
   2785  1.1.1.2  joerg     a += b;
   2786      1.1  joerg 
   2787  1.1.1.2  joerg Example 2: matches s1 &lt; s2
   2788  1.1.1.2  joerg            (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   2789  1.1.1.2  joerg   struct S { bool operator&lt;(const S&amp; other); };
   2790  1.1.1.2  joerg   void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
   2791  1.1.1.2  joerg </pre></td></tr>
   2792      1.1  joerg 
   2793  1.1.1.2  joerg 
   2794  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
   2796  1.1.1.2  joerg inheritance.
   2797  1.1.1.2  joerg 
   2798  1.1.1.2  joerg Examples:
   2799  1.1.1.2  joerg   class C {
   2800  1.1.1.2  joerg   public:    int a;
   2801  1.1.1.2  joerg   protected: int b;
   2802  1.1.1.2  joerg   private:   int c; // fieldDecl(isPrivate()) matches 'c'
   2803  1.1.1.2  joerg   };
   2804  1.1.1.2  joerg 
   2805  1.1.1.2  joerg   struct Base {};
   2806  1.1.1.2  joerg   struct Derived1 : private Base {}; // matches 'Base'
   2807  1.1.1.2  joerg   class Derived2 : Base {}; // matches 'Base'
   2808  1.1.1.2  joerg </pre></td></tr>
   2809  1.1.1.2  joerg 
   2810  1.1.1.2  joerg 
   2811  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
   2813  1.1.1.2  joerg protected inheritance.
   2814  1.1.1.2  joerg 
   2815  1.1.1.2  joerg Examples:
   2816  1.1.1.2  joerg   class C {
   2817  1.1.1.2  joerg   public:    int a;
   2818  1.1.1.2  joerg   protected: int b; // fieldDecl(isProtected()) matches 'b'
   2819  1.1.1.2  joerg   private:   int c;
   2820  1.1.1.2  joerg   };
   2821  1.1.1.2  joerg 
   2822  1.1.1.2  joerg   class Base {};
   2823  1.1.1.2  joerg   class Derived : protected Base {}; // matches 'Base'
   2824  1.1.1.2  joerg </pre></td></tr>
   2825  1.1.1.2  joerg 
   2826  1.1.1.2  joerg 
   2827  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
   2829  1.1.1.2  joerg inheritance.
   2830  1.1.1.2  joerg 
   2831  1.1.1.2  joerg Examples:
   2832  1.1.1.2  joerg   class C {
   2833  1.1.1.2  joerg   public:    int a; // fieldDecl(isPublic()) matches 'a'
   2834  1.1.1.2  joerg   protected: int b;
   2835  1.1.1.2  joerg   private:   int c;
   2836  1.1.1.2  joerg   };
   2837  1.1.1.2  joerg 
   2838  1.1.1.2  joerg   class Base {};
   2839  1.1.1.2  joerg   class Derived1 : public Base {}; // matches 'Base'
   2840  1.1.1.2  joerg   struct Derived2 : Base {}; // matches 'Base'
   2841  1.1.1.2  joerg </pre></td></tr>
   2842  1.1.1.2  joerg 
   2843  1.1.1.2  joerg 
   2844  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
   2846  1.1.1.2  joerg virtual inheritance.
   2847  1.1.1.2  joerg 
   2848  1.1.1.2  joerg Example:
   2849  1.1.1.2  joerg   class A {
   2850  1.1.1.2  joerg    public:
   2851  1.1.1.2  joerg     virtual void x(); // matches x
   2852  1.1.1.2  joerg   };
   2853  1.1.1.2  joerg 
   2854  1.1.1.2  joerg Example:
   2855  1.1.1.2  joerg   class Base {};
   2856  1.1.1.2  joerg   class DirectlyDerived : virtual Base {}; // matches Base
   2857  1.1.1.2  joerg   class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
   2858  1.1.1.2  joerg 
   2859  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg </pre></td></tr>
   2861  1.1.1.2  joerg 
   2862  1.1.1.2  joerg 
   2863  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
   2865  1.1.1.2  joerg 
   2866  1.1.1.2  joerg 
   2867  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
   2869  1.1.1.2  joerg 
   2870  1.1.1.2  joerg Given
   2871  1.1.1.2  joerg   f('false, 3.14, 42);
   2872      1.1  joerg characterLiteral(equals(0))
   2873      1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   2874      1.1  joerg   match false
   2875      1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   2876      1.1  joerg   match 3.14
   2877      1.1  joerg integerLiteral(equals(42))
   2878      1.1  joerg   matches 42
   2879      1.1  joerg 
   2880      1.1  joerg Note that you cannot directly match a negative numeric literal because the
   2881      1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   2882      1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   2883      1.1  joerg matcher to match the minus sign:
   2884      1.1  joerg 
   2885      1.1  joerg unaryOperator(hasOperatorName("-"),
   2886      1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   2887      1.1  joerg 
   2888      1.1  joerg Usable as: Matcher&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      1.1  joerg            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      1.1  joerg </pre></td></tr>
   2891      1.1  joerg 
   2892      1.1  joerg 
   2893      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
   2895      1.1  joerg 
   2896      1.1  joerg 
   2897      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
   2899      1.1  joerg 
   2900      1.1  joerg 
   2901      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
   2903      1.1  joerg 
   2904      1.1  joerg Given
   2905      1.1  joerg   try {
   2906      1.1  joerg     // ...
   2907      1.1  joerg   } catch (int) {
   2908      1.1  joerg     // ...
   2909      1.1  joerg   } catch (...) {
   2910      1.1  joerg     // ...
   2911      1.1  joerg   }
   2912      1.1  joerg cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
   2913      1.1  joerg </pre></td></tr>
   2914      1.1  joerg 
   2915      1.1  joerg 
   2916      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
   2918      1.1  joerg a specific number of arguments (including absent default arguments).
   2919      1.1  joerg 
   2920      1.1  joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   2921      1.1  joerg   void f(int x, int y);
   2922      1.1  joerg   f(0, 0);
   2923      1.1  joerg </pre></td></tr>
   2924      1.1  joerg 
   2925      1.1  joerg 
   2926      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
   2928      1.1  joerg </pre></td></tr>
   2929      1.1  joerg 
   2930      1.1  joerg 
   2931      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
   2933      1.1  joerg zero initialization.
   2934      1.1  joerg 
   2935      1.1  joerg Given
   2936      1.1  joerg void foo() {
   2937      1.1  joerg   struct point { double x; double y; };
   2938      1.1  joerg   point pt[2] = { { 1.0, 2.0 } };
   2939      1.1  joerg }
   2940      1.1  joerg initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
   2941      1.1  joerg will match the implicit array filler for pt[1].
   2942      1.1  joerg </pre></td></tr>
   2943      1.1  joerg 
   2944      1.1  joerg 
   2945      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
   2947      1.1  joerg 
   2948      1.1  joerg Given
   2949      1.1  joerg   struct S {
   2950      1.1  joerg     S(); // #1
   2951      1.1  joerg     S(const S &amp;); // #2
   2952      1.1  joerg     S(S &amp;&amp;); // #3
   2953      1.1  joerg   };
   2954      1.1  joerg cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
   2955      1.1  joerg </pre></td></tr>
   2956      1.1  joerg 
   2957      1.1  joerg 
   2958      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
   2960      1.1  joerg 
   2961      1.1  joerg Given
   2962      1.1  joerg   struct S {
   2963      1.1  joerg     S(); // #1
   2964      1.1  joerg     S(const S &amp;); // #2
   2965      1.1  joerg     S(S &amp;&amp;); // #3
   2966      1.1  joerg   };
   2967      1.1  joerg cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
   2968      1.1  joerg </pre></td></tr>
   2969      1.1  joerg 
   2970      1.1  joerg 
   2971      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
   2973      1.1  joerg 
   2974      1.1  joerg Given
   2975      1.1  joerg   struct S {
   2976      1.1  joerg     S(); // #1
   2977      1.1  joerg     S(int) {} // #2
   2978      1.1  joerg     S(S &amp;&amp;) : S() {} // #3
   2979      1.1  joerg   };
   2980      1.1  joerg   S::S() : S(0) {} // #4
   2981      1.1  joerg cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
   2982      1.1  joerg #1 or #2.
   2983      1.1  joerg </pre></td></tr>
   2984      1.1  joerg 
   2985      1.1  joerg 
   2986      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
   2988      1.1  joerg that have an explicit specifier if this explicit specifier is resolved to
   2989      1.1  joerg true.
   2990      1.1  joerg 
   2991      1.1  joerg Given
   2992      1.1  joerg   template&lt;bool b&gt;
   2993      1.1  joerg   struct S {
   2994      1.1  joerg     S(int); // #1
   2995      1.1  joerg     explicit S(double); // #2
   2996      1.1  joerg     operator int(); // #3
   2997      1.1  joerg     explicit operator bool(); // #4
   2998      1.1  joerg     explicit(false) S(bool) // # 7
   2999      1.1  joerg     explicit(true) S(char) // # 8
   3000      1.1  joerg     explicit(b) S(S) // # 9
   3001      1.1  joerg   };
   3002      1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   3003      1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   3004      1.1  joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   3005      1.1  joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
   3006      1.1  joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   3007      1.1  joerg </pre></td></tr>
   3008      1.1  joerg 
   3009      1.1  joerg 
   3010      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
   3012      1.1  joerg 
   3013      1.1  joerg Given
   3014      1.1  joerg   struct S {
   3015      1.1  joerg     S(); // #1
   3016      1.1  joerg     S(const S &amp;); // #2
   3017      1.1  joerg     S(S &amp;&amp;); // #3
   3018      1.1  joerg   };
   3019      1.1  joerg cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
   3020      1.1  joerg </pre></td></tr>
   3021      1.1  joerg 
   3022      1.1  joerg 
   3023      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
   3025      1.1  joerg that have an explicit specifier if this explicit specifier is resolved to
   3026      1.1  joerg true.
   3027      1.1  joerg 
   3028      1.1  joerg Given
   3029      1.1  joerg   template&lt;bool b&gt;
   3030      1.1  joerg   struct S {
   3031      1.1  joerg     S(int); // #1
   3032      1.1  joerg     explicit S(double); // #2
   3033      1.1  joerg     operator int(); // #3
   3034      1.1  joerg     explicit operator bool(); // #4
   3035      1.1  joerg     explicit(false) S(bool) // # 7
   3036      1.1  joerg     explicit(true) S(char) // # 8
   3037      1.1  joerg     explicit(b) S(S) // # 9
   3038      1.1  joerg   };
   3039      1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   3040      1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   3041      1.1  joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   3042      1.1  joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
   3043      1.1  joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   3044      1.1  joerg </pre></td></tr>
   3045      1.1  joerg 
   3046      1.1  joerg 
   3047      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
   3049      1.1  joerg opposed to a member.
   3050      1.1  joerg 
   3051      1.1  joerg Given
   3052      1.1  joerg   struct B {};
   3053      1.1  joerg   struct D : B {
   3054      1.1  joerg     int I;
   3055      1.1  joerg     D(int i) : I(i) {}
   3056      1.1  joerg   };
   3057      1.1  joerg   struct E : B {
   3058      1.1  joerg     E() : B() {}
   3059      1.1  joerg   };
   3060      1.1  joerg cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
   3061      1.1  joerg   will match E(), but not match D(int).
   3062      1.1  joerg </pre></td></tr>
   3063      1.1  joerg 
   3064      1.1  joerg 
   3065      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
   3067      1.1  joerg opposed to a base.
   3068      1.1  joerg 
   3069      1.1  joerg Given
   3070      1.1  joerg   struct B {};
   3071      1.1  joerg   struct D : B {
   3072      1.1  joerg     int I;
   3073      1.1  joerg     D(int i) : I(i) {}
   3074      1.1  joerg   };
   3075      1.1  joerg   struct E : B {
   3076      1.1  joerg     E() : B() {}
   3077      1.1  joerg   };
   3078      1.1  joerg cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
   3079      1.1  joerg   will match D(int), but not match E().
   3080      1.1  joerg </pre></td></tr>
   3081      1.1  joerg 
   3082      1.1  joerg 
   3083      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
   3085      1.1  joerg code (as opposed to implicitly added by the compiler).
   3086      1.1  joerg 
   3087      1.1  joerg Given
   3088      1.1  joerg   struct Foo {
   3089      1.1  joerg     Foo() { }
   3090      1.1  joerg     Foo(int) : foo_("A") { }
   3091      1.1  joerg     string foo_;
   3092      1.1  joerg   };
   3093      1.1  joerg cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
   3094      1.1  joerg   will match Foo(int), but not Foo()
   3095      1.1  joerg </pre></td></tr>
   3096      1.1  joerg 
   3097      1.1  joerg 
   3098      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
   3100      1.1  joerg that have an explicit specifier if this explicit specifier is resolved to
   3101      1.1  joerg true.
   3102      1.1  joerg 
   3103      1.1  joerg Given
   3104      1.1  joerg   template&lt;bool b&gt;
   3105      1.1  joerg   struct S {
   3106      1.1  joerg     S(int); // #1
   3107      1.1  joerg     explicit S(double); // #2
   3108      1.1  joerg     operator int(); // #3
   3109      1.1  joerg     explicit operator bool(); // #4
   3110      1.1  joerg     explicit(false) S(bool) // # 7
   3111      1.1  joerg     explicit(true) S(char) // # 8
   3112      1.1  joerg     explicit(b) S(S) // # 9
   3113      1.1  joerg   };
   3114      1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   3115      1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   3116      1.1  joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   3117      1.1  joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
   3118      1.1  joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   3119      1.1  joerg </pre></td></tr>
   3120      1.1  joerg 
   3121      1.1  joerg 
   3122  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
   3124  1.1.1.2  joerg 
   3125  1.1.1.2  joerg In template declarations, dependent members are not resolved and so can
   3126  1.1.1.2  joerg not be matched to particular named declarations.
   3127  1.1.1.2  joerg 
   3128  1.1.1.2  joerg This matcher allows to match on the known name of members.
   3129  1.1.1.2  joerg 
   3130  1.1.1.2  joerg Given
   3131  1.1.1.2  joerg   template &lt;typename T&gt;
   3132  1.1.1.2  joerg   struct S {
   3133  1.1.1.2  joerg       void mem();
   3134  1.1.1.2  joerg   };
   3135  1.1.1.2  joerg   template &lt;typename T&gt;
   3136  1.1.1.2  joerg   void x() {
   3137  1.1.1.2  joerg       S&lt;T&gt; s;
   3138  1.1.1.2  joerg       s.mem();
   3139  1.1.1.2  joerg   }
   3140  1.1.1.2  joerg cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
   3141  1.1.1.2  joerg </pre></td></tr>
   3142  1.1.1.2  joerg 
   3143  1.1.1.2  joerg 
   3144      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
   3146      1.1  joerg to '.'.
   3147      1.1  joerg 
   3148      1.1  joerg Member calls on the implicit this pointer match as called with '-&gt;'.
   3149      1.1  joerg 
   3150      1.1  joerg Given
   3151      1.1  joerg   class Y {
   3152      1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   3153      1.1  joerg     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   3154      1.1  joerg     int a;
   3155      1.1  joerg     static int b;
   3156      1.1  joerg   };
   3157      1.1  joerg   template &lt;class T&gt;
   3158      1.1  joerg   class Z {
   3159      1.1  joerg     void x() { this-&gt;m; }
   3160      1.1  joerg   };
   3161      1.1  joerg memberExpr(isArrow())
   3162      1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   3163      1.1  joerg cxxDependentScopeMemberExpr(isArrow())
   3164      1.1  joerg   matches this-&gt;m
   3165      1.1  joerg unresolvedMemberExpr(isArrow())
   3166      1.1  joerg   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   3167      1.1  joerg </pre></td></tr>
   3168      1.1  joerg 
   3169      1.1  joerg 
   3170  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
   3172  1.1.1.2  joerg node
   3173  1.1.1.2  joerg 
   3174  1.1.1.2  joerg In template declarations, dependent members are not resolved and so can
   3175  1.1.1.2  joerg not be matched to particular named declarations.
   3176  1.1.1.2  joerg 
   3177  1.1.1.2  joerg This matcher allows to match on the name of already-bound VarDecl, FieldDecl
   3178  1.1.1.2  joerg and CXXMethodDecl nodes.
   3179  1.1.1.2  joerg 
   3180  1.1.1.2  joerg Given
   3181  1.1.1.2  joerg   template &lt;typename T&gt;
   3182  1.1.1.2  joerg   struct S {
   3183  1.1.1.2  joerg       void mem();
   3184  1.1.1.2  joerg   };
   3185  1.1.1.2  joerg   template &lt;typename T&gt;
   3186  1.1.1.2  joerg   void x() {
   3187  1.1.1.2  joerg       S&lt;T&gt; s;
   3188  1.1.1.2  joerg       s.mem();
   3189  1.1.1.2  joerg   }
   3190  1.1.1.2  joerg The matcher
   3191  1.1.1.2  joerg @code
   3192  1.1.1.2  joerg cxxDependentScopeMemberExpr(
   3193  1.1.1.2  joerg   hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
   3194  1.1.1.2  joerg       hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
   3195  1.1.1.2  joerg           cxxMethodDecl(hasName("mem")).bind("templMem")
   3196  1.1.1.2  joerg           )))))
   3197  1.1.1.2  joerg       )))),
   3198  1.1.1.2  joerg   memberHasSameNameAsBoundNode("templMem")
   3199  1.1.1.2  joerg   )
   3200  1.1.1.2  joerg @endcode
   3201  1.1.1.2  joerg first matches and binds the @c mem member of the @c S template, then
   3202  1.1.1.2  joerg compares its name to the usage in @c s.mem() in the @c x function template
   3203  1.1.1.2  joerg </pre></td></tr>
   3204  1.1.1.2  joerg 
   3205  1.1.1.2  joerg 
   3206      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
   3208      1.1  joerg 
   3209      1.1  joerg Given
   3210      1.1  joerg struct A {
   3211      1.1  joerg   void foo() const;
   3212      1.1  joerg   void bar();
   3213      1.1  joerg };
   3214      1.1  joerg 
   3215      1.1  joerg cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
   3216      1.1  joerg </pre></td></tr>
   3217      1.1  joerg 
   3218      1.1  joerg 
   3219      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
   3221      1.1  joerg operator.
   3222      1.1  joerg 
   3223      1.1  joerg Given
   3224      1.1  joerg struct A {
   3225      1.1  joerg   A &amp;operator=(const A &amp;);
   3226      1.1  joerg   A &amp;operator=(A &amp;&amp;);
   3227      1.1  joerg };
   3228      1.1  joerg 
   3229      1.1  joerg cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
   3230      1.1  joerg the second one.
   3231      1.1  joerg </pre></td></tr>
   3232      1.1  joerg 
   3233      1.1  joerg 
   3234      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
   3236      1.1  joerg 
   3237      1.1  joerg Given:
   3238      1.1  joerg   class A final {};
   3239      1.1  joerg 
   3240      1.1  joerg   struct B {
   3241      1.1  joerg     virtual void f();
   3242      1.1  joerg   };
   3243      1.1  joerg 
   3244      1.1  joerg   struct C : B {
   3245      1.1  joerg     void f() final;
   3246      1.1  joerg   };
   3247      1.1  joerg matches A and C::f, but not B, C, or B::f
   3248      1.1  joerg </pre></td></tr>
   3249      1.1  joerg 
   3250      1.1  joerg 
   3251      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
   3253      1.1  joerg operator.
   3254      1.1  joerg 
   3255      1.1  joerg Given
   3256      1.1  joerg struct A {
   3257      1.1  joerg   A &amp;operator=(const A &amp;);
   3258      1.1  joerg   A &amp;operator=(A &amp;&amp;);
   3259      1.1  joerg };
   3260      1.1  joerg 
   3261      1.1  joerg cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
   3262      1.1  joerg the first one.
   3263      1.1  joerg </pre></td></tr>
   3264      1.1  joerg 
   3265      1.1  joerg 
   3266      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
   3268      1.1  joerg 
   3269      1.1  joerg Given
   3270      1.1  joerg   class A {
   3271      1.1  joerg    public:
   3272      1.1  joerg     virtual void x();
   3273      1.1  joerg   };
   3274      1.1  joerg   class B : public A {
   3275      1.1  joerg    public:
   3276      1.1  joerg     virtual void x();
   3277      1.1  joerg   };
   3278      1.1  joerg   matches B::x
   3279      1.1  joerg </pre></td></tr>
   3280      1.1  joerg 
   3281      1.1  joerg 
   3282      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
   3284      1.1  joerg 
   3285      1.1  joerg Given
   3286      1.1  joerg   class A {
   3287      1.1  joerg    public:
   3288      1.1  joerg     virtual void x() = 0;
   3289      1.1  joerg   };
   3290      1.1  joerg   matches A::x
   3291      1.1  joerg </pre></td></tr>
   3292      1.1  joerg 
   3293      1.1  joerg 
   3294      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
   3296      1.1  joerg 
   3297      1.1  joerg Given
   3298      1.1  joerg   struct S {
   3299      1.1  joerg     S(); // #1
   3300      1.1  joerg     S(const S &amp;) = default; // #2
   3301      1.1  joerg     S(S &amp;&amp;) = delete; // #3
   3302      1.1  joerg   };
   3303      1.1  joerg cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
   3304      1.1  joerg </pre></td></tr>
   3305      1.1  joerg 
   3306      1.1  joerg 
   3307      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
   3309  1.1.1.2  joerg virtual inheritance.
   3310      1.1  joerg 
   3311  1.1.1.2  joerg Example:
   3312      1.1  joerg   class A {
   3313      1.1  joerg    public:
   3314  1.1.1.2  joerg     virtual void x(); // matches x
   3315      1.1  joerg   };
   3316  1.1.1.2  joerg 
   3317  1.1.1.2  joerg Example:
   3318  1.1.1.2  joerg   class Base {};
   3319  1.1.1.2  joerg   class DirectlyDerived : virtual Base {}; // matches Base
   3320  1.1.1.2  joerg   class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
   3321  1.1.1.2  joerg 
   3322  1.1.1.2  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   3324      1.1  joerg 
   3325      1.1  joerg 
   3326      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
   3328      1.1  joerg 
   3329      1.1  joerg Given
   3330      1.1  joerg   class A {
   3331      1.1  joerg    public:
   3332      1.1  joerg     virtual void x();
   3333      1.1  joerg   };
   3334      1.1  joerg   class B : public A {
   3335      1.1  joerg    public:
   3336      1.1  joerg     void x();
   3337      1.1  joerg   };
   3338      1.1  joerg   matches A::x but not B::x
   3339      1.1  joerg </pre></td></tr>
   3340      1.1  joerg 
   3341      1.1  joerg 
   3342      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
   3344      1.1  joerg 
   3345      1.1  joerg Given:
   3346      1.1  joerg   MyClass *p1 = new MyClass[10];
   3347      1.1  joerg cxxNewExpr(isArray())
   3348      1.1  joerg   matches the expression 'new MyClass[10]'.
   3349      1.1  joerg </pre></td></tr>
   3350      1.1  joerg 
   3351      1.1  joerg 
   3352  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
   3354  1.1.1.2  joerg specified names.
   3355  1.1.1.2  joerg 
   3356  1.1.1.2  joerg    hasAnyOperatorName("+", "-")
   3357  1.1.1.2  joerg  Is equivalent to
   3358  1.1.1.2  joerg    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   3359  1.1.1.2  joerg </pre></td></tr>
   3360  1.1.1.2  joerg 
   3361  1.1.1.2  joerg 
   3362  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
   3364  1.1.1.2  joerg 
   3365  1.1.1.2  joerg Matches overloaded operator names specified in strings without the
   3366  1.1.1.2  joerg "operator" prefix: e.g. "&lt;&lt;".
   3367  1.1.1.2  joerg 
   3368  1.1.1.2  joerg   hasAnyOverloadedOperatorName("+", "-")
   3369  1.1.1.2  joerg Is equivalent to
   3370  1.1.1.2  joerg   anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
   3371  1.1.1.2  joerg </pre></td></tr>
   3372  1.1.1.2  joerg 
   3373  1.1.1.2  joerg 
   3374  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
   3376  1.1.1.2  joerg unary).
   3377  1.1.1.2  joerg 
   3378  1.1.1.2  joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   3379  1.1.1.2  joerg   !(a || b)
   3380  1.1.1.2  joerg </pre></td></tr>
   3381  1.1.1.2  joerg 
   3382  1.1.1.2  joerg 
   3383      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
   3385      1.1  joerg 
   3386      1.1  joerg Matches overloaded operator names specified in strings without the
   3387      1.1  joerg "operator" prefix: e.g. "&lt;&lt;".
   3388      1.1  joerg 
   3389      1.1  joerg Given:
   3390      1.1  joerg   class A { int operator*(); };
   3391      1.1  joerg   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
   3392      1.1  joerg   A a;
   3393      1.1  joerg   a &lt;&lt; a;   // &lt;-- This matches
   3394      1.1  joerg 
   3395      1.1  joerg cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
   3396      1.1  joerg specified line and
   3397      1.1  joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
   3398      1.1  joerg matches the declaration of A.
   3399      1.1  joerg 
   3400      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   3402      1.1  joerg 
   3403      1.1  joerg 
   3404      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
   3406      1.1  joerg 
   3407      1.1  joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   3408      1.1  joerg   if (a == b)
   3409      1.1  joerg     a += b;
   3410      1.1  joerg 
   3411      1.1  joerg Example 2: matches s1 = s2
   3412      1.1  joerg            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   3413      1.1  joerg   struct S { S&amp; operator=(const S&amp;); };
   3414  1.1.1.2  joerg   void x() { S s1, s2; s1 = s2; }
   3415  1.1.1.2  joerg </pre></td></tr>
   3416  1.1.1.2  joerg 
   3417  1.1.1.2  joerg 
   3418  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
   3420  1.1.1.2  joerg 
   3421  1.1.1.2  joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   3422  1.1.1.2  joerg   if (a == b)
   3423  1.1.1.2  joerg     a += b;
   3424  1.1.1.2  joerg 
   3425  1.1.1.2  joerg Example 2: matches s1 &lt; s2
   3426  1.1.1.2  joerg            (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   3427  1.1.1.2  joerg   struct S { bool operator&lt;(const S&amp; other); };
   3428  1.1.1.2  joerg   void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
   3429      1.1  joerg </pre></td></tr>
   3430      1.1  joerg 
   3431      1.1  joerg 
   3432      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
   3434      1.1  joerg 
   3435      1.1  joerg Example matches x (matcher = cxxRecordDecl(hasDefinition()))
   3436      1.1  joerg class x {};
   3437      1.1  joerg class y;
   3438      1.1  joerg </pre></td></tr>
   3439      1.1  joerg 
   3440      1.1  joerg 
   3441      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
   3443      1.1  joerg </pre></td></tr>
   3444      1.1  joerg 
   3445      1.1  joerg 
   3446      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
   3448      1.1  joerg </pre></td></tr>
   3449      1.1  joerg 
   3450      1.1  joerg 
   3451      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
   3453      1.1  joerg static member variable template instantiations.
   3454      1.1  joerg 
   3455      1.1  joerg Given
   3456      1.1  joerg   template&lt;typename T&gt; void A(T t) { }
   3457      1.1  joerg   template&lt;&gt; void A(int N) { }
   3458      1.1  joerg functionDecl(isExplicitTemplateSpecialization())
   3459      1.1  joerg   matches the specialization A&lt;int&gt;().
   3460      1.1  joerg 
   3461      1.1  joerg 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      1.1  joerg </pre></td></tr>
   3463      1.1  joerg 
   3464      1.1  joerg 
   3465      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
   3467      1.1  joerg 
   3468      1.1  joerg Given:
   3469      1.1  joerg   class A final {};
   3470      1.1  joerg 
   3471      1.1  joerg   struct B {
   3472      1.1  joerg     virtual void f();
   3473      1.1  joerg   };
   3474      1.1  joerg 
   3475      1.1  joerg   struct C : B {
   3476      1.1  joerg     void f() final;
   3477      1.1  joerg   };
   3478      1.1  joerg matches A and C::f, but not B, C, or B::f
   3479      1.1  joerg </pre></td></tr>
   3480      1.1  joerg 
   3481      1.1  joerg 
   3482      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
   3484      1.1  joerg 
   3485      1.1  joerg Given:
   3486      1.1  joerg   auto x = []{};
   3487      1.1  joerg 
   3488      1.1  joerg cxxRecordDecl(isLambda()) matches the implicit class declaration of
   3489      1.1  joerg decltype(x)
   3490      1.1  joerg </pre></td></tr>
   3491      1.1  joerg 
   3492      1.1  joerg 
   3493      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
   3495      1.1  joerg isSameOrDerivedFrom(hasName(...)).
   3496      1.1  joerg </pre></td></tr>
   3497      1.1  joerg 
   3498      1.1  joerg 
   3499      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
   3501      1.1  joerg member variable template instantiations.
   3502      1.1  joerg 
   3503      1.1  joerg Given
   3504      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   3505      1.1  joerg or
   3506      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   3507      1.1  joerg or
   3508      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   3509      1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   3510      1.1  joerg   matches the template instantiation of X&lt;A&gt;.
   3511      1.1  joerg 
   3512      1.1  joerg But given
   3513      1.1  joerg   template &lt;typename T&gt;  class X {}; class A {};
   3514      1.1  joerg   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   3515      1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   3516      1.1  joerg   does not match, as X&lt;A&gt; is an explicit template specialization.
   3517      1.1  joerg 
   3518      1.1  joerg 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      1.1  joerg </pre></td></tr>
   3520      1.1  joerg 
   3521      1.1  joerg 
   3522  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
   3524  1.1.1.2  joerg specified names.
   3525  1.1.1.2  joerg 
   3526  1.1.1.2  joerg    hasAnyOperatorName("+", "-")
   3527  1.1.1.2  joerg  Is equivalent to
   3528  1.1.1.2  joerg    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   3529  1.1.1.2  joerg </pre></td></tr>
   3530  1.1.1.2  joerg 
   3531  1.1.1.2  joerg 
   3532  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
   3534  1.1.1.2  joerg unary).
   3535  1.1.1.2  joerg 
   3536  1.1.1.2  joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   3537  1.1.1.2  joerg   !(a || b)
   3538  1.1.1.2  joerg </pre></td></tr>
   3539  1.1.1.2  joerg 
   3540  1.1.1.2  joerg 
   3541  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
   3543  1.1.1.2  joerg 
   3544  1.1.1.2  joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   3545  1.1.1.2  joerg   if (a == b)
   3546  1.1.1.2  joerg     a += b;
   3547  1.1.1.2  joerg 
   3548  1.1.1.2  joerg Example 2: matches s1 = s2
   3549  1.1.1.2  joerg            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   3550  1.1.1.2  joerg   struct S { S&amp; operator=(const S&amp;); };
   3551  1.1.1.2  joerg   void x() { S s1, s2; s1 = s2; }
   3552  1.1.1.2  joerg </pre></td></tr>
   3553  1.1.1.2  joerg 
   3554  1.1.1.2  joerg 
   3555  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
   3557  1.1.1.2  joerg 
   3558  1.1.1.2  joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   3559  1.1.1.2  joerg   if (a == b)
   3560  1.1.1.2  joerg     a += b;
   3561  1.1.1.2  joerg 
   3562  1.1.1.2  joerg Example 2: matches s1 &lt; s2
   3563  1.1.1.2  joerg            (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   3564  1.1.1.2  joerg   struct S { bool operator&lt;(const S&amp; other); };
   3565  1.1.1.2  joerg   void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
   3566  1.1.1.2  joerg </pre></td></tr>
   3567  1.1.1.2  joerg 
   3568  1.1.1.2  joerg 
   3569  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
   3571  1.1.1.2  joerg a specific number of arguments (including absent default arguments).
   3572  1.1.1.2  joerg 
   3573  1.1.1.2  joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   3574  1.1.1.2  joerg   void f(int x, int y);
   3575  1.1.1.2  joerg   f(0, 0);
   3576  1.1.1.2  joerg </pre></td></tr>
   3577  1.1.1.2  joerg 
   3578  1.1.1.2  joerg 
   3579      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
   3581      1.1  joerg a specific number of arguments (including absent default arguments).
   3582      1.1  joerg 
   3583      1.1  joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   3584      1.1  joerg   void f(int x, int y);
   3585      1.1  joerg   f(0, 0);
   3586      1.1  joerg </pre></td></tr>
   3587      1.1  joerg 
   3588      1.1  joerg 
   3589      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
   3591      1.1  joerg 
   3592      1.1  joerg Example matches y(x) but not y(42) or NS::y(x).
   3593      1.1  joerg   namespace NS {
   3594      1.1  joerg     struct X {};
   3595      1.1  joerg     void y(X);
   3596      1.1  joerg   }
   3597      1.1  joerg 
   3598      1.1  joerg   void y(...);
   3599      1.1  joerg 
   3600      1.1  joerg   void test() {
   3601      1.1  joerg     NS::X x;
   3602      1.1  joerg     y(x); // Matches
   3603      1.1  joerg     NS::y(x); // Doesn't match
   3604      1.1  joerg     y(42); // Doesn't match
   3605      1.1  joerg     using NS::y;
   3606      1.1  joerg     y(x); // Found by both unqualified lookup and ADL, doesn't match
   3607      1.1  joerg    }
   3608      1.1  joerg </pre></td></tr>
   3609      1.1  joerg 
   3610      1.1  joerg 
   3611      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
   3613      1.1  joerg 
   3614      1.1  joerg Example: matches the implicit cast around 0
   3615      1.1  joerg (matcher = castExpr(hasCastKind(CK_NullToPointer)))
   3616      1.1  joerg   int *p = 0;
   3617      1.1  joerg 
   3618      1.1  joerg If the matcher is use from clang-query, CastKind parameter
   3619  1.1.1.2  joerg should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
   3620      1.1  joerg </pre></td></tr>
   3621      1.1  joerg 
   3622      1.1  joerg 
   3623      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
   3625      1.1  joerg 
   3626      1.1  joerg 
   3627      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
   3629      1.1  joerg 
   3630      1.1  joerg Given
   3631      1.1  joerg   f('false, 3.14, 42);
   3632      1.1  joerg characterLiteral(equals(0))
   3633      1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   3634      1.1  joerg   match false
   3635      1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   3636      1.1  joerg   match 3.14
   3637      1.1  joerg integerLiteral(equals(42))
   3638      1.1  joerg   matches 42
   3639      1.1  joerg 
   3640      1.1  joerg Note that you cannot directly match a negative numeric literal because the
   3641      1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   3642      1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   3643      1.1  joerg matcher to match the minus sign:
   3644      1.1  joerg 
   3645      1.1  joerg unaryOperator(hasOperatorName("-"),
   3646      1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   3647      1.1  joerg 
   3648      1.1  joerg Usable as: Matcher&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      1.1  joerg            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      1.1  joerg </pre></td></tr>
   3651      1.1  joerg 
   3652      1.1  joerg 
   3653      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
   3655      1.1  joerg 
   3656      1.1  joerg 
   3657      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
   3659      1.1  joerg 
   3660      1.1  joerg 
   3661      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
   3663      1.1  joerg 
   3664      1.1  joerg Given
   3665      1.1  joerg   template&lt;typename T&gt; struct C {};
   3666      1.1  joerg   C&lt;int&gt; c;
   3667      1.1  joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
   3668      1.1  joerg   matches C&lt;int&gt;.
   3669      1.1  joerg </pre></td></tr>
   3670      1.1  joerg 
   3671      1.1  joerg 
   3672      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
   3674      1.1  joerg child statements.
   3675      1.1  joerg 
   3676      1.1  joerg Example: Given
   3677      1.1  joerg   { for (;;) {} }
   3678      1.1  joerg compoundStmt(statementCountIs(0)))
   3679      1.1  joerg   matches '{}'
   3680      1.1  joerg   but does not match the outer compound statement.
   3681      1.1  joerg </pre></td></tr>
   3682      1.1  joerg 
   3683      1.1  joerg 
   3684      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
   3686      1.1  joerg 
   3687      1.1  joerg Given
   3688      1.1  joerg   int a[42];
   3689      1.1  joerg   int b[2 * 21];
   3690      1.1  joerg   int c[41], d[43];
   3691      1.1  joerg   char *s = "abcd";
   3692      1.1  joerg   wchar_t *ws = L"abcd";
   3693      1.1  joerg   char *w = "a";
   3694      1.1  joerg constantArrayType(hasSize(42))
   3695      1.1  joerg   matches "int a[42]" and "int b[2 * 21]"
   3696      1.1  joerg stringLiteral(hasSize(4))
   3697      1.1  joerg   matches "abcd", L"abcd"
   3698      1.1  joerg </pre></td></tr>
   3699      1.1  joerg 
   3700      1.1  joerg 
   3701      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
   3703      1.1  joerg declarations.
   3704      1.1  joerg 
   3705      1.1  joerg Example: Given
   3706      1.1  joerg   int a, b;
   3707      1.1  joerg   int c;
   3708      1.1  joerg   int d = 2, e;
   3709      1.1  joerg declCountIs(2)
   3710      1.1  joerg   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
   3711      1.1  joerg </pre></td></tr>
   3712      1.1  joerg 
   3713      1.1  joerg 
   3714      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
   3716      1.1  joerg 
   3717      1.1  joerg Matches a node if it equals the node previously bound to ID.
   3718      1.1  joerg 
   3719      1.1  joerg Given
   3720      1.1  joerg   class X { int a; int b; };
   3721      1.1  joerg cxxRecordDecl(
   3722      1.1  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   3723      1.1  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   3724      1.1  joerg   matches the class X, as a and b have the same type.
   3725      1.1  joerg 
   3726      1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   3727      1.1  joerg equalsBoundNodes acts as a filter.
   3728      1.1  joerg For example:
   3729      1.1  joerg compoundStmt(
   3730      1.1  joerg     forEachDescendant(varDecl().bind("d")),
   3731      1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   3732      1.1  joerg will trigger a match for each combination of variable declaration
   3733      1.1  joerg and reference to that variable declaration within a compound statement.
   3734      1.1  joerg </pre></td></tr>
   3735      1.1  joerg 
   3736      1.1  joerg 
   3737      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
   3739      1.1  joerg 
   3740      1.1  joerg Decl has pointer identity in the AST.
   3741      1.1  joerg </pre></td></tr>
   3742      1.1  joerg 
   3743      1.1  joerg 
   3744      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
   3746      1.1  joerg 
   3747      1.1  joerg Given
   3748      1.1  joerg   __attribute__((device)) void f() { ... }
   3749      1.1  joerg decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
   3750      1.1  joerg f. If the matcher is used from clang-query, attr::Kind parameter should be
   3751      1.1  joerg passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
   3752      1.1  joerg </pre></td></tr>
   3753      1.1  joerg 
   3754      1.1  joerg 
   3755  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
   3757  1.1.1.2  joerg Does not match if only part of the statement is expanded from that macro or
   3758  1.1.1.2  joerg if different parts of the the statement are expanded from different
   3759  1.1.1.2  joerg appearances of the macro.
   3760  1.1.1.2  joerg </pre></td></tr>
   3761  1.1.1.2  joerg 
   3762  1.1.1.2  joerg 
   3763  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
   3765      1.1  joerg partially matching a given regex.
   3766      1.1  joerg 
   3767      1.1  joerg Example matches Y but not X
   3768      1.1  joerg     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   3769      1.1  joerg   #include "ASTMatcher.h"
   3770      1.1  joerg   class X {};
   3771      1.1  joerg ASTMatcher.h:
   3772      1.1  joerg   class Y {};
   3773      1.1  joerg 
   3774      1.1  joerg Usable as: Matcher&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  1.1.1.2  joerg 
   3776  1.1.1.2  joerg If the matcher is used in clang-query, RegexFlags parameter
   3777  1.1.1.2  joerg should be passed as a quoted string. e.g: "NoFlags".
   3778  1.1.1.2  joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   3779      1.1  joerg </pre></td></tr>
   3780      1.1  joerg 
   3781      1.1  joerg 
   3782      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
   3784      1.1  joerg 
   3785      1.1  joerg Example matches X but not Y
   3786      1.1  joerg   (matcher = cxxRecordDecl(isExpansionInMainFile())
   3787      1.1  joerg   #include &lt;Y.h&gt;
   3788      1.1  joerg   class X {};
   3789      1.1  joerg Y.h:
   3790      1.1  joerg   class Y {};
   3791      1.1  joerg 
   3792      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   3794      1.1  joerg 
   3795      1.1  joerg 
   3796      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
   3798      1.1  joerg 
   3799      1.1  joerg Example matches Y but not X
   3800      1.1  joerg     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   3801      1.1  joerg   #include &lt;SystemHeader.h&gt;
   3802      1.1  joerg   class X {};
   3803      1.1  joerg SystemHeader.h:
   3804      1.1  joerg   class Y {};
   3805      1.1  joerg 
   3806      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   3808      1.1  joerg 
   3809      1.1  joerg 
   3810      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
   3812      1.1  joerg by the compiler (eg. implicit default/copy constructors).
   3813      1.1  joerg </pre></td></tr>
   3814      1.1  joerg 
   3815      1.1  joerg 
   3816      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
   3818      1.1  joerg 
   3819      1.1  joerg Given
   3820      1.1  joerg   class vector {};
   3821      1.1  joerg   namespace foo {
   3822      1.1  joerg     class vector {};
   3823      1.1  joerg     namespace std {
   3824      1.1  joerg       class vector {};
   3825      1.1  joerg     }
   3826      1.1  joerg   }
   3827      1.1  joerg   namespace std {
   3828      1.1  joerg     inline namespace __1 {
   3829      1.1  joerg       class vector {}; // #1
   3830      1.1  joerg       namespace experimental {
   3831      1.1  joerg         class vector {};
   3832      1.1  joerg       }
   3833      1.1  joerg     }
   3834      1.1  joerg   }
   3835      1.1  joerg cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
   3836      1.1  joerg </pre></td></tr>
   3837      1.1  joerg 
   3838      1.1  joerg 
   3839  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
   3841  1.1.1.2  joerg template instantiations.
   3842      1.1  joerg 
   3843      1.1  joerg Given
   3844  1.1.1.2  joerg   template&lt;typename T&gt; void A(T t) { T i; }
   3845  1.1.1.2  joerg   A(0);
   3846  1.1.1.2  joerg   A(0U);
   3847  1.1.1.2  joerg functionDecl(isInstantiated())
   3848  1.1.1.2  joerg   matches 'A(int) {...};' and 'A(unsigned) {...}'.
   3849  1.1.1.2  joerg </pre></td></tr>
   3850  1.1.1.2  joerg 
   3851  1.1.1.2  joerg 
   3852  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
   3854  1.1.1.2  joerg inheritance.
   3855  1.1.1.2  joerg 
   3856  1.1.1.2  joerg Examples:
   3857      1.1  joerg   class C {
   3858      1.1  joerg   public:    int a;
   3859      1.1  joerg   protected: int b;
   3860  1.1.1.2  joerg   private:   int c; // fieldDecl(isPrivate()) matches 'c'
   3861      1.1  joerg   };
   3862  1.1.1.2  joerg 
   3863  1.1.1.2  joerg   struct Base {};
   3864  1.1.1.2  joerg   struct Derived1 : private Base {}; // matches 'Base'
   3865  1.1.1.2  joerg   class Derived2 : Base {}; // matches 'Base'
   3866      1.1  joerg </pre></td></tr>
   3867      1.1  joerg 
   3868      1.1  joerg 
   3869      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
   3871  1.1.1.2  joerg protected inheritance.
   3872      1.1  joerg 
   3873  1.1.1.2  joerg Examples:
   3874      1.1  joerg   class C {
   3875      1.1  joerg   public:    int a;
   3876  1.1.1.2  joerg   protected: int b; // fieldDecl(isProtected()) matches 'b'
   3877      1.1  joerg   private:   int c;
   3878      1.1  joerg   };
   3879  1.1.1.2  joerg 
   3880  1.1.1.2  joerg   class Base {};
   3881  1.1.1.2  joerg   class Derived : protected Base {}; // matches 'Base'
   3882      1.1  joerg </pre></td></tr>
   3883      1.1  joerg 
   3884      1.1  joerg 
   3885      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
   3887  1.1.1.2  joerg inheritance.
   3888      1.1  joerg 
   3889  1.1.1.2  joerg Examples:
   3890      1.1  joerg   class C {
   3891  1.1.1.2  joerg   public:    int a; // fieldDecl(isPublic()) matches 'a'
   3892      1.1  joerg   protected: int b;
   3893      1.1  joerg   private:   int c;
   3894      1.1  joerg   };
   3895  1.1.1.2  joerg 
   3896  1.1.1.2  joerg   class Base {};
   3897  1.1.1.2  joerg   class Derived1 : public Base {}; // matches 'Base'
   3898  1.1.1.2  joerg   struct Derived2 : Base {}; // matches 'Base'
   3899      1.1  joerg </pre></td></tr>
   3900      1.1  joerg 
   3901      1.1  joerg 
   3902      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
   3904      1.1  joerg a specific number of designators.
   3905      1.1  joerg 
   3906      1.1  joerg Example: Given
   3907      1.1  joerg   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
   3908      1.1  joerg   point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
   3909      1.1  joerg designatorCountIs(2)
   3910      1.1  joerg   matches '{ [2].y = 1.0, [0].x = 1.0 }',
   3911      1.1  joerg   but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
   3912      1.1  joerg </pre></td></tr>
   3913      1.1  joerg 
   3914      1.1  joerg 
   3915      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
   3917      1.1  joerg 
   3918      1.1  joerg Example matches Y (matcher = enumDecl(isScoped()))
   3919      1.1  joerg enum X {};
   3920      1.1  joerg enum class Y {};
   3921      1.1  joerg </pre></td></tr>
   3922      1.1  joerg 
   3923      1.1  joerg 
   3924      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
   3926      1.1  joerg neither type- nor value-dependent.
   3927      1.1  joerg 
   3928      1.1  joerg In the following example, the expression sizeof(sizeof(T() + T()))
   3929      1.1  joerg is instantiation-dependent (since it involves a template parameter T),
   3930      1.1  joerg but is neither type- nor value-dependent, since the type of the inner
   3931      1.1  joerg sizeof is known (std::size_t) and therefore the size of the outer
   3932      1.1  joerg sizeof is known.
   3933      1.1  joerg   template&lt;typename T&gt;
   3934      1.1  joerg   void f(T x, T y) { sizeof(sizeof(T() + T()); }
   3935      1.1  joerg expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
   3936      1.1  joerg </pre></td></tr>
   3937      1.1  joerg 
   3938      1.1  joerg 
   3939      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
   3941      1.1  joerg is not yet instantiated.
   3942      1.1  joerg 
   3943      1.1  joerg For example, the expressions "x" and "x + y" are type-dependent in
   3944      1.1  joerg the following code, but "y" is not type-dependent:
   3945      1.1  joerg   template&lt;typename T&gt;
   3946      1.1  joerg   void add(T x, int y) {
   3947      1.1  joerg     x + y;
   3948      1.1  joerg   }
   3949      1.1  joerg expr(isTypeDependent()) matches x + y
   3950      1.1  joerg </pre></td></tr>
   3951      1.1  joerg 
   3952      1.1  joerg 
   3953      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
   3955      1.1  joerg non-type template parameter.
   3956      1.1  joerg 
   3957      1.1  joerg For example, the array bound of "Chars" in the following example is
   3958      1.1  joerg value-dependent.
   3959      1.1  joerg   template&lt;int Size&gt; int f() { return Size; }
   3960      1.1  joerg expr(isValueDependent()) matches return Size
   3961      1.1  joerg </pre></td></tr>
   3962      1.1  joerg 
   3963      1.1  joerg 
   3964  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
   3966  1.1.1.2  joerg GNU's __null, C++11's nullptr, or C's NULL macro.
   3967  1.1.1.2  joerg 
   3968  1.1.1.2  joerg Given:
   3969  1.1.1.2  joerg   void *v1 = NULL;
   3970  1.1.1.2  joerg   void *v2 = nullptr;
   3971  1.1.1.2  joerg   void *v3 = __null; // GNU extension
   3972  1.1.1.2  joerg   char *cp = (char *)0;
   3973  1.1.1.2  joerg   int *ip = 0;
   3974  1.1.1.2  joerg   int i = 0;
   3975  1.1.1.2  joerg expr(nullPointerConstant())
   3976  1.1.1.2  joerg   matches the initializer for v1, v2, v3, cp, and ip. Does not match the
   3977  1.1.1.2  joerg   initializer for i.
   3978  1.1.1.2  joerg </pre></td></tr>
   3979  1.1.1.2  joerg 
   3980  1.1.1.2  joerg 
   3981      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
   3983      1.1  joerg bit width.
   3984      1.1  joerg 
   3985      1.1  joerg Given
   3986      1.1  joerg   class C {
   3987      1.1  joerg     int a : 2;
   3988      1.1  joerg     int b : 4;
   3989      1.1  joerg     int c : 2;
   3990      1.1  joerg   };
   3991      1.1  joerg fieldDecl(hasBitWidth(2))
   3992      1.1  joerg   matches 'int a;' and 'int c;' but not 'int b;'.
   3993      1.1  joerg </pre></td></tr>
   3994      1.1  joerg 
   3995      1.1  joerg 
   3996      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
   3998      1.1  joerg 
   3999      1.1  joerg Given
   4000      1.1  joerg   class C {
   4001      1.1  joerg     int a : 2;
   4002      1.1  joerg     int b;
   4003      1.1  joerg   };
   4004      1.1  joerg fieldDecl(isBitField())
   4005      1.1  joerg   matches 'int a;' but not 'int b;'.
   4006      1.1  joerg </pre></td></tr>
   4007      1.1  joerg 
   4008      1.1  joerg 
   4009      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
   4011      1.1  joerg 
   4012      1.1  joerg Given
   4013      1.1  joerg   f('false, 3.14, 42);
   4014      1.1  joerg characterLiteral(equals(0))
   4015      1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   4016      1.1  joerg   match false
   4017      1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   4018      1.1  joerg   match 3.14
   4019      1.1  joerg integerLiteral(equals(42))
   4020      1.1  joerg   matches 42
   4021      1.1  joerg 
   4022      1.1  joerg Note that you cannot directly match a negative numeric literal because the
   4023      1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   4024      1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   4025      1.1  joerg matcher to match the minus sign:
   4026      1.1  joerg 
   4027      1.1  joerg unaryOperator(hasOperatorName("-"),
   4028      1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   4029      1.1  joerg 
   4030      1.1  joerg Usable as: Matcher&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      1.1  joerg            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      1.1  joerg </pre></td></tr>
   4033      1.1  joerg 
   4034      1.1  joerg 
   4035      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
   4037      1.1  joerg 
   4038      1.1  joerg 
   4039  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
   4041  1.1.1.2  joerg 
   4042  1.1.1.2  joerg Matches overloaded operator names specified in strings without the
   4043  1.1.1.2  joerg "operator" prefix: e.g. "&lt;&lt;".
   4044  1.1.1.2  joerg 
   4045  1.1.1.2  joerg   hasAnyOverloadedOperatorName("+", "-")
   4046  1.1.1.2  joerg Is equivalent to
   4047  1.1.1.2  joerg   anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
   4048  1.1.1.2  joerg </pre></td></tr>
   4049  1.1.1.2  joerg 
   4050  1.1.1.2  joerg 
   4051      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
   4053      1.1  joerg 
   4054      1.1  joerg Given:
   4055      1.1  joerg   void f();
   4056      1.1  joerg   void g() noexcept;
   4057      1.1  joerg   void h() noexcept(true);
   4058      1.1  joerg   void i() noexcept(false);
   4059      1.1  joerg   void j() throw();
   4060      1.1  joerg   void k() throw(int);
   4061      1.1  joerg   void l() throw(...);
   4062      1.1  joerg functionDecl(hasDynamicExceptionSpec()) and
   4063      1.1  joerg   functionProtoType(hasDynamicExceptionSpec())
   4064      1.1  joerg   match the declarations of j, k, and l, but not f, g, h, or i.
   4065      1.1  joerg </pre></td></tr>
   4066      1.1  joerg 
   4067      1.1  joerg 
   4068      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
   4070      1.1  joerg 
   4071      1.1  joerg Matches overloaded operator names specified in strings without the
   4072      1.1  joerg "operator" prefix: e.g. "&lt;&lt;".
   4073      1.1  joerg 
   4074      1.1  joerg Given:
   4075      1.1  joerg   class A { int operator*(); };
   4076      1.1  joerg   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
   4077      1.1  joerg   A a;
   4078      1.1  joerg   a &lt;&lt; a;   // &lt;-- This matches
   4079      1.1  joerg 
   4080      1.1  joerg cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
   4081      1.1  joerg specified line and
   4082      1.1  joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
   4083      1.1  joerg matches the declaration of A.
   4084      1.1  joerg 
   4085      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   4087      1.1  joerg 
   4088      1.1  joerg 
   4089      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
   4091      1.1  joerg 
   4092      1.1  joerg Example matches Y (matcher = functionDecl(hasTrailingReturn()))
   4093      1.1  joerg int X() {}
   4094      1.1  joerg auto Y() -&gt; int {}
   4095      1.1  joerg </pre></td></tr>
   4096      1.1  joerg 
   4097      1.1  joerg 
   4098      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
   4100      1.1  joerg        and if constexpr.
   4101      1.1  joerg 
   4102      1.1  joerg Given:
   4103      1.1  joerg   constexpr int foo = 42;
   4104      1.1  joerg   constexpr int bar();
   4105      1.1  joerg   void baz() { if constexpr(1 &gt; 0) {} }
   4106      1.1  joerg varDecl(isConstexpr())
   4107      1.1  joerg   matches the declaration of foo.
   4108      1.1  joerg functionDecl(isConstexpr())
   4109      1.1  joerg   matches the declaration of bar.
   4110      1.1  joerg ifStmt(isConstexpr())
   4111      1.1  joerg   matches the if statement in baz.
   4112      1.1  joerg </pre></td></tr>
   4113      1.1  joerg 
   4114      1.1  joerg 
   4115      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
   4117      1.1  joerg 
   4118      1.1  joerg Given:
   4119      1.1  joerg   class A { ~A(); };
   4120      1.1  joerg   class B { ~B() = default; };
   4121      1.1  joerg functionDecl(isDefaulted())
   4122      1.1  joerg   matches the declaration of ~B, but not ~A.
   4123      1.1  joerg </pre></td></tr>
   4124      1.1  joerg 
   4125      1.1  joerg 
   4126      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
   4128      1.1  joerg 
   4129      1.1  joerg Example matches A, va, fa
   4130      1.1  joerg   class A {};
   4131      1.1  joerg   class B;  // Doesn't match, as it has no body.
   4132      1.1  joerg   int va;
   4133      1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   4134      1.1  joerg   void fa() {}
   4135      1.1  joerg   void fb();  // Doesn't match, as it has no body.
   4136      1.1  joerg   @interface X
   4137      1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   4138      1.1  joerg   @end
   4139      1.1  joerg   @implementation X
   4140      1.1  joerg   - (void)ma {}
   4141      1.1  joerg   @end
   4142      1.1  joerg 
   4143      1.1  joerg Usable as: Matcher&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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   4145      1.1  joerg </pre></td></tr>
   4146      1.1  joerg 
   4147      1.1  joerg 
   4148      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
   4150      1.1  joerg 
   4151      1.1  joerg Given:
   4152      1.1  joerg   void Func();
   4153      1.1  joerg   void DeletedFunc() = delete;
   4154      1.1  joerg functionDecl(isDeleted())
   4155      1.1  joerg   matches the declaration of DeletedFunc, but not Func.
   4156      1.1  joerg </pre></td></tr>
   4157      1.1  joerg 
   4158      1.1  joerg 
   4159      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
   4161      1.1  joerg static member variable template instantiations.
   4162      1.1  joerg 
   4163      1.1  joerg Given
   4164      1.1  joerg   template&lt;typename T&gt; void A(T t) { }
   4165      1.1  joerg   template&lt;&gt; void A(int N) { }
   4166      1.1  joerg functionDecl(isExplicitTemplateSpecialization())
   4167      1.1  joerg   matches the specialization A&lt;int&gt;().
   4168      1.1  joerg 
   4169      1.1  joerg 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      1.1  joerg </pre></td></tr>
   4171      1.1  joerg 
   4172      1.1  joerg 
   4173      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
   4175      1.1  joerg 
   4176      1.1  joerg Given:
   4177      1.1  joerg   extern "C" void f() {}
   4178      1.1  joerg   extern "C" { void g() {} }
   4179      1.1  joerg   void h() {}
   4180      1.1  joerg   extern "C" int x = 1;
   4181      1.1  joerg   extern "C" int y = 2;
   4182      1.1  joerg   int z = 3;
   4183      1.1  joerg functionDecl(isExternC())
   4184      1.1  joerg   matches the declaration of f and g, but not the declaration of h.
   4185      1.1  joerg varDecl(isExternC())
   4186      1.1  joerg   matches the declaration of x and y, but not the declaration of z.
   4187      1.1  joerg </pre></td></tr>
   4188      1.1  joerg 
   4189      1.1  joerg 
   4190      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
   4192      1.1  joerg the inline keyword.
   4193      1.1  joerg 
   4194      1.1  joerg Given
   4195      1.1  joerg   inline void f();
   4196      1.1  joerg   void g();
   4197      1.1  joerg   namespace n {
   4198      1.1  joerg   inline namespace m {}
   4199      1.1  joerg   }
   4200      1.1  joerg functionDecl(isInline()) will match ::f().
   4201      1.1  joerg namespaceDecl(isInline()) will match n::m.
   4202      1.1  joerg </pre></td></tr>
   4203      1.1  joerg 
   4204      1.1  joerg 
   4205      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
   4207      1.1  joerg into an executable program.
   4208      1.1  joerg </pre></td></tr>
   4209      1.1  joerg 
   4210      1.1  joerg 
   4211      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
   4213      1.1  joerg 
   4214      1.1  joerg Given
   4215      1.1  joerg   void nope();
   4216      1.1  joerg   [[noreturn]] void a();
   4217      1.1  joerg   __attribute__((noreturn)) void b();
   4218      1.1  joerg   struct c { [[noreturn]] c(); };
   4219      1.1  joerg functionDecl(isNoReturn())
   4220      1.1  joerg   matches all of those except
   4221      1.1  joerg   void nope();
   4222      1.1  joerg </pre></td></tr>
   4223      1.1  joerg 
   4224      1.1  joerg 
   4225      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
   4227      1.1  joerg 
   4228      1.1  joerg Given:
   4229      1.1  joerg   void f();
   4230      1.1  joerg   void g() noexcept;
   4231      1.1  joerg   void h() throw();
   4232      1.1  joerg   void i() throw(int);
   4233      1.1  joerg   void j() noexcept(false);
   4234      1.1  joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
   4235      1.1  joerg   match the declarations of g, and h, but not f, i or j.
   4236      1.1  joerg </pre></td></tr>
   4237      1.1  joerg 
   4238      1.1  joerg 
   4239      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
   4241      1.1  joerg class specifier ("static" keyword) written in the source.
   4242      1.1  joerg 
   4243      1.1  joerg Given:
   4244      1.1  joerg   static void f() {}
   4245      1.1  joerg   static int i = 0;
   4246      1.1  joerg   extern int j;
   4247      1.1  joerg   int k;
   4248      1.1  joerg functionDecl(isStaticStorageClass())
   4249      1.1  joerg   matches the function declaration f.
   4250      1.1  joerg varDecl(isStaticStorageClass())
   4251      1.1  joerg   matches the variable declaration i.
   4252      1.1  joerg </pre></td></tr>
   4253      1.1  joerg 
   4254      1.1  joerg 
   4255      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
   4257      1.1  joerg member variable template instantiations.
   4258      1.1  joerg 
   4259      1.1  joerg Given
   4260      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   4261      1.1  joerg or
   4262      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   4263      1.1  joerg or
   4264      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   4265      1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   4266      1.1  joerg   matches the template instantiation of X&lt;A&gt;.
   4267      1.1  joerg 
   4268      1.1  joerg But given
   4269      1.1  joerg   template &lt;typename T&gt;  class X {}; class A {};
   4270      1.1  joerg   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   4271      1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   4272      1.1  joerg   does not match, as X&lt;A&gt; is an explicit template specialization.
   4273      1.1  joerg 
   4274      1.1  joerg 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      1.1  joerg </pre></td></tr>
   4276      1.1  joerg 
   4277      1.1  joerg 
   4278      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
   4280      1.1  joerg 
   4281      1.1  joerg Example matches f, but not g or h. The function i will not match, even when
   4282      1.1  joerg compiled in C mode.
   4283      1.1  joerg   void f(...);
   4284      1.1  joerg   void g(int);
   4285      1.1  joerg   template &lt;typename... Ts&gt; void h(Ts...);
   4286      1.1  joerg   void i();
   4287      1.1  joerg </pre></td></tr>
   4288      1.1  joerg 
   4289      1.1  joerg 
   4290  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
   4292  1.1.1.2  joerg 
   4293  1.1.1.2  joerg Given:
   4294  1.1.1.2  joerg   void foo() __attribute__((__weakref__("__foo")));
   4295  1.1.1.2  joerg   void bar();
   4296  1.1.1.2  joerg functionDecl(isWeak())
   4297  1.1.1.2  joerg   matches the weak declaration "foo", but not "bar".
   4298  1.1.1.2  joerg </pre></td></tr>
   4299  1.1.1.2  joerg 
   4300  1.1.1.2  joerg 
   4301      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
   4303      1.1  joerg specific parameter count.
   4304      1.1  joerg 
   4305      1.1  joerg Given
   4306      1.1  joerg   void f(int i) {}
   4307      1.1  joerg   void g(int i, int j) {}
   4308      1.1  joerg   void h(int i, int j);
   4309      1.1  joerg   void j(int i);
   4310      1.1  joerg   void k(int x, int y, int z, ...);
   4311      1.1  joerg functionDecl(parameterCountIs(2))
   4312      1.1  joerg   matches g and h
   4313      1.1  joerg functionProtoType(parameterCountIs(2))
   4314      1.1  joerg   matches g and h
   4315      1.1  joerg functionProtoType(parameterCountIs(3))
   4316      1.1  joerg   matches k
   4317      1.1  joerg </pre></td></tr>
   4318      1.1  joerg 
   4319      1.1  joerg 
   4320      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
   4322      1.1  joerg 
   4323      1.1  joerg Given:
   4324      1.1  joerg   void f();
   4325      1.1  joerg   void g() noexcept;
   4326      1.1  joerg   void h() noexcept(true);
   4327      1.1  joerg   void i() noexcept(false);
   4328      1.1  joerg   void j() throw();
   4329      1.1  joerg   void k() throw(int);
   4330      1.1  joerg   void l() throw(...);
   4331      1.1  joerg functionDecl(hasDynamicExceptionSpec()) and
   4332      1.1  joerg   functionProtoType(hasDynamicExceptionSpec())
   4333      1.1  joerg   match the declarations of j, k, and l, but not f, g, h, or i.
   4334      1.1  joerg </pre></td></tr>
   4335      1.1  joerg 
   4336      1.1  joerg 
   4337      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
   4339      1.1  joerg 
   4340      1.1  joerg Given:
   4341      1.1  joerg   void f();
   4342      1.1  joerg   void g() noexcept;
   4343      1.1  joerg   void h() throw();
   4344      1.1  joerg   void i() throw(int);
   4345      1.1  joerg   void j() noexcept(false);
   4346      1.1  joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
   4347      1.1  joerg   match the declarations of g, and h, but not f, i or j.
   4348      1.1  joerg </pre></td></tr>
   4349      1.1  joerg 
   4350      1.1  joerg 
   4351      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
   4353      1.1  joerg specific parameter count.
   4354      1.1  joerg 
   4355      1.1  joerg Given
   4356      1.1  joerg   void f(int i) {}
   4357      1.1  joerg   void g(int i, int j) {}
   4358      1.1  joerg   void h(int i, int j);
   4359      1.1  joerg   void j(int i);
   4360      1.1  joerg   void k(int x, int y, int z, ...);
   4361      1.1  joerg functionDecl(parameterCountIs(2))
   4362      1.1  joerg   matches g and h
   4363      1.1  joerg functionProtoType(parameterCountIs(2))
   4364      1.1  joerg   matches g and h
   4365      1.1  joerg functionProtoType(parameterCountIs(3))
   4366      1.1  joerg   matches k
   4367      1.1  joerg </pre></td></tr>
   4368      1.1  joerg 
   4369      1.1  joerg 
   4370      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
   4372      1.1  joerg        and if constexpr.
   4373      1.1  joerg 
   4374      1.1  joerg Given:
   4375      1.1  joerg   constexpr int foo = 42;
   4376      1.1  joerg   constexpr int bar();
   4377      1.1  joerg   void baz() { if constexpr(1 &gt; 0) {} }
   4378      1.1  joerg varDecl(isConstexpr())
   4379      1.1  joerg   matches the declaration of foo.
   4380      1.1  joerg functionDecl(isConstexpr())
   4381      1.1  joerg   matches the declaration of bar.
   4382      1.1  joerg ifStmt(isConstexpr())
   4383      1.1  joerg   matches the if statement in baz.
   4384      1.1  joerg </pre></td></tr>
   4385      1.1  joerg 
   4386      1.1  joerg 
   4387      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
   4389      1.1  joerg 
   4390      1.1  joerg 
   4391      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
   4393      1.1  joerg 
   4394      1.1  joerg Given
   4395      1.1  joerg   f('false, 3.14, 42);
   4396      1.1  joerg characterLiteral(equals(0))
   4397      1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   4398      1.1  joerg   match false
   4399      1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   4400      1.1  joerg   match 3.14
   4401      1.1  joerg integerLiteral(equals(42))
   4402      1.1  joerg   matches 42
   4403      1.1  joerg 
   4404      1.1  joerg Note that you cannot directly match a negative numeric literal because the
   4405      1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   4406      1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   4407      1.1  joerg matcher to match the minus sign:
   4408      1.1  joerg 
   4409      1.1  joerg unaryOperator(hasOperatorName("-"),
   4410      1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   4411      1.1  joerg 
   4412      1.1  joerg Usable as: Matcher&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      1.1  joerg            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      1.1  joerg </pre></td></tr>
   4415      1.1  joerg 
   4416      1.1  joerg 
   4417      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
   4419      1.1  joerg 
   4420      1.1  joerg 
   4421      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
   4423      1.1  joerg 
   4424      1.1  joerg 
   4425      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
   4427      1.1  joerg to '.'.
   4428      1.1  joerg 
   4429      1.1  joerg Member calls on the implicit this pointer match as called with '-&gt;'.
   4430      1.1  joerg 
   4431      1.1  joerg Given
   4432      1.1  joerg   class Y {
   4433      1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   4434      1.1  joerg     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   4435      1.1  joerg     int a;
   4436      1.1  joerg     static int b;
   4437      1.1  joerg   };
   4438      1.1  joerg   template &lt;class T&gt;
   4439      1.1  joerg   class Z {
   4440      1.1  joerg     void x() { this-&gt;m; }
   4441      1.1  joerg   };
   4442      1.1  joerg memberExpr(isArrow())
   4443      1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   4444      1.1  joerg cxxDependentScopeMemberExpr(isArrow())
   4445      1.1  joerg   matches this-&gt;m
   4446      1.1  joerg unresolvedMemberExpr(isArrow())
   4447      1.1  joerg   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   4448      1.1  joerg </pre></td></tr>
   4449      1.1  joerg 
   4450      1.1  joerg 
   4451  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
   4453  1.1.1.2  joerg 
   4454  1.1.1.2  joerg This matcher is only provided as a performance optimization of hasName.
   4455  1.1.1.2  joerg     hasAnyName(a, b, c)
   4456  1.1.1.2  joerg  is equivalent to, but faster than
   4457  1.1.1.2  joerg     anyOf(hasName(a), hasName(b), hasName(c))
   4458  1.1.1.2  joerg </pre></td></tr>
   4459  1.1.1.2  joerg 
   4460  1.1.1.2  joerg 
   4461      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
   4463      1.1  joerg 
   4464      1.1  joerg Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
   4465      1.1  joerg void f() {
   4466      1.1  joerg   int x;
   4467      1.1  joerg   static int y;
   4468      1.1  joerg }
   4469      1.1  joerg int z;
   4470      1.1  joerg 
   4471      1.1  joerg Example matches f() because it has external formal linkage despite being
   4472      1.1  joerg unique to the translation unit as though it has internal likage
   4473      1.1  joerg (matcher = functionDecl(hasExternalFormalLinkage()))
   4474      1.1  joerg 
   4475      1.1  joerg namespace {
   4476      1.1  joerg void f() {}
   4477      1.1  joerg }
   4478      1.1  joerg </pre></td></tr>
   4479      1.1  joerg 
   4480      1.1  joerg 
   4481  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
   4483      1.1  joerg 
   4484      1.1  joerg Supports specifying enclosing namespaces or classes by prefixing the name
   4485      1.1  joerg with '&lt;enclosing&gt;::'.
   4486      1.1  joerg Does not match typedefs of an underlying type with the given name.
   4487      1.1  joerg 
   4488      1.1  joerg Example matches X (Name == "X")
   4489      1.1  joerg   class X;
   4490      1.1  joerg 
   4491      1.1  joerg Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
   4492      1.1  joerg   namespace a { namespace b { class X; } }
   4493      1.1  joerg </pre></td></tr>
   4494      1.1  joerg 
   4495      1.1  joerg 
   4496  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
   4498      1.1  joerg a substring matched by the given RegExp.
   4499      1.1  joerg 
   4500      1.1  joerg Supports specifying enclosing namespaces or classes by
   4501      1.1  joerg prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
   4502      1.1  joerg of an underlying type with the given name.
   4503      1.1  joerg 
   4504      1.1  joerg Example matches X (regexp == "::X")
   4505      1.1  joerg   class X;
   4506      1.1  joerg 
   4507      1.1  joerg Example matches X (regexp is one of "::X", "^foo::.*X", among others)
   4508      1.1  joerg   namespace foo { namespace bar { class X; } }
   4509  1.1.1.2  joerg 
   4510  1.1.1.2  joerg If the matcher is used in clang-query, RegexFlags parameter
   4511  1.1.1.2  joerg should be passed as a quoted string. e.g: "NoFlags".
   4512  1.1.1.2  joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   4513      1.1  joerg </pre></td></tr>
   4514      1.1  joerg 
   4515      1.1  joerg 
   4516      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
   4518      1.1  joerg 
   4519      1.1  joerg Given
   4520      1.1  joerg   namespace n {
   4521      1.1  joerg   namespace {} // #1
   4522      1.1  joerg   }
   4523      1.1  joerg namespaceDecl(isAnonymous()) will match #1 but not ::n.
   4524      1.1  joerg </pre></td></tr>
   4525      1.1  joerg 
   4526      1.1  joerg 
   4527      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
   4529      1.1  joerg the inline keyword.
   4530      1.1  joerg 
   4531      1.1  joerg Given
   4532      1.1  joerg   inline void f();
   4533      1.1  joerg   void g();
   4534      1.1  joerg   namespace n {
   4535      1.1  joerg   inline namespace m {}
   4536      1.1  joerg   }
   4537      1.1  joerg functionDecl(isInline()) will match ::f().
   4538      1.1  joerg namespaceDecl(isInline()) will match n::m.
   4539      1.1  joerg </pre></td></tr>
   4540      1.1  joerg 
   4541      1.1  joerg 
   4542  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
   4544  1.1.1.2  joerg specified.
   4545  1.1.1.2  joerg 
   4546  1.1.1.2  joerg Given
   4547  1.1.1.2  joerg 
   4548  1.1.1.2  joerg   #pragma omp parallel
   4549  1.1.1.2  joerg   #pragma omp parallel default(none)
   4550  1.1.1.2  joerg   #pragma omp parallel default(shared)
   4551  1.1.1.2  joerg   #pragma omp parallel default(firstprivate)
   4552  1.1.1.2  joerg 
   4553  1.1.1.2  joerg ``ompDefaultClause(isFirstPrivateKind())`` matches only
   4554  1.1.1.2  joerg ``default(firstprivate)``.
   4555  1.1.1.2  joerg </pre></td></tr>
   4556  1.1.1.2  joerg 
   4557  1.1.1.2  joerg 
   4558      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
   4560      1.1  joerg 
   4561      1.1  joerg Given
   4562      1.1  joerg 
   4563      1.1  joerg   #pragma omp parallel
   4564      1.1  joerg   #pragma omp parallel default(none)
   4565      1.1  joerg   #pragma omp parallel default(shared)
   4566  1.1.1.2  joerg   #pragma omp parallel default(firstprivate)
   4567      1.1  joerg 
   4568      1.1  joerg ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
   4569      1.1  joerg </pre></td></tr>
   4570      1.1  joerg 
   4571      1.1  joerg 
   4572      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
   4574      1.1  joerg 
   4575      1.1  joerg Given
   4576      1.1  joerg 
   4577      1.1  joerg   #pragma omp parallel
   4578      1.1  joerg   #pragma omp parallel default(none)
   4579      1.1  joerg   #pragma omp parallel default(shared)
   4580  1.1.1.2  joerg   #pragma omp parallel default(firstprivate)
   4581      1.1  joerg 
   4582      1.1  joerg ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
   4583      1.1  joerg </pre></td></tr>
   4584      1.1  joerg 
   4585      1.1  joerg 
   4586      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
   4588      1.1  joerg clause kind.
   4589      1.1  joerg 
   4590      1.1  joerg Given
   4591      1.1  joerg 
   4592      1.1  joerg   #pragma omp parallel
   4593      1.1  joerg   #pragma omp parallel for
   4594      1.1  joerg   #pragma omp          for
   4595      1.1  joerg 
   4596      1.1  joerg `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
   4597      1.1  joerg ``omp parallel`` and ``omp parallel for``.
   4598      1.1  joerg 
   4599      1.1  joerg If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
   4600      1.1  joerg should be passed as a quoted string. e.g.,
   4601      1.1  joerg ``isAllowedToContainClauseKind("OMPC_default").``
   4602      1.1  joerg </pre></td></tr>
   4603      1.1  joerg 
   4604      1.1  joerg 
   4605      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
   4607      1.1  joerg i.e., directives that can't have a structured block.
   4608      1.1  joerg 
   4609      1.1  joerg Given
   4610      1.1  joerg 
   4611      1.1  joerg   #pragma omp parallel
   4612      1.1  joerg   {}
   4613      1.1  joerg   #pragma omp taskyield
   4614      1.1  joerg 
   4615      1.1  joerg ``ompExecutableDirective(isStandaloneDirective()))`` matches
   4616      1.1  joerg ``omp taskyield``.
   4617      1.1  joerg </pre></td></tr>
   4618      1.1  joerg 
   4619      1.1  joerg 
   4620      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
   4622      1.1  joerg </pre></td></tr>
   4623      1.1  joerg 
   4624      1.1  joerg 
   4625      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
   4627      1.1  joerg </pre></td></tr>
   4628      1.1  joerg 
   4629      1.1  joerg 
   4630      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
   4632      1.1  joerg isSameOrDerivedFrom(hasName(...)).
   4633      1.1  joerg </pre></td></tr>
   4634      1.1  joerg 
   4635      1.1  joerg 
   4636  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
   4638      1.1  joerg a specific number of arguments (including absent default arguments).
   4639      1.1  joerg 
   4640      1.1  joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   4641      1.1  joerg   void f(int x, int y);
   4642      1.1  joerg   f(0, 0);
   4643      1.1  joerg </pre></td></tr>
   4644      1.1  joerg 
   4645      1.1  joerg 
   4646  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
   4648  1.1.1.2  joerg Selector.getAsString()
   4649  1.1.1.2  joerg 
   4650  1.1.1.2  joerg  matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
   4651  1.1.1.2  joerg  matches both of the expressions below:
   4652  1.1.1.2  joerg     [myObj methodA:argA];
   4653  1.1.1.2  joerg     [myObj methodB:argB];
   4654  1.1.1.2  joerg </pre></td></tr>
   4655  1.1.1.2  joerg 
   4656  1.1.1.2  joerg 
   4657      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
   4659      1.1  joerg 
   4660      1.1  joerg objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
   4661      1.1  joerg message expression in
   4662      1.1  joerg 
   4663      1.1  joerg   UIWebView *webView = ...;
   4664      1.1  joerg   CGRect bodyFrame = webView.frame;
   4665      1.1  joerg   bodyFrame.size.height = self.bodyContentHeight;
   4666      1.1  joerg   webView.frame = bodyFrame;
   4667      1.1  joerg   //     ^---- matches here
   4668      1.1  joerg </pre></td></tr>
   4669      1.1  joerg 
   4670      1.1  joerg 
   4671      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
   4673      1.1  joerg 
   4674      1.1  joerg Matches only when the selector of the objCMessageExpr is NULL. This may
   4675      1.1  joerg represent an error condition in the tree!
   4676      1.1  joerg </pre></td></tr>
   4677      1.1  joerg 
   4678      1.1  joerg 
   4679      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
   4681      1.1  joerg 
   4682      1.1  joerg  matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
   4683      1.1  joerg  matches the outer message expr in the code below, but NOT the message
   4684      1.1  joerg  invocation for self.bodyView.
   4685      1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   4686      1.1  joerg </pre></td></tr>
   4687      1.1  joerg 
   4688      1.1  joerg 
   4689      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
   4691      1.1  joerg 
   4692      1.1  joerg  matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
   4693      1.1  joerg  matches self.bodyView in the code below, but NOT the outer message
   4694      1.1  joerg  invocation of "loadHTMLString:baseURL:".
   4695      1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   4696      1.1  joerg </pre></td></tr>
   4697      1.1  joerg 
   4698      1.1  joerg 
   4699      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
   4701      1.1  joerg 
   4702      1.1  joerg Example
   4703      1.1  joerg matcher = objcMessageExpr(isClassMessage())
   4704      1.1  joerg matches
   4705      1.1  joerg   [NSString stringWithFormat:@"format"];
   4706      1.1  joerg but not
   4707      1.1  joerg   NSString *x = @"hello";
   4708      1.1  joerg   [x containsString:@"h"];
   4709      1.1  joerg </pre></td></tr>
   4710      1.1  joerg 
   4711      1.1  joerg 
   4712      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
   4714      1.1  joerg 
   4715      1.1  joerg Example
   4716      1.1  joerg matcher = objcMessageExpr(isInstanceMessage())
   4717      1.1  joerg matches
   4718      1.1  joerg   NSString *x = @"hello";
   4719      1.1  joerg   [x containsString:@"h"];
   4720      1.1  joerg but not
   4721      1.1  joerg   [NSString stringWithFormat:@"format"];
   4722      1.1  joerg </pre></td></tr>
   4723      1.1  joerg 
   4724      1.1  joerg 
   4725  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
   4727      1.1  joerg a substring matched by the given RegExp.
   4728      1.1  joerg  matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
   4729      1.1  joerg  invocation for self.bodyView.
   4730      1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   4731  1.1.1.2  joerg 
   4732  1.1.1.2  joerg If the matcher is used in clang-query, RegexFlags parameter
   4733  1.1.1.2  joerg should be passed as a quoted string. e.g: "NoFlags".
   4734  1.1.1.2  joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   4735      1.1  joerg </pre></td></tr>
   4736      1.1  joerg 
   4737      1.1  joerg 
   4738      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
   4740      1.1  joerg 
   4741      1.1  joerg  matcher = objCMessageExpr(numSelectorArgs(0));
   4742      1.1  joerg  matches self.bodyView in the code below
   4743      1.1  joerg 
   4744      1.1  joerg  matcher = objCMessageExpr(numSelectorArgs(2));
   4745      1.1  joerg  matches the invocation of "loadHTMLString:baseURL:" but not that
   4746      1.1  joerg  of self.bodyView
   4747      1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   4748      1.1  joerg </pre></td></tr>
   4749      1.1  joerg 
   4750      1.1  joerg 
   4751      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
   4753      1.1  joerg 
   4754      1.1  joerg Example
   4755      1.1  joerg matcher = objcMethodDecl(isClassMethod())
   4756      1.1  joerg matches
   4757      1.1  joerg @interface I + (void)foo; @end
   4758      1.1  joerg but not
   4759      1.1  joerg @interface I - (void)bar; @end
   4760      1.1  joerg </pre></td></tr>
   4761      1.1  joerg 
   4762      1.1  joerg 
   4763      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
   4765      1.1  joerg 
   4766      1.1  joerg Example matches A, va, fa
   4767      1.1  joerg   class A {};
   4768      1.1  joerg   class B;  // Doesn't match, as it has no body.
   4769      1.1  joerg   int va;
   4770      1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   4771      1.1  joerg   void fa() {}
   4772      1.1  joerg   void fb();  // Doesn't match, as it has no body.
   4773      1.1  joerg   @interface X
   4774      1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   4775      1.1  joerg   @end
   4776      1.1  joerg   @implementation X
   4777      1.1  joerg   - (void)ma {}
   4778      1.1  joerg   @end
   4779      1.1  joerg 
   4780      1.1  joerg Usable as: Matcher&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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   4782      1.1  joerg </pre></td></tr>
   4783      1.1  joerg 
   4784      1.1  joerg 
   4785      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
   4787      1.1  joerg 
   4788      1.1  joerg Example
   4789      1.1  joerg matcher = objcMethodDecl(isInstanceMethod())
   4790      1.1  joerg matches
   4791      1.1  joerg @interface I - (void)bar; @end
   4792      1.1  joerg but not
   4793      1.1  joerg @interface I + (void)foo; @end
   4794      1.1  joerg </pre></td></tr>
   4795      1.1  joerg 
   4796      1.1  joerg 
   4797      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
   4799      1.1  joerg 
   4800      1.1  joerg Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
   4801      1.1  joerg void x(int val) {}
   4802      1.1  joerg void y(int val = 0) {}
   4803  1.1.1.2  joerg 
   4804  1.1.1.2  joerg Deprecated. Use hasInitializer() instead to be able to
   4805  1.1.1.2  joerg match on the contents of the default argument.  For example:
   4806  1.1.1.2  joerg 
   4807  1.1.1.2  joerg void x(int val = 7) {}
   4808  1.1.1.2  joerg void y(int val = 42) {}
   4809  1.1.1.2  joerg parmVarDecl(hasInitializer(integerLiteral(equals(42))))
   4810  1.1.1.2  joerg   matches the parameter of y
   4811  1.1.1.2  joerg 
   4812  1.1.1.2  joerg A matcher such as
   4813  1.1.1.2  joerg   parmVarDecl(hasInitializer(anything()))
   4814  1.1.1.2  joerg is equivalent to parmVarDecl(hasDefaultArgument()).
   4815  1.1.1.2  joerg </pre></td></tr>
   4816  1.1.1.2  joerg 
   4817  1.1.1.2  joerg 
   4818  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
   4820  1.1.1.2  joerg list. The parameter list could be that of either a block, function, or
   4821  1.1.1.2  joerg objc-method.
   4822  1.1.1.2  joerg 
   4823  1.1.1.2  joerg 
   4824  1.1.1.2  joerg Given
   4825  1.1.1.2  joerg 
   4826  1.1.1.2  joerg void f(int a, int b, int c) {
   4827  1.1.1.2  joerg }
   4828  1.1.1.2  joerg 
   4829  1.1.1.2  joerg ``parmVarDecl(isAtPosition(0))`` matches ``int a``.
   4830  1.1.1.2  joerg 
   4831  1.1.1.2  joerg ``parmVarDecl(isAtPosition(1))`` matches ``int b``.
   4832      1.1  joerg </pre></td></tr>
   4833      1.1  joerg 
   4834      1.1  joerg 
   4835      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
   4837      1.1  joerg 
   4838      1.1  joerg Given
   4839      1.1  joerg   class Y { public: void x(); };
   4840      1.1  joerg   void z() { Y* y; y-&gt;x(); }
   4841      1.1  joerg cxxMemberCallExpr(on(hasType(asString("class Y *"))))
   4842      1.1  joerg   matches y-&gt;x()
   4843      1.1  joerg </pre></td></tr>
   4844      1.1  joerg 
   4845      1.1  joerg 
   4846      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
   4848      1.1  joerg 
   4849      1.1  joerg Matches a node if it equals the node previously bound to ID.
   4850      1.1  joerg 
   4851      1.1  joerg Given
   4852      1.1  joerg   class X { int a; int b; };
   4853      1.1  joerg cxxRecordDecl(
   4854      1.1  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   4855      1.1  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   4856      1.1  joerg   matches the class X, as a and b have the same type.
   4857      1.1  joerg 
   4858      1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   4859      1.1  joerg equalsBoundNodes acts as a filter.
   4860      1.1  joerg For example:
   4861      1.1  joerg compoundStmt(
   4862      1.1  joerg     forEachDescendant(varDecl().bind("d")),
   4863      1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   4864      1.1  joerg will trigger a match for each combination of variable declaration
   4865      1.1  joerg and reference to that variable declaration within a compound statement.
   4866      1.1  joerg </pre></td></tr>
   4867      1.1  joerg 
   4868      1.1  joerg 
   4869      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
   4871      1.1  joerg the node, not hidden within a typedef.
   4872      1.1  joerg 
   4873      1.1  joerg Given
   4874      1.1  joerg   typedef const int const_int;
   4875      1.1  joerg   const_int i;
   4876      1.1  joerg   int *const j;
   4877      1.1  joerg   int *volatile k;
   4878      1.1  joerg   int m;
   4879      1.1  joerg varDecl(hasType(hasLocalQualifiers())) matches only j and k.
   4880      1.1  joerg i is const-qualified but the qualifier is not local.
   4881      1.1  joerg </pre></td></tr>
   4882      1.1  joerg 
   4883      1.1  joerg 
   4884      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
   4886      1.1  joerg 
   4887      1.1  joerg Given
   4888      1.1  joerg   void a(char);
   4889      1.1  joerg   void b(wchar_t);
   4890      1.1  joerg   void c(double);
   4891      1.1  joerg functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
   4892      1.1  joerg matches "a(char)", "b(wchar_t)", but not "c(double)".
   4893      1.1  joerg </pre></td></tr>
   4894      1.1  joerg 
   4895      1.1  joerg 
   4896      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
   4898      1.1  joerg the Objective-C object pointer type, which is different despite being
   4899      1.1  joerg syntactically similar.
   4900      1.1  joerg 
   4901      1.1  joerg Given
   4902      1.1  joerg   int *i = nullptr;
   4903      1.1  joerg 
   4904      1.1  joerg   @interface Foo
   4905      1.1  joerg   @end
   4906      1.1  joerg   Foo *f;
   4907      1.1  joerg 
   4908      1.1  joerg   int j;
   4909      1.1  joerg varDecl(hasType(isAnyPointer()))
   4910      1.1  joerg   matches "int *i" and "Foo *f", but not "int j".
   4911      1.1  joerg </pre></td></tr>
   4912      1.1  joerg 
   4913      1.1  joerg 
   4914      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
   4916      1.1  joerg include "top-level" const.
   4917      1.1  joerg 
   4918      1.1  joerg Given
   4919      1.1  joerg   void a(int);
   4920      1.1  joerg   void b(int const);
   4921      1.1  joerg   void c(const int);
   4922      1.1  joerg   void d(const int*);
   4923      1.1  joerg   void e(int const) {};
   4924      1.1  joerg functionDecl(hasAnyParameter(hasType(isConstQualified())))
   4925      1.1  joerg   matches "void b(int const)", "void c(const int)" and
   4926      1.1  joerg   "void e(int const) {}". It does not match d as there
   4927      1.1  joerg   is no top-level const on the parameter type "const int *".
   4928      1.1  joerg </pre></td></tr>
   4929      1.1  joerg 
   4930      1.1  joerg 
   4931      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
   4933      1.1  joerg 
   4934      1.1  joerg Given
   4935      1.1  joerg   void a(int);
   4936      1.1  joerg   void b(long);
   4937      1.1  joerg   void c(double);
   4938      1.1  joerg functionDecl(hasAnyParameter(hasType(isInteger())))
   4939      1.1  joerg matches "a(int)", "b(long)", but not "c(double)".
   4940      1.1  joerg </pre></td></tr>
   4941      1.1  joerg 
   4942      1.1  joerg 
   4943      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
   4945      1.1  joerg 
   4946      1.1  joerg Given
   4947      1.1  joerg   void a(int);
   4948      1.1  joerg   void b(unsigned long);
   4949      1.1  joerg   void c(double);
   4950      1.1  joerg functionDecl(hasAnyParameter(hasType(isSignedInteger())))
   4951      1.1  joerg matches "a(int)", but not "b(unsigned long)" and "c(double)".
   4952      1.1  joerg </pre></td></tr>
   4953      1.1  joerg 
   4954      1.1  joerg 
   4955      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
   4957      1.1  joerg 
   4958      1.1  joerg Given
   4959      1.1  joerg   void a(int);
   4960      1.1  joerg   void b(unsigned long);
   4961      1.1  joerg   void c(double);
   4962      1.1  joerg functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
   4963      1.1  joerg matches "b(unsigned long)", but not "a(int)" and "c(double)".
   4964      1.1  joerg </pre></td></tr>
   4965      1.1  joerg 
   4966      1.1  joerg 
   4967      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
   4969      1.1  joerg include "top-level" volatile.
   4970      1.1  joerg 
   4971      1.1  joerg Given
   4972      1.1  joerg   void a(int);
   4973      1.1  joerg   void b(int volatile);
   4974      1.1  joerg   void c(volatile int);
   4975      1.1  joerg   void d(volatile int*);
   4976      1.1  joerg   void e(int volatile) {};
   4977      1.1  joerg functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
   4978      1.1  joerg   matches "void b(int volatile)", "void c(volatile int)" and
   4979      1.1  joerg   "void e(int volatile) {}". It does not match d as there
   4980      1.1  joerg   is no top-level volatile on the parameter type "volatile int *".
   4981      1.1  joerg </pre></td></tr>
   4982      1.1  joerg 
   4983      1.1  joerg 
   4984  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
   4986      1.1  joerg 
   4987  1.1.1.2  joerg Matches a node if it equals the node previously bound to ID.
   4988      1.1  joerg 
   4989  1.1.1.2  joerg Given
   4990  1.1.1.2  joerg   class X { int a; int b; };
   4991  1.1.1.2  joerg cxxRecordDecl(
   4992  1.1.1.2  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   4993  1.1.1.2  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   4994  1.1.1.2  joerg   matches the class X, as a and b have the same type.
   4995      1.1  joerg 
   4996      1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   4997      1.1  joerg equalsBoundNodes acts as a filter.
   4998      1.1  joerg For example:
   4999      1.1  joerg compoundStmt(
   5000      1.1  joerg     forEachDescendant(varDecl().bind("d")),
   5001      1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   5002      1.1  joerg will trigger a match for each combination of variable declaration
   5003      1.1  joerg and reference to that variable declaration within a compound statement.
   5004      1.1  joerg </pre></td></tr>
   5005      1.1  joerg 
   5006      1.1  joerg 
   5007      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
   5009      1.1  joerg 
   5010      1.1  joerg Stmt has pointer identity in the AST.
   5011      1.1  joerg </pre></td></tr>
   5012      1.1  joerg 
   5013      1.1  joerg 
   5014  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
   5016  1.1.1.2  joerg Does not match if only part of the statement is expanded from that macro or
   5017  1.1.1.2  joerg if different parts of the the statement are expanded from different
   5018  1.1.1.2  joerg appearances of the macro.
   5019  1.1.1.2  joerg </pre></td></tr>
   5020  1.1.1.2  joerg 
   5021  1.1.1.2  joerg 
   5022  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
   5024      1.1  joerg partially matching a given regex.
   5025      1.1  joerg 
   5026      1.1  joerg Example matches Y but not X
   5027      1.1  joerg     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   5028      1.1  joerg   #include "ASTMatcher.h"
   5029      1.1  joerg   class X {};
   5030      1.1  joerg ASTMatcher.h:
   5031      1.1  joerg   class Y {};
   5032      1.1  joerg 
   5033      1.1  joerg Usable as: Matcher&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  1.1.1.2  joerg 
   5035  1.1.1.2  joerg If the matcher is used in clang-query, RegexFlags parameter
   5036  1.1.1.2  joerg should be passed as a quoted string. e.g: "NoFlags".
   5037  1.1.1.2  joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   5038      1.1  joerg </pre></td></tr>
   5039      1.1  joerg 
   5040      1.1  joerg 
   5041      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
   5043      1.1  joerg 
   5044      1.1  joerg Example matches X but not Y
   5045      1.1  joerg   (matcher = cxxRecordDecl(isExpansionInMainFile())
   5046      1.1  joerg   #include &lt;Y.h&gt;
   5047      1.1  joerg   class X {};
   5048      1.1  joerg Y.h:
   5049      1.1  joerg   class Y {};
   5050      1.1  joerg 
   5051      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   5053      1.1  joerg 
   5054      1.1  joerg 
   5055      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
   5057      1.1  joerg 
   5058      1.1  joerg Example matches Y but not X
   5059      1.1  joerg     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   5060      1.1  joerg   #include &lt;SystemHeader.h&gt;
   5061      1.1  joerg   class X {};
   5062      1.1  joerg SystemHeader.h:
   5063      1.1  joerg   class Y {};
   5064      1.1  joerg 
   5065      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   5067      1.1  joerg 
   5068      1.1  joerg 
   5069  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
   5071      1.1  joerg 
   5072      1.1  joerg Given
   5073  1.1.1.2  joerg   int j;
   5074  1.1.1.2  joerg   template&lt;typename T&gt; void A(T t) { T i; j += 42;}
   5075  1.1.1.2  joerg   A(0);
   5076  1.1.1.2  joerg   A(0U);
   5077  1.1.1.2  joerg declStmt(isInTemplateInstantiation())
   5078  1.1.1.2  joerg   matches 'int i;' and 'unsigned i'.
   5079  1.1.1.2  joerg unless(stmt(isInTemplateInstantiation()))
   5080  1.1.1.2  joerg   will NOT match j += 42; as it's shared between the template definition and
   5081  1.1.1.2  joerg   instantiation.
   5082      1.1  joerg </pre></td></tr>
   5083      1.1  joerg 
   5084      1.1  joerg 
   5085      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
   5087      1.1  joerg 
   5088      1.1  joerg Given
   5089      1.1  joerg   int a[42];
   5090      1.1  joerg   int b[2 * 21];
   5091      1.1  joerg   int c[41], d[43];
   5092      1.1  joerg   char *s = "abcd";
   5093      1.1  joerg   wchar_t *ws = L"abcd";
   5094      1.1  joerg   char *w = "a";
   5095      1.1  joerg constantArrayType(hasSize(42))
   5096      1.1  joerg   matches "int a[42]" and "int b[2 * 21]"
   5097      1.1  joerg stringLiteral(hasSize(4))
   5098      1.1  joerg   matches "abcd", L"abcd"
   5099      1.1  joerg </pre></td></tr>
   5100      1.1  joerg 
   5101      1.1  joerg 
   5102  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
   5104  1.1.1.2  joerg 
   5105  1.1.1.2  joerg Example matches C, but not S, U or E.
   5106  1.1.1.2  joerg   struct S {};
   5107  1.1.1.2  joerg   class C {};
   5108  1.1.1.2  joerg   union U {};
   5109  1.1.1.2  joerg   enum E {};
   5110  1.1.1.2  joerg </pre></td></tr>
   5111  1.1.1.2  joerg 
   5112  1.1.1.2  joerg 
   5113      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
   5115      1.1  joerg 
   5116      1.1  joerg Example matches A, va, fa
   5117      1.1  joerg   class A {};
   5118      1.1  joerg   class B;  // Doesn't match, as it has no body.
   5119      1.1  joerg   int va;
   5120      1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   5121      1.1  joerg   void fa() {}
   5122      1.1  joerg   void fb();  // Doesn't match, as it has no body.
   5123      1.1  joerg   @interface X
   5124      1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   5125      1.1  joerg   @end
   5126      1.1  joerg   @implementation X
   5127      1.1  joerg   - (void)ma {}
   5128      1.1  joerg   @end
   5129      1.1  joerg 
   5130      1.1  joerg Usable as: Matcher&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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   5132      1.1  joerg </pre></td></tr>
   5133      1.1  joerg 
   5134      1.1  joerg 
   5135  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
   5137  1.1.1.2  joerg 
   5138  1.1.1.2  joerg Example matches E, but not C, S or U.
   5139  1.1.1.2  joerg   struct S {};
   5140  1.1.1.2  joerg   class C {};
   5141  1.1.1.2  joerg   union U {};
   5142  1.1.1.2  joerg   enum E {};
   5143  1.1.1.2  joerg </pre></td></tr>
   5144  1.1.1.2  joerg 
   5145  1.1.1.2  joerg 
   5146  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
   5148  1.1.1.2  joerg 
   5149  1.1.1.2  joerg Example matches S, but not C, U or E.
   5150  1.1.1.2  joerg   struct S {};
   5151  1.1.1.2  joerg   class C {};
   5152  1.1.1.2  joerg   union U {};
   5153  1.1.1.2  joerg   enum E {};
   5154  1.1.1.2  joerg </pre></td></tr>
   5155  1.1.1.2  joerg 
   5156  1.1.1.2  joerg 
   5157  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
   5159  1.1.1.2  joerg 
   5160  1.1.1.2  joerg Example matches U, but not C, S or E.
   5161  1.1.1.2  joerg   struct S {};
   5162  1.1.1.2  joerg   class C {};
   5163  1.1.1.2  joerg   union U {};
   5164  1.1.1.2  joerg   enum E {};
   5165  1.1.1.2  joerg </pre></td></tr>
   5166  1.1.1.2  joerg 
   5167  1.1.1.2  joerg 
   5168      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
   5170      1.1  joerg 
   5171      1.1  joerg Note that 'Value' is a string as the template argument's value is
   5172      1.1  joerg an arbitrary precision integer. 'Value' must be euqal to the canonical
   5173      1.1  joerg representation of that integral value in base 10.
   5174      1.1  joerg 
   5175      1.1  joerg Given
   5176      1.1  joerg   template&lt;int T&gt; struct C {};
   5177      1.1  joerg   C&lt;42&gt; c;
   5178      1.1  joerg classTemplateSpecializationDecl(
   5179      1.1  joerg   hasAnyTemplateArgument(equalsIntegralValue("42")))
   5180      1.1  joerg   matches the implicit instantiation of C in C&lt;42&gt;.
   5181      1.1  joerg </pre></td></tr>
   5182      1.1  joerg 
   5183      1.1  joerg 
   5184      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
   5186      1.1  joerg 
   5187      1.1  joerg Given
   5188      1.1  joerg   template&lt;int T&gt; struct C {};
   5189      1.1  joerg   C&lt;42&gt; c;
   5190      1.1  joerg classTemplateSpecializationDecl(
   5191      1.1  joerg   hasAnyTemplateArgument(isIntegral()))
   5192      1.1  joerg   matches the implicit instantiation of C in C&lt;42&gt;
   5193      1.1  joerg   with isIntegral() matching 42.
   5194      1.1  joerg </pre></td></tr>
   5195      1.1  joerg 
   5196      1.1  joerg 
   5197      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
   5199      1.1  joerg 
   5200      1.1  joerg Given
   5201      1.1  joerg   template&lt;typename T&gt; struct C {};
   5202      1.1  joerg   C&lt;int&gt; c;
   5203      1.1  joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
   5204      1.1  joerg   matches C&lt;int&gt;.
   5205      1.1  joerg </pre></td></tr>
   5206      1.1  joerg 
   5207      1.1  joerg 
   5208  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
   5210  1.1.1.2  joerg Does not match if only part of the statement is expanded from that macro or
   5211  1.1.1.2  joerg if different parts of the the statement are expanded from different
   5212  1.1.1.2  joerg appearances of the macro.
   5213  1.1.1.2  joerg </pre></td></tr>
   5214  1.1.1.2  joerg 
   5215  1.1.1.2  joerg 
   5216  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
   5218      1.1  joerg partially matching a given regex.
   5219      1.1  joerg 
   5220      1.1  joerg Example matches Y but not X
   5221      1.1  joerg     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   5222      1.1  joerg   #include "ASTMatcher.h"
   5223      1.1  joerg   class X {};
   5224      1.1  joerg ASTMatcher.h:
   5225      1.1  joerg   class Y {};
   5226      1.1  joerg 
   5227      1.1  joerg Usable as: Matcher&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  1.1.1.2  joerg 
   5229  1.1.1.2  joerg If the matcher is used in clang-query, RegexFlags parameter
   5230  1.1.1.2  joerg should be passed as a quoted string. e.g: "NoFlags".
   5231  1.1.1.2  joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex"
   5232      1.1  joerg </pre></td></tr>
   5233      1.1  joerg 
   5234      1.1  joerg 
   5235      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
   5237      1.1  joerg 
   5238      1.1  joerg Example matches X but not Y
   5239      1.1  joerg   (matcher = cxxRecordDecl(isExpansionInMainFile())
   5240      1.1  joerg   #include &lt;Y.h&gt;
   5241      1.1  joerg   class X {};
   5242      1.1  joerg Y.h:
   5243      1.1  joerg   class Y {};
   5244      1.1  joerg 
   5245      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   5247      1.1  joerg 
   5248      1.1  joerg 
   5249      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
   5251      1.1  joerg 
   5252      1.1  joerg Example matches Y but not X
   5253      1.1  joerg     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   5254      1.1  joerg   #include &lt;SystemHeader.h&gt;
   5255      1.1  joerg   class X {};
   5256      1.1  joerg SystemHeader.h:
   5257      1.1  joerg   class Y {};
   5258      1.1  joerg 
   5259      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   5261      1.1  joerg 
   5262      1.1  joerg 
   5263      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
   5265      1.1  joerg 
   5266      1.1  joerg Given
   5267      1.1  joerg  struct S { bool func(); };
   5268      1.1  joerg functionDecl(returns(booleanType()))
   5269      1.1  joerg   matches "bool func();"
   5270      1.1  joerg </pre></td></tr>
   5271      1.1  joerg 
   5272      1.1  joerg 
   5273      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
   5275      1.1  joerg 
   5276      1.1  joerg Matches a node if it equals the node previously bound to ID.
   5277      1.1  joerg 
   5278      1.1  joerg Given
   5279      1.1  joerg   class X { int a; int b; };
   5280      1.1  joerg cxxRecordDecl(
   5281      1.1  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   5282      1.1  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   5283      1.1  joerg   matches the class X, as a and b have the same type.
   5284      1.1  joerg 
   5285      1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   5286      1.1  joerg equalsBoundNodes acts as a filter.
   5287      1.1  joerg For example:
   5288      1.1  joerg compoundStmt(
   5289      1.1  joerg     forEachDescendant(varDecl().bind("d")),
   5290      1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   5291      1.1  joerg will trigger a match for each combination of variable declaration
   5292      1.1  joerg and reference to that variable declaration within a compound statement.
   5293      1.1  joerg </pre></td></tr>
   5294      1.1  joerg 
   5295      1.1  joerg 
   5296      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
   5298      1.1  joerg 
   5299      1.1  joerg Type has pointer identity in the AST.
   5300      1.1  joerg </pre></td></tr>
   5301      1.1  joerg 
   5302      1.1  joerg 
   5303      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
   5305      1.1  joerg 
   5306      1.1  joerg Given
   5307      1.1  joerg   int i;
   5308      1.1  joerg   float f;
   5309      1.1  joerg realFloatingPointType()
   5310      1.1  joerg   matches "float f" but not "int i"
   5311      1.1  joerg </pre></td></tr>
   5312      1.1  joerg 
   5313      1.1  joerg 
   5314      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
   5316      1.1  joerg 
   5317      1.1  joerg Given
   5318      1.1  joerg  struct S { void func(); };
   5319      1.1  joerg functionDecl(returns(voidType()))
   5320      1.1  joerg   matches "void func();"
   5321      1.1  joerg </pre></td></tr>
   5322      1.1  joerg 
   5323      1.1  joerg 
   5324      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
   5326      1.1  joerg 
   5327      1.1  joerg Given
   5328      1.1  joerg   int x;
   5329      1.1  joerg   int s = sizeof(x) + alignof(x)
   5330      1.1  joerg unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
   5331      1.1  joerg   matches sizeof(x)
   5332      1.1  joerg 
   5333      1.1  joerg If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
   5334      1.1  joerg should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
   5335      1.1  joerg </pre></td></tr>
   5336      1.1  joerg 
   5337      1.1  joerg 
   5338  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
   5340  1.1.1.2  joerg specified names.
   5341  1.1.1.2  joerg 
   5342  1.1.1.2  joerg    hasAnyOperatorName("+", "-")
   5343  1.1.1.2  joerg  Is equivalent to
   5344  1.1.1.2  joerg    anyOf(hasOperatorName("+"), hasOperatorName("-"))
   5345  1.1.1.2  joerg </pre></td></tr>
   5346  1.1.1.2  joerg 
   5347  1.1.1.2  joerg 
   5348  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
   5350      1.1  joerg unary).
   5351      1.1  joerg 
   5352      1.1  joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   5353      1.1  joerg   !(a || b)
   5354      1.1  joerg </pre></td></tr>
   5355      1.1  joerg 
   5356      1.1  joerg 
   5357      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
   5359      1.1  joerg to '.'.
   5360      1.1  joerg 
   5361      1.1  joerg Member calls on the implicit this pointer match as called with '-&gt;'.
   5362      1.1  joerg 
   5363      1.1  joerg Given
   5364      1.1  joerg   class Y {
   5365      1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   5366      1.1  joerg     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   5367      1.1  joerg     int a;
   5368      1.1  joerg     static int b;
   5369      1.1  joerg   };
   5370      1.1  joerg   template &lt;class T&gt;
   5371      1.1  joerg   class Z {
   5372      1.1  joerg     void x() { this-&gt;m; }
   5373      1.1  joerg   };
   5374      1.1  joerg memberExpr(isArrow())
   5375      1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   5376      1.1  joerg cxxDependentScopeMemberExpr(isArrow())
   5377      1.1  joerg   matches this-&gt;m
   5378      1.1  joerg unresolvedMemberExpr(isArrow())
   5379      1.1  joerg   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   5380      1.1  joerg </pre></td></tr>
   5381      1.1  joerg 
   5382      1.1  joerg 
   5383      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
   5385      1.1  joerg 
   5386      1.1  joerg Example matches x, but not y, z, or a.
   5387      1.1  joerg (matcher = varDecl(hasAutomaticStorageDuration())
   5388      1.1  joerg void f() {
   5389      1.1  joerg   int x;
   5390      1.1  joerg   static int y;
   5391      1.1  joerg   thread_local int z;
   5392      1.1  joerg }
   5393      1.1  joerg int a;
   5394      1.1  joerg </pre></td></tr>
   5395      1.1  joerg 
   5396      1.1  joerg 
   5397      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
   5399      1.1  joerg 
   5400      1.1  joerg Example matches y and z (matcher = varDecl(hasGlobalStorage())
   5401      1.1  joerg void f() {
   5402      1.1  joerg   int x;
   5403      1.1  joerg   static int y;
   5404      1.1  joerg }
   5405      1.1  joerg int z;
   5406      1.1  joerg </pre></td></tr>
   5407      1.1  joerg 
   5408      1.1  joerg 
   5409      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
   5411      1.1  joerg non-static local variable.
   5412      1.1  joerg 
   5413      1.1  joerg Example matches x (matcher = varDecl(hasLocalStorage())
   5414      1.1  joerg void f() {
   5415      1.1  joerg   int x;
   5416      1.1  joerg   static int y;
   5417      1.1  joerg }
   5418      1.1  joerg int z;
   5419      1.1  joerg </pre></td></tr>
   5420      1.1  joerg 
   5421      1.1  joerg 
   5422      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
   5424      1.1  joerg It includes the variable declared at namespace scope and those declared
   5425      1.1  joerg with "static" and "extern" storage class specifiers.
   5426      1.1  joerg 
   5427      1.1  joerg void f() {
   5428      1.1  joerg   int x;
   5429      1.1  joerg   static int y;
   5430      1.1  joerg   thread_local int z;
   5431      1.1  joerg }
   5432      1.1  joerg int a;
   5433      1.1  joerg static int b;
   5434      1.1  joerg extern int c;
   5435      1.1  joerg varDecl(hasStaticStorageDuration())
   5436      1.1  joerg   matches the function declaration y, a, b and c.
   5437      1.1  joerg </pre></td></tr>
   5438      1.1  joerg 
   5439      1.1  joerg 
   5440      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
   5442      1.1  joerg 
   5443      1.1  joerg Example matches z, but not x, z, or a.
   5444      1.1  joerg (matcher = varDecl(hasThreadStorageDuration())
   5445      1.1  joerg void f() {
   5446      1.1  joerg   int x;
   5447      1.1  joerg   static int y;
   5448      1.1  joerg   thread_local int z;
   5449      1.1  joerg }
   5450      1.1  joerg int a;
   5451      1.1  joerg </pre></td></tr>
   5452      1.1  joerg 
   5453      1.1  joerg 
   5454      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
   5456      1.1  joerg        and if constexpr.
   5457      1.1  joerg 
   5458      1.1  joerg Given:
   5459      1.1  joerg   constexpr int foo = 42;
   5460      1.1  joerg   constexpr int bar();
   5461      1.1  joerg   void baz() { if constexpr(1 &gt; 0) {} }
   5462      1.1  joerg varDecl(isConstexpr())
   5463      1.1  joerg   matches the declaration of foo.
   5464      1.1  joerg functionDecl(isConstexpr())
   5465      1.1  joerg   matches the declaration of bar.
   5466      1.1  joerg ifStmt(isConstexpr())
   5467      1.1  joerg   matches the if statement in baz.
   5468      1.1  joerg </pre></td></tr>
   5469      1.1  joerg 
   5470      1.1  joerg 
   5471      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
   5473      1.1  joerg 
   5474      1.1  joerg Example matches A, va, fa
   5475      1.1  joerg   class A {};
   5476      1.1  joerg   class B;  // Doesn't match, as it has no body.
   5477      1.1  joerg   int va;
   5478      1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   5479      1.1  joerg   void fa() {}
   5480      1.1  joerg   void fb();  // Doesn't match, as it has no body.
   5481      1.1  joerg   @interface X
   5482      1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   5483      1.1  joerg   @end
   5484      1.1  joerg   @implementation X
   5485      1.1  joerg   - (void)ma {}
   5486      1.1  joerg   @end
   5487      1.1  joerg 
   5488      1.1  joerg Usable as: Matcher&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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   5490      1.1  joerg </pre></td></tr>
   5491      1.1  joerg 
   5492      1.1  joerg 
   5493      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
   5495      1.1  joerg a C++ catch block, or an Objective-C statement.
   5496      1.1  joerg 
   5497      1.1  joerg Example matches x (matcher = varDecl(isExceptionVariable())
   5498      1.1  joerg void f(int y) {
   5499      1.1  joerg   try {
   5500      1.1  joerg   } catch (int x) {
   5501      1.1  joerg   }
   5502      1.1  joerg }
   5503      1.1  joerg </pre></td></tr>
   5504      1.1  joerg 
   5505      1.1  joerg 
   5506      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
   5508      1.1  joerg static member variable template instantiations.
   5509      1.1  joerg 
   5510      1.1  joerg Given
   5511      1.1  joerg   template&lt;typename T&gt; void A(T t) { }
   5512      1.1  joerg   template&lt;&gt; void A(int N) { }
   5513      1.1  joerg functionDecl(isExplicitTemplateSpecialization())
   5514      1.1  joerg   matches the specialization A&lt;int&gt;().
   5515      1.1  joerg 
   5516      1.1  joerg 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      1.1  joerg </pre></td></tr>
   5518      1.1  joerg 
   5519      1.1  joerg 
   5520      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
   5522      1.1  joerg 
   5523      1.1  joerg Given:
   5524      1.1  joerg   extern "C" void f() {}
   5525      1.1  joerg   extern "C" { void g() {} }
   5526      1.1  joerg   void h() {}
   5527      1.1  joerg   extern "C" int x = 1;
   5528      1.1  joerg   extern "C" int y = 2;
   5529      1.1  joerg   int z = 3;
   5530      1.1  joerg functionDecl(isExternC())
   5531      1.1  joerg   matches the declaration of f and g, but not the declaration of h.
   5532      1.1  joerg varDecl(isExternC())
   5533      1.1  joerg   matches the declaration of x and y, but not the declaration of z.
   5534      1.1  joerg </pre></td></tr>
   5535      1.1  joerg 
   5536      1.1  joerg 
   5537      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
   5539      1.1  joerg 
   5540      1.1  joerg Example matches y (matcher = varDecl(isStaticLocal()))
   5541      1.1  joerg void f() {
   5542      1.1  joerg   int x;
   5543      1.1  joerg   static int y;
   5544      1.1  joerg }
   5545      1.1  joerg static int z;
   5546      1.1  joerg </pre></td></tr>
   5547      1.1  joerg 
   5548      1.1  joerg 
   5549      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
   5551      1.1  joerg class specifier ("static" keyword) written in the source.
   5552      1.1  joerg 
   5553      1.1  joerg Given:
   5554      1.1  joerg   static void f() {}
   5555      1.1  joerg   static int i = 0;
   5556      1.1  joerg   extern int j;
   5557      1.1  joerg   int k;
   5558      1.1  joerg functionDecl(isStaticStorageClass())
   5559      1.1  joerg   matches the function declaration f.
   5560      1.1  joerg varDecl(isStaticStorageClass())
   5561      1.1  joerg   matches the variable declaration i.
   5562      1.1  joerg </pre></td></tr>
   5563      1.1  joerg 
   5564      1.1  joerg 
   5565      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
   5567      1.1  joerg member variable template instantiations.
   5568      1.1  joerg 
   5569      1.1  joerg Given
   5570      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   5571      1.1  joerg or
   5572      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   5573      1.1  joerg or
   5574      1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   5575      1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   5576      1.1  joerg   matches the template instantiation of X&lt;A&gt;.
   5577      1.1  joerg 
   5578      1.1  joerg But given
   5579      1.1  joerg   template &lt;typename T&gt;  class X {}; class A {};
   5580      1.1  joerg   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   5581      1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   5582      1.1  joerg   does not match, as X&lt;A&gt; is an explicit template specialization.
   5583      1.1  joerg 
   5584      1.1  joerg 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      1.1  joerg </pre></td></tr>
   5586      1.1  joerg 
   5587      1.1  joerg <!--END_NARROWING_MATCHERS -->
   5588      1.1  joerg </table>
   5589      1.1  joerg 
   5590      1.1  joerg <!-- ======================================================================= -->
   5591      1.1  joerg <h2 id="traversal-matchers">AST Traversal Matchers</h2>
   5592      1.1  joerg <!-- ======================================================================= -->
   5593      1.1  joerg 
   5594      1.1  joerg <p>Traversal matchers specify the relationship to other nodes that are
   5595      1.1  joerg reachable from the current node.</p>
   5596      1.1  joerg 
   5597      1.1  joerg <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
   5598      1.1  joerg forEachDescendant) which work on all nodes and allow users to write more generic
   5599      1.1  joerg match expressions.</p>
   5600      1.1  joerg 
   5601      1.1  joerg <table>
   5602      1.1  joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
   5603      1.1  joerg <!-- START_TRAVERSAL_MATCHERS -->
   5604      1.1  joerg 
   5605  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
   5607  1.1.1.2  joerg 
   5608  1.1.1.2  joerg The code
   5609  1.1.1.2  joerg   var1 != var2;
   5610  1.1.1.2  joerg might be represented in the clang AST as a binaryOperator, a
   5611  1.1.1.2  joerg cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
   5612  1.1.1.2  joerg 
   5613  1.1.1.2  joerg * whether the types of var1 and var2 are fundamental (binaryOperator) or at
   5614  1.1.1.2  joerg   least one is a class type (cxxOperatorCallExpr)
   5615  1.1.1.2  joerg * whether the code appears in a template declaration, if at least one of the
   5616  1.1.1.2  joerg   vars is a dependent-type (binaryOperator)
   5617  1.1.1.2  joerg * whether the code relies on a rewritten binary operator, such as a
   5618  1.1.1.2  joerg spaceship operator or an inverted equality operator
   5619  1.1.1.2  joerg (cxxRewrittenBinaryOperator)
   5620  1.1.1.2  joerg 
   5621  1.1.1.2  joerg This matcher elides details in places where the matchers for the nodes are
   5622  1.1.1.2  joerg compatible.
   5623  1.1.1.2  joerg 
   5624  1.1.1.2  joerg Given
   5625  1.1.1.2  joerg   binaryOperation(
   5626  1.1.1.2  joerg     hasOperatorName("!="),
   5627  1.1.1.2  joerg     hasLHS(expr().bind("lhs")),
   5628  1.1.1.2  joerg     hasRHS(expr().bind("rhs"))
   5629  1.1.1.2  joerg   )
   5630  1.1.1.2  joerg matches each use of "!=" in:
   5631  1.1.1.2  joerg   struct S{
   5632  1.1.1.2  joerg       bool operator!=(const S&amp;) const;
   5633  1.1.1.2  joerg   };
   5634  1.1.1.2  joerg 
   5635  1.1.1.2  joerg   void foo()
   5636  1.1.1.2  joerg   {
   5637  1.1.1.2  joerg      1 != 2;
   5638  1.1.1.2  joerg      S() != S();
   5639  1.1.1.2  joerg   }
   5640  1.1.1.2  joerg 
   5641  1.1.1.2  joerg   template&lt;typename T&gt;
   5642  1.1.1.2  joerg   void templ()
   5643  1.1.1.2  joerg   {
   5644  1.1.1.2  joerg      1 != 2;
   5645  1.1.1.2  joerg      T() != S();
   5646  1.1.1.2  joerg   }
   5647  1.1.1.2  joerg   struct HasOpEq
   5648  1.1.1.2  joerg   {
   5649  1.1.1.2  joerg       bool operator==(const HasOpEq &amp;) const;
   5650  1.1.1.2  joerg   };
   5651  1.1.1.2  joerg 
   5652  1.1.1.2  joerg   void inverse()
   5653  1.1.1.2  joerg   {
   5654  1.1.1.2  joerg       HasOpEq s1;
   5655  1.1.1.2  joerg       HasOpEq s2;
   5656  1.1.1.2  joerg       if (s1 != s2)
   5657  1.1.1.2  joerg           return;
   5658  1.1.1.2  joerg   }
   5659  1.1.1.2  joerg 
   5660  1.1.1.2  joerg   struct HasSpaceship
   5661  1.1.1.2  joerg   {
   5662  1.1.1.2  joerg       bool operator&lt;=&gt;(const HasOpEq &amp;) const;
   5663  1.1.1.2  joerg   };
   5664  1.1.1.2  joerg 
   5665  1.1.1.2  joerg   void use_spaceship()
   5666  1.1.1.2  joerg   {
   5667  1.1.1.2  joerg       HasSpaceship s1;
   5668  1.1.1.2  joerg       HasSpaceship s2;
   5669  1.1.1.2  joerg       if (s1 != s2)
   5670  1.1.1.2  joerg           return;
   5671  1.1.1.2  joerg   }
   5672  1.1.1.2  joerg </pre></td></tr>
   5673  1.1.1.2  joerg 
   5674  1.1.1.2  joerg 
   5675      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
   5677      1.1  joerg 
   5678      1.1  joerg Unlike anyOf, eachOf will generate a match result for each
   5679      1.1  joerg matching submatcher.
   5680      1.1  joerg 
   5681      1.1  joerg For example, in:
   5682      1.1  joerg   class A { int a; int b; };
   5683      1.1  joerg The matcher:
   5684      1.1  joerg   cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
   5685      1.1  joerg                        has(fieldDecl(hasName("b")).bind("v"))))
   5686      1.1  joerg will generate two results binding "v", the first of which binds
   5687      1.1  joerg the field declaration of a, the second the field declaration of
   5688      1.1  joerg b.
   5689      1.1  joerg 
   5690      1.1  joerg Usable as: Any Matcher
   5691      1.1  joerg </pre></td></tr>
   5692      1.1  joerg 
   5693      1.1  joerg 
   5694  1.1.1.2  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;*&gt;  Matcher</td></tr>
   5695  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
   5696  1.1.1.2  joerg 
   5697  1.1.1.2  joerg Generates results for each match.
   5698  1.1.1.2  joerg 
   5699  1.1.1.2  joerg For example, in:
   5700  1.1.1.2  joerg   class A { class B {}; class C {}; };
   5701  1.1.1.2  joerg The matcher:
   5702  1.1.1.2  joerg   cxxRecordDecl(hasName("::A"),
   5703  1.1.1.2  joerg                 findAll(cxxRecordDecl(isDefinition()).bind("m")))
   5704  1.1.1.2  joerg will generate results for A, B and C.
   5705  1.1.1.2  joerg 
   5706  1.1.1.2  joerg Usable as: Any Matcher
   5707  1.1.1.2  joerg </pre></td></tr>
   5708  1.1.1.2  joerg 
   5709  1.1.1.2  joerg 
   5710      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
   5711      1.1  joerg <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   5712      1.1  joerg provided matcher.
   5713      1.1  joerg 
   5714      1.1  joerg Example matches X, A, A::X, B, B::C, B::C::X
   5715      1.1  joerg   (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
   5716      1.1  joerg   class X {};
   5717      1.1  joerg   class A { class X {}; };  // Matches A, because A::X is a class of name
   5718      1.1  joerg                             // X inside A.
   5719      1.1  joerg   class B { class C { class X {}; }; };
   5720      1.1  joerg 
   5721      1.1  joerg DescendantT must be an AST base type.
   5722      1.1  joerg 
   5723      1.1  joerg As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
   5724      1.1  joerg each result that matches instead of only on the first one.
   5725      1.1  joerg 
   5726      1.1  joerg Note: Recursively combined ForEachDescendant can cause many matches:
   5727      1.1  joerg   cxxRecordDecl(forEachDescendant(cxxRecordDecl(
   5728      1.1  joerg     forEachDescendant(cxxRecordDecl())
   5729      1.1  joerg   )))
   5730      1.1  joerg will match 10 times (plus injected class name matches) on:
   5731      1.1  joerg   class A { class B { class C { class D { class E {}; }; }; }; };
   5732      1.1  joerg 
   5733      1.1  joerg Usable as: Any Matcher
   5734      1.1  joerg </pre></td></tr>
   5735      1.1  joerg 
   5736      1.1  joerg 
   5737      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
   5738      1.1  joerg <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
   5739      1.1  joerg provided matcher.
   5740      1.1  joerg 
   5741      1.1  joerg Example matches X, Y, Y::X, Z::Y, Z::Y::X
   5742      1.1  joerg   (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
   5743      1.1  joerg   class X {};
   5744      1.1  joerg   class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
   5745      1.1  joerg                             // inside Y.
   5746      1.1  joerg   class Z { class Y { class X {}; }; };  // Does not match Z.
   5747      1.1  joerg 
   5748      1.1  joerg ChildT must be an AST base type.
   5749      1.1  joerg 
   5750      1.1  joerg As opposed to 'has', 'forEach' will cause a match for each result that
   5751      1.1  joerg matches instead of only on the first one.
   5752      1.1  joerg 
   5753      1.1  joerg Usable as: Any Matcher
   5754      1.1  joerg </pre></td></tr>
   5755      1.1  joerg 
   5756      1.1  joerg 
   5757      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
   5758      1.1  joerg <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
   5759      1.1  joerg matcher.
   5760      1.1  joerg 
   5761      1.1  joerg Given
   5762      1.1  joerg void f() { if (true) { int x = 42; } }
   5763      1.1  joerg void g() { for (;;) { int x = 43; } }
   5764      1.1  joerg expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
   5765      1.1  joerg 
   5766      1.1  joerg Usable as: Any Matcher
   5767      1.1  joerg </pre></td></tr>
   5768      1.1  joerg 
   5769      1.1  joerg 
   5770      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
   5771      1.1  joerg <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   5772      1.1  joerg provided matcher.
   5773      1.1  joerg 
   5774      1.1  joerg Example matches X, Y, Z
   5775      1.1  joerg     (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
   5776      1.1  joerg   class X {};  // Matches X, because X::X is a class of name X inside X.
   5777      1.1  joerg   class Y { class X {}; };
   5778      1.1  joerg   class Z { class Y { class X {}; }; };
   5779      1.1  joerg 
   5780      1.1  joerg DescendantT must be an AST base type.
   5781      1.1  joerg 
   5782      1.1  joerg Usable as: Any Matcher
   5783      1.1  joerg </pre></td></tr>
   5784      1.1  joerg 
   5785      1.1  joerg 
   5786      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
   5787      1.1  joerg <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
   5788      1.1  joerg provided matcher.
   5789      1.1  joerg 
   5790      1.1  joerg Example matches X, Y
   5791      1.1  joerg   (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
   5792      1.1  joerg   class X {};  // Matches X, because X::X is a class of name X inside X.
   5793      1.1  joerg   class Y { class X {}; };
   5794      1.1  joerg   class Z { class Y { class X {}; }; };  // Does not match Z.
   5795      1.1  joerg 
   5796      1.1  joerg ChildT must be an AST base type.
   5797      1.1  joerg 
   5798      1.1  joerg Usable as: Any Matcher
   5799      1.1  joerg Note that has is direct matcher, so it also matches things like implicit
   5800      1.1  joerg casts and paren casts. If you are matching with expr then you should
   5801      1.1  joerg probably consider using ignoringParenImpCasts like:
   5802      1.1  joerg has(ignoringParenImpCasts(expr())).
   5803      1.1  joerg </pre></td></tr>
   5804      1.1  joerg 
   5805      1.1  joerg 
   5806      1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
   5807      1.1  joerg <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
   5808      1.1  joerg matcher.
   5809      1.1  joerg 
   5810      1.1  joerg Given
   5811      1.1  joerg void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
   5812      1.1  joerg compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
   5813      1.1  joerg 
   5814      1.1  joerg Usable as: Any Matcher
   5815      1.1  joerg </pre></td></tr>
   5816      1.1  joerg 
   5817      1.1  joerg 
   5818  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
   5820  1.1.1.2  joerg 
   5821  1.1.1.2  joerg Because CallExpr and CXXConstructExpr do not share a common
   5822  1.1.1.2  joerg base class with API accessing arguments etc, AST Matchers for code
   5823  1.1.1.2  joerg which should match both are typically duplicated. This matcher
   5824  1.1.1.2  joerg removes the need for duplication.
   5825  1.1.1.2  joerg 
   5826  1.1.1.2  joerg Given code
   5827  1.1.1.2  joerg struct ConstructorTakesInt
   5828  1.1.1.2  joerg {
   5829  1.1.1.2  joerg   ConstructorTakesInt(int i) {}
   5830  1.1.1.2  joerg };
   5831  1.1.1.2  joerg 
   5832  1.1.1.2  joerg void callTakesInt(int i)
   5833  1.1.1.2  joerg {
   5834  1.1.1.2  joerg }
   5835  1.1.1.2  joerg 
   5836  1.1.1.2  joerg void doCall()
   5837  1.1.1.2  joerg {
   5838  1.1.1.2  joerg   callTakesInt(42);
   5839  1.1.1.2  joerg }
   5840  1.1.1.2  joerg 
   5841  1.1.1.2  joerg void doConstruct()
   5842  1.1.1.2  joerg {
   5843  1.1.1.2  joerg   ConstructorTakesInt cti(42);
   5844  1.1.1.2  joerg }
   5845  1.1.1.2  joerg 
   5846  1.1.1.2  joerg The matcher
   5847  1.1.1.2  joerg invocation(hasArgument(0, integerLiteral(equals(42))))
   5848  1.1.1.2  joerg matches the expression in both doCall and doConstruct
   5849  1.1.1.2  joerg </pre></td></tr>
   5850  1.1.1.2  joerg 
   5851  1.1.1.2  joerg 
   5852  1.1.1.2  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
   5853  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
   5854  1.1.1.2  joerg 
   5855  1.1.1.2  joerg However, optionally will retain any bindings generated by the submatcher.
   5856  1.1.1.2  joerg Useful when additional information which may or may not present about a main
   5857  1.1.1.2  joerg matching node is desired.
   5858  1.1.1.2  joerg 
   5859  1.1.1.2  joerg For example, in:
   5860  1.1.1.2  joerg   class Foo {
   5861  1.1.1.2  joerg     int bar;
   5862  1.1.1.2  joerg   }
   5863  1.1.1.2  joerg The matcher:
   5864  1.1.1.2  joerg   cxxRecordDecl(
   5865  1.1.1.2  joerg     optionally(has(
   5866  1.1.1.2  joerg       fieldDecl(hasName("bar")).bind("var")
   5867  1.1.1.2  joerg   ))).bind("record")
   5868  1.1.1.2  joerg will produce a result binding for both "record" and "var".
   5869  1.1.1.2  joerg The matcher will produce a "record" binding for even if there is no data
   5870  1.1.1.2  joerg member named "bar" in that class.
   5871  1.1.1.2  joerg 
   5872  1.1.1.2  joerg Usable as: Any Matcher
   5873  1.1.1.2  joerg </pre></td></tr>
   5874  1.1.1.2  joerg 
   5875  1.1.1.2  joerg 
   5876  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
   5878  1.1.1.2  joerg 
   5879  1.1.1.2  joerg Given
   5880  1.1.1.2  joerg   void foo()
   5881  1.1.1.2  joerg   {
   5882  1.1.1.2  joerg       int i = 3.0;
   5883  1.1.1.2  joerg   }
   5884  1.1.1.2  joerg The matcher
   5885  1.1.1.2  joerg   traverse(TK_IgnoreUnlessSpelledInSource,
   5886  1.1.1.2  joerg     varDecl(hasInitializer(floatLiteral().bind("init")))
   5887  1.1.1.2  joerg   )
   5888  1.1.1.2  joerg matches the variable declaration with "init" bound to the "3.0".
   5889  1.1.1.2  joerg </pre></td></tr>
   5890  1.1.1.2  joerg 
   5891  1.1.1.2  joerg 
   5892      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
   5894      1.1  joerg switch statement or conditional operator.
   5895      1.1  joerg 
   5896      1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   5897      1.1  joerg   if (true) {}
   5898      1.1  joerg </pre></td></tr>
   5899      1.1  joerg 
   5900      1.1  joerg 
   5901      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
   5903      1.1  joerg (binary or ternary).
   5904      1.1  joerg 
   5905      1.1  joerg Example matches b
   5906      1.1  joerg   condition ? a : b
   5907      1.1  joerg   condition ?: b
   5908      1.1  joerg </pre></td></tr>
   5909      1.1  joerg 
   5910      1.1  joerg 
   5911      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
   5913      1.1  joerg 
   5914      1.1  joerg Example 1 (conditional ternary operator): matches a
   5915      1.1  joerg   condition ? a : b
   5916      1.1  joerg 
   5917      1.1  joerg Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
   5918      1.1  joerg   condition ?: b
   5919      1.1  joerg </pre></td></tr>
   5920      1.1  joerg 
   5921      1.1  joerg 
   5922  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
   5924      1.1  joerg matches the given matcher.
   5925      1.1  joerg 
   5926      1.1  joerg The associated declaration is:
   5927      1.1  joerg - for type nodes, the declaration of the underlying type
   5928      1.1  joerg - for CallExpr, the declaration of the callee
   5929      1.1  joerg - for MemberExpr, the declaration of the referenced member
   5930      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   5931      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   5932      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   5933      1.1  joerg 
   5934      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   5935      1.1  joerg sugared type. Given
   5936      1.1  joerg   class X {};
   5937      1.1  joerg   typedef X Y;
   5938      1.1  joerg   Y y;
   5939      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   5940      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   5941      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   5942      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   5943      1.1  joerg       recordType(hasDeclaration(decl())))))
   5944      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   5945      1.1  joerg 
   5946      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   5953      1.1  joerg </pre></td></tr>
   5954      1.1  joerg 
   5955      1.1  joerg 
   5956      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
   5958      1.1  joerg 
   5959      1.1  joerg Given
   5960      1.1  joerg   int i[5];
   5961      1.1  joerg   void f() { i[1] = 42; }
   5962      1.1  joerg arraySubscriptExpression(hasBase(implicitCastExpr(
   5963      1.1  joerg     hasSourceExpression(declRefExpr()))))
   5964      1.1  joerg   matches i[1] with the declRefExpr() matching i
   5965      1.1  joerg </pre></td></tr>
   5966      1.1  joerg 
   5967      1.1  joerg 
   5968      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
   5970      1.1  joerg 
   5971      1.1  joerg Given
   5972      1.1  joerg   int i[5];
   5973      1.1  joerg   void f() { i[1] = 42; }
   5974      1.1  joerg arraySubscriptExpression(hasIndex(integerLiteral()))
   5975      1.1  joerg   matches i[1] with the integerLiteral() matching 1
   5976      1.1  joerg </pre></td></tr>
   5977      1.1  joerg 
   5978      1.1  joerg 
   5979  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
   5981      1.1  joerg 
   5982      1.1  joerg Example matches a (matcher = binaryOperator(hasLHS()))
   5983      1.1  joerg   a || b
   5984      1.1  joerg </pre></td></tr>
   5985      1.1  joerg 
   5986      1.1  joerg 
   5987  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
   5989      1.1  joerg 
   5990      1.1  joerg Example matches b (matcher = binaryOperator(hasRHS()))
   5991      1.1  joerg   a || b
   5992      1.1  joerg </pre></td></tr>
   5993      1.1  joerg 
   5994      1.1  joerg 
   5995      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
   5997      1.1  joerg type.
   5998      1.1  joerg 
   5999      1.1  joerg Given
   6000      1.1  joerg   struct A {};
   6001      1.1  joerg   A a[7];
   6002      1.1  joerg   int b[7];
   6003      1.1  joerg arrayType(hasElementType(builtinType()))
   6004      1.1  joerg   matches "int b[7]"
   6005      1.1  joerg 
   6006      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   6008      1.1  joerg 
   6009      1.1  joerg 
   6010      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
   6012      1.1  joerg 
   6013      1.1  joerg Given
   6014      1.1  joerg   _Atomic(int) i;
   6015      1.1  joerg   _Atomic(float) f;
   6016      1.1  joerg atomicType(hasValueType(isInteger()))
   6017      1.1  joerg  matches "_Atomic(int) i"
   6018      1.1  joerg 
   6019      1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
   6020      1.1  joerg </pre></td></tr>
   6021      1.1  joerg 
   6022      1.1  joerg 
   6023      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
   6025      1.1  joerg 
   6026      1.1  joerg Note: There is no TypeLoc for the deduced type and thus no
   6027      1.1  joerg getDeducedLoc() matcher.
   6028      1.1  joerg 
   6029      1.1  joerg Given
   6030      1.1  joerg   auto a = 1;
   6031      1.1  joerg   auto b = 2.0;
   6032      1.1  joerg autoType(hasDeducedType(isInteger()))
   6033      1.1  joerg   matches "auto a"
   6034      1.1  joerg 
   6035      1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
   6036      1.1  joerg </pre></td></tr>
   6037      1.1  joerg 
   6038      1.1  joerg 
   6039  1.1.1.2  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
   6041      1.1  joerg binary operator matches.
   6042      1.1  joerg </pre></td></tr>
   6043      1.1  joerg 
   6044      1.1  joerg 
   6045      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
   6047      1.1  joerg 
   6048      1.1  joerg Example matches a (matcher = binaryOperator(hasLHS()))
   6049      1.1  joerg   a || b
   6050      1.1  joerg </pre></td></tr>
   6051      1.1  joerg 
   6052      1.1  joerg 
   6053  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
   6055  1.1.1.2  joerg 
   6056  1.1.1.2  joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
   6057  1.1.1.2  joerg                                              integerLiteral(equals(2)))
   6058  1.1.1.2  joerg   1 + 2 // Match
   6059  1.1.1.2  joerg   2 + 1 // Match
   6060  1.1.1.2  joerg   1 + 1 // No match
   6061  1.1.1.2  joerg   2 + 2 // No match
   6062  1.1.1.2  joerg </pre></td></tr>
   6063  1.1.1.2  joerg 
   6064  1.1.1.2  joerg 
   6065      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
   6067      1.1  joerg 
   6068      1.1  joerg Example matches b (matcher = binaryOperator(hasRHS()))
   6069      1.1  joerg   a || b
   6070      1.1  joerg </pre></td></tr>
   6071      1.1  joerg 
   6072      1.1  joerg 
   6073  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
   6075  1.1.1.2  joerg 
   6076  1.1.1.2  joerg For example, in:
   6077  1.1.1.2  joerg void foo()
   6078  1.1.1.2  joerg {
   6079  1.1.1.2  joerg     int arr[3];
   6080  1.1.1.2  joerg     auto &amp;[f, s, t] = arr;
   6081  1.1.1.2  joerg 
   6082  1.1.1.2  joerg     f = 42;
   6083  1.1.1.2  joerg }
   6084  1.1.1.2  joerg The matcher:
   6085  1.1.1.2  joerg   bindingDecl(hasName("f"),
   6086  1.1.1.2  joerg                 forDecomposition(decompositionDecl())
   6087  1.1.1.2  joerg matches 'f' in 'auto &amp;[f, s, t]'.
   6088  1.1.1.2  joerg </pre></td></tr>
   6089  1.1.1.2  joerg 
   6090  1.1.1.2  joerg 
   6091      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
   6093      1.1  joerg block.
   6094      1.1  joerg 
   6095      1.1  joerg Does not match the 'this' parameter of a method.
   6096      1.1  joerg 
   6097      1.1  joerg Given
   6098      1.1  joerg   class X { void f(int x, int y, int z) {} };
   6099      1.1  joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
   6100      1.1  joerg   matches f(int x, int y, int z) {}
   6101      1.1  joerg with hasAnyParameter(...)
   6102      1.1  joerg   matching int y
   6103      1.1  joerg 
   6104      1.1  joerg For ObjectiveC, given
   6105      1.1  joerg   @interface I - (void) f:(int) y; @end
   6106      1.1  joerg 
   6107      1.1  joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   6108      1.1  joerg matches the declaration of method f with hasParameter
   6109      1.1  joerg matching y.
   6110      1.1  joerg 
   6111      1.1  joerg For blocks, given
   6112      1.1  joerg   b = ^(int y) { printf("%d", y) };
   6113      1.1  joerg 
   6114      1.1  joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
   6115      1.1  joerg matches the declaration of the block b with hasParameter
   6116      1.1  joerg matching y.
   6117      1.1  joerg </pre></td></tr>
   6118      1.1  joerg 
   6119      1.1  joerg 
   6120      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
   6122      1.1  joerg declaration or a block.
   6123      1.1  joerg 
   6124      1.1  joerg Given
   6125      1.1  joerg   class X { void f(int x) {} };
   6126      1.1  joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   6127      1.1  joerg   matches f(int x) {}
   6128      1.1  joerg with hasParameter(...)
   6129      1.1  joerg   matching int x
   6130      1.1  joerg 
   6131      1.1  joerg For ObjectiveC, given
   6132      1.1  joerg   @interface I - (void) f:(int) y; @end
   6133      1.1  joerg 
   6134      1.1  joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   6135      1.1  joerg matches the declaration of method f with hasParameter
   6136      1.1  joerg matching y.
   6137      1.1  joerg </pre></td></tr>
   6138      1.1  joerg 
   6139      1.1  joerg 
   6140  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
   6142  1.1.1.2  joerg 
   6143  1.1.1.2  joerg Examples:
   6144  1.1.1.2  joerg   int x;
   6145  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6146  1.1.1.2  joerg   matches int x
   6147  1.1.1.2  joerg 
   6148  1.1.1.2  joerg auto x = int(3);
   6149  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6150  1.1.1.2  joerg   matches int(3)
   6151  1.1.1.2  joerg 
   6152  1.1.1.2  joerg struct Foo { Foo(int, int); };
   6153  1.1.1.2  joerg auto x = Foo(1, 2);
   6154  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6155  1.1.1.2  joerg   matches Foo(1, 2)
   6156  1.1.1.2  joerg 
   6157  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6161  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6165  1.1.1.2  joerg </pre></td></tr>
   6166  1.1.1.2  joerg 
   6167  1.1.1.2  joerg 
   6168      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
   6170      1.1  joerg pointee matches a given matcher.
   6171      1.1  joerg 
   6172      1.1  joerg Given
   6173      1.1  joerg   int *a;
   6174      1.1  joerg   int const *b;
   6175      1.1  joerg   float const *f;
   6176      1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   6177      1.1  joerg   matches "int const *b"
   6178      1.1  joerg 
   6179      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg </pre></td></tr>
   6182      1.1  joerg 
   6183      1.1  joerg 
   6184  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
   6186  1.1.1.2  joerg 
   6187  1.1.1.2  joerg Examples:
   6188  1.1.1.2  joerg   int x;
   6189  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6190  1.1.1.2  joerg   matches int x
   6191  1.1.1.2  joerg 
   6192  1.1.1.2  joerg auto x = int(3);
   6193  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6194  1.1.1.2  joerg   matches int(3)
   6195  1.1.1.2  joerg 
   6196  1.1.1.2  joerg struct Foo { Foo(int, int); };
   6197  1.1.1.2  joerg auto x = Foo(1, 2);
   6198  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6199  1.1.1.2  joerg   matches Foo(1, 2)
   6200  1.1.1.2  joerg 
   6201  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6205  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6209  1.1.1.2  joerg </pre></td></tr>
   6210  1.1.1.2  joerg 
   6211  1.1.1.2  joerg 
   6212  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
   6214  1.1.1.2  joerg declaration's type.
   6215  1.1.1.2  joerg 
   6216  1.1.1.2  joerg In case of a value declaration (for example a variable declaration),
   6217  1.1.1.2  joerg this resolves one layer of indirection. For example, in the value
   6218  1.1.1.2  joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   6219  1.1.1.2  joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   6220  1.1.1.2  joerg declaration of x.
   6221  1.1.1.2  joerg 
   6222  1.1.1.2  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   6223  1.1.1.2  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   6224  1.1.1.2  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   6225  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   6226  1.1.1.2  joerg                                               cxxRecordDecl(hasName("X"))))
   6227  1.1.1.2  joerg  class X {};
   6228  1.1.1.2  joerg  void y(X &amp;x) { x; X z; }
   6229  1.1.1.2  joerg  class Y { friend class X; };
   6230  1.1.1.2  joerg  class Z : public virtual X {};
   6231  1.1.1.2  joerg 
   6232  1.1.1.2  joerg Example matches class Derived
   6233  1.1.1.2  joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   6234  1.1.1.2  joerg class Base {};
   6235  1.1.1.2  joerg class Derived : Base {};
   6236  1.1.1.2  joerg 
   6237  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   6239  1.1.1.2  joerg </pre></td></tr>
   6240  1.1.1.2  joerg 
   6241  1.1.1.2  joerg 
   6242  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
   6244  1.1.1.2  joerg matcher.
   6245  1.1.1.2  joerg 
   6246  1.1.1.2  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   6247  1.1.1.2  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   6248  1.1.1.2  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   6249  1.1.1.2  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   6250  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   6251  1.1.1.2  joerg                                               asString("class X")))
   6252  1.1.1.2  joerg  class X {};
   6253  1.1.1.2  joerg  void y(X &amp;x) { x; X z; }
   6254  1.1.1.2  joerg  typedef int U;
   6255  1.1.1.2  joerg  class Y { friend class X; };
   6256  1.1.1.2  joerg  class Z : public virtual X {};
   6257  1.1.1.2  joerg </pre></td></tr>
   6258  1.1.1.2  joerg 
   6259  1.1.1.2  joerg 
   6260      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
   6262      1.1  joerg 
   6263      1.1  joerg Given
   6264      1.1  joerg   void f(int i);
   6265      1.1  joerg   int y;
   6266      1.1  joerg   f(y);
   6267      1.1  joerg callExpr(
   6268      1.1  joerg   forEachArgumentWithParam(
   6269      1.1  joerg     declRefExpr(to(varDecl(hasName("y")))),
   6270      1.1  joerg     parmVarDecl(hasType(isInteger()))
   6271      1.1  joerg ))
   6272      1.1  joerg   matches f(y);
   6273      1.1  joerg with declRefExpr(...)
   6274      1.1  joerg   matching int y
   6275      1.1  joerg and parmVarDecl(...)
   6276      1.1  joerg   matching int i
   6277      1.1  joerg </pre></td></tr>
   6278      1.1  joerg 
   6279      1.1  joerg 
   6280  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
   6282  1.1.1.2  joerg CXXConstructExpr. It is very similar to forEachArgumentWithParam but
   6283  1.1.1.2  joerg it works on calls through function pointers as well.
   6284  1.1.1.2  joerg 
   6285  1.1.1.2  joerg The difference is, that function pointers do not provide access to a
   6286  1.1.1.2  joerg ParmVarDecl, but only the QualType for each argument.
   6287  1.1.1.2  joerg 
   6288  1.1.1.2  joerg Given
   6289  1.1.1.2  joerg   void f(int i);
   6290  1.1.1.2  joerg   int y;
   6291  1.1.1.2  joerg   f(y);
   6292  1.1.1.2  joerg   void (*f_ptr)(int) = f;
   6293  1.1.1.2  joerg   f_ptr(y);
   6294  1.1.1.2  joerg callExpr(
   6295  1.1.1.2  joerg   forEachArgumentWithParamType(
   6296  1.1.1.2  joerg     declRefExpr(to(varDecl(hasName("y")))),
   6297  1.1.1.2  joerg     qualType(isInteger()).bind("type)
   6298  1.1.1.2  joerg ))
   6299  1.1.1.2  joerg   matches f(y) and f_ptr(y)
   6300  1.1.1.2  joerg with declRefExpr(...)
   6301  1.1.1.2  joerg   matching int y
   6302  1.1.1.2  joerg and qualType(...)
   6303  1.1.1.2  joerg   matching int
   6304  1.1.1.2  joerg </pre></td></tr>
   6305  1.1.1.2  joerg 
   6306  1.1.1.2  joerg 
   6307      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
   6309      1.1  joerg expression, or an ObjC-message-send expression.
   6310      1.1  joerg 
   6311      1.1  joerg Given
   6312      1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   6313      1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   6314      1.1  joerg   matches x(1, y, 42)
   6315      1.1  joerg with hasAnyArgument(...)
   6316      1.1  joerg   matching y
   6317      1.1  joerg 
   6318      1.1  joerg For ObjectiveC, given
   6319      1.1  joerg   @interface I - (void) f:(int) y; @end
   6320      1.1  joerg   void foo(I *i) { [i f:12]; }
   6321      1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   6322      1.1  joerg   matches [i f:12]
   6323      1.1  joerg </pre></td></tr>
   6324      1.1  joerg 
   6325      1.1  joerg 
   6326      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
   6328      1.1  joerg call expression.
   6329      1.1  joerg 
   6330      1.1  joerg Example matches y in x(y)
   6331      1.1  joerg     (matcher = callExpr(hasArgument(0, declRefExpr())))
   6332      1.1  joerg   void x(int) { int y; x(y); }
   6333      1.1  joerg </pre></td></tr>
   6334      1.1  joerg 
   6335      1.1  joerg 
   6336  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
   6338      1.1  joerg matches the given matcher.
   6339      1.1  joerg 
   6340      1.1  joerg The associated declaration is:
   6341      1.1  joerg - for type nodes, the declaration of the underlying type
   6342      1.1  joerg - for CallExpr, the declaration of the callee
   6343      1.1  joerg - for MemberExpr, the declaration of the referenced member
   6344      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   6345      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   6346      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   6347      1.1  joerg 
   6348      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6349      1.1  joerg sugared type. Given
   6350      1.1  joerg   class X {};
   6351      1.1  joerg   typedef X Y;
   6352      1.1  joerg   Y y;
   6353      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6354      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6355      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6356      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6357      1.1  joerg       recordType(hasDeclaration(decl())))))
   6358      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6359      1.1  joerg 
   6360      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6367      1.1  joerg </pre></td></tr>
   6368      1.1  joerg 
   6369      1.1  joerg 
   6370      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
   6372      1.1  joerg 
   6373      1.1  joerg Given
   6374      1.1  joerg   class A { A() : i(42), j(42) {} int i; int j; };
   6375      1.1  joerg cxxConstructorDecl(forEachConstructorInitializer(
   6376      1.1  joerg   forField(decl().bind("x"))
   6377      1.1  joerg ))
   6378      1.1  joerg   will trigger two matches, binding for 'i' and 'j' respectively.
   6379      1.1  joerg </pre></td></tr>
   6380      1.1  joerg 
   6381      1.1  joerg 
   6382      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
   6384      1.1  joerg 
   6385      1.1  joerg Given
   6386      1.1  joerg   struct Foo {
   6387      1.1  joerg     Foo() : foo_(1) { }
   6388      1.1  joerg     int foo_;
   6389      1.1  joerg   };
   6390      1.1  joerg cxxRecordDecl(has(cxxConstructorDecl(
   6391      1.1  joerg   hasAnyConstructorInitializer(anything())
   6392      1.1  joerg )))
   6393      1.1  joerg   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
   6394      1.1  joerg </pre></td></tr>
   6395      1.1  joerg 
   6396      1.1  joerg 
   6397      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
   6399      1.1  joerg 
   6400      1.1  joerg Given
   6401      1.1  joerg   struct Foo {
   6402      1.1  joerg     Foo() : foo_(1) { }
   6403      1.1  joerg     int foo_;
   6404      1.1  joerg   };
   6405      1.1  joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
   6406      1.1  joerg     forField(hasName("foo_"))))))
   6407      1.1  joerg   matches Foo
   6408      1.1  joerg with forField matching foo_
   6409      1.1  joerg </pre></td></tr>
   6410      1.1  joerg 
   6411      1.1  joerg 
   6412  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
   6414  1.1.1.2  joerg 
   6415  1.1.1.2  joerg Examples:
   6416  1.1.1.2  joerg   int x;
   6417  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6418  1.1.1.2  joerg   matches int x
   6419  1.1.1.2  joerg 
   6420  1.1.1.2  joerg auto x = int(3);
   6421  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6422  1.1.1.2  joerg   matches int(3)
   6423  1.1.1.2  joerg 
   6424  1.1.1.2  joerg struct Foo { Foo(int, int); };
   6425  1.1.1.2  joerg auto x = Foo(1, 2);
   6426  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6427  1.1.1.2  joerg   matches Foo(1, 2)
   6428  1.1.1.2  joerg 
   6429  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6433  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6437  1.1.1.2  joerg </pre></td></tr>
   6438  1.1.1.2  joerg 
   6439  1.1.1.2  joerg 
   6440      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
   6442      1.1  joerg 
   6443      1.1  joerg Given
   6444      1.1  joerg   struct Foo {
   6445      1.1  joerg     Foo() : foo_(1) { }
   6446      1.1  joerg     int foo_;
   6447      1.1  joerg   };
   6448      1.1  joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
   6449      1.1  joerg     withInitializer(integerLiteral(equals(1)))))))
   6450      1.1  joerg   matches Foo
   6451      1.1  joerg with withInitializer matching (1)
   6452      1.1  joerg </pre></td></tr>
   6453      1.1  joerg 
   6454      1.1  joerg 
   6455      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
   6457      1.1  joerg given matcher. Implicit object expressions are included; that is, it matches
   6458      1.1  joerg use of implicit `this`.
   6459      1.1  joerg 
   6460      1.1  joerg Given
   6461      1.1  joerg   struct X {
   6462      1.1  joerg     int m;
   6463      1.1  joerg     int f(X x) { x.m; return m; }
   6464      1.1  joerg   };
   6465      1.1  joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   6466      1.1  joerg   matches `x.m`, but not `m`; however,
   6467      1.1  joerg memberExpr(hasObjectExpression(hasType(pointsTo(
   6468      1.1  joerg      cxxRecordDecl(hasName("X"))))))
   6469      1.1  joerg   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   6470      1.1  joerg </pre></td></tr>
   6471      1.1  joerg 
   6472      1.1  joerg 
   6473      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
   6475      1.1  joerg 
   6476  1.1.1.2  joerg 
   6477  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
   6479  1.1.1.2  joerg 
   6480  1.1.1.2  joerg Given:
   6481  1.1.1.2  joerg  void foo() {
   6482  1.1.1.2  joerg    if (int i = foobar(); i &gt; 0) {}
   6483  1.1.1.2  joerg    switch (int i = foobar(); i) {}
   6484  1.1.1.2  joerg    for (auto&amp; a = get_range(); auto&amp; x : a) {}
   6485  1.1.1.2  joerg  }
   6486  1.1.1.2  joerg  void bar() {
   6487  1.1.1.2  joerg    if (foobar() &gt; 0) {}
   6488  1.1.1.2  joerg    switch (foobar()) {}
   6489  1.1.1.2  joerg    for (auto&amp; x : get_range()) {}
   6490  1.1.1.2  joerg  }
   6491  1.1.1.2  joerg ifStmt(hasInitStatement(anything()))
   6492  1.1.1.2  joerg   matches the if statement in foo but not in bar.
   6493  1.1.1.2  joerg switchStmt(hasInitStatement(anything()))
   6494  1.1.1.2  joerg   matches the switch statement in foo but not in bar.
   6495  1.1.1.2  joerg cxxForRangeStmt(hasInitStatement(anything()))
   6496  1.1.1.2  joerg   matches the range for statement in foo but not in bar.
   6497      1.1  joerg </pre></td></tr>
   6498      1.1  joerg 
   6499      1.1  joerg 
   6500      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
   6502      1.1  joerg 
   6503      1.1  joerg Example:
   6504      1.1  joerg     forStmt(hasLoopVariable(anything()))
   6505      1.1  joerg matches 'int x' in
   6506      1.1  joerg     for (int x : a) { }
   6507      1.1  joerg </pre></td></tr>
   6508      1.1  joerg 
   6509      1.1  joerg 
   6510      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
   6512      1.1  joerg 
   6513      1.1  joerg Example:
   6514      1.1  joerg     forStmt(hasRangeInit(anything()))
   6515      1.1  joerg matches 'a' in
   6516      1.1  joerg     for (int x : a) { }
   6517      1.1  joerg </pre></td></tr>
   6518      1.1  joerg 
   6519      1.1  joerg 
   6520  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
   6522  1.1.1.2  joerg 
   6523  1.1.1.2  joerg Examples:
   6524  1.1.1.2  joerg   int x;
   6525  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6526  1.1.1.2  joerg   matches int x
   6527  1.1.1.2  joerg 
   6528  1.1.1.2  joerg auto x = int(3);
   6529  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6530  1.1.1.2  joerg   matches int(3)
   6531  1.1.1.2  joerg 
   6532  1.1.1.2  joerg struct Foo { Foo(int, int); };
   6533  1.1.1.2  joerg auto x = Foo(1, 2);
   6534  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6535  1.1.1.2  joerg   matches Foo(1, 2)
   6536  1.1.1.2  joerg 
   6537  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6541  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6545  1.1.1.2  joerg </pre></td></tr>
   6546  1.1.1.2  joerg 
   6547  1.1.1.2  joerg 
   6548      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
   6550      1.1  joerg `on`, matches the argument directly without stripping away anything.
   6551      1.1  joerg 
   6552      1.1  joerg Given
   6553      1.1  joerg   class Y { public: void m(); };
   6554      1.1  joerg   Y g();
   6555      1.1  joerg   class X : public Y { void g(); };
   6556      1.1  joerg   void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
   6557      1.1  joerg cxxMemberCallExpr(onImplicitObjectArgument(hasType(
   6558      1.1  joerg     cxxRecordDecl(hasName("Y")))))
   6559      1.1  joerg   matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
   6560      1.1  joerg cxxMemberCallExpr(on(callExpr()))
   6561      1.1  joerg   does not match `(g()).m()`, because the parens are not ignored.
   6562      1.1  joerg 
   6563      1.1  joerg FIXME: Overload to allow directly matching types?
   6564      1.1  joerg </pre></td></tr>
   6565      1.1  joerg 
   6566      1.1  joerg 
   6567      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
   6569      1.1  joerg stripping off any parentheses or implicit casts.
   6570      1.1  joerg 
   6571      1.1  joerg Given
   6572      1.1  joerg   class Y { public: void m(); };
   6573      1.1  joerg   Y g();
   6574      1.1  joerg   class X : public Y {};
   6575      1.1  joerg   void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
   6576      1.1  joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
   6577      1.1  joerg   matches `y.m()` and `(g()).m()`.
   6578      1.1  joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
   6579      1.1  joerg   matches `x.m()`.
   6580      1.1  joerg cxxMemberCallExpr(on(callExpr()))
   6581      1.1  joerg   matches `(g()).m()`.
   6582      1.1  joerg 
   6583      1.1  joerg FIXME: Overload to allow directly matching types?
   6584      1.1  joerg </pre></td></tr>
   6585      1.1  joerg 
   6586      1.1  joerg 
   6587      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
   6589      1.1  joerg </pre></td></tr>
   6590      1.1  joerg 
   6591      1.1  joerg 
   6592      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
   6594      1.1  joerg matches the InnerMatcher, or is a pointer to a type that matches the
   6595      1.1  joerg InnerMatcher.
   6596      1.1  joerg 
   6597      1.1  joerg Given
   6598      1.1  joerg   class Y { public: void m(); };
   6599      1.1  joerg   class X : public Y { void g(); };
   6600      1.1  joerg   void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
   6601      1.1  joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
   6602      1.1  joerg     cxxRecordDecl(hasName("Y")))))
   6603      1.1  joerg   matches `y.m()`, `p-&gt;m()` and `x.m()`.
   6604      1.1  joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
   6605      1.1  joerg     cxxRecordDecl(hasName("X")))))
   6606      1.1  joerg   matches `x.g()`.
   6607      1.1  joerg </pre></td></tr>
   6608      1.1  joerg 
   6609      1.1  joerg 
   6610      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
   6612      1.1  joerg produce multiple matches.
   6613      1.1  joerg 
   6614      1.1  joerg Given
   6615      1.1  joerg   class A { virtual void f(); };
   6616      1.1  joerg   class B : public A { void f(); };
   6617      1.1  joerg   class C : public B { void f(); };
   6618      1.1  joerg cxxMethodDecl(ofClass(hasName("C")),
   6619      1.1  joerg               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
   6620      1.1  joerg   matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
   6621      1.1  joerg   that B::f is not overridden by C::f).
   6622      1.1  joerg 
   6623      1.1  joerg The check can produce multiple matches in case of multiple inheritance, e.g.
   6624      1.1  joerg   class A1 { virtual void f(); };
   6625      1.1  joerg   class A2 { virtual void f(); };
   6626      1.1  joerg   class C : public A1, public A2 { void f(); };
   6627      1.1  joerg cxxMethodDecl(ofClass(hasName("C")),
   6628      1.1  joerg               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
   6629      1.1  joerg   matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
   6630      1.1  joerg   once with "b" binding "A2::f" and "d" binding "C::f".
   6631      1.1  joerg </pre></td></tr>
   6632      1.1  joerg 
   6633      1.1  joerg 
   6634      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
   6636      1.1  joerg belongs to.
   6637      1.1  joerg 
   6638      1.1  joerg FIXME: Generalize this for other kinds of declarations.
   6639      1.1  joerg FIXME: What other kind of declarations would we need to generalize
   6640      1.1  joerg this to?
   6641      1.1  joerg 
   6642      1.1  joerg Example matches A() in the last line
   6643      1.1  joerg     (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
   6644      1.1  joerg         ofClass(hasName("A"))))))
   6645      1.1  joerg   class A {
   6646      1.1  joerg    public:
   6647      1.1  joerg     A();
   6648      1.1  joerg   };
   6649      1.1  joerg   A a = A();
   6650      1.1  joerg </pre></td></tr>
   6651      1.1  joerg 
   6652      1.1  joerg 
   6653  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
   6655  1.1.1.2  joerg 
   6656  1.1.1.2  joerg Given:
   6657  1.1.1.2  joerg   MyClass *p1 = new (Storage) MyClass();
   6658  1.1.1.2  joerg cxxNewExpr(hasAnyPlacementArg(anything()))
   6659  1.1.1.2  joerg   matches the expression 'new (Storage, 16) MyClass()'.
   6660  1.1.1.2  joerg </pre></td></tr>
   6661  1.1.1.2  joerg 
   6662  1.1.1.2  joerg 
   6663      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
   6665      1.1  joerg 
   6666      1.1  joerg Given:
   6667      1.1  joerg   MyClass *p1 = new MyClass[10];
   6668  1.1.1.2  joerg cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
   6669      1.1  joerg   matches the expression 'new MyClass[10]'.
   6670      1.1  joerg </pre></td></tr>
   6671      1.1  joerg 
   6672      1.1  joerg 
   6673  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
   6675      1.1  joerg matches the given matcher.
   6676      1.1  joerg 
   6677  1.1.1.2  joerg The associated declaration is:
   6678  1.1.1.2  joerg - for type nodes, the declaration of the underlying type
   6679  1.1.1.2  joerg - for CallExpr, the declaration of the callee
   6680  1.1.1.2  joerg - for MemberExpr, the declaration of the referenced member
   6681  1.1.1.2  joerg - for CXXConstructExpr, the declaration of the constructor
   6682  1.1.1.2  joerg - for CXXNewExpr, the declaration of the operator new
   6683  1.1.1.2  joerg - for ObjCIvarExpr, the declaration of the ivar
   6684  1.1.1.2  joerg 
   6685  1.1.1.2  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6686  1.1.1.2  joerg sugared type. Given
   6687  1.1.1.2  joerg   class X {};
   6688  1.1.1.2  joerg   typedef X Y;
   6689  1.1.1.2  joerg   Y y;
   6690  1.1.1.2  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6691  1.1.1.2  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6692  1.1.1.2  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6693  1.1.1.2  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6694  1.1.1.2  joerg       recordType(hasDeclaration(decl())))))
   6695  1.1.1.2  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6696  1.1.1.2  joerg 
   6697  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6704  1.1.1.2  joerg </pre></td></tr>
   6705  1.1.1.2  joerg 
   6706  1.1.1.2  joerg 
   6707  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
   6709  1.1.1.2  joerg 
   6710  1.1.1.2  joerg Given:
   6711  1.1.1.2  joerg   MyClass *p1 = new (Storage, 16) MyClass();
   6712  1.1.1.2  joerg cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
   6713  1.1.1.2  joerg   matches the expression 'new (Storage, 16) MyClass()'.
   6714  1.1.1.2  joerg </pre></td></tr>
   6715  1.1.1.2  joerg 
   6716  1.1.1.2  joerg 
   6717  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
   6719  1.1.1.2  joerg 
   6720  1.1.1.2  joerg Examples:
   6721  1.1.1.2  joerg   int x;
   6722  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6723  1.1.1.2  joerg   matches int x
   6724  1.1.1.2  joerg 
   6725  1.1.1.2  joerg auto x = int(3);
   6726  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6727  1.1.1.2  joerg   matches int(3)
   6728  1.1.1.2  joerg 
   6729  1.1.1.2  joerg struct Foo { Foo(int, int); };
   6730  1.1.1.2  joerg auto x = Foo(1, 2);
   6731  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6732  1.1.1.2  joerg   matches Foo(1, 2)
   6733  1.1.1.2  joerg 
   6734  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6738  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6742  1.1.1.2  joerg </pre></td></tr>
   6743  1.1.1.2  joerg 
   6744  1.1.1.2  joerg 
   6745  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
   6747  1.1.1.2  joerg binary operator matches.
   6748  1.1.1.2  joerg </pre></td></tr>
   6749  1.1.1.2  joerg 
   6750  1.1.1.2  joerg 
   6751  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
   6753  1.1.1.2  joerg 
   6754  1.1.1.2  joerg Example matches a (matcher = binaryOperator(hasLHS()))
   6755  1.1.1.2  joerg   a || b
   6756  1.1.1.2  joerg </pre></td></tr>
   6757  1.1.1.2  joerg 
   6758  1.1.1.2  joerg 
   6759  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
   6761  1.1.1.2  joerg 
   6762  1.1.1.2  joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
   6763  1.1.1.2  joerg                                              integerLiteral(equals(2)))
   6764  1.1.1.2  joerg   1 + 2 // Match
   6765  1.1.1.2  joerg   2 + 1 // Match
   6766  1.1.1.2  joerg   1 + 1 // No match
   6767  1.1.1.2  joerg   2 + 2 // No match
   6768  1.1.1.2  joerg </pre></td></tr>
   6769  1.1.1.2  joerg 
   6770  1.1.1.2  joerg 
   6771  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
   6773  1.1.1.2  joerg 
   6774  1.1.1.2  joerg Example matches b (matcher = binaryOperator(hasRHS()))
   6775  1.1.1.2  joerg   a || b
   6776  1.1.1.2  joerg </pre></td></tr>
   6777  1.1.1.2  joerg 
   6778  1.1.1.2  joerg 
   6779  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
   6781  1.1.1.2  joerg 
   6782  1.1.1.2  joerg Example matches true (matcher = hasUnaryOperand(
   6783  1.1.1.2  joerg                                   cxxBoolLiteral(equals(true))))
   6784  1.1.1.2  joerg   !true
   6785  1.1.1.2  joerg </pre></td></tr>
   6786  1.1.1.2  joerg 
   6787  1.1.1.2  joerg 
   6788  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
   6790  1.1.1.2  joerg 
   6791  1.1.1.2  joerg Example:
   6792  1.1.1.2  joerg matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
   6793  1.1.1.2  joerg   class Foo;
   6794  1.1.1.2  joerg   class Bar : Foo {};
   6795  1.1.1.2  joerg   class Baz : Bar {};
   6796  1.1.1.2  joerg   class SpecialBase;
   6797  1.1.1.2  joerg   class Proxy : SpecialBase {};  // matches Proxy
   6798  1.1.1.2  joerg   class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
   6799  1.1.1.2  joerg 
   6800  1.1.1.2  joerg FIXME: Refactor this and isDerivedFrom to reuse implementation.
   6801  1.1.1.2  joerg </pre></td></tr>
   6802      1.1  joerg 
   6803      1.1  joerg 
   6804  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
   6806  1.1.1.2  joerg 
   6807  1.1.1.2  joerg Example:
   6808  1.1.1.2  joerg matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
   6809  1.1.1.2  joerg   class Foo;
   6810  1.1.1.2  joerg   class Bar : Foo {};
   6811  1.1.1.2  joerg   class Baz : Bar {};
   6812  1.1.1.2  joerg   class SpecialBase;
   6813  1.1.1.2  joerg   class Proxy : SpecialBase {};  // matches Proxy
   6814  1.1.1.2  joerg   class IndirectlyDerived : Proxy {};  // doesn't match
   6815      1.1  joerg </pre></td></tr>
   6816      1.1  joerg 
   6817      1.1  joerg 
   6818      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
   6820      1.1  joerg 
   6821      1.1  joerg Given:
   6822      1.1  joerg   class A { void func(); };
   6823      1.1  joerg   class B { void member(); };
   6824      1.1  joerg 
   6825      1.1  joerg cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
   6826      1.1  joerg A but not B.
   6827      1.1  joerg </pre></td></tr>
   6828      1.1  joerg 
   6829      1.1  joerg 
   6830      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
   6832      1.1  joerg matching Base, or Objective-C classes that directly or indirectly
   6833      1.1  joerg subclass a class matching Base.
   6834      1.1  joerg 
   6835      1.1  joerg Note that a class is not considered to be derived from itself.
   6836      1.1  joerg 
   6837      1.1  joerg Example matches Y, Z, C (Base == hasName("X"))
   6838      1.1  joerg   class X;
   6839      1.1  joerg   class Y : public X {};  // directly derived
   6840      1.1  joerg   class Z : public Y {};  // indirectly derived
   6841      1.1  joerg   typedef X A;
   6842      1.1  joerg   typedef A B;
   6843      1.1  joerg   class C : public B {};  // derived from a typedef of X
   6844      1.1  joerg 
   6845      1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   6846      1.1  joerg   class Foo;
   6847      1.1  joerg   typedef Foo X;
   6848      1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   6849      1.1  joerg 
   6850      1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
   6851      1.1  joerg   @interface NSObject @end
   6852      1.1  joerg   @interface Bar : NSObject @end
   6853      1.1  joerg 
   6854      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   6856      1.1  joerg 
   6857      1.1  joerg 
   6858      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
   6860      1.1  joerg matching Base.
   6861      1.1  joerg 
   6862      1.1  joerg Note that a class is not considered to be derived from itself.
   6863      1.1  joerg 
   6864      1.1  joerg Example matches Y, C (Base == hasName("X"))
   6865      1.1  joerg   class X;
   6866      1.1  joerg   class Y : public X {};  // directly derived
   6867      1.1  joerg   class Z : public Y {};  // indirectly derived
   6868      1.1  joerg   typedef X A;
   6869      1.1  joerg   typedef A B;
   6870      1.1  joerg   class C : public B {};  // derived from a typedef of X
   6871      1.1  joerg 
   6872      1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   6873      1.1  joerg   class Foo;
   6874      1.1  joerg   typedef Foo X;
   6875      1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   6876      1.1  joerg </pre></td></tr>
   6877      1.1  joerg 
   6878      1.1  joerg 
   6879      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
   6881      1.1  joerg match Base.
   6882      1.1  joerg </pre></td></tr>
   6883      1.1  joerg 
   6884      1.1  joerg 
   6885  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
   6887  1.1.1.2  joerg binary operator matches.
   6888  1.1.1.2  joerg </pre></td></tr>
   6889  1.1.1.2  joerg 
   6890  1.1.1.2  joerg 
   6891  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
   6893  1.1.1.2  joerg 
   6894  1.1.1.2  joerg Example matches a (matcher = binaryOperator(hasLHS()))
   6895  1.1.1.2  joerg   a || b
   6896  1.1.1.2  joerg </pre></td></tr>
   6897  1.1.1.2  joerg 
   6898  1.1.1.2  joerg 
   6899  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
   6901  1.1.1.2  joerg 
   6902  1.1.1.2  joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
   6903  1.1.1.2  joerg                                              integerLiteral(equals(2)))
   6904  1.1.1.2  joerg   1 + 2 // Match
   6905  1.1.1.2  joerg   2 + 1 // Match
   6906  1.1.1.2  joerg   1 + 1 // No match
   6907  1.1.1.2  joerg   2 + 2 // No match
   6908  1.1.1.2  joerg </pre></td></tr>
   6909  1.1.1.2  joerg 
   6910  1.1.1.2  joerg 
   6911  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
   6913  1.1.1.2  joerg 
   6914  1.1.1.2  joerg Example matches b (matcher = binaryOperator(hasRHS()))
   6915  1.1.1.2  joerg   a || b
   6916  1.1.1.2  joerg </pre></td></tr>
   6917  1.1.1.2  joerg 
   6918  1.1.1.2  joerg 
   6919  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
   6921  1.1.1.2  joerg 
   6922  1.1.1.2  joerg Examples:
   6923  1.1.1.2  joerg   int x;
   6924  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6925  1.1.1.2  joerg   matches int x
   6926  1.1.1.2  joerg 
   6927  1.1.1.2  joerg auto x = int(3);
   6928  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6929  1.1.1.2  joerg   matches int(3)
   6930  1.1.1.2  joerg 
   6931  1.1.1.2  joerg struct Foo { Foo(int, int); };
   6932  1.1.1.2  joerg auto x = Foo(1, 2);
   6933  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6934  1.1.1.2  joerg   matches Foo(1, 2)
   6935  1.1.1.2  joerg 
   6936  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6940  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   6944  1.1.1.2  joerg </pre></td></tr>
   6945  1.1.1.2  joerg 
   6946  1.1.1.2  joerg 
   6947      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
   6949      1.1  joerg expression, or an ObjC-message-send expression.
   6950      1.1  joerg 
   6951      1.1  joerg Given
   6952      1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   6953      1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   6954      1.1  joerg   matches x(1, y, 42)
   6955      1.1  joerg with hasAnyArgument(...)
   6956      1.1  joerg   matching y
   6957      1.1  joerg 
   6958      1.1  joerg For ObjectiveC, given
   6959      1.1  joerg   @interface I - (void) f:(int) y; @end
   6960      1.1  joerg   void foo(I *i) { [i f:12]; }
   6961      1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   6962      1.1  joerg   matches [i f:12]
   6963      1.1  joerg </pre></td></tr>
   6964      1.1  joerg 
   6965      1.1  joerg 
   6966  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
   6968  1.1.1.2  joerg call expression.
   6969  1.1.1.2  joerg 
   6970  1.1.1.2  joerg Example matches y in x(y)
   6971  1.1.1.2  joerg     (matcher = callExpr(hasArgument(0, declRefExpr())))
   6972  1.1.1.2  joerg   void x(int) { int y; x(y); }
   6973  1.1.1.2  joerg </pre></td></tr>
   6974  1.1.1.2  joerg 
   6975  1.1.1.2  joerg 
   6976  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
   6978  1.1.1.2  joerg 
   6979  1.1.1.2  joerg Examples:
   6980  1.1.1.2  joerg   int x;
   6981  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   6982  1.1.1.2  joerg   matches int x
   6983  1.1.1.2  joerg 
   6984  1.1.1.2  joerg auto x = int(3);
   6985  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   6986  1.1.1.2  joerg   matches int(3)
   6987  1.1.1.2  joerg 
   6988  1.1.1.2  joerg struct Foo { Foo(int, int); };
   6989  1.1.1.2  joerg auto x = Foo(1, 2);
   6990  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   6991  1.1.1.2  joerg   matches Foo(1, 2)
   6992  1.1.1.2  joerg 
   6993  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   6997  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7001  1.1.1.2  joerg </pre></td></tr>
   7002  1.1.1.2  joerg 
   7003  1.1.1.2  joerg 
   7004      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
   7006      1.1  joerg given matcher.
   7007      1.1  joerg 
   7008      1.1  joerg Example matches y.x() (matcher = callExpr(callee(
   7009      1.1  joerg                                    cxxMethodDecl(hasName("x")))))
   7010      1.1  joerg   class Y { public: void x(); };
   7011      1.1  joerg   void z() { Y y; y.x(); }
   7012      1.1  joerg </pre></td></tr>
   7013      1.1  joerg 
   7014      1.1  joerg 
   7015      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
   7017      1.1  joerg 
   7018      1.1  joerg Given
   7019      1.1  joerg   class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
   7020      1.1  joerg   void f() { f(); }
   7021      1.1  joerg callExpr(callee(expr()))
   7022      1.1  joerg   matches this-&gt;x(), x(), y.x(), f()
   7023      1.1  joerg with callee(...)
   7024      1.1  joerg   matching this-&gt;x, x, y.x, f respectively
   7025      1.1  joerg 
   7026      1.1  joerg 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      1.1  joerg because this introduces ambiguous overloads with calls to Callee taking a
   7028      1.1  joerg internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
   7029      1.1  joerg implemented in terms of implicit casts.
   7030      1.1  joerg </pre></td></tr>
   7031      1.1  joerg 
   7032      1.1  joerg 
   7033      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
   7035      1.1  joerg 
   7036      1.1  joerg Given
   7037      1.1  joerg   void f(int i);
   7038      1.1  joerg   int y;
   7039      1.1  joerg   f(y);
   7040      1.1  joerg callExpr(
   7041      1.1  joerg   forEachArgumentWithParam(
   7042      1.1  joerg     declRefExpr(to(varDecl(hasName("y")))),
   7043      1.1  joerg     parmVarDecl(hasType(isInteger()))
   7044      1.1  joerg ))
   7045      1.1  joerg   matches f(y);
   7046      1.1  joerg with declRefExpr(...)
   7047      1.1  joerg   matching int y
   7048      1.1  joerg and parmVarDecl(...)
   7049      1.1  joerg   matching int i
   7050      1.1  joerg </pre></td></tr>
   7051      1.1  joerg 
   7052      1.1  joerg 
   7053  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
   7055  1.1.1.2  joerg CXXConstructExpr. It is very similar to forEachArgumentWithParam but
   7056  1.1.1.2  joerg it works on calls through function pointers as well.
   7057  1.1.1.2  joerg 
   7058  1.1.1.2  joerg The difference is, that function pointers do not provide access to a
   7059  1.1.1.2  joerg ParmVarDecl, but only the QualType for each argument.
   7060  1.1.1.2  joerg 
   7061  1.1.1.2  joerg Given
   7062  1.1.1.2  joerg   void f(int i);
   7063  1.1.1.2  joerg   int y;
   7064  1.1.1.2  joerg   f(y);
   7065  1.1.1.2  joerg   void (*f_ptr)(int) = f;
   7066  1.1.1.2  joerg   f_ptr(y);
   7067  1.1.1.2  joerg callExpr(
   7068  1.1.1.2  joerg   forEachArgumentWithParamType(
   7069  1.1.1.2  joerg     declRefExpr(to(varDecl(hasName("y")))),
   7070  1.1.1.2  joerg     qualType(isInteger()).bind("type)
   7071  1.1.1.2  joerg ))
   7072  1.1.1.2  joerg   matches f(y) and f_ptr(y)
   7073  1.1.1.2  joerg with declRefExpr(...)
   7074  1.1.1.2  joerg   matching int y
   7075  1.1.1.2  joerg and qualType(...)
   7076  1.1.1.2  joerg   matching int
   7077  1.1.1.2  joerg </pre></td></tr>
   7078  1.1.1.2  joerg 
   7079  1.1.1.2  joerg 
   7080      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
   7082      1.1  joerg expression, or an ObjC-message-send expression.
   7083      1.1  joerg 
   7084      1.1  joerg Given
   7085      1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   7086      1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   7087      1.1  joerg   matches x(1, y, 42)
   7088      1.1  joerg with hasAnyArgument(...)
   7089      1.1  joerg   matching y
   7090      1.1  joerg 
   7091      1.1  joerg For ObjectiveC, given
   7092      1.1  joerg   @interface I - (void) f:(int) y; @end
   7093      1.1  joerg   void foo(I *i) { [i f:12]; }
   7094      1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   7095      1.1  joerg   matches [i f:12]
   7096      1.1  joerg </pre></td></tr>
   7097      1.1  joerg 
   7098      1.1  joerg 
   7099      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
   7101      1.1  joerg call expression.
   7102      1.1  joerg 
   7103      1.1  joerg Example matches y in x(y)
   7104      1.1  joerg     (matcher = callExpr(hasArgument(0, declRefExpr())))
   7105      1.1  joerg   void x(int) { int y; x(y); }
   7106      1.1  joerg </pre></td></tr>
   7107      1.1  joerg 
   7108      1.1  joerg 
   7109  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
   7111      1.1  joerg matches the given matcher.
   7112      1.1  joerg 
   7113      1.1  joerg The associated declaration is:
   7114      1.1  joerg - for type nodes, the declaration of the underlying type
   7115      1.1  joerg - for CallExpr, the declaration of the callee
   7116      1.1  joerg - for MemberExpr, the declaration of the referenced member
   7117      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   7118      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   7119      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   7120      1.1  joerg 
   7121      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   7122      1.1  joerg sugared type. Given
   7123      1.1  joerg   class X {};
   7124      1.1  joerg   typedef X Y;
   7125      1.1  joerg   Y y;
   7126      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7127      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   7128      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7129      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   7130      1.1  joerg       recordType(hasDeclaration(decl())))))
   7131      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   7132      1.1  joerg 
   7133      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7140      1.1  joerg </pre></td></tr>
   7141      1.1  joerg 
   7142      1.1  joerg 
   7143      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
   7145      1.1  joerg extension, matches the constant given in the statement.
   7146      1.1  joerg 
   7147      1.1  joerg Given
   7148      1.1  joerg   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
   7149      1.1  joerg caseStmt(hasCaseConstant(integerLiteral()))
   7150      1.1  joerg   matches "case 1:"
   7151      1.1  joerg </pre></td></tr>
   7152      1.1  joerg 
   7153      1.1  joerg 
   7154      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
   7156      1.1  joerg or opaque value's source expression matches the given matcher.
   7157      1.1  joerg 
   7158      1.1  joerg Example 1: matches "a string"
   7159      1.1  joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
   7160      1.1  joerg class URL { URL(string); };
   7161      1.1  joerg URL url = "a string";
   7162      1.1  joerg 
   7163      1.1  joerg Example 2: matches 'b' (matcher =
   7164      1.1  joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
   7165      1.1  joerg int a = b ?: 1;
   7166      1.1  joerg </pre></td></tr>
   7167      1.1  joerg 
   7168      1.1  joerg 
   7169      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7171      1.1  joerg functionDecl that have at least one TemplateArgument matching the given
   7172      1.1  joerg InnerMatcher.
   7173      1.1  joerg 
   7174      1.1  joerg Given
   7175      1.1  joerg   template&lt;typename T&gt; class A {};
   7176      1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
   7177      1.1  joerg   A&lt;int&gt; a;
   7178      1.1  joerg 
   7179      1.1  joerg   template&lt;typename T&gt; f() {};
   7180      1.1  joerg   void func() { f&lt;int&gt;(); };
   7181      1.1  joerg 
   7182      1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7183      1.1  joerg     refersToType(asString("int"))))
   7184      1.1  joerg   matches the specialization A&lt;int&gt;
   7185      1.1  joerg 
   7186      1.1  joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   7187      1.1  joerg   matches the specialization f&lt;int&gt;
   7188      1.1  joerg </pre></td></tr>
   7189      1.1  joerg 
   7190      1.1  joerg 
   7191      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
   7193      1.1  joerg 
   7194      1.1  joerg Given
   7195      1.1  joerg   template&lt;typename T&gt; class A {}; #1
   7196      1.1  joerg   template&lt;&gt; class A&lt;int&gt; {}; #2
   7197      1.1  joerg classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
   7198      1.1  joerg   matches '#2' with classTemplateDecl() matching the class template
   7199      1.1  joerg   declaration of 'A' at #1.
   7200      1.1  joerg </pre></td></tr>
   7201      1.1  joerg 
   7202      1.1  joerg 
   7203      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7205      1.1  joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   7206      1.1  joerg 
   7207      1.1  joerg Given
   7208      1.1  joerg   template&lt;typename T, typename U&gt; class A {};
   7209      1.1  joerg   A&lt;bool, int&gt; b;
   7210      1.1  joerg   A&lt;int, bool&gt; c;
   7211      1.1  joerg 
   7212      1.1  joerg   template&lt;typename T&gt; void f() {}
   7213      1.1  joerg   void func() { f&lt;int&gt;(); };
   7214      1.1  joerg classTemplateSpecializationDecl(hasTemplateArgument(
   7215      1.1  joerg     1, refersToType(asString("int"))))
   7216      1.1  joerg   matches the specialization A&lt;bool, int&gt;
   7217      1.1  joerg 
   7218      1.1  joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   7219      1.1  joerg   matches the specialization f&lt;int&gt;
   7220      1.1  joerg </pre></td></tr>
   7221      1.1  joerg 
   7222      1.1  joerg 
   7223  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
   7225  1.1.1.2  joerg 
   7226  1.1.1.2  joerg Examples:
   7227  1.1.1.2  joerg   int x;
   7228  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7229  1.1.1.2  joerg   matches int x
   7230  1.1.1.2  joerg 
   7231  1.1.1.2  joerg auto x = int(3);
   7232  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7233  1.1.1.2  joerg   matches int(3)
   7234  1.1.1.2  joerg 
   7235  1.1.1.2  joerg struct Foo { Foo(int, int); };
   7236  1.1.1.2  joerg auto x = Foo(1, 2);
   7237  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7238  1.1.1.2  joerg   matches Foo(1, 2)
   7239  1.1.1.2  joerg 
   7240  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7244  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7248  1.1.1.2  joerg </pre></td></tr>
   7249  1.1.1.2  joerg 
   7250  1.1.1.2  joerg 
   7251      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
   7253      1.1  joerg type.
   7254      1.1  joerg 
   7255      1.1  joerg Given
   7256      1.1  joerg   struct A {};
   7257      1.1  joerg   A a[7];
   7258      1.1  joerg   int b[7];
   7259      1.1  joerg arrayType(hasElementType(builtinType()))
   7260      1.1  joerg   matches "int b[7]"
   7261      1.1  joerg 
   7262      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   7264      1.1  joerg 
   7265      1.1  joerg 
   7266  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
   7268  1.1.1.2  joerg 
   7269  1.1.1.2  joerg Examples:
   7270  1.1.1.2  joerg   int x;
   7271  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7272  1.1.1.2  joerg   matches int x
   7273  1.1.1.2  joerg 
   7274  1.1.1.2  joerg auto x = int(3);
   7275  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7276  1.1.1.2  joerg   matches int(3)
   7277  1.1.1.2  joerg 
   7278  1.1.1.2  joerg struct Foo { Foo(int, int); };
   7279  1.1.1.2  joerg auto x = Foo(1, 2);
   7280  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7281  1.1.1.2  joerg   matches Foo(1, 2)
   7282  1.1.1.2  joerg 
   7283  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7287  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7291  1.1.1.2  joerg </pre></td></tr>
   7292  1.1.1.2  joerg 
   7293  1.1.1.2  joerg 
   7294      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
   7296      1.1  joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
   7297      1.1  joerg 
   7298      1.1  joerg Given
   7299      1.1  joerg   { {}; 1+2; }
   7300      1.1  joerg hasAnySubstatement(compoundStmt())
   7301      1.1  joerg   matches '{ {}; 1+2; }'
   7302      1.1  joerg with compoundStmt()
   7303      1.1  joerg   matching '{}'
   7304      1.1  joerg </pre></td></tr>
   7305      1.1  joerg 
   7306      1.1  joerg 
   7307      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
   7309      1.1  joerg </pre></td></tr>
   7310      1.1  joerg 
   7311      1.1  joerg 
   7312  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
   7314      1.1  joerg matches the given matcher.
   7315      1.1  joerg 
   7316      1.1  joerg The associated declaration is:
   7317      1.1  joerg - for type nodes, the declaration of the underlying type
   7318      1.1  joerg - for CallExpr, the declaration of the callee
   7319      1.1  joerg - for MemberExpr, the declaration of the referenced member
   7320      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   7321      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   7322      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   7323      1.1  joerg 
   7324      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   7325      1.1  joerg sugared type. Given
   7326      1.1  joerg   class X {};
   7327      1.1  joerg   typedef X Y;
   7328      1.1  joerg   Y y;
   7329      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7330      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   7331      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7332      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   7333      1.1  joerg       recordType(hasDeclaration(decl())))))
   7334      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   7335      1.1  joerg 
   7336      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7343      1.1  joerg </pre></td></tr>
   7344      1.1  joerg 
   7345      1.1  joerg 
   7346      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
   7348      1.1  joerg specific using shadow declaration.
   7349      1.1  joerg 
   7350      1.1  joerg Given
   7351      1.1  joerg   namespace a { void f() {} }
   7352      1.1  joerg   using a::f;
   7353      1.1  joerg   void g() {
   7354      1.1  joerg     f();     // Matches this ..
   7355      1.1  joerg     a::f();  // .. but not this.
   7356      1.1  joerg   }
   7357      1.1  joerg declRefExpr(throughUsingDecl(anything()))
   7358      1.1  joerg   matches f()
   7359      1.1  joerg </pre></td></tr>
   7360      1.1  joerg 
   7361      1.1  joerg 
   7362      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
   7364      1.1  joerg specified matcher.
   7365      1.1  joerg 
   7366      1.1  joerg Example matches x in if(x)
   7367      1.1  joerg     (matcher = declRefExpr(to(varDecl(hasName("x")))))
   7368      1.1  joerg   bool x;
   7369      1.1  joerg   if (x) {}
   7370      1.1  joerg </pre></td></tr>
   7371      1.1  joerg 
   7372      1.1  joerg 
   7373      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
   7375      1.1  joerg 
   7376      1.1  joerg Note that this does not work for global declarations because the AST
   7377      1.1  joerg breaks up multiple-declaration DeclStmt's into multiple single-declaration
   7378      1.1  joerg DeclStmt's.
   7379      1.1  joerg Example: Given non-global declarations
   7380      1.1  joerg   int a, b = 0;
   7381      1.1  joerg   int c;
   7382      1.1  joerg   int d = 2, e;
   7383      1.1  joerg declStmt(containsDeclaration(
   7384      1.1  joerg       0, varDecl(hasInitializer(anything()))))
   7385      1.1  joerg   matches only 'int d = 2, e;', and
   7386      1.1  joerg declStmt(containsDeclaration(1, varDecl()))
   7387      1.1  joerg   matches 'int a, b = 0' as well as 'int d = 2, e;'
   7388      1.1  joerg   but 'int c;' is not matched.
   7389      1.1  joerg </pre></td></tr>
   7390      1.1  joerg 
   7391      1.1  joerg 
   7392      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
   7394      1.1  joerg 
   7395      1.1  joerg Given
   7396      1.1  joerg   int a, b;
   7397      1.1  joerg   int c;
   7398      1.1  joerg declStmt(hasSingleDecl(anything()))
   7399      1.1  joerg   matches 'int c;' but not 'int a, b;'.
   7400      1.1  joerg </pre></td></tr>
   7401      1.1  joerg 
   7402      1.1  joerg 
   7403  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
   7405      1.1  joerg 
   7406  1.1.1.2  joerg Examples:
   7407      1.1  joerg   int x;
   7408      1.1  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7409      1.1  joerg   matches int x
   7410  1.1.1.2  joerg 
   7411  1.1.1.2  joerg auto x = int(3);
   7412  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7413  1.1.1.2  joerg   matches int(3)
   7414  1.1.1.2  joerg 
   7415  1.1.1.2  joerg struct Foo { Foo(int, int); };
   7416  1.1.1.2  joerg auto x = Foo(1, 2);
   7417  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7418  1.1.1.2  joerg   matches Foo(1, 2)
   7419  1.1.1.2  joerg 
   7420  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7424  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7428      1.1  joerg </pre></td></tr>
   7429      1.1  joerg 
   7430      1.1  joerg 
   7431      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
   7433      1.1  joerg Decl, matches InnerMatcher.
   7434      1.1  joerg 
   7435      1.1  joerg Given
   7436      1.1  joerg   namespace N {
   7437      1.1  joerg     namespace M {
   7438      1.1  joerg       class D {};
   7439      1.1  joerg     }
   7440      1.1  joerg   }
   7441      1.1  joerg 
   7442      1.1  joerg cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
   7443      1.1  joerg declaration of class D.
   7444      1.1  joerg </pre></td></tr>
   7445      1.1  joerg 
   7446      1.1  joerg 
   7447      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
   7449      1.1  joerg 
   7450      1.1  joerg Given
   7451      1.1  joerg   decltype(1) a = 1;
   7452      1.1  joerg   decltype(2.0) b = 2.0;
   7453      1.1  joerg decltypeType(hasUnderlyingType(isInteger()))
   7454      1.1  joerg   matches the type of "a"
   7455      1.1  joerg 
   7456      1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
   7457      1.1  joerg </pre></td></tr>
   7458      1.1  joerg 
   7459      1.1  joerg 
   7460  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
   7462      1.1  joerg 
   7463  1.1.1.2  joerg For example, in:
   7464  1.1.1.2  joerg void foo()
   7465  1.1.1.2  joerg {
   7466  1.1.1.2  joerg     int arr[3];
   7467  1.1.1.2  joerg     auto &amp;[f, s, t] = arr;
   7468  1.1.1.2  joerg 
   7469  1.1.1.2  joerg     f = 42;
   7470  1.1.1.2  joerg }
   7471  1.1.1.2  joerg The matcher:
   7472  1.1.1.2  joerg   decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
   7473  1.1.1.2  joerg matches the decomposition decl with 'f' bound to "fBinding".
   7474  1.1.1.2  joerg </pre></td></tr>
   7475  1.1.1.2  joerg 
   7476  1.1.1.2  joerg 
   7477  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
   7479  1.1.1.2  joerg 
   7480  1.1.1.2  joerg For example, in:
   7481  1.1.1.2  joerg void foo()
   7482  1.1.1.2  joerg {
   7483  1.1.1.2  joerg     int arr[3];
   7484  1.1.1.2  joerg     auto &amp;[f, s, t] = arr;
   7485  1.1.1.2  joerg 
   7486  1.1.1.2  joerg     f = 42;
   7487  1.1.1.2  joerg }
   7488  1.1.1.2  joerg The matcher:
   7489  1.1.1.2  joerg   decompositionDecl(hasBinding(0,
   7490  1.1.1.2  joerg   bindingDecl(hasName("f").bind("fBinding"))))
   7491  1.1.1.2  joerg matches the decomposition decl with 'f' bound to "fBinding".
   7492      1.1  joerg </pre></td></tr>
   7493      1.1  joerg 
   7494      1.1  joerg 
   7495  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
   7497  1.1.1.2  joerg 
   7498  1.1.1.2  joerg 
   7499      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
   7501      1.1  joerg switch statement or conditional operator.
   7502      1.1  joerg 
   7503      1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   7504      1.1  joerg   if (true) {}
   7505      1.1  joerg </pre></td></tr>
   7506      1.1  joerg 
   7507      1.1  joerg 
   7508      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
   7510      1.1  joerg matches InnerMatcher if the qualifier exists.
   7511      1.1  joerg 
   7512      1.1  joerg Given
   7513      1.1  joerg   namespace N {
   7514      1.1  joerg     namespace M {
   7515      1.1  joerg       class D {};
   7516      1.1  joerg     }
   7517      1.1  joerg   }
   7518      1.1  joerg   N::M::D d;
   7519      1.1  joerg 
   7520      1.1  joerg elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
   7521      1.1  joerg matches the type of the variable declaration of d.
   7522      1.1  joerg </pre></td></tr>
   7523      1.1  joerg 
   7524      1.1  joerg 
   7525      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
   7527      1.1  joerg 
   7528      1.1  joerg Given
   7529      1.1  joerg   namespace N {
   7530      1.1  joerg     namespace M {
   7531      1.1  joerg       class D {};
   7532      1.1  joerg     }
   7533      1.1  joerg   }
   7534      1.1  joerg   N::M::D d;
   7535      1.1  joerg 
   7536      1.1  joerg elaboratedType(namesType(recordType(
   7537      1.1  joerg hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
   7538      1.1  joerg declaration of d.
   7539      1.1  joerg </pre></td></tr>
   7540      1.1  joerg 
   7541      1.1  joerg 
   7542  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
   7544      1.1  joerg matches the given matcher.
   7545      1.1  joerg 
   7546      1.1  joerg The associated declaration is:
   7547      1.1  joerg - for type nodes, the declaration of the underlying type
   7548      1.1  joerg - for CallExpr, the declaration of the callee
   7549      1.1  joerg - for MemberExpr, the declaration of the referenced member
   7550      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   7551      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   7552      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   7553      1.1  joerg 
   7554      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   7555      1.1  joerg sugared type. Given
   7556      1.1  joerg   class X {};
   7557      1.1  joerg   typedef X Y;
   7558      1.1  joerg   Y y;
   7559      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7560      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   7561      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7562      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   7563      1.1  joerg       recordType(hasDeclaration(decl())))))
   7564      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   7565      1.1  joerg 
   7566      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7573      1.1  joerg </pre></td></tr>
   7574      1.1  joerg 
   7575      1.1  joerg 
   7576      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
   7578      1.1  joerg 
   7579      1.1  joerg (Note: Clang's AST refers to other conversions as "casts" too, and calls
   7580      1.1  joerg actual casts "explicit" casts.)
   7581      1.1  joerg </pre></td></tr>
   7582      1.1  joerg 
   7583      1.1  joerg 
   7584  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
   7586  1.1.1.2  joerg 
   7587  1.1.1.2  joerg Examples:
   7588  1.1.1.2  joerg   int x;
   7589  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   7590  1.1.1.2  joerg   matches int x
   7591  1.1.1.2  joerg 
   7592  1.1.1.2  joerg auto x = int(3);
   7593  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   7594  1.1.1.2  joerg   matches int(3)
   7595  1.1.1.2  joerg 
   7596  1.1.1.2  joerg struct Foo { Foo(int, int); };
   7597  1.1.1.2  joerg auto x = Foo(1, 2);
   7598  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   7599  1.1.1.2  joerg   matches Foo(1, 2)
   7600  1.1.1.2  joerg 
   7601  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   7605  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   7609  1.1.1.2  joerg </pre></td></tr>
   7610  1.1.1.2  joerg 
   7611  1.1.1.2  joerg 
   7612  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
   7614      1.1  joerg declaration's type.
   7615      1.1  joerg 
   7616      1.1  joerg In case of a value declaration (for example a variable declaration),
   7617      1.1  joerg this resolves one layer of indirection. For example, in the value
   7618      1.1  joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   7619      1.1  joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   7620      1.1  joerg declaration of x.
   7621      1.1  joerg 
   7622      1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7623      1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7624      1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   7625  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7626  1.1.1.2  joerg                                               cxxRecordDecl(hasName("X"))))
   7627      1.1  joerg  class X {};
   7628      1.1  joerg  void y(X &amp;x) { x; X z; }
   7629      1.1  joerg  class Y { friend class X; };
   7630  1.1.1.2  joerg  class Z : public virtual X {};
   7631  1.1.1.2  joerg 
   7632  1.1.1.2  joerg Example matches class Derived
   7633  1.1.1.2  joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   7634  1.1.1.2  joerg class Base {};
   7635  1.1.1.2  joerg class Derived : Base {};
   7636      1.1  joerg 
   7637  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   7639      1.1  joerg </pre></td></tr>
   7640      1.1  joerg 
   7641      1.1  joerg 
   7642      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
   7644      1.1  joerg matcher.
   7645      1.1  joerg 
   7646      1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7647      1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7648      1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   7649      1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   7650  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7651  1.1.1.2  joerg                                               asString("class X")))
   7652      1.1  joerg  class X {};
   7653      1.1  joerg  void y(X &amp;x) { x; X z; }
   7654      1.1  joerg  typedef int U;
   7655      1.1  joerg  class Y { friend class X; };
   7656  1.1.1.2  joerg  class Z : public virtual X {};
   7657      1.1  joerg </pre></td></tr>
   7658      1.1  joerg 
   7659      1.1  joerg 
   7660      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
   7662      1.1  joerg elidable constructor and other corresponding bookkeeping nodes.
   7663      1.1  joerg 
   7664      1.1  joerg In C++17, elidable copy constructors are no longer being generated in the
   7665      1.1  joerg AST as it is not permitted by the standard. They are, however, part of the
   7666      1.1  joerg AST in C++14 and earlier. So, a matcher must abstract over these differences
   7667      1.1  joerg to work in all language modes. This matcher skips elidable constructor-call
   7668      1.1  joerg AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
   7669      1.1  joerg various implicit nodes inside the constructor calls, all of which will not
   7670      1.1  joerg appear in the C++17 AST.
   7671      1.1  joerg 
   7672      1.1  joerg Given
   7673      1.1  joerg 
   7674      1.1  joerg struct H {};
   7675      1.1  joerg H G();
   7676      1.1  joerg void f() {
   7677      1.1  joerg   H D = G();
   7678      1.1  joerg }
   7679      1.1  joerg 
   7680      1.1  joerg ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
   7681      1.1  joerg matches ``H D = G()`` in C++11 through C++17 (and beyond).
   7682      1.1  joerg </pre></td></tr>
   7683      1.1  joerg 
   7684      1.1  joerg 
   7685      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
   7687      1.1  joerg are stripped off.
   7688      1.1  joerg 
   7689      1.1  joerg Parentheses and explicit casts are not discarded.
   7690      1.1  joerg Given
   7691      1.1  joerg   int arr[5];
   7692      1.1  joerg   int a = 0;
   7693      1.1  joerg   char b = 0;
   7694      1.1  joerg   const int c = a;
   7695      1.1  joerg   int *d = arr;
   7696      1.1  joerg   long e = (long) 0l;
   7697      1.1  joerg The matchers
   7698      1.1  joerg    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
   7699      1.1  joerg    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
   7700      1.1  joerg would match the declarations for a, b, c, and d, but not e.
   7701      1.1  joerg While
   7702      1.1  joerg    varDecl(hasInitializer(integerLiteral()))
   7703      1.1  joerg    varDecl(hasInitializer(declRefExpr()))
   7704      1.1  joerg only match the declarations for b, c, and d.
   7705      1.1  joerg </pre></td></tr>
   7706      1.1  joerg 
   7707      1.1  joerg 
   7708      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
   7710      1.1  joerg nodes are stripped off.
   7711      1.1  joerg 
   7712      1.1  joerg Parentheses and explicit casts are not discarded.
   7713      1.1  joerg Given
   7714      1.1  joerg   class C {};
   7715      1.1  joerg   C a = C();
   7716      1.1  joerg   C b;
   7717      1.1  joerg   C c = b;
   7718      1.1  joerg The matchers
   7719      1.1  joerg    varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
   7720      1.1  joerg would match the declarations for a, b, and c.
   7721      1.1  joerg While
   7722      1.1  joerg    varDecl(hasInitializer(cxxConstructExpr()))
   7723      1.1  joerg only match the declarations for b and c.
   7724      1.1  joerg </pre></td></tr>
   7725      1.1  joerg 
   7726      1.1  joerg 
   7727      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
   7729      1.1  joerg casts are stripped off.
   7730      1.1  joerg 
   7731      1.1  joerg Implicit and non-C Style casts are also discarded.
   7732      1.1  joerg Given
   7733      1.1  joerg   int a = 0;
   7734      1.1  joerg   char b = (0);
   7735      1.1  joerg   void* c = reinterpret_cast&lt;char*&gt;(0);
   7736      1.1  joerg   char d = char(0);
   7737      1.1  joerg The matcher
   7738      1.1  joerg    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
   7739      1.1  joerg would match the declarations for a, b, c, and d.
   7740      1.1  joerg while
   7741      1.1  joerg    varDecl(hasInitializer(integerLiteral()))
   7742      1.1  joerg only match the declaration for a.
   7743      1.1  joerg </pre></td></tr>
   7744      1.1  joerg 
   7745      1.1  joerg 
   7746      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
   7748      1.1  joerg parentheses are stripped off.
   7749      1.1  joerg 
   7750      1.1  joerg Explicit casts are not discarded.
   7751      1.1  joerg Given
   7752      1.1  joerg   int arr[5];
   7753      1.1  joerg   int a = 0;
   7754      1.1  joerg   char b = (0);
   7755      1.1  joerg   const int c = a;
   7756      1.1  joerg   int *d = (arr);
   7757      1.1  joerg   long e = ((long) 0l);
   7758      1.1  joerg The matchers
   7759      1.1  joerg    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
   7760      1.1  joerg    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
   7761      1.1  joerg would match the declarations for a, b, c, and d, but not e.
   7762      1.1  joerg while
   7763      1.1  joerg    varDecl(hasInitializer(integerLiteral()))
   7764      1.1  joerg    varDecl(hasInitializer(declRefExpr()))
   7765      1.1  joerg would only match the declaration for a.
   7766      1.1  joerg </pre></td></tr>
   7767      1.1  joerg 
   7768      1.1  joerg 
   7769      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
   7771      1.1  joerg 
   7772      1.1  joerg Given
   7773      1.1  joerg   const char* str = ("my-string");
   7774      1.1  joerg The matcher
   7775      1.1  joerg   implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
   7776      1.1  joerg would match the implicit cast resulting from the assignment.
   7777      1.1  joerg </pre></td></tr>
   7778      1.1  joerg 
   7779      1.1  joerg 
   7780      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
   7782      1.1  joerg 
   7783      1.1  joerg Given
   7784      1.1  joerg   class C {
   7785      1.1  joerg     int a = 2;
   7786      1.1  joerg     int b = 3;
   7787      1.1  joerg     int c;
   7788      1.1  joerg   };
   7789      1.1  joerg fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
   7790      1.1  joerg   matches 'int a;' but not 'int b;'.
   7791      1.1  joerg fieldDecl(hasInClassInitializer(anything()))
   7792      1.1  joerg   matches 'int a;' and 'int b;' but not 'int c;'.
   7793      1.1  joerg </pre></td></tr>
   7794      1.1  joerg 
   7795      1.1  joerg 
   7796      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
   7798      1.1  joerg 
   7799      1.1  joerg 
   7800      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
   7802      1.1  joerg switch statement or conditional operator.
   7803      1.1  joerg 
   7804      1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   7805      1.1  joerg   if (true) {}
   7806      1.1  joerg </pre></td></tr>
   7807      1.1  joerg 
   7808      1.1  joerg 
   7809      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
   7811      1.1  joerg 
   7812      1.1  joerg Example:
   7813      1.1  joerg     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
   7814      1.1  joerg matches '++x' in
   7815      1.1  joerg     for (x; x &lt; N; ++x) { }
   7816      1.1  joerg </pre></td></tr>
   7817      1.1  joerg 
   7818      1.1  joerg 
   7819      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
   7821      1.1  joerg 
   7822      1.1  joerg Example:
   7823      1.1  joerg     forStmt(hasLoopInit(declStmt()))
   7824      1.1  joerg matches 'int x = 0' in
   7825      1.1  joerg     for (int x = 0; x &lt; N; ++x) { }
   7826      1.1  joerg </pre></td></tr>
   7827      1.1  joerg 
   7828      1.1  joerg 
   7829  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
   7831      1.1  joerg declaration's type.
   7832      1.1  joerg 
   7833      1.1  joerg In case of a value declaration (for example a variable declaration),
   7834      1.1  joerg this resolves one layer of indirection. For example, in the value
   7835      1.1  joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   7836      1.1  joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   7837      1.1  joerg declaration of x.
   7838      1.1  joerg 
   7839      1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7840      1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7841      1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   7842  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7843  1.1.1.2  joerg                                               cxxRecordDecl(hasName("X"))))
   7844      1.1  joerg  class X {};
   7845      1.1  joerg  void y(X &amp;x) { x; X z; }
   7846      1.1  joerg  class Y { friend class X; };
   7847  1.1.1.2  joerg  class Z : public virtual X {};
   7848      1.1  joerg 
   7849  1.1.1.2  joerg Example matches class Derived
   7850  1.1.1.2  joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   7851  1.1.1.2  joerg class Base {};
   7852  1.1.1.2  joerg class Derived : Base {};
   7853  1.1.1.2  joerg 
   7854  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   7856      1.1  joerg </pre></td></tr>
   7857      1.1  joerg 
   7858      1.1  joerg 
   7859      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
   7861      1.1  joerg matcher.
   7862      1.1  joerg 
   7863      1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7864      1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7865      1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   7866      1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   7867  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   7868  1.1.1.2  joerg                                               asString("class X")))
   7869      1.1  joerg  class X {};
   7870      1.1  joerg  void y(X &amp;x) { x; X z; }
   7871      1.1  joerg  typedef int U;
   7872      1.1  joerg  class Y { friend class X; };
   7873  1.1.1.2  joerg  class Z : public virtual X {};
   7874  1.1.1.2  joerg </pre></td></tr>
   7875  1.1.1.2  joerg 
   7876  1.1.1.2  joerg 
   7877  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
   7879  1.1.1.2  joerg Note that this matcher matches all the declarations of a function whose
   7880  1.1.1.2  joerg body is present in the AST.
   7881  1.1.1.2  joerg 
   7882  1.1.1.2  joerg Given
   7883  1.1.1.2  joerg   void f();
   7884  1.1.1.2  joerg   void f() {}
   7885  1.1.1.2  joerg   void g();
   7886  1.1.1.2  joerg functionDecl(hasAnyBody(compoundStmt()))
   7887  1.1.1.2  joerg   matches both 'void f();'
   7888  1.1.1.2  joerg   and 'void f() {}'
   7889  1.1.1.2  joerg with compoundStmt()
   7890  1.1.1.2  joerg   matching '{}'
   7891  1.1.1.2  joerg   but does not match 'void g();'
   7892      1.1  joerg </pre></td></tr>
   7893      1.1  joerg 
   7894      1.1  joerg 
   7895      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
   7897      1.1  joerg block.
   7898      1.1  joerg 
   7899      1.1  joerg Does not match the 'this' parameter of a method.
   7900      1.1  joerg 
   7901      1.1  joerg Given
   7902      1.1  joerg   class X { void f(int x, int y, int z) {} };
   7903      1.1  joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
   7904      1.1  joerg   matches f(int x, int y, int z) {}
   7905      1.1  joerg with hasAnyParameter(...)
   7906      1.1  joerg   matching int y
   7907      1.1  joerg 
   7908      1.1  joerg For ObjectiveC, given
   7909      1.1  joerg   @interface I - (void) f:(int) y; @end
   7910      1.1  joerg 
   7911      1.1  joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   7912      1.1  joerg matches the declaration of method f with hasParameter
   7913      1.1  joerg matching y.
   7914      1.1  joerg 
   7915      1.1  joerg For blocks, given
   7916      1.1  joerg   b = ^(int y) { printf("%d", y) };
   7917      1.1  joerg 
   7918      1.1  joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
   7919      1.1  joerg matches the declaration of the block b with hasParameter
   7920      1.1  joerg matching y.
   7921      1.1  joerg </pre></td></tr>
   7922      1.1  joerg 
   7923      1.1  joerg 
   7924      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7926      1.1  joerg functionDecl that have at least one TemplateArgument matching the given
   7927      1.1  joerg InnerMatcher.
   7928      1.1  joerg 
   7929      1.1  joerg Given
   7930      1.1  joerg   template&lt;typename T&gt; class A {};
   7931      1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
   7932      1.1  joerg   A&lt;int&gt; a;
   7933      1.1  joerg 
   7934      1.1  joerg   template&lt;typename T&gt; f() {};
   7935      1.1  joerg   void func() { f&lt;int&gt;(); };
   7936      1.1  joerg 
   7937      1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7938      1.1  joerg     refersToType(asString("int"))))
   7939      1.1  joerg   matches the specialization A&lt;int&gt;
   7940      1.1  joerg 
   7941      1.1  joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   7942      1.1  joerg   matches the specialization f&lt;int&gt;
   7943      1.1  joerg </pre></td></tr>
   7944      1.1  joerg 
   7945      1.1  joerg 
   7946      1.1  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
   7948      1.1  joerg 
   7949      1.1  joerg 
   7950      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
   7952      1.1  joerg declaration.
   7953      1.1  joerg 
   7954      1.1  joerg Given
   7955      1.1  joerg   template&lt;bool b&gt;
   7956      1.1  joerg   struct S {
   7957      1.1  joerg     S(int); // #1
   7958      1.1  joerg     explicit S(double); // #2
   7959      1.1  joerg     operator int(); // #3
   7960      1.1  joerg     explicit operator bool(); // #4
   7961      1.1  joerg     explicit(false) S(bool) // # 7
   7962      1.1  joerg     explicit(true) S(char) // # 8
   7963      1.1  joerg     explicit(b) S(S) // # 9
   7964      1.1  joerg   };
   7965      1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   7966      1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   7967      1.1  joerg cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
   7968      1.1  joerg cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
   7969      1.1  joerg cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
   7970      1.1  joerg </pre></td></tr>
   7971      1.1  joerg 
   7972      1.1  joerg 
   7973      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
   7975      1.1  joerg declaration or a block.
   7976      1.1  joerg 
   7977      1.1  joerg Given
   7978      1.1  joerg   class X { void f(int x) {} };
   7979      1.1  joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   7980      1.1  joerg   matches f(int x) {}
   7981      1.1  joerg with hasParameter(...)
   7982      1.1  joerg   matching int x
   7983      1.1  joerg 
   7984      1.1  joerg For ObjectiveC, given
   7985      1.1  joerg   @interface I - (void) f:(int) y; @end
   7986      1.1  joerg 
   7987      1.1  joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   7988      1.1  joerg matches the declaration of method f with hasParameter
   7989      1.1  joerg matching y.
   7990      1.1  joerg </pre></td></tr>
   7991      1.1  joerg 
   7992      1.1  joerg 
   7993      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7995      1.1  joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   7996      1.1  joerg 
   7997      1.1  joerg Given
   7998      1.1  joerg   template&lt;typename T, typename U&gt; class A {};
   7999      1.1  joerg   A&lt;bool, int&gt; b;
   8000      1.1  joerg   A&lt;int, bool&gt; c;
   8001      1.1  joerg 
   8002      1.1  joerg   template&lt;typename T&gt; void f() {}
   8003      1.1  joerg   void func() { f&lt;int&gt;(); };
   8004      1.1  joerg classTemplateSpecializationDecl(hasTemplateArgument(
   8005      1.1  joerg     1, refersToType(asString("int"))))
   8006      1.1  joerg   matches the specialization A&lt;bool, int&gt;
   8007      1.1  joerg 
   8008      1.1  joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   8009      1.1  joerg   matches the specialization f&lt;int&gt;
   8010      1.1  joerg </pre></td></tr>
   8011      1.1  joerg 
   8012      1.1  joerg 
   8013      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
   8015      1.1  joerg 
   8016      1.1  joerg Given:
   8017      1.1  joerg   class X { int f() { return 1; } };
   8018      1.1  joerg cxxMethodDecl(returns(asString("int")))
   8019      1.1  joerg   matches int f() { return 1; }
   8020      1.1  joerg </pre></td></tr>
   8021      1.1  joerg 
   8022      1.1  joerg 
   8023      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
   8025      1.1  joerg switch statement or conditional operator.
   8026      1.1  joerg 
   8027      1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   8028      1.1  joerg   if (true) {}
   8029      1.1  joerg </pre></td></tr>
   8030      1.1  joerg 
   8031      1.1  joerg 
   8032      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
   8034      1.1  joerg 
   8035      1.1  joerg Given
   8036      1.1  joerg   if (A* a = GetAPointer()) {}
   8037      1.1  joerg hasConditionVariableStatement(...)
   8038      1.1  joerg   matches 'A* a = GetAPointer()'.
   8039      1.1  joerg </pre></td></tr>
   8040      1.1  joerg 
   8041      1.1  joerg 
   8042      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
   8044      1.1  joerg 
   8045      1.1  joerg Examples matches the if statement
   8046      1.1  joerg   (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
   8047      1.1  joerg   if (false) false; else true;
   8048      1.1  joerg </pre></td></tr>
   8049      1.1  joerg 
   8050      1.1  joerg 
   8051  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
   8053  1.1.1.2  joerg 
   8054  1.1.1.2  joerg Given:
   8055  1.1.1.2  joerg  void foo() {
   8056  1.1.1.2  joerg    if (int i = foobar(); i &gt; 0) {}
   8057  1.1.1.2  joerg    switch (int i = foobar(); i) {}
   8058  1.1.1.2  joerg    for (auto&amp; a = get_range(); auto&amp; x : a) {}
   8059  1.1.1.2  joerg  }
   8060  1.1.1.2  joerg  void bar() {
   8061  1.1.1.2  joerg    if (foobar() &gt; 0) {}
   8062  1.1.1.2  joerg    switch (foobar()) {}
   8063  1.1.1.2  joerg    for (auto&amp; x : get_range()) {}
   8064  1.1.1.2  joerg  }
   8065  1.1.1.2  joerg ifStmt(hasInitStatement(anything()))
   8066  1.1.1.2  joerg   matches the if statement in foo but not in bar.
   8067  1.1.1.2  joerg switchStmt(hasInitStatement(anything()))
   8068  1.1.1.2  joerg   matches the switch statement in foo but not in bar.
   8069  1.1.1.2  joerg cxxForRangeStmt(hasInitStatement(anything()))
   8070  1.1.1.2  joerg   matches the range for statement in foo but not in bar.
   8071  1.1.1.2  joerg </pre></td></tr>
   8072  1.1.1.2  joerg 
   8073  1.1.1.2  joerg 
   8074      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
   8076      1.1  joerg 
   8077      1.1  joerg Examples matches the if statement
   8078      1.1  joerg   (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
   8079      1.1  joerg   if (false) true; else false;
   8080      1.1  joerg </pre></td></tr>
   8081      1.1  joerg 
   8082      1.1  joerg 
   8083      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
   8085      1.1  joerg matcher.
   8086      1.1  joerg 
   8087      1.1  joerg FIXME: Unit test this matcher
   8088      1.1  joerg </pre></td></tr>
   8089      1.1  joerg 
   8090      1.1  joerg 
   8091      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
   8093      1.1  joerg 
   8094      1.1  joerg Example matches y.
   8095      1.1  joerg     (matcher = initListExpr(hasInit(0, expr())))
   8096      1.1  joerg   int x{y}.
   8097      1.1  joerg </pre></td></tr>
   8098      1.1  joerg 
   8099      1.1  joerg 
   8100      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
   8102      1.1  joerg (if expression have it).
   8103      1.1  joerg </pre></td></tr>
   8104      1.1  joerg 
   8105      1.1  joerg 
   8106  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
   8108      1.1  joerg matches the given matcher.
   8109      1.1  joerg 
   8110      1.1  joerg The associated declaration is:
   8111      1.1  joerg - for type nodes, the declaration of the underlying type
   8112      1.1  joerg - for CallExpr, the declaration of the callee
   8113      1.1  joerg - for MemberExpr, the declaration of the referenced member
   8114      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   8115      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   8116      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   8117      1.1  joerg 
   8118      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   8119      1.1  joerg sugared type. Given
   8120      1.1  joerg   class X {};
   8121      1.1  joerg   typedef X Y;
   8122      1.1  joerg   Y y;
   8123      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8124      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   8125      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8126      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   8127      1.1  joerg       recordType(hasDeclaration(decl())))))
   8128      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   8129      1.1  joerg 
   8130      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8137      1.1  joerg </pre></td></tr>
   8138      1.1  joerg 
   8139      1.1  joerg 
   8140  1.1.1.2  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
   8142      1.1  joerg matches the given matcher.
   8143      1.1  joerg 
   8144      1.1  joerg The associated declaration is:
   8145      1.1  joerg - for type nodes, the declaration of the underlying type
   8146      1.1  joerg - for CallExpr, the declaration of the callee
   8147      1.1  joerg - for MemberExpr, the declaration of the referenced member
   8148      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   8149      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   8150      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   8151      1.1  joerg 
   8152      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   8153      1.1  joerg sugared type. Given
   8154      1.1  joerg   class X {};
   8155      1.1  joerg   typedef X Y;
   8156      1.1  joerg   Y y;
   8157      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8158      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   8159      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8160      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   8161      1.1  joerg       recordType(hasDeclaration(decl())))))
   8162      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   8163      1.1  joerg 
   8164      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8171      1.1  joerg </pre></td></tr>
   8172      1.1  joerg 
   8173      1.1  joerg 
   8174  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
   8176  1.1.1.2  joerg 
   8177  1.1.1.2  joerg Given
   8178  1.1.1.2  joerg   struct foo {
   8179  1.1.1.2  joerg     void bar() {
   8180  1.1.1.2  joerg       auto f = [this](){};
   8181  1.1.1.2  joerg     }
   8182  1.1.1.2  joerg   }
   8183  1.1.1.2  joerg lambdaExpr(hasAnyCapture(cxxThisExpr()))
   8184  1.1.1.2  joerg   matches [this](){};
   8185  1.1.1.2  joerg </pre></td></tr>
   8186  1.1.1.2  joerg 
   8187  1.1.1.2  joerg 
   8188  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
   8190  1.1.1.2  joerg 
   8191  1.1.1.2  joerg Given
   8192  1.1.1.2  joerg   void foo() {
   8193  1.1.1.2  joerg     int x;
   8194  1.1.1.2  joerg     auto f = [x](){};
   8195  1.1.1.2  joerg   }
   8196  1.1.1.2  joerg lambdaExpr(hasAnyCapture(anything()))
   8197  1.1.1.2  joerg   matches [x](){};
   8198  1.1.1.2  joerg </pre></td></tr>
   8199  1.1.1.2  joerg 
   8200  1.1.1.2  joerg 
   8201  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
   8203      1.1  joerg matches the given matcher.
   8204      1.1  joerg 
   8205      1.1  joerg The associated declaration is:
   8206      1.1  joerg - for type nodes, the declaration of the underlying type
   8207      1.1  joerg - for CallExpr, the declaration of the callee
   8208      1.1  joerg - for MemberExpr, the declaration of the referenced member
   8209      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   8210      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   8211      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   8212      1.1  joerg 
   8213      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   8214      1.1  joerg sugared type. Given
   8215      1.1  joerg   class X {};
   8216      1.1  joerg   typedef X Y;
   8217      1.1  joerg   Y y;
   8218      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8219      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   8220      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8221      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   8222      1.1  joerg       recordType(hasDeclaration(decl())))))
   8223      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   8224      1.1  joerg 
   8225      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8232      1.1  joerg </pre></td></tr>
   8233      1.1  joerg 
   8234      1.1  joerg 
   8235      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
   8237      1.1  joerg given matcher. Implicit object expressions are included; that is, it matches
   8238      1.1  joerg use of implicit `this`.
   8239      1.1  joerg 
   8240      1.1  joerg Given
   8241      1.1  joerg   struct X {
   8242      1.1  joerg     int m;
   8243      1.1  joerg     int f(X x) { x.m; return m; }
   8244      1.1  joerg   };
   8245      1.1  joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   8246      1.1  joerg   matches `x.m`, but not `m`; however,
   8247      1.1  joerg memberExpr(hasObjectExpression(hasType(pointsTo(
   8248      1.1  joerg      cxxRecordDecl(hasName("X"))))))
   8249      1.1  joerg   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   8250      1.1  joerg </pre></td></tr>
   8251      1.1  joerg 
   8252      1.1  joerg 
   8253      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
   8255      1.1  joerg given matcher.
   8256      1.1  joerg 
   8257      1.1  joerg Given
   8258      1.1  joerg   struct { int first, second; } first, second;
   8259      1.1  joerg   int i(second.first);
   8260      1.1  joerg   int j(first.second);
   8261      1.1  joerg memberExpr(member(hasName("first")))
   8262      1.1  joerg   matches second.first
   8263      1.1  joerg   but not first.second (because the member name there is "second").
   8264      1.1  joerg </pre></td></tr>
   8265      1.1  joerg 
   8266      1.1  joerg 
   8267      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
   8269      1.1  joerg pointee matches a given matcher.
   8270      1.1  joerg 
   8271      1.1  joerg Given
   8272      1.1  joerg   int *a;
   8273      1.1  joerg   int const *b;
   8274      1.1  joerg   float const *f;
   8275      1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   8276      1.1  joerg   matches "int const *b"
   8277      1.1  joerg 
   8278      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg </pre></td></tr>
   8281      1.1  joerg 
   8282      1.1  joerg 
   8283      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
   8285      1.1  joerg matcher.
   8286      1.1  joerg 
   8287      1.1  joerg Given
   8288      1.1  joerg   namespace N { template&lt;class T&gt; void f(T t); }
   8289      1.1  joerg   template &lt;class T&gt; void g() { using N::f; f(T()); }
   8290      1.1  joerg unresolvedLookupExpr(hasAnyDeclaration(
   8291      1.1  joerg     namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
   8292      1.1  joerg   matches the use of f in g() .
   8293      1.1  joerg </pre></td></tr>
   8294      1.1  joerg 
   8295      1.1  joerg 
   8296      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
   8298      1.1  joerg 
   8299      1.1  joerg Given
   8300      1.1  joerg   struct A { struct B { struct C {}; }; };
   8301      1.1  joerg   A::B::C c;
   8302      1.1  joerg nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
   8303      1.1  joerg   matches "A::"
   8304      1.1  joerg </pre></td></tr>
   8305      1.1  joerg 
   8306      1.1  joerg 
   8307  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
   8309  1.1.1.2  joerg NestedNameSpecifier-matcher matches.
   8310  1.1.1.2  joerg </pre></td></tr>
   8311  1.1.1.2  joerg 
   8312  1.1.1.2  joerg 
   8313      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
   8315      1.1  joerg given TypeLoc.
   8316      1.1  joerg 
   8317      1.1  joerg Given
   8318      1.1  joerg   struct A { struct B { struct C {}; }; };
   8319      1.1  joerg   A::B::C c;
   8320      1.1  joerg nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
   8321      1.1  joerg   hasDeclaration(cxxRecordDecl(hasName("A")))))))
   8322      1.1  joerg   matches "A::"
   8323      1.1  joerg </pre></td></tr>
   8324      1.1  joerg 
   8325      1.1  joerg 
   8326      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
   8328      1.1  joerg 
   8329      1.1  joerg Given
   8330      1.1  joerg   struct A { struct B { struct C {}; }; };
   8331      1.1  joerg   A::B::C c;
   8332      1.1  joerg nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
   8333      1.1  joerg   matches "A::"
   8334      1.1  joerg </pre></td></tr>
   8335      1.1  joerg 
   8336      1.1  joerg 
   8337      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
   8339      1.1  joerg given namespace matcher.
   8340      1.1  joerg 
   8341      1.1  joerg Given
   8342      1.1  joerg   namespace ns { struct A {}; }
   8343      1.1  joerg   ns::A a;
   8344      1.1  joerg nestedNameSpecifier(specifiesNamespace(hasName("ns")))
   8345      1.1  joerg   matches "ns::"
   8346      1.1  joerg </pre></td></tr>
   8347      1.1  joerg 
   8348      1.1  joerg 
   8349      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
   8351      1.1  joerg given QualType matcher without qualifiers.
   8352      1.1  joerg 
   8353      1.1  joerg Given
   8354      1.1  joerg   struct A { struct B { struct C {}; }; };
   8355      1.1  joerg   A::B::C c;
   8356      1.1  joerg nestedNameSpecifier(specifiesType(
   8357      1.1  joerg   hasDeclaration(cxxRecordDecl(hasName("A")))
   8358      1.1  joerg ))
   8359      1.1  joerg   matches "A::"
   8360      1.1  joerg </pre></td></tr>
   8361      1.1  joerg 
   8362      1.1  joerg 
   8363      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
   8365      1.1  joerg 
   8366      1.1  joerg Given
   8367      1.1  joerg 
   8368      1.1  joerg   #pragma omp parallel
   8369      1.1  joerg   #pragma omp parallel default(none)
   8370      1.1  joerg 
   8371      1.1  joerg ``ompExecutableDirective(hasAnyClause(anything()))`` matches
   8372      1.1  joerg ``omp parallel default(none)``.
   8373      1.1  joerg </pre></td></tr>
   8374      1.1  joerg 
   8375      1.1  joerg 
   8376      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
   8378      1.1  joerg 
   8379      1.1  joerg Prerequisite: the executable directive must not be standalone directive.
   8380      1.1  joerg If it is, it will never match.
   8381      1.1  joerg 
   8382      1.1  joerg Given
   8383      1.1  joerg 
   8384      1.1  joerg    #pragma omp parallel
   8385      1.1  joerg    ;
   8386      1.1  joerg    #pragma omp parallel
   8387      1.1  joerg    {}
   8388      1.1  joerg 
   8389      1.1  joerg ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
   8390      1.1  joerg </pre></td></tr>
   8391      1.1  joerg 
   8392      1.1  joerg 
   8393      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
   8395      1.1  joerg matching Base, or Objective-C classes that directly or indirectly
   8396      1.1  joerg subclass a class matching Base.
   8397      1.1  joerg 
   8398      1.1  joerg Note that a class is not considered to be derived from itself.
   8399      1.1  joerg 
   8400      1.1  joerg Example matches Y, Z, C (Base == hasName("X"))
   8401      1.1  joerg   class X;
   8402      1.1  joerg   class Y : public X {};  // directly derived
   8403      1.1  joerg   class Z : public Y {};  // indirectly derived
   8404      1.1  joerg   typedef X A;
   8405      1.1  joerg   typedef A B;
   8406      1.1  joerg   class C : public B {};  // derived from a typedef of X
   8407      1.1  joerg 
   8408      1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   8409      1.1  joerg   class Foo;
   8410      1.1  joerg   typedef Foo X;
   8411      1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   8412      1.1  joerg 
   8413      1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
   8414      1.1  joerg   @interface NSObject @end
   8415      1.1  joerg   @interface Bar : NSObject @end
   8416      1.1  joerg 
   8417      1.1  joerg Usable as: Matcher&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      1.1  joerg </pre></td></tr>
   8419      1.1  joerg 
   8420      1.1  joerg 
   8421      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
   8423      1.1  joerg matching Base.
   8424      1.1  joerg 
   8425      1.1  joerg Note that a class is not considered to be derived from itself.
   8426      1.1  joerg 
   8427      1.1  joerg Example matches Y, C (Base == hasName("X"))
   8428      1.1  joerg   class X;
   8429      1.1  joerg   class Y : public X {};  // directly derived
   8430      1.1  joerg   class Z : public Y {};  // indirectly derived
   8431      1.1  joerg   typedef X A;
   8432      1.1  joerg   typedef A B;
   8433      1.1  joerg   class C : public B {};  // derived from a typedef of X
   8434      1.1  joerg 
   8435      1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   8436      1.1  joerg   class Foo;
   8437      1.1  joerg   typedef Foo X;
   8438      1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   8439      1.1  joerg </pre></td></tr>
   8440      1.1  joerg 
   8441      1.1  joerg 
   8442      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
   8444      1.1  joerg match Base.
   8445      1.1  joerg </pre></td></tr>
   8446      1.1  joerg 
   8447      1.1  joerg 
   8448      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
   8450      1.1  joerg expression, or an ObjC-message-send expression.
   8451      1.1  joerg 
   8452      1.1  joerg Given
   8453      1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   8454      1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   8455      1.1  joerg   matches x(1, y, 42)
   8456      1.1  joerg with hasAnyArgument(...)
   8457      1.1  joerg   matching y
   8458      1.1  joerg 
   8459      1.1  joerg For ObjectiveC, given
   8460      1.1  joerg   @interface I - (void) f:(int) y; @end
   8461      1.1  joerg   void foo(I *i) { [i f:12]; }
   8462      1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   8463      1.1  joerg   matches [i f:12]
   8464      1.1  joerg </pre></td></tr>
   8465      1.1  joerg 
   8466      1.1  joerg 
   8467  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
   8469      1.1  joerg call expression.
   8470      1.1  joerg 
   8471      1.1  joerg Example matches y in x(y)
   8472      1.1  joerg     (matcher = callExpr(hasArgument(0, declRefExpr())))
   8473      1.1  joerg   void x(int) { int y; x(y); }
   8474      1.1  joerg </pre></td></tr>
   8475      1.1  joerg 
   8476      1.1  joerg 
   8477      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
   8479      1.1  joerg and the inner matcher matches on that instance.
   8480      1.1  joerg 
   8481      1.1  joerg For example the method call in
   8482      1.1  joerg   NSString *x = @"hello";
   8483      1.1  joerg   [x containsString:@"h"];
   8484      1.1  joerg is matched by
   8485      1.1  joerg objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
   8486      1.1  joerg </pre></td></tr>
   8487      1.1  joerg 
   8488      1.1  joerg 
   8489      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
   8491      1.1  joerg 
   8492      1.1  joerg Example
   8493      1.1  joerg matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
   8494      1.1  joerg matches the [webView ...] message invocation.
   8495      1.1  joerg   NSString *webViewJavaScript = ...
   8496      1.1  joerg   UIWebView *webView = ...
   8497      1.1  joerg   [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
   8498      1.1  joerg </pre></td></tr>
   8499      1.1  joerg 
   8500      1.1  joerg 
   8501      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
   8503      1.1  joerg block.
   8504      1.1  joerg 
   8505      1.1  joerg Does not match the 'this' parameter of a method.
   8506      1.1  joerg 
   8507      1.1  joerg Given
   8508      1.1  joerg   class X { void f(int x, int y, int z) {} };
   8509      1.1  joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
   8510      1.1  joerg   matches f(int x, int y, int z) {}
   8511      1.1  joerg with hasAnyParameter(...)
   8512      1.1  joerg   matching int y
   8513      1.1  joerg 
   8514      1.1  joerg For ObjectiveC, given
   8515      1.1  joerg   @interface I - (void) f:(int) y; @end
   8516      1.1  joerg 
   8517      1.1  joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   8518      1.1  joerg matches the declaration of method f with hasParameter
   8519      1.1  joerg matching y.
   8520      1.1  joerg 
   8521      1.1  joerg For blocks, given
   8522      1.1  joerg   b = ^(int y) { printf("%d", y) };
   8523      1.1  joerg 
   8524      1.1  joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
   8525      1.1  joerg matches the declaration of the block b with hasParameter
   8526      1.1  joerg matching y.
   8527      1.1  joerg </pre></td></tr>
   8528      1.1  joerg 
   8529      1.1  joerg 
   8530      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
   8532      1.1  joerg declaration or a block.
   8533      1.1  joerg 
   8534      1.1  joerg Given
   8535      1.1  joerg   class X { void f(int x) {} };
   8536      1.1  joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   8537      1.1  joerg   matches f(int x) {}
   8538      1.1  joerg with hasParameter(...)
   8539      1.1  joerg   matching int x
   8540      1.1  joerg 
   8541      1.1  joerg For ObjectiveC, given
   8542      1.1  joerg   @interface I - (void) f:(int) y; @end
   8543      1.1  joerg 
   8544      1.1  joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   8545      1.1  joerg matches the declaration of method f with hasParameter
   8546      1.1  joerg matching y.
   8547      1.1  joerg </pre></td></tr>
   8548      1.1  joerg 
   8549      1.1  joerg 
   8550  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
   8552  1.1.1.2  joerg 
   8553  1.1.1.2  joerg Examples:
   8554  1.1.1.2  joerg   int x;
   8555  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   8556  1.1.1.2  joerg   matches int x
   8557  1.1.1.2  joerg 
   8558  1.1.1.2  joerg auto x = int(3);
   8559  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   8560  1.1.1.2  joerg   matches int(3)
   8561  1.1.1.2  joerg 
   8562  1.1.1.2  joerg struct Foo { Foo(int, int); };
   8563  1.1.1.2  joerg auto x = Foo(1, 2);
   8564  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   8565  1.1.1.2  joerg   matches Foo(1, 2)
   8566  1.1.1.2  joerg 
   8567  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   8571  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   8575  1.1.1.2  joerg </pre></td></tr>
   8576  1.1.1.2  joerg 
   8577  1.1.1.2  joerg 
   8578      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
   8580      1.1  joerg or opaque value's source expression matches the given matcher.
   8581      1.1  joerg 
   8582      1.1  joerg Example 1: matches "a string"
   8583      1.1  joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
   8584      1.1  joerg class URL { URL(string); };
   8585      1.1  joerg URL url = "a string";
   8586      1.1  joerg 
   8587      1.1  joerg Example 2: matches 'b' (matcher =
   8588      1.1  joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
   8589      1.1  joerg int a = b ?: 1;
   8590      1.1  joerg </pre></td></tr>
   8591      1.1  joerg 
   8592      1.1  joerg 
   8593      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
   8595      1.1  joerg overloads matches the given matcher.
   8596      1.1  joerg 
   8597      1.1  joerg Given
   8598      1.1  joerg   template &lt;typename T&gt; void foo(T);
   8599      1.1  joerg   template &lt;typename T&gt; void bar(T);
   8600      1.1  joerg   template &lt;typename T&gt; void baz(T t) {
   8601      1.1  joerg     foo(t);
   8602      1.1  joerg     bar(t);
   8603      1.1  joerg   }
   8604      1.1  joerg unresolvedLookupExpr(hasAnyDeclaration(
   8605      1.1  joerg     functionTemplateDecl(hasName("foo"))))
   8606      1.1  joerg   matches foo in foo(t); but not bar in bar(t);
   8607      1.1  joerg </pre></td></tr>
   8608      1.1  joerg 
   8609      1.1  joerg 
   8610      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
   8612      1.1  joerg 
   8613      1.1  joerg Given
   8614      1.1  joerg   int (*ptr_to_array)[4];
   8615      1.1  joerg   int (*ptr_to_func)(int);
   8616      1.1  joerg 
   8617      1.1  joerg varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
   8618      1.1  joerg ptr_to_func but not ptr_to_array.
   8619      1.1  joerg 
   8620      1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
   8621      1.1  joerg </pre></td></tr>
   8622      1.1  joerg 
   8623      1.1  joerg 
   8624      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
   8626      1.1  joerg pointee matches a given matcher.
   8627      1.1  joerg 
   8628      1.1  joerg Given
   8629      1.1  joerg   int *a;
   8630      1.1  joerg   int const *b;
   8631      1.1  joerg   float const *f;
   8632      1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   8633      1.1  joerg   matches "int const *b"
   8634      1.1  joerg 
   8635      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg </pre></td></tr>
   8638      1.1  joerg 
   8639      1.1  joerg 
   8640      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
   8642      1.1  joerg 
   8643      1.1  joerg Given:
   8644      1.1  joerg   typedef int &amp;int_ref;
   8645      1.1  joerg   int a;
   8646      1.1  joerg   int_ref b = a;
   8647      1.1  joerg 
   8648      1.1  joerg varDecl(hasType(qualType(referenceType()))))) will not match the
   8649      1.1  joerg declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
   8650      1.1  joerg </pre></td></tr>
   8651      1.1  joerg 
   8652      1.1  joerg 
   8653  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
   8655      1.1  joerg matches the given matcher.
   8656      1.1  joerg 
   8657      1.1  joerg The associated declaration is:
   8658      1.1  joerg - for type nodes, the declaration of the underlying type
   8659      1.1  joerg - for CallExpr, the declaration of the callee
   8660      1.1  joerg - for MemberExpr, the declaration of the referenced member
   8661      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   8662      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   8663      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   8664      1.1  joerg 
   8665      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   8666      1.1  joerg sugared type. Given
   8667      1.1  joerg   class X {};
   8668      1.1  joerg   typedef X Y;
   8669      1.1  joerg   Y y;
   8670      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8671      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   8672      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8673      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   8674      1.1  joerg       recordType(hasDeclaration(decl())))))
   8675      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   8676      1.1  joerg 
   8677      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8684      1.1  joerg </pre></td></tr>
   8685      1.1  joerg 
   8686      1.1  joerg 
   8687      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
   8689      1.1  joerg 
   8690      1.1  joerg Given
   8691      1.1  joerg   void (*fp)(void);
   8692      1.1  joerg The matcher
   8693      1.1  joerg   varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
   8694      1.1  joerg would match the declaration for fp.
   8695      1.1  joerg </pre></td></tr>
   8696      1.1  joerg 
   8697      1.1  joerg 
   8698      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
   8700      1.1  joerg </pre></td></tr>
   8701      1.1  joerg 
   8702      1.1  joerg 
   8703      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
   8705      1.1  joerg matches the specified matcher.
   8706      1.1  joerg 
   8707      1.1  joerg Example matches y-&gt;x()
   8708      1.1  joerg   (matcher = cxxMemberCallExpr(on(hasType(pointsTo
   8709      1.1  joerg      cxxRecordDecl(hasName("Y")))))))
   8710      1.1  joerg   class Y { public: void x(); };
   8711      1.1  joerg   void z() { Y *y; y-&gt;x(); }
   8712      1.1  joerg </pre></td></tr>
   8713      1.1  joerg 
   8714      1.1  joerg 
   8715      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
   8717      1.1  joerg </pre></td></tr>
   8718      1.1  joerg 
   8719      1.1  joerg 
   8720      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
   8722      1.1  joerg type matches the specified matcher.
   8723      1.1  joerg 
   8724      1.1  joerg Example matches X &amp;x and const X &amp;y
   8725      1.1  joerg     (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
   8726      1.1  joerg   class X {
   8727      1.1  joerg     void a(X b) {
   8728      1.1  joerg       X &amp;x = b;
   8729      1.1  joerg       const X &amp;y = b;
   8730      1.1  joerg     }
   8731      1.1  joerg   };
   8732      1.1  joerg </pre></td></tr>
   8733      1.1  joerg 
   8734      1.1  joerg 
   8735  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
   8737      1.1  joerg matches the given matcher.
   8738      1.1  joerg 
   8739      1.1  joerg The associated declaration is:
   8740      1.1  joerg - for type nodes, the declaration of the underlying type
   8741      1.1  joerg - for CallExpr, the declaration of the callee
   8742      1.1  joerg - for MemberExpr, the declaration of the referenced member
   8743      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   8744      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   8745      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   8746      1.1  joerg 
   8747      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   8748      1.1  joerg sugared type. Given
   8749      1.1  joerg   class X {};
   8750      1.1  joerg   typedef X Y;
   8751      1.1  joerg   Y y;
   8752      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8753      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   8754      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8755      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   8756      1.1  joerg       recordType(hasDeclaration(decl())))))
   8757      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   8758      1.1  joerg 
   8759      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8766      1.1  joerg </pre></td></tr>
   8767      1.1  joerg 
   8768      1.1  joerg 
   8769      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
   8771      1.1  joerg pointee matches a given matcher.
   8772      1.1  joerg 
   8773      1.1  joerg Given
   8774      1.1  joerg   int *a;
   8775      1.1  joerg   int const *b;
   8776      1.1  joerg   float const *f;
   8777      1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   8778      1.1  joerg   matches "int const *b"
   8779      1.1  joerg 
   8780      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg </pre></td></tr>
   8783      1.1  joerg 
   8784      1.1  joerg 
   8785      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
   8787      1.1  joerg 
   8788      1.1  joerg Given
   8789      1.1  joerg   return a + b;
   8790      1.1  joerg hasReturnValue(binaryOperator())
   8791      1.1  joerg   matches 'return a + b'
   8792      1.1  joerg with binaryOperator()
   8793      1.1  joerg   matching 'a + b'
   8794      1.1  joerg </pre></td></tr>
   8795      1.1  joerg 
   8796      1.1  joerg 
   8797      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
   8799      1.1  joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
   8800      1.1  joerg 
   8801      1.1  joerg Given
   8802      1.1  joerg   { {}; 1+2; }
   8803      1.1  joerg hasAnySubstatement(compoundStmt())
   8804      1.1  joerg   matches '{ {}; 1+2; }'
   8805      1.1  joerg with compoundStmt()
   8806      1.1  joerg   matching '{}'
   8807      1.1  joerg </pre></td></tr>
   8808      1.1  joerg 
   8809      1.1  joerg 
   8810  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   8812      1.1  joerg alignof.
   8813      1.1  joerg </pre></td></tr>
   8814      1.1  joerg 
   8815      1.1  joerg 
   8816  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
   8818  1.1.1.2  joerg belongs to.
   8819  1.1.1.2  joerg 
   8820  1.1.1.2  joerg Given:
   8821  1.1.1.2  joerg F&amp; operator=(const F&amp; o) {
   8822  1.1.1.2  joerg   std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
   8823  1.1.1.2  joerg   return *this;
   8824  1.1.1.2  joerg }
   8825  1.1.1.2  joerg returnStmt(forCallable(functionDecl(hasName("operator="))))
   8826  1.1.1.2  joerg   matches 'return *this'
   8827  1.1.1.2  joerg   but does not match 'return v &gt; 0'
   8828  1.1.1.2  joerg 
   8829  1.1.1.2  joerg Given:
   8830  1.1.1.2  joerg -(void) foo {
   8831  1.1.1.2  joerg   int x = 1;
   8832  1.1.1.2  joerg   dispatch_sync(queue, ^{ int y = 2; });
   8833  1.1.1.2  joerg }
   8834  1.1.1.2  joerg declStmt(forCallable(objcMethodDecl()))
   8835  1.1.1.2  joerg   matches 'int x = 1'
   8836  1.1.1.2  joerg   but does not match 'int y = 2'.
   8837  1.1.1.2  joerg whereas declStmt(forCallable(blockDecl()))
   8838  1.1.1.2  joerg   matches 'int y = 2'
   8839  1.1.1.2  joerg   but does not match 'int x = 1'.
   8840  1.1.1.2  joerg </pre></td></tr>
   8841  1.1.1.2  joerg 
   8842  1.1.1.2  joerg 
   8843      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
   8845  1.1.1.2  joerg 
   8846  1.1.1.2  joerg Deprecated. Use forCallable() to correctly handle the situation when
   8847  1.1.1.2  joerg the declaration is not a function (but a block or an Objective-C method).
   8848  1.1.1.2  joerg forFunction() not only fails to take non-functions into account but also
   8849  1.1.1.2  joerg may match the wrong declaration in their presence.
   8850      1.1  joerg 
   8851      1.1  joerg Given:
   8852      1.1  joerg F&amp; operator=(const F&amp; o) {
   8853      1.1  joerg   std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
   8854      1.1  joerg   return *this;
   8855      1.1  joerg }
   8856      1.1  joerg returnStmt(forFunction(hasName("operator=")))
   8857      1.1  joerg   matches 'return *this'
   8858      1.1  joerg   but does not match 'return v &gt; 0'
   8859      1.1  joerg </pre></td></tr>
   8860      1.1  joerg 
   8861      1.1  joerg 
   8862  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   8864      1.1  joerg sizeof.
   8865      1.1  joerg </pre></td></tr>
   8866      1.1  joerg 
   8867      1.1  joerg 
   8868      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
   8870      1.1  joerg type that matches the provided matcher.
   8871      1.1  joerg 
   8872      1.1  joerg Given
   8873      1.1  joerg   template &lt;typename T&gt;
   8874      1.1  joerg   double F(T t);
   8875      1.1  joerg   int i;
   8876      1.1  joerg   double j = F(i);
   8877      1.1  joerg 
   8878      1.1  joerg substTemplateTypeParmType(hasReplacementType(type())) matches int
   8879      1.1  joerg </pre></td></tr>
   8880      1.1  joerg 
   8881      1.1  joerg 
   8882      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
   8884      1.1  joerg statement. This matcher may produce multiple matches.
   8885      1.1  joerg 
   8886      1.1  joerg Given
   8887      1.1  joerg   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
   8888      1.1  joerg switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
   8889      1.1  joerg   matches four times, with "c" binding each of "case 1:", "case 2:",
   8890      1.1  joerg "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
   8891      1.1  joerg "switch (1)", "switch (2)" and "switch (2)".
   8892      1.1  joerg </pre></td></tr>
   8893      1.1  joerg 
   8894      1.1  joerg 
   8895      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
   8897      1.1  joerg switch statement or conditional operator.
   8898      1.1  joerg 
   8899      1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   8900      1.1  joerg   if (true) {}
   8901      1.1  joerg </pre></td></tr>
   8902      1.1  joerg 
   8903      1.1  joerg 
   8904  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
   8906  1.1.1.2  joerg 
   8907  1.1.1.2  joerg Given:
   8908  1.1.1.2  joerg  void foo() {
   8909  1.1.1.2  joerg    if (int i = foobar(); i &gt; 0) {}
   8910  1.1.1.2  joerg    switch (int i = foobar(); i) {}
   8911  1.1.1.2  joerg    for (auto&amp; a = get_range(); auto&amp; x : a) {}
   8912  1.1.1.2  joerg  }
   8913  1.1.1.2  joerg  void bar() {
   8914  1.1.1.2  joerg    if (foobar() &gt; 0) {}
   8915  1.1.1.2  joerg    switch (foobar()) {}
   8916  1.1.1.2  joerg    for (auto&amp; x : get_range()) {}
   8917  1.1.1.2  joerg  }
   8918  1.1.1.2  joerg ifStmt(hasInitStatement(anything()))
   8919  1.1.1.2  joerg   matches the if statement in foo but not in bar.
   8920  1.1.1.2  joerg switchStmt(hasInitStatement(anything()))
   8921  1.1.1.2  joerg   matches the switch statement in foo but not in bar.
   8922  1.1.1.2  joerg cxxForRangeStmt(hasInitStatement(anything()))
   8923  1.1.1.2  joerg   matches the range for statement in foo but not in bar.
   8924  1.1.1.2  joerg </pre></td></tr>
   8925  1.1.1.2  joerg 
   8926  1.1.1.2  joerg 
   8927  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
   8929      1.1  joerg matches the given matcher.
   8930      1.1  joerg 
   8931      1.1  joerg The associated declaration is:
   8932      1.1  joerg - for type nodes, the declaration of the underlying type
   8933      1.1  joerg - for CallExpr, the declaration of the callee
   8934      1.1  joerg - for MemberExpr, the declaration of the referenced member
   8935      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   8936      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   8937      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   8938      1.1  joerg 
   8939      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   8940      1.1  joerg sugared type. Given
   8941      1.1  joerg   class X {};
   8942      1.1  joerg   typedef X Y;
   8943      1.1  joerg   Y y;
   8944      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   8945      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   8946      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   8947      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   8948      1.1  joerg       recordType(hasDeclaration(decl())))))
   8949      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   8950      1.1  joerg 
   8951      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   8958      1.1  joerg </pre></td></tr>
   8959      1.1  joerg 
   8960      1.1  joerg 
   8961  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
   8963  1.1.1.2  joerg 
   8964  1.1.1.2  joerg Examples:
   8965  1.1.1.2  joerg   int x;
   8966  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   8967  1.1.1.2  joerg   matches int x
   8968  1.1.1.2  joerg 
   8969  1.1.1.2  joerg auto x = int(3);
   8970  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   8971  1.1.1.2  joerg   matches int(3)
   8972  1.1.1.2  joerg 
   8973  1.1.1.2  joerg struct Foo { Foo(int, int); };
   8974  1.1.1.2  joerg auto x = Foo(1, 2);
   8975  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   8976  1.1.1.2  joerg   matches Foo(1, 2)
   8977  1.1.1.2  joerg 
   8978  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   8982  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   8986  1.1.1.2  joerg </pre></td></tr>
   8987  1.1.1.2  joerg 
   8988  1.1.1.2  joerg 
   8989      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
   8991      1.1  joerg 
   8992      1.1  joerg Given
   8993      1.1  joerg   struct B { int next; };
   8994      1.1  joerg   template&lt;int(B::*next_ptr)&gt; struct A {};
   8995      1.1  joerg   A&lt;&amp;B::next&gt; a;
   8996      1.1  joerg templateSpecializationType(hasAnyTemplateArgument(
   8997      1.1  joerg   isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
   8998      1.1  joerg   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
   8999      1.1  joerg     B::next
   9000      1.1  joerg </pre></td></tr>
   9001      1.1  joerg 
   9002      1.1  joerg 
   9003      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
   9005      1.1  joerg declaration.
   9006      1.1  joerg 
   9007      1.1  joerg Given
   9008      1.1  joerg   struct B { int next; };
   9009      1.1  joerg   template&lt;int(B::*next_ptr)&gt; struct A {};
   9010      1.1  joerg   A&lt;&amp;B::next&gt; a;
   9011      1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9012      1.1  joerg     refersToDeclaration(fieldDecl(hasName("next")))))
   9013      1.1  joerg   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
   9014      1.1  joerg     B::next
   9015      1.1  joerg </pre></td></tr>
   9016      1.1  joerg 
   9017      1.1  joerg 
   9018      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
   9020      1.1  joerg 
   9021      1.1  joerg Given
   9022      1.1  joerg   template&lt;int T&gt; struct C {};
   9023      1.1  joerg   C&lt;42&gt; c;
   9024      1.1  joerg classTemplateSpecializationDecl(
   9025      1.1  joerg   hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
   9026      1.1  joerg   matches the implicit instantiation of C in C&lt;42&gt;.
   9027      1.1  joerg </pre></td></tr>
   9028      1.1  joerg 
   9029      1.1  joerg 
   9030      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
   9032      1.1  joerg 
   9033      1.1  joerg Given
   9034      1.1  joerg   template&lt;template &lt;typename&gt; class S&gt; class X {};
   9035      1.1  joerg   template&lt;typename T&gt; class Y {};
   9036      1.1  joerg   X&lt;Y&gt; xi;
   9037      1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9038      1.1  joerg     refersToTemplate(templateName())))
   9039      1.1  joerg   matches the specialization X&lt;Y&gt;
   9040      1.1  joerg </pre></td></tr>
   9041      1.1  joerg 
   9042      1.1  joerg 
   9043      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
   9045      1.1  joerg 
   9046      1.1  joerg Given
   9047      1.1  joerg   struct X {};
   9048      1.1  joerg   template&lt;typename T&gt; struct A {};
   9049      1.1  joerg   A&lt;X&gt; a;
   9050      1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9051      1.1  joerg     refersToType(class(hasName("X")))))
   9052      1.1  joerg   matches the specialization A&lt;X&gt;
   9053      1.1  joerg </pre></td></tr>
   9054      1.1  joerg 
   9055      1.1  joerg 
   9056      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   9058      1.1  joerg functionDecl that have at least one TemplateArgument matching the given
   9059      1.1  joerg InnerMatcher.
   9060      1.1  joerg 
   9061      1.1  joerg Given
   9062      1.1  joerg   template&lt;typename T&gt; class A {};
   9063      1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
   9064      1.1  joerg   A&lt;int&gt; a;
   9065      1.1  joerg 
   9066      1.1  joerg   template&lt;typename T&gt; f() {};
   9067      1.1  joerg   void func() { f&lt;int&gt;(); };
   9068      1.1  joerg 
   9069      1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   9070      1.1  joerg     refersToType(asString("int"))))
   9071      1.1  joerg   matches the specialization A&lt;int&gt;
   9072      1.1  joerg 
   9073      1.1  joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   9074      1.1  joerg   matches the specialization f&lt;int&gt;
   9075      1.1  joerg </pre></td></tr>
   9076      1.1  joerg 
   9077      1.1  joerg 
   9078  1.1.1.2  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
   9080      1.1  joerg matches the given matcher.
   9081      1.1  joerg 
   9082      1.1  joerg The associated declaration is:
   9083      1.1  joerg - for type nodes, the declaration of the underlying type
   9084      1.1  joerg - for CallExpr, the declaration of the callee
   9085      1.1  joerg - for MemberExpr, the declaration of the referenced member
   9086      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   9087      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   9088      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   9089      1.1  joerg 
   9090      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   9091      1.1  joerg sugared type. Given
   9092      1.1  joerg   class X {};
   9093      1.1  joerg   typedef X Y;
   9094      1.1  joerg   Y y;
   9095      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9096      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   9097      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9098      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   9099      1.1  joerg       recordType(hasDeclaration(decl())))))
   9100      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   9101      1.1  joerg 
   9102      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9109      1.1  joerg </pre></td></tr>
   9110      1.1  joerg 
   9111      1.1  joerg 
   9112      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   9114      1.1  joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   9115      1.1  joerg 
   9116      1.1  joerg Given
   9117      1.1  joerg   template&lt;typename T, typename U&gt; class A {};
   9118      1.1  joerg   A&lt;bool, int&gt; b;
   9119      1.1  joerg   A&lt;int, bool&gt; c;
   9120      1.1  joerg 
   9121      1.1  joerg   template&lt;typename T&gt; void f() {}
   9122      1.1  joerg   void func() { f&lt;int&gt;(); };
   9123      1.1  joerg classTemplateSpecializationDecl(hasTemplateArgument(
   9124      1.1  joerg     1, refersToType(asString("int"))))
   9125      1.1  joerg   matches the specialization A&lt;bool, int&gt;
   9126      1.1  joerg 
   9127      1.1  joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   9128      1.1  joerg   matches the specialization f&lt;int&gt;
   9129      1.1  joerg </pre></td></tr>
   9130      1.1  joerg 
   9131      1.1  joerg 
   9132  1.1.1.2  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
   9134      1.1  joerg matches the given matcher.
   9135      1.1  joerg 
   9136      1.1  joerg The associated declaration is:
   9137      1.1  joerg - for type nodes, the declaration of the underlying type
   9138      1.1  joerg - for CallExpr, the declaration of the callee
   9139      1.1  joerg - for MemberExpr, the declaration of the referenced member
   9140      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   9141      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   9142      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   9143      1.1  joerg 
   9144      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   9145      1.1  joerg sugared type. Given
   9146      1.1  joerg   class X {};
   9147      1.1  joerg   typedef X Y;
   9148      1.1  joerg   Y y;
   9149      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9150      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   9151      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9152      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   9153      1.1  joerg       recordType(hasDeclaration(decl())))))
   9154      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   9155      1.1  joerg 
   9156      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9163      1.1  joerg </pre></td></tr>
   9164      1.1  joerg 
   9165      1.1  joerg 
   9166  1.1.1.2  joerg <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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
   9168  1.1.1.2  joerg QualType-matcher matches.
   9169  1.1.1.2  joerg </pre></td></tr>
   9170      1.1  joerg 
   9171      1.1  joerg 
   9172  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
   9174      1.1  joerg 
   9175  1.1.1.2  joerg Examples:
   9176  1.1.1.2  joerg   int x;
   9177  1.1.1.2  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   9178  1.1.1.2  joerg   matches int x
   9179  1.1.1.2  joerg 
   9180  1.1.1.2  joerg auto x = int(3);
   9181  1.1.1.2  joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
   9182  1.1.1.2  joerg   matches int(3)
   9183  1.1.1.2  joerg 
   9184  1.1.1.2  joerg struct Foo { Foo(int, int); };
   9185  1.1.1.2  joerg auto x = Foo(1, 2);
   9186  1.1.1.2  joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
   9187  1.1.1.2  joerg   matches Foo(1, 2)
   9188  1.1.1.2  joerg 
   9189  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
   9193  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   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  1.1.1.2  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
   9197      1.1  joerg </pre></td></tr>
   9198      1.1  joerg 
   9199      1.1  joerg 
   9200      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
   9202      1.1  joerg matcher.
   9203      1.1  joerg 
   9204      1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   9205      1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   9206      1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   9207      1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   9208  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   9209  1.1.1.2  joerg                                               asString("class X")))
   9210      1.1  joerg  class X {};
   9211      1.1  joerg  void y(X &amp;x) { x; X z; }
   9212      1.1  joerg  typedef int U;
   9213      1.1  joerg  class Y { friend class X; };
   9214  1.1.1.2  joerg  class Z : public virtual X {};
   9215      1.1  joerg </pre></td></tr>
   9216      1.1  joerg 
   9217      1.1  joerg 
   9218  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
   9220      1.1  joerg matches the given matcher.
   9221      1.1  joerg 
   9222      1.1  joerg The associated declaration is:
   9223      1.1  joerg - for type nodes, the declaration of the underlying type
   9224      1.1  joerg - for CallExpr, the declaration of the callee
   9225      1.1  joerg - for MemberExpr, the declaration of the referenced member
   9226      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   9227      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   9228      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   9229      1.1  joerg 
   9230      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   9231      1.1  joerg sugared type. Given
   9232      1.1  joerg   class X {};
   9233      1.1  joerg   typedef X Y;
   9234      1.1  joerg   Y y;
   9235      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9236      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   9237      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9238      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   9239      1.1  joerg       recordType(hasDeclaration(decl())))))
   9240      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   9241      1.1  joerg 
   9242      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9249      1.1  joerg </pre></td></tr>
   9250      1.1  joerg 
   9251      1.1  joerg 
   9252      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
   9254      1.1  joerg type of the matched node.
   9255      1.1  joerg 
   9256      1.1  joerg For example, in:
   9257      1.1  joerg   class A {};
   9258      1.1  joerg   using B = A;
   9259      1.1  joerg The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
   9260      1.1  joerg both B and A.
   9261      1.1  joerg </pre></td></tr>
   9262      1.1  joerg 
   9263      1.1  joerg 
   9264      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
   9266      1.1  joerg 
   9267      1.1  joerg Given
   9268      1.1  joerg   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
   9269      1.1  joerg unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
   9270      1.1  joerg   matches sizeof(a) and alignof(c)
   9271      1.1  joerg </pre></td></tr>
   9272      1.1  joerg 
   9273      1.1  joerg 
   9274      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
   9276      1.1  joerg 
   9277      1.1  joerg Example matches true (matcher = hasUnaryOperand(
   9278      1.1  joerg                                   cxxBoolLiteral(equals(true))))
   9279      1.1  joerg   !true
   9280      1.1  joerg </pre></td></tr>
   9281      1.1  joerg 
   9282      1.1  joerg 
   9283      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
   9285      1.1  joerg given matcher. Implicit object expressions are included; that is, it matches
   9286      1.1  joerg use of implicit `this`.
   9287      1.1  joerg 
   9288      1.1  joerg Given
   9289      1.1  joerg   struct X {
   9290      1.1  joerg     int m;
   9291      1.1  joerg     int f(X x) { x.m; return m; }
   9292      1.1  joerg   };
   9293      1.1  joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   9294      1.1  joerg   matches `x.m`, but not `m`; however,
   9295      1.1  joerg memberExpr(hasObjectExpression(hasType(pointsTo(
   9296      1.1  joerg      cxxRecordDecl(hasName("X"))))))
   9297      1.1  joerg   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   9298      1.1  joerg </pre></td></tr>
   9299      1.1  joerg 
   9300      1.1  joerg 
   9301  1.1.1.2  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
   9303      1.1  joerg matches the given matcher.
   9304      1.1  joerg 
   9305      1.1  joerg The associated declaration is:
   9306      1.1  joerg - for type nodes, the declaration of the underlying type
   9307      1.1  joerg - for CallExpr, the declaration of the callee
   9308      1.1  joerg - for MemberExpr, the declaration of the referenced member
   9309      1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   9310      1.1  joerg - for CXXNewExpr, the declaration of the operator new
   9311      1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   9312      1.1  joerg 
   9313      1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   9314      1.1  joerg sugared type. Given
   9315      1.1  joerg   class X {};
   9316      1.1  joerg   typedef X Y;
   9317      1.1  joerg   Y y;
   9318      1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   9319      1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   9320      1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   9321      1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   9322      1.1  joerg       recordType(hasDeclaration(decl())))))
   9323      1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   9324      1.1  joerg 
   9325      1.1  joerg Usable as: Matcher&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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   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      1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   9332      1.1  joerg </pre></td></tr>
   9333      1.1  joerg 
   9334      1.1  joerg 
   9335      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
   9337      1.1  joerg 
   9338      1.1  joerg Given
   9339      1.1  joerg   namespace X { void b(); }
   9340      1.1  joerg   using X::b;
   9341      1.1  joerg usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
   9342      1.1  joerg   matches using X::b </pre></td></tr>
   9343      1.1  joerg 
   9344      1.1  joerg 
   9345      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
   9347      1.1  joerg matched by the given matcher.
   9348      1.1  joerg 
   9349      1.1  joerg Given
   9350      1.1  joerg   namespace X { int a; void b(); }
   9351      1.1  joerg   using X::a;
   9352      1.1  joerg   using X::b;
   9353      1.1  joerg usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
   9354      1.1  joerg   matches using X::b but not using X::a </pre></td></tr>
   9355      1.1  joerg 
   9356      1.1  joerg 
   9357  1.1.1.2  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
   9359      1.1  joerg declaration's type.
   9360      1.1  joerg 
   9361      1.1  joerg In case of a value declaration (for example a variable declaration),
   9362      1.1  joerg this resolves one layer of indirection. For example, in the value
   9363      1.1  joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   9364      1.1  joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   9365      1.1  joerg declaration of x.
   9366      1.1  joerg 
   9367      1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   9368      1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   9369      1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   9370  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   9371  1.1.1.2  joerg                                               cxxRecordDecl(hasName("X"))))
   9372      1.1  joerg  class X {};
   9373      1.1  joerg  void y(X &amp;x) { x; X z; }
   9374      1.1  joerg  class Y { friend class X; };
   9375  1.1.1.2  joerg  class Z : public virtual X {};
   9376  1.1.1.2  joerg 
   9377  1.1.1.2  joerg Example matches class Derived
   9378  1.1.1.2  joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
   9379  1.1.1.2  joerg class Base {};
   9380  1.1.1.2  joerg class Derived : Base {};
   9381      1.1  joerg 
   9382  1.1.1.2  joerg Usable as: Matcher&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  1.1.1.2  joerg Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
   9384      1.1  joerg </pre></td></tr>
   9385      1.1  joerg 
   9386      1.1  joerg 
   9387      1.1  joerg <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      1.1  joerg <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
   9389      1.1  joerg matcher.
   9390      1.1  joerg 
   9391      1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   9392      1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   9393      1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   9394      1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   9395  1.1.1.2  joerg             and public virtual X (matcher = cxxBaseSpecifier(hasType(
   9396  1.1.1.2  joerg                                               asString("class X")))
   9397      1.1  joerg  class X {};
   9398      1.1  joerg  void y(X &amp;x) { x; X z; }
   9399      1.1  joerg  typedef int U;
   9400      1.1  joerg  class Y { friend class X; };
   9401  1.1.1.2  joerg  class Z : public virtual X {};
   9402      1.1  joerg </pre></td></tr>
   9403      1.1  joerg 
   9404      1.1  joerg 
   9405      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
   9407      1.1  joerg that matches the given matcher.
   9408      1.1  joerg 
   9409      1.1  joerg Example matches x (matcher = varDecl(hasInitializer(callExpr())))
   9410      1.1  joerg   bool y() { return true; }
   9411      1.1  joerg   bool x = y();
   9412      1.1  joerg </pre></td></tr>
   9413      1.1  joerg 
   9414      1.1  joerg 
   9415      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
   9417      1.1  joerg expression.
   9418      1.1  joerg 
   9419      1.1  joerg Given
   9420      1.1  joerg   void f(int b) {
   9421      1.1  joerg     int a[b];
   9422      1.1  joerg   }
   9423      1.1  joerg variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
   9424      1.1  joerg   varDecl(hasName("b")))))))
   9425      1.1  joerg   matches "int a[b]"
   9426      1.1  joerg </pre></td></tr>
   9427      1.1  joerg 
   9428      1.1  joerg 
   9429      1.1  joerg <tr><td>Matcher&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  1.1.1.2  joerg <tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
   9431      1.1  joerg 
   9432      1.1  joerg 
   9433      1.1  joerg <tr><td>Matcher&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      1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
   9435      1.1  joerg switch statement or conditional operator.
   9436      1.1  joerg 
   9437      1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   9438      1.1  joerg   if (true) {}
   9439      1.1  joerg </pre></td></tr>
   9440      1.1  joerg 
   9441      1.1  joerg <!--END_TRAVERSAL_MATCHERS -->
   9442      1.1  joerg </table>
   9443      1.1  joerg 
   9444      1.1  joerg </div>
   9445      1.1  joerg </body>
   9446      1.1  joerg </html>
   9447      1.1  joerg 
   9448      1.1  joerg 
   9449