Home | History | Annotate | Line # | Download | only in docs
LibASTMatchersReference.html revision 1.1
      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  joerg </style>
     21  1.1  joerg <script type="text/javascript">
     22  1.1  joerg function toggle(id) {
     23  1.1  joerg   if (!id) return;
     24  1.1  joerg   row = document.getElementById(id);
     25  1.1  joerg   if (row.style.display != 'table-cell')
     26  1.1  joerg     row.style.display = 'table-cell';
     27  1.1  joerg   else
     28  1.1  joerg     row.style.display = 'none';
     29  1.1  joerg }
     30  1.1  joerg </script>
     31  1.1  joerg </head>
     32  1.1  joerg <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
     33  1.1  joerg 
     34  1.1  joerg <!--#include virtual="../menu.html.incl"-->
     35  1.1  joerg 
     36  1.1  joerg <div id="content">
     37  1.1  joerg 
     38  1.1  joerg <h1>AST Matcher Reference</h1>
     39  1.1  joerg 
     40  1.1  joerg <p>This document shows all currently implemented matchers. The matchers are grouped
     41  1.1  joerg by category and node type they match. You can click on matcher names to show the
     42  1.1  joerg matcher's source documentation.</p>
     43  1.1  joerg 
     44  1.1  joerg <p>There are three different basic categories of matchers:
     45  1.1  joerg <ul>
     46  1.1  joerg <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
     47  1.1  joerg <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
     48  1.1  joerg <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
     49  1.1  joerg </ul>
     50  1.1  joerg </p>
     51  1.1  joerg 
     52  1.1  joerg <p>Within each category the matchers are ordered by node type they match on.
     53  1.1  joerg Note that if a matcher can match multiple node types, it will it will appear
     54  1.1  joerg multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
     55  1.1  joerg find all matchers that can be used to match on Stmt nodes.</p>
     56  1.1  joerg 
     57  1.1  joerg <p>The exception to that rule are matchers that can match on any node. Those
     58  1.1  joerg are marked with a * and are listed in the beginning of each category.</p>
     59  1.1  joerg 
     60  1.1  joerg <p>Note that the categorization of matchers is a great help when you combine
     61  1.1  joerg them into matcher expressions. You will usually want to form matcher expressions
     62  1.1  joerg that read like english sentences by alternating between node matchers and
     63  1.1  joerg narrowing or traversal matchers, like this:
     64  1.1  joerg <pre>
     65  1.1  joerg recordDecl(hasDescendant(
     66  1.1  joerg     ifStmt(hasTrueExpression(
     67  1.1  joerg         expr(hasDescendant(
     68  1.1  joerg             ifStmt()))))))
     69  1.1  joerg </pre>
     70  1.1  joerg </p>
     71  1.1  joerg 
     72  1.1  joerg <!-- ======================================================================= -->
     73  1.1  joerg <h2 id="decl-matchers">Node Matchers</h2>
     74  1.1  joerg <!-- ======================================================================= -->
     75  1.1  joerg 
     76  1.1  joerg <p>Node matchers are at the core of matcher expressions - they specify the type
     77  1.1  joerg of node that is expected. Every match expression starts with a node matcher,
     78  1.1  joerg which can then be further refined with a narrowing or traversal matcher. All
     79  1.1  joerg traversal matchers take node matchers as their arguments.</p>
     80  1.1  joerg 
     81  1.1  joerg <p>For convenience, all node matchers take an arbitrary number of arguments
     82  1.1  joerg and implicitly act as allOf matchers.</p>
     83  1.1  joerg 
     84  1.1  joerg <p>Node matchers are the only matchers that support the bind("id") call to
     85  1.1  joerg bind the matched node to the given string, to be later retrieved from the
     86  1.1  joerg match callback.</p>
     87  1.1  joerg 
     88  1.1  joerg <p>It is important to remember that the arguments to node matchers are
     89  1.1  joerg predicates on the same node, just with additional information about the type.
     90  1.1  joerg This is often useful to make matcher expression more readable by inlining bind
     91  1.1  joerg calls into redundant node matchers inside another node matcher:
     92  1.1  joerg <pre>
     93  1.1  joerg // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
     94  1.1  joerg // the same node.
     95  1.1  joerg recordDecl(decl().bind("id"), hasName("::MyClass"))
     96  1.1  joerg </pre>
     97  1.1  joerg </p>
     98  1.1  joerg 
     99  1.1  joerg <table>
    100  1.1  joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
    101  1.1  joerg <!-- START_DECL_MATCHERS -->
    102  1.1  joerg 
    103  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>
    104  1.1  joerg <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
    105  1.1  joerg 
    106  1.1  joerg Examples matches i(42).
    107  1.1  joerg   class C {
    108  1.1  joerg     C() : i(42) {}
    109  1.1  joerg     int i;
    110  1.1  joerg   };
    111  1.1  joerg </pre></td></tr>
    112  1.1  joerg 
    113  1.1  joerg 
    114  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>
    115  1.1  joerg <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
    116  1.1  joerg 
    117  1.1  joerg Given
    118  1.1  joerg   class C {
    119  1.1  joerg   public:
    120  1.1  joerg     int a;
    121  1.1  joerg   };
    122  1.1  joerg accessSpecDecl()
    123  1.1  joerg   matches 'public:'
    124  1.1  joerg </pre></td></tr>
    125  1.1  joerg 
    126  1.1  joerg 
    127  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>
    128  1.1  joerg <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
    129  1.1  joerg 
    130  1.1  joerg Example matches the declaration of the nameless block printing an input
    131  1.1  joerg integer.
    132  1.1  joerg 
    133  1.1  joerg   myFunc(^(int p) {
    134  1.1  joerg     printf("%d", p);
    135  1.1  joerg   })
    136  1.1  joerg </pre></td></tr>
    137  1.1  joerg 
    138  1.1  joerg 
    139  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>
    140  1.1  joerg <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
    141  1.1  joerg 
    142  1.1  joerg Example matches Z
    143  1.1  joerg   template&lt;class T&gt; class Z {};
    144  1.1  joerg </pre></td></tr>
    145  1.1  joerg 
    146  1.1  joerg 
    147  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>
    148  1.1  joerg <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
    149  1.1  joerg 
    150  1.1  joerg Given
    151  1.1  joerg   template&lt;class T1, class T2, int I&gt;
    152  1.1  joerg   class A {};
    153  1.1  joerg 
    154  1.1  joerg   template&lt;class T, int I&gt;
    155  1.1  joerg   class A&lt;T, T*, I&gt; {};
    156  1.1  joerg 
    157  1.1  joerg   template&lt;&gt;
    158  1.1  joerg   class A&lt;int, int, 1&gt; {};
    159  1.1  joerg classTemplatePartialSpecializationDecl()
    160  1.1  joerg   matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
    161  1.1  joerg </pre></td></tr>
    162  1.1  joerg 
    163  1.1  joerg 
    164  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>
    165  1.1  joerg <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
    166  1.1  joerg 
    167  1.1  joerg Given
    168  1.1  joerg   template&lt;typename T&gt; class A {};
    169  1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
    170  1.1  joerg   A&lt;int&gt; a;
    171  1.1  joerg classTemplateSpecializationDecl()
    172  1.1  joerg   matches the specializations A&lt;int&gt; and A&lt;double&gt;
    173  1.1  joerg </pre></td></tr>
    174  1.1  joerg 
    175  1.1  joerg 
    176  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>
    177  1.1  joerg <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
    178  1.1  joerg 
    179  1.1  joerg Example matches Foo::Foo() and Foo::Foo(int)
    180  1.1  joerg   class Foo {
    181  1.1  joerg    public:
    182  1.1  joerg     Foo();
    183  1.1  joerg     Foo(int);
    184  1.1  joerg     int DoSomething();
    185  1.1  joerg   };
    186  1.1  joerg </pre></td></tr>
    187  1.1  joerg 
    188  1.1  joerg 
    189  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>
    190  1.1  joerg <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
    191  1.1  joerg 
    192  1.1  joerg Example matches the operator.
    193  1.1  joerg   class X { operator int() const; };
    194  1.1  joerg </pre></td></tr>
    195  1.1  joerg 
    196  1.1  joerg 
    197  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>
    198  1.1  joerg <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
    199  1.1  joerg 
    200  1.1  joerg Example matches the deduction guide.
    201  1.1  joerg   template&lt;typename T&gt;
    202  1.1  joerg   class X { X(int) };
    203  1.1  joerg   X(int) -&gt; X&lt;int&gt;;
    204  1.1  joerg </pre></td></tr>
    205  1.1  joerg 
    206  1.1  joerg 
    207  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>
    208  1.1  joerg <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
    209  1.1  joerg 
    210  1.1  joerg Example matches Foo::~Foo()
    211  1.1  joerg   class Foo {
    212  1.1  joerg    public:
    213  1.1  joerg     virtual ~Foo();
    214  1.1  joerg   };
    215  1.1  joerg </pre></td></tr>
    216  1.1  joerg 
    217  1.1  joerg 
    218  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>
    219  1.1  joerg <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
    220  1.1  joerg 
    221  1.1  joerg Example matches y
    222  1.1  joerg   class X { void y(); };
    223  1.1  joerg </pre></td></tr>
    224  1.1  joerg 
    225  1.1  joerg 
    226  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>
    227  1.1  joerg <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
    228  1.1  joerg 
    229  1.1  joerg Example matches X, Z
    230  1.1  joerg   class X;
    231  1.1  joerg   template&lt;class T&gt; class Z {};
    232  1.1  joerg </pre></td></tr>
    233  1.1  joerg 
    234  1.1  joerg 
    235  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>
    236  1.1  joerg <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
    237  1.1  joerg 
    238  1.1  joerg Examples matches X, C, and the friend declaration inside C;
    239  1.1  joerg   void X();
    240  1.1  joerg   class C {
    241  1.1  joerg     friend X;
    242  1.1  joerg   };
    243  1.1  joerg </pre></td></tr>
    244  1.1  joerg 
    245  1.1  joerg 
    246  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>
    247  1.1  joerg <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
    248  1.1  joerg and non-type template parameter declarations).
    249  1.1  joerg 
    250  1.1  joerg Given
    251  1.1  joerg   class X { int y; };
    252  1.1  joerg declaratorDecl()
    253  1.1  joerg   matches int y.
    254  1.1  joerg </pre></td></tr>
    255  1.1  joerg 
    256  1.1  joerg 
    257  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>
    258  1.1  joerg <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
    259  1.1  joerg 
    260  1.1  joerg Example matches A, B, C
    261  1.1  joerg   enum X {
    262  1.1  joerg     A, B, C
    263  1.1  joerg   };
    264  1.1  joerg </pre></td></tr>
    265  1.1  joerg 
    266  1.1  joerg 
    267  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>
    268  1.1  joerg <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
    269  1.1  joerg 
    270  1.1  joerg Example matches X
    271  1.1  joerg   enum X {
    272  1.1  joerg     A, B, C
    273  1.1  joerg   };
    274  1.1  joerg </pre></td></tr>
    275  1.1  joerg 
    276  1.1  joerg 
    277  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>
    278  1.1  joerg <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
    279  1.1  joerg 
    280  1.1  joerg Given
    281  1.1  joerg   class X { int m; };
    282  1.1  joerg fieldDecl()
    283  1.1  joerg   matches 'm'.
    284  1.1  joerg </pre></td></tr>
    285  1.1  joerg 
    286  1.1  joerg 
    287  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>
    288  1.1  joerg <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
    289  1.1  joerg 
    290  1.1  joerg Given
    291  1.1  joerg   class X { friend void foo(); };
    292  1.1  joerg friendDecl()
    293  1.1  joerg   matches 'friend void foo()'.
    294  1.1  joerg </pre></td></tr>
    295  1.1  joerg 
    296  1.1  joerg 
    297  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>
    298  1.1  joerg <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
    299  1.1  joerg 
    300  1.1  joerg Example matches f
    301  1.1  joerg   void f();
    302  1.1  joerg </pre></td></tr>
    303  1.1  joerg 
    304  1.1  joerg 
    305  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>
    306  1.1  joerg <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
    307  1.1  joerg 
    308  1.1  joerg Example matches f
    309  1.1  joerg   template&lt;class T&gt; void f(T t) {}
    310  1.1  joerg </pre></td></tr>
    311  1.1  joerg 
    312  1.1  joerg 
    313  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>
    314  1.1  joerg <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
    315  1.1  joerg 
    316  1.1  joerg Given
    317  1.1  joerg   struct X { struct { int a; }; };
    318  1.1  joerg indirectFieldDecl()
    319  1.1  joerg   matches 'a'.
    320  1.1  joerg </pre></td></tr>
    321  1.1  joerg 
    322  1.1  joerg 
    323  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>
    324  1.1  joerg <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
    325  1.1  joerg 
    326  1.1  joerg Given
    327  1.1  joerg   goto FOO;
    328  1.1  joerg   FOO: bar();
    329  1.1  joerg labelDecl()
    330  1.1  joerg   matches 'FOO:'
    331  1.1  joerg </pre></td></tr>
    332  1.1  joerg 
    333  1.1  joerg 
    334  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>
    335  1.1  joerg <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
    336  1.1  joerg 
    337  1.1  joerg Given
    338  1.1  joerg   extern "C" {}
    339  1.1  joerg linkageSpecDecl()
    340  1.1  joerg   matches "extern "C" {}"
    341  1.1  joerg </pre></td></tr>
    342  1.1  joerg 
    343  1.1  joerg 
    344  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>
    345  1.1  joerg <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
    346  1.1  joerg 
    347  1.1  joerg Example matches X, S, the anonymous union type, i, and U;
    348  1.1  joerg   typedef int X;
    349  1.1  joerg   struct S {
    350  1.1  joerg     union {
    351  1.1  joerg       int i;
    352  1.1  joerg     } U;
    353  1.1  joerg   };
    354  1.1  joerg </pre></td></tr>
    355  1.1  joerg 
    356  1.1  joerg 
    357  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>
    358  1.1  joerg <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
    359  1.1  joerg 
    360  1.1  joerg Given
    361  1.1  joerg   namespace test {}
    362  1.1  joerg   namespace alias = ::test;
    363  1.1  joerg namespaceAliasDecl()
    364  1.1  joerg   matches "namespace alias" but not "namespace test"
    365  1.1  joerg </pre></td></tr>
    366  1.1  joerg 
    367  1.1  joerg 
    368  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>
    369  1.1  joerg <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
    370  1.1  joerg 
    371  1.1  joerg Given
    372  1.1  joerg   namespace {}
    373  1.1  joerg   namespace test {}
    374  1.1  joerg namespaceDecl()
    375  1.1  joerg   matches "namespace {}" and "namespace test {}"
    376  1.1  joerg </pre></td></tr>
    377  1.1  joerg 
    378  1.1  joerg 
    379  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>
    380  1.1  joerg <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
    381  1.1  joerg 
    382  1.1  joerg Given
    383  1.1  joerg   template &lt;typename T, int N&gt; struct C {};
    384  1.1  joerg nonTypeTemplateParmDecl()
    385  1.1  joerg   matches 'N', but not 'T'.
    386  1.1  joerg </pre></td></tr>
    387  1.1  joerg 
    388  1.1  joerg 
    389  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>
    390  1.1  joerg <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
    391  1.1  joerg 
    392  1.1  joerg Example matches Foo (Additions)
    393  1.1  joerg   @interface Foo (Additions)
    394  1.1  joerg   @end
    395  1.1  joerg </pre></td></tr>
    396  1.1  joerg 
    397  1.1  joerg 
    398  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>
    399  1.1  joerg <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
    400  1.1  joerg 
    401  1.1  joerg Example matches Foo (Additions)
    402  1.1  joerg   @implementation Foo (Additions)
    403  1.1  joerg   @end
    404  1.1  joerg </pre></td></tr>
    405  1.1  joerg 
    406  1.1  joerg 
    407  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>
    408  1.1  joerg <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
    409  1.1  joerg 
    410  1.1  joerg Example matches Foo
    411  1.1  joerg   @implementation Foo
    412  1.1  joerg   @end
    413  1.1  joerg </pre></td></tr>
    414  1.1  joerg 
    415  1.1  joerg 
    416  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>
    417  1.1  joerg <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
    418  1.1  joerg 
    419  1.1  joerg Example matches Foo
    420  1.1  joerg   @interface Foo
    421  1.1  joerg   @end
    422  1.1  joerg </pre></td></tr>
    423  1.1  joerg 
    424  1.1  joerg 
    425  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>
    426  1.1  joerg <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
    427  1.1  joerg 
    428  1.1  joerg Example matches _enabled
    429  1.1  joerg   @implementation Foo {
    430  1.1  joerg     BOOL _enabled;
    431  1.1  joerg   }
    432  1.1  joerg   @end
    433  1.1  joerg </pre></td></tr>
    434  1.1  joerg 
    435  1.1  joerg 
    436  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>
    437  1.1  joerg <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
    438  1.1  joerg 
    439  1.1  joerg Example matches both declaration and definition of -[Foo method]
    440  1.1  joerg   @interface Foo
    441  1.1  joerg   - (void)method;
    442  1.1  joerg   @end
    443  1.1  joerg 
    444  1.1  joerg   @implementation Foo
    445  1.1  joerg   - (void)method {}
    446  1.1  joerg   @end
    447  1.1  joerg </pre></td></tr>
    448  1.1  joerg 
    449  1.1  joerg 
    450  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>
    451  1.1  joerg <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
    452  1.1  joerg 
    453  1.1  joerg Example matches enabled
    454  1.1  joerg   @interface Foo
    455  1.1  joerg   @property BOOL enabled;
    456  1.1  joerg   @end
    457  1.1  joerg </pre></td></tr>
    458  1.1  joerg 
    459  1.1  joerg 
    460  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>
    461  1.1  joerg <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
    462  1.1  joerg 
    463  1.1  joerg Example matches FooDelegate
    464  1.1  joerg   @protocol FooDelegate
    465  1.1  joerg   @end
    466  1.1  joerg </pre></td></tr>
    467  1.1  joerg 
    468  1.1  joerg 
    469  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>
    470  1.1  joerg <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
    471  1.1  joerg 
    472  1.1  joerg Given
    473  1.1  joerg   void f(int x);
    474  1.1  joerg parmVarDecl()
    475  1.1  joerg   matches int x.
    476  1.1  joerg </pre></td></tr>
    477  1.1  joerg 
    478  1.1  joerg 
    479  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>
    480  1.1  joerg <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
    481  1.1  joerg 
    482  1.1  joerg Example matches X, Z, U, and S
    483  1.1  joerg   class X;
    484  1.1  joerg   template&lt;class T&gt; class Z {};
    485  1.1  joerg   struct S {};
    486  1.1  joerg   union U {};
    487  1.1  joerg </pre></td></tr>
    488  1.1  joerg 
    489  1.1  joerg 
    490  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>
    491  1.1  joerg <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
    492  1.1  joerg 
    493  1.1  joerg Example:
    494  1.1  joerg   staticAssertExpr()
    495  1.1  joerg matches
    496  1.1  joerg   static_assert(sizeof(S) == sizeof(int))
    497  1.1  joerg in
    498  1.1  joerg   struct S {
    499  1.1  joerg     int x;
    500  1.1  joerg   };
    501  1.1  joerg   static_assert(sizeof(S) == sizeof(int));
    502  1.1  joerg </pre></td></tr>
    503  1.1  joerg 
    504  1.1  joerg 
    505  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>
    506  1.1  joerg <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
    507  1.1  joerg 
    508  1.1  joerg Given
    509  1.1  joerg   template &lt;typename T, int N&gt; struct C {};
    510  1.1  joerg templateTypeParmDecl()
    511  1.1  joerg   matches 'T', but not 'N'.
    512  1.1  joerg </pre></td></tr>
    513  1.1  joerg 
    514  1.1  joerg 
    515  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>
    516  1.1  joerg <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
    517  1.1  joerg 
    518  1.1  joerg Given
    519  1.1  joerg   int X;
    520  1.1  joerg   namespace NS {
    521  1.1  joerg   int Y;
    522  1.1  joerg   }  // namespace NS
    523  1.1  joerg decl(hasDeclContext(translationUnitDecl()))
    524  1.1  joerg   matches "int X", but not "int Y".
    525  1.1  joerg </pre></td></tr>
    526  1.1  joerg 
    527  1.1  joerg 
    528  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>
    529  1.1  joerg <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
    530  1.1  joerg 
    531  1.1  joerg Given
    532  1.1  joerg   typedef int X;
    533  1.1  joerg   using Y = int;
    534  1.1  joerg typeAliasDecl()
    535  1.1  joerg   matches "using Y = int", but not "typedef int X"
    536  1.1  joerg </pre></td></tr>
    537  1.1  joerg 
    538  1.1  joerg 
    539  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>
    540  1.1  joerg <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
    541  1.1  joerg 
    542  1.1  joerg typeAliasTemplateDecl() matches
    543  1.1  joerg   template &lt;typename T&gt;
    544  1.1  joerg   using Y = X&lt;T&gt;;
    545  1.1  joerg </pre></td></tr>
    546  1.1  joerg 
    547  1.1  joerg 
    548  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>
    549  1.1  joerg <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
    550  1.1  joerg 
    551  1.1  joerg Given
    552  1.1  joerg   typedef int X;
    553  1.1  joerg   using Y = int;
    554  1.1  joerg typedefDecl()
    555  1.1  joerg   matches "typedef int X", but not "using Y = int"
    556  1.1  joerg </pre></td></tr>
    557  1.1  joerg 
    558  1.1  joerg 
    559  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>
    560  1.1  joerg <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
    561  1.1  joerg 
    562  1.1  joerg Given
    563  1.1  joerg   typedef int X;
    564  1.1  joerg   using Y = int;
    565  1.1  joerg typedefNameDecl()
    566  1.1  joerg   matches "typedef int X" and "using Y = int"
    567  1.1  joerg </pre></td></tr>
    568  1.1  joerg 
    569  1.1  joerg 
    570  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>
    571  1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
    572  1.1  joerg typename.
    573  1.1  joerg 
    574  1.1  joerg Given
    575  1.1  joerg   template &lt;typename T&gt;
    576  1.1  joerg   struct Base { typedef T Foo; };
    577  1.1  joerg 
    578  1.1  joerg   template&lt;typename T&gt;
    579  1.1  joerg   struct S : private Base&lt;T&gt; {
    580  1.1  joerg     using typename Base&lt;T&gt;::Foo;
    581  1.1  joerg   };
    582  1.1  joerg unresolvedUsingTypenameDecl()
    583  1.1  joerg   matches using Base&lt;T&gt;::Foo </pre></td></tr>
    584  1.1  joerg 
    585  1.1  joerg 
    586  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>
    587  1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
    588  1.1  joerg 
    589  1.1  joerg Given
    590  1.1  joerg   template&lt;typename X&gt;
    591  1.1  joerg   class C : private X {
    592  1.1  joerg     using X::x;
    593  1.1  joerg   };
    594  1.1  joerg unresolvedUsingValueDecl()
    595  1.1  joerg   matches using X::x </pre></td></tr>
    596  1.1  joerg 
    597  1.1  joerg 
    598  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>
    599  1.1  joerg <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
    600  1.1  joerg 
    601  1.1  joerg Given
    602  1.1  joerg   namespace X { int x; }
    603  1.1  joerg   using X::x;
    604  1.1  joerg usingDecl()
    605  1.1  joerg   matches using X::x </pre></td></tr>
    606  1.1  joerg 
    607  1.1  joerg 
    608  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>
    609  1.1  joerg <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
    610  1.1  joerg 
    611  1.1  joerg Given
    612  1.1  joerg   namespace X { int x; }
    613  1.1  joerg   using namespace X;
    614  1.1  joerg usingDirectiveDecl()
    615  1.1  joerg   matches using namespace X </pre></td></tr>
    616  1.1  joerg 
    617  1.1  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('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>
    619  1.1  joerg <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
    620  1.1  joerg 
    621  1.1  joerg Example matches A, B, C and F
    622  1.1  joerg   enum X { A, B, C };
    623  1.1  joerg   void F();
    624  1.1  joerg </pre></td></tr>
    625  1.1  joerg 
    626  1.1  joerg 
    627  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>
    628  1.1  joerg <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
    629  1.1  joerg 
    630  1.1  joerg Note: this does not match declarations of member variables, which are
    631  1.1  joerg "field" declarations in Clang parlance.
    632  1.1  joerg 
    633  1.1  joerg Example matches a
    634  1.1  joerg   int a;
    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_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>
    639  1.1  joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
    640  1.1  joerg </pre></td></tr>
    641  1.1  joerg 
    642  1.1  joerg 
    643  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>
    644  1.1  joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
    645  1.1  joerg 
    646  1.1  joerg Given
    647  1.1  joerg   namespace ns {
    648  1.1  joerg     struct A { static void f(); };
    649  1.1  joerg     void A::f() {}
    650  1.1  joerg     void g() { A::f(); }
    651  1.1  joerg   }
    652  1.1  joerg   ns::A a;
    653  1.1  joerg nestedNameSpecifier()
    654  1.1  joerg   matches "ns::" and both "A::"
    655  1.1  joerg </pre></td></tr>
    656  1.1  joerg 
    657  1.1  joerg 
    658  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>
    659  1.1  joerg <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
    660  1.1  joerg 
    661  1.1  joerg Given
    662  1.1  joerg 
    663  1.1  joerg   #pragma omp parallel default(none)
    664  1.1  joerg   #pragma omp parallel default(shared)
    665  1.1  joerg   #pragma omp parallel
    666  1.1  joerg 
    667  1.1  joerg ``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
    668  1.1  joerg </pre></td></tr>
    669  1.1  joerg 
    670  1.1  joerg 
    671  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>
    672  1.1  joerg <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
    673  1.1  joerg </pre></td></tr>
    674  1.1  joerg 
    675  1.1  joerg 
    676  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>
    677  1.1  joerg <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
    678  1.1  joerg 
    679  1.1  joerg Given
    680  1.1  joerg   FOO: bar();
    681  1.1  joerg   void *ptr = &amp;&amp;FOO;
    682  1.1  joerg   goto *bar;
    683  1.1  joerg addrLabelExpr()
    684  1.1  joerg   matches '&amp;&amp;FOO'
    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_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>
    689  1.1  joerg <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
    690  1.1  joerg 
    691  1.1  joerg Given
    692  1.1  joerg   int i = a[1];
    693  1.1  joerg arraySubscriptExpr()
    694  1.1  joerg   matches "a[1]"
    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_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>
    699  1.1  joerg <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
    700  1.1  joerg 
    701  1.1  joerg  int i = 100;
    702  1.1  joerg   __asm("mov al, 2");
    703  1.1  joerg asmStmt()
    704  1.1  joerg   matches '__asm("mov al, 2")'
    705  1.1  joerg </pre></td></tr>
    706  1.1  joerg 
    707  1.1  joerg 
    708  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>
    709  1.1  joerg <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
    710  1.1  joerg Example matches __atomic_load_n(ptr, 1)
    711  1.1  joerg   void foo() { int *ptr; __atomic_load_n(ptr, 1); }
    712  1.1  joerg </pre></td></tr>
    713  1.1  joerg 
    714  1.1  joerg 
    715  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>
    716  1.1  joerg <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
    717  1.1  joerg 
    718  1.1  joerg Given
    719  1.1  joerg   @autoreleasepool {
    720  1.1  joerg     int x = 0;
    721  1.1  joerg   }
    722  1.1  joerg autoreleasePoolStmt(stmt()) matches the declaration of "x"
    723  1.1  joerg inside the autorelease pool.
    724  1.1  joerg </pre></td></tr>
    725  1.1  joerg 
    726  1.1  joerg 
    727  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>
    728  1.1  joerg <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
    729  1.1  joerg 
    730  1.1  joerg Example matches a ?: b
    731  1.1  joerg   (a ?: b) + 42;
    732  1.1  joerg </pre></td></tr>
    733  1.1  joerg 
    734  1.1  joerg 
    735  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>
    736  1.1  joerg <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
    737  1.1  joerg 
    738  1.1  joerg Example matches a || b
    739  1.1  joerg   !(a || b)
    740  1.1  joerg </pre></td></tr>
    741  1.1  joerg 
    742  1.1  joerg 
    743  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>
    744  1.1  joerg <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
    745  1.1  joerg 
    746  1.1  joerg Example: matches "^{}":
    747  1.1  joerg   void f() { ^{}(); }
    748  1.1  joerg </pre></td></tr>
    749  1.1  joerg 
    750  1.1  joerg 
    751  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>
    752  1.1  joerg <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
    753  1.1  joerg 
    754  1.1  joerg Given
    755  1.1  joerg   while (true) { break; }
    756  1.1  joerg breakStmt()
    757  1.1  joerg   matches 'break'
    758  1.1  joerg </pre></td></tr>
    759  1.1  joerg 
    760  1.1  joerg 
    761  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>
    762  1.1  joerg <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
    763  1.1  joerg 
    764  1.1  joerg Example: Matches (int) 2.2f in
    765  1.1  joerg   int i = (int) 2.2f;
    766  1.1  joerg </pre></td></tr>
    767  1.1  joerg 
    768  1.1  joerg 
    769  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>
    770  1.1  joerg <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
    771  1.1  joerg 
    772  1.1  joerg Example matches x.y() and y()
    773  1.1  joerg   X x;
    774  1.1  joerg   x.y();
    775  1.1  joerg   y();
    776  1.1  joerg </pre></td></tr>
    777  1.1  joerg 
    778  1.1  joerg 
    779  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>
    780  1.1  joerg <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
    781  1.1  joerg 
    782  1.1  joerg Given
    783  1.1  joerg   switch(a) { case 42: break; default: break; }
    784  1.1  joerg caseStmt()
    785  1.1  joerg   matches 'case 42:'.
    786  1.1  joerg </pre></td></tr>
    787  1.1  joerg 
    788  1.1  joerg 
    789  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>
    790  1.1  joerg <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
    791  1.1  joerg 
    792  1.1  joerg Example: castExpr() matches each of the following:
    793  1.1  joerg   (int) 3;
    794  1.1  joerg   const_cast&lt;Expr *&gt;(SubExpr);
    795  1.1  joerg   char c = 0;
    796  1.1  joerg but does not match
    797  1.1  joerg   int i = (0);
    798  1.1  joerg   int k = 0;
    799  1.1  joerg </pre></td></tr>
    800  1.1  joerg 
    801  1.1  joerg 
    802  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>
    803  1.1  joerg <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
    804  1.1  joerg 
    805  1.1  joerg Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
    806  1.1  joerg though.
    807  1.1  joerg 
    808  1.1  joerg Example matches 'a', L'a'
    809  1.1  joerg   char ch = 'a';
    810  1.1  joerg   wchar_t chw = L'a';
    811  1.1  joerg </pre></td></tr>
    812  1.1  joerg 
    813  1.1  joerg 
    814  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>
    815  1.1  joerg <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
    816  1.1  joerg </pre></td></tr>
    817  1.1  joerg 
    818  1.1  joerg 
    819  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>
    820  1.1  joerg <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
    821  1.1  joerg 
    822  1.1  joerg Example match: {1}, (1, 2)
    823  1.1  joerg   int array[4] = {1};
    824  1.1  joerg   vector int myvec = (vector int)(1, 2);
    825  1.1  joerg </pre></td></tr>
    826  1.1  joerg 
    827  1.1  joerg 
    828  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>
    829  1.1  joerg <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
    830  1.1  joerg 
    831  1.1  joerg Example matches '{}' and '{{}}' in 'for (;;) {{}}'
    832  1.1  joerg   for (;;) {{}}
    833  1.1  joerg </pre></td></tr>
    834  1.1  joerg 
    835  1.1  joerg 
    836  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>
    837  1.1  joerg <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
    838  1.1  joerg 
    839  1.1  joerg Example matches a ? b : c
    840  1.1  joerg   (a ? b : c) + 42
    841  1.1  joerg </pre></td></tr>
    842  1.1  joerg 
    843  1.1  joerg 
    844  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>
    845  1.1  joerg <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
    846  1.1  joerg 
    847  1.1  joerg Example matches the constant in the case statement:
    848  1.1  joerg     (matcher = constantExpr())
    849  1.1  joerg   switch (a) {
    850  1.1  joerg   case 37: break;
    851  1.1  joerg   }
    852  1.1  joerg </pre></td></tr>
    853  1.1  joerg 
    854  1.1  joerg 
    855  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>
    856  1.1  joerg <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
    857  1.1  joerg 
    858  1.1  joerg Given
    859  1.1  joerg   while (true) { continue; }
    860  1.1  joerg continueStmt()
    861  1.1  joerg   matches 'continue'
    862  1.1  joerg </pre></td></tr>
    863  1.1  joerg 
    864  1.1  joerg 
    865  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>
    866  1.1  joerg <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
    867  1.1  joerg 
    868  1.1  joerg Example matches,
    869  1.1  joerg   kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
    870  1.1  joerg </pre></td></tr>
    871  1.1  joerg 
    872  1.1  joerg 
    873  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>
    874  1.1  joerg <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
    875  1.1  joerg 
    876  1.1  joerg Example matches FunctionTakesString(GetStringByValue())
    877  1.1  joerg     (matcher = cxxBindTemporaryExpr())
    878  1.1  joerg   FunctionTakesString(GetStringByValue());
    879  1.1  joerg   FunctionTakesStringByPointer(GetStringPointer());
    880  1.1  joerg </pre></td></tr>
    881  1.1  joerg 
    882  1.1  joerg 
    883  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>
    884  1.1  joerg <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
    885  1.1  joerg 
    886  1.1  joerg Example matches true
    887  1.1  joerg   true
    888  1.1  joerg </pre></td></tr>
    889  1.1  joerg 
    890  1.1  joerg 
    891  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>
    892  1.1  joerg <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
    893  1.1  joerg 
    894  1.1  joerg   try {} catch(int i) {}
    895  1.1  joerg cxxCatchStmt()
    896  1.1  joerg   matches 'catch(int i)'
    897  1.1  joerg </pre></td></tr>
    898  1.1  joerg 
    899  1.1  joerg 
    900  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>
    901  1.1  joerg <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
    902  1.1  joerg 
    903  1.1  joerg Example: Matches const_cast&lt;int*&gt;(&amp;r) in
    904  1.1  joerg   int n = 42;
    905  1.1  joerg   const int &amp;r(n);
    906  1.1  joerg   int* p = const_cast&lt;int*&gt;(&amp;r);
    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_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>
    911  1.1  joerg <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
    912  1.1  joerg 
    913  1.1  joerg Example matches string(ptr, n) and ptr within arguments of f
    914  1.1  joerg     (matcher = cxxConstructExpr())
    915  1.1  joerg   void f(const string &amp;a, const string &amp;b);
    916  1.1  joerg   char *ptr;
    917  1.1  joerg   int n;
    918  1.1  joerg   f(string(ptr, n), ptr);
    919  1.1  joerg </pre></td></tr>
    920  1.1  joerg 
    921  1.1  joerg 
    922  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>
    923  1.1  joerg <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
    924  1.1  joerg 
    925  1.1  joerg Example matches the CXXDefaultArgExpr placeholder inserted for the
    926  1.1  joerg     default value of the second parameter in the call expression f(42)
    927  1.1  joerg     (matcher = cxxDefaultArgExpr())
    928  1.1  joerg   void f(int x, int y = 0);
    929  1.1  joerg   f(42);
    930  1.1  joerg </pre></td></tr>
    931  1.1  joerg 
    932  1.1  joerg 
    933  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>
    934  1.1  joerg <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
    935  1.1  joerg 
    936  1.1  joerg Given
    937  1.1  joerg   delete X;
    938  1.1  joerg cxxDeleteExpr()
    939  1.1  joerg   matches 'delete X'.
    940  1.1  joerg </pre></td></tr>
    941  1.1  joerg 
    942  1.1  joerg 
    943  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>
    944  1.1  joerg <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
    945  1.1  joerg resolved because the base expression or the member name was dependent.
    946  1.1  joerg 
    947  1.1  joerg Given
    948  1.1  joerg   template &lt;class T&gt; void f() { T t; t.g(); }
    949  1.1  joerg cxxDependentScopeMemberExpr()
    950  1.1  joerg   matches t.g
    951  1.1  joerg </pre></td></tr>
    952  1.1  joerg 
    953  1.1  joerg 
    954  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>
    955  1.1  joerg <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
    956  1.1  joerg 
    957  1.1  joerg Example:
    958  1.1  joerg   cxxDynamicCastExpr()
    959  1.1  joerg matches
    960  1.1  joerg   dynamic_cast&lt;D*&gt;(&amp;b);
    961  1.1  joerg in
    962  1.1  joerg   struct B { virtual ~B() {} }; struct D : B {};
    963  1.1  joerg   B b;
    964  1.1  joerg   D* p = dynamic_cast&lt;D*&gt;(&amp;b);
    965  1.1  joerg </pre></td></tr>
    966  1.1  joerg 
    967  1.1  joerg 
    968  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>
    969  1.1  joerg <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
    970  1.1  joerg 
    971  1.1  joerg cxxForRangeStmt() matches 'for (auto a : i)'
    972  1.1  joerg   int i[] =  {1, 2, 3}; for (auto a : i);
    973  1.1  joerg   for(int j = 0; j &lt; 5; ++j);
    974  1.1  joerg </pre></td></tr>
    975  1.1  joerg 
    976  1.1  joerg 
    977  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>
    978  1.1  joerg <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
    979  1.1  joerg 
    980  1.1  joerg Example: Matches Foo(bar);
    981  1.1  joerg   Foo f = bar;
    982  1.1  joerg   Foo g = (Foo) bar;
    983  1.1  joerg   Foo h = Foo(bar);
    984  1.1  joerg </pre></td></tr>
    985  1.1  joerg 
    986  1.1  joerg 
    987  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>
    988  1.1  joerg <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
    989  1.1  joerg 
    990  1.1  joerg Example matches x.y()
    991  1.1  joerg   X x;
    992  1.1  joerg   x.y();
    993  1.1  joerg </pre></td></tr>
    994  1.1  joerg 
    995  1.1  joerg 
    996  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>
    997  1.1  joerg <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
    998  1.1  joerg 
    999  1.1  joerg Given
   1000  1.1  joerg   new X;
   1001  1.1  joerg cxxNewExpr()
   1002  1.1  joerg   matches 'new X'.
   1003  1.1  joerg </pre></td></tr>
   1004  1.1  joerg 
   1005  1.1  joerg 
   1006  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>
   1007  1.1  joerg <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
   1008  1.1  joerg </pre></td></tr>
   1009  1.1  joerg 
   1010  1.1  joerg 
   1011  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>
   1012  1.1  joerg <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
   1013  1.1  joerg 
   1014  1.1  joerg Note that if an operator isn't overloaded, it won't match. Instead, use
   1015  1.1  joerg binaryOperator matcher.
   1016  1.1  joerg Currently it does not match operators such as new delete.
   1017  1.1  joerg FIXME: figure out why these do not match?
   1018  1.1  joerg 
   1019  1.1  joerg Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
   1020  1.1  joerg     (matcher = cxxOperatorCallExpr())
   1021  1.1  joerg   ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
   1022  1.1  joerg   ostream &amp;o; int b = 1, c = 1;
   1023  1.1  joerg   o &lt;&lt; b &lt;&lt; c;
   1024  1.1  joerg </pre></td></tr>
   1025  1.1  joerg 
   1026  1.1  joerg 
   1027  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>
   1028  1.1  joerg <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
   1029  1.1  joerg 
   1030  1.1  joerg Either the source expression or the destination type can be matched
   1031  1.1  joerg using has(), but hasDestinationType() is more specific and can be
   1032  1.1  joerg more readable.
   1033  1.1  joerg 
   1034  1.1  joerg Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
   1035  1.1  joerg   void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
   1036  1.1  joerg </pre></td></tr>
   1037  1.1  joerg 
   1038  1.1  joerg 
   1039  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>
   1040  1.1  joerg <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
   1041  1.1  joerg 
   1042  1.1  joerg See also: hasDestinationType
   1043  1.1  joerg See also: reinterpretCast
   1044  1.1  joerg 
   1045  1.1  joerg Example:
   1046  1.1  joerg   cxxStaticCastExpr()
   1047  1.1  joerg matches
   1048  1.1  joerg   static_cast&lt;long&gt;(8)
   1049  1.1  joerg in
   1050  1.1  joerg   long eight(static_cast&lt;long&gt;(8));
   1051  1.1  joerg </pre></td></tr>
   1052  1.1  joerg 
   1053  1.1  joerg 
   1054  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>
   1055  1.1  joerg <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
   1056  1.1  joerg 
   1057  1.1  joerg Given
   1058  1.1  joerg   std::vector&lt;int&gt; a({ 1, 2, 3 });
   1059  1.1  joerg   std::vector&lt;int&gt; b = { 4, 5 };
   1060  1.1  joerg   int c[] = { 6, 7 };
   1061  1.1  joerg   std::pair&lt;int, int&gt; d = { 8, 9 };
   1062  1.1  joerg cxxStdInitializerListExpr()
   1063  1.1  joerg   matches "{ 1, 2, 3 }" and "{ 4, 5 }"
   1064  1.1  joerg </pre></td></tr>
   1065  1.1  joerg 
   1066  1.1  joerg 
   1067  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>
   1068  1.1  joerg <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
   1069  1.1  joerg 
   1070  1.1  joerg Example: Matches Foo(bar, bar)
   1071  1.1  joerg   Foo h = Foo(bar, bar);
   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_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>
   1076  1.1  joerg <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
   1077  1.1  joerg 
   1078  1.1  joerg Example matches the implicit this expression in "return i".
   1079  1.1  joerg     (matcher = cxxThisExpr())
   1080  1.1  joerg struct foo {
   1081  1.1  joerg   int i;
   1082  1.1  joerg   int f() { return i; }
   1083  1.1  joerg };
   1084  1.1  joerg </pre></td></tr>
   1085  1.1  joerg 
   1086  1.1  joerg 
   1087  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>
   1088  1.1  joerg <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
   1089  1.1  joerg 
   1090  1.1  joerg   try { throw 5; } catch(int i) {}
   1091  1.1  joerg cxxThrowExpr()
   1092  1.1  joerg   matches 'throw 5'
   1093  1.1  joerg </pre></td></tr>
   1094  1.1  joerg 
   1095  1.1  joerg 
   1096  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>
   1097  1.1  joerg <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
   1098  1.1  joerg 
   1099  1.1  joerg   try {} catch(int i) {}
   1100  1.1  joerg cxxTryStmt()
   1101  1.1  joerg   matches 'try {}'
   1102  1.1  joerg </pre></td></tr>
   1103  1.1  joerg 
   1104  1.1  joerg 
   1105  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>
   1106  1.1  joerg <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
   1107  1.1  joerg 
   1108  1.1  joerg Example matches T(t) in return statement of f
   1109  1.1  joerg     (matcher = cxxUnresolvedConstructExpr())
   1110  1.1  joerg   template &lt;typename T&gt;
   1111  1.1  joerg   void f(const T&amp; t) { return T(t); }
   1112  1.1  joerg </pre></td></tr>
   1113  1.1  joerg 
   1114  1.1  joerg 
   1115  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>
   1116  1.1  joerg <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
   1117  1.1  joerg 
   1118  1.1  joerg Example matches x in if (x)
   1119  1.1  joerg   bool x;
   1120  1.1  joerg   if (x) {}
   1121  1.1  joerg </pre></td></tr>
   1122  1.1  joerg 
   1123  1.1  joerg 
   1124  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>
   1125  1.1  joerg <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
   1126  1.1  joerg 
   1127  1.1  joerg Given
   1128  1.1  joerg   int a;
   1129  1.1  joerg declStmt()
   1130  1.1  joerg   matches 'int a'.
   1131  1.1  joerg </pre></td></tr>
   1132  1.1  joerg 
   1133  1.1  joerg 
   1134  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>
   1135  1.1  joerg <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
   1136  1.1  joerg 
   1137  1.1  joerg Given
   1138  1.1  joerg   switch(a) { case 42: break; default: break; }
   1139  1.1  joerg defaultStmt()
   1140  1.1  joerg   matches 'default:'.
   1141  1.1  joerg </pre></td></tr>
   1142  1.1  joerg 
   1143  1.1  joerg 
   1144  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>
   1145  1.1  joerg <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
   1146  1.1  joerg 
   1147  1.1  joerg Example: Matches { [2].y = 1.0, [0].x = 1.0 }
   1148  1.1  joerg   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
   1149  1.1  joerg </pre></td></tr>
   1150  1.1  joerg 
   1151  1.1  joerg 
   1152  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>
   1153  1.1  joerg <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
   1154  1.1  joerg 
   1155  1.1  joerg Given
   1156  1.1  joerg   do {} while (true);
   1157  1.1  joerg doStmt()
   1158  1.1  joerg   matches 'do {} while(true)'
   1159  1.1  joerg </pre></td></tr>
   1160  1.1  joerg 
   1161  1.1  joerg 
   1162  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>
   1163  1.1  joerg <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
   1164  1.1  joerg 
   1165  1.1  joerg Matches any cast expression written in user code, whether it be a
   1166  1.1  joerg C-style cast, a functional-style cast, or a keyword cast.
   1167  1.1  joerg 
   1168  1.1  joerg Does not match implicit conversions.
   1169  1.1  joerg 
   1170  1.1  joerg Note: the name "explicitCast" is chosen to match Clang's terminology, as
   1171  1.1  joerg Clang uses the term "cast" to apply to implicit conversions as well as to
   1172  1.1  joerg actual cast expressions.
   1173  1.1  joerg 
   1174  1.1  joerg See also: hasDestinationType.
   1175  1.1  joerg 
   1176  1.1  joerg Example: matches all five of the casts in
   1177  1.1  joerg   int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
   1178  1.1  joerg but does not match the implicit conversion in
   1179  1.1  joerg   long ell = 42;
   1180  1.1  joerg </pre></td></tr>
   1181  1.1  joerg 
   1182  1.1  joerg 
   1183  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>
   1184  1.1  joerg <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
   1185  1.1  joerg 
   1186  1.1  joerg Example matches x()
   1187  1.1  joerg   void f() { x(); }
   1188  1.1  joerg </pre></td></tr>
   1189  1.1  joerg 
   1190  1.1  joerg 
   1191  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>
   1192  1.1  joerg <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
   1193  1.1  joerg of the sub-expression's evaluation.
   1194  1.1  joerg 
   1195  1.1  joerg Example matches std::string()
   1196  1.1  joerg   const std::string str = std::string();
   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_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>
   1201  1.1  joerg <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
   1202  1.1  joerg 1.0, 1.0f, 1.0L and 1e10.
   1203  1.1  joerg 
   1204  1.1  joerg Does not match implicit conversions such as
   1205  1.1  joerg   float a = 10;
   1206  1.1  joerg </pre></td></tr>
   1207  1.1  joerg 
   1208  1.1  joerg 
   1209  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>
   1210  1.1  joerg <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
   1211  1.1  joerg 
   1212  1.1  joerg Example matches 'for (;;) {}'
   1213  1.1  joerg   for (;;) {}
   1214  1.1  joerg   int i[] =  {1, 2, 3}; for (auto a : i);
   1215  1.1  joerg </pre></td></tr>
   1216  1.1  joerg 
   1217  1.1  joerg 
   1218  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>
   1219  1.1  joerg <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
   1220  1.1  joerg </pre></td></tr>
   1221  1.1  joerg 
   1222  1.1  joerg 
   1223  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>
   1224  1.1  joerg <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
   1225  1.1  joerg 
   1226  1.1  joerg Given
   1227  1.1  joerg   goto FOO;
   1228  1.1  joerg   FOO: bar();
   1229  1.1  joerg gotoStmt()
   1230  1.1  joerg   matches 'goto FOO'
   1231  1.1  joerg </pre></td></tr>
   1232  1.1  joerg 
   1233  1.1  joerg 
   1234  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>
   1235  1.1  joerg <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
   1236  1.1  joerg 
   1237  1.1  joerg Example matches 'if (x) {}'
   1238  1.1  joerg   if (x) {}
   1239  1.1  joerg </pre></td></tr>
   1240  1.1  joerg 
   1241  1.1  joerg 
   1242  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>
   1243  1.1  joerg <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
   1244  1.1  joerg point literals e.g.: 1i, 1.0i
   1245  1.1  joerg </pre></td></tr>
   1246  1.1  joerg 
   1247  1.1  joerg 
   1248  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>
   1249  1.1  joerg <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
   1250  1.1  joerg 
   1251  1.1  joerg This matches many different places, including function call return value
   1252  1.1  joerg eliding, as well as any type conversions.
   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('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>
   1257  1.1  joerg <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
   1258  1.1  joerg 
   1259  1.1  joerg Given
   1260  1.1  joerg   point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
   1261  1.1  joerg implicitValueInitExpr()
   1262  1.1  joerg   matches "[0].y" (implicitly)
   1263  1.1  joerg </pre></td></tr>
   1264  1.1  joerg 
   1265  1.1  joerg 
   1266  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>
   1267  1.1  joerg <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
   1268  1.1  joerg 
   1269  1.1  joerg Given
   1270  1.1  joerg   int a[] = { 1, 2 };
   1271  1.1  joerg   struct B { int x, y; };
   1272  1.1  joerg   B b = { 5, 6 };
   1273  1.1  joerg initListExpr()
   1274  1.1  joerg   matches "{ 1, 2 }" and "{ 5, 6 }"
   1275  1.1  joerg </pre></td></tr>
   1276  1.1  joerg 
   1277  1.1  joerg 
   1278  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>
   1279  1.1  joerg <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
   1280  1.1  joerg 1, 1L, 0x1 and 1U.
   1281  1.1  joerg 
   1282  1.1  joerg Does not match character-encoded integers such as L'a'.
   1283  1.1  joerg </pre></td></tr>
   1284  1.1  joerg 
   1285  1.1  joerg 
   1286  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>
   1287  1.1  joerg <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
   1288  1.1  joerg 
   1289  1.1  joerg Given
   1290  1.1  joerg   goto FOO;
   1291  1.1  joerg   FOO: bar();
   1292  1.1  joerg labelStmt()
   1293  1.1  joerg   matches 'FOO:'
   1294  1.1  joerg </pre></td></tr>
   1295  1.1  joerg 
   1296  1.1  joerg 
   1297  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>
   1298  1.1  joerg <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
   1299  1.1  joerg 
   1300  1.1  joerg Example matches [&amp;](){return 5;}
   1301  1.1  joerg   [&amp;](){return 5;}
   1302  1.1  joerg </pre></td></tr>
   1303  1.1  joerg 
   1304  1.1  joerg 
   1305  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>
   1306  1.1  joerg <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
   1307  1.1  joerg 
   1308  1.1  joerg Example: Given
   1309  1.1  joerg   struct T {void func();};
   1310  1.1  joerg   T f();
   1311  1.1  joerg   void g(T);
   1312  1.1  joerg materializeTemporaryExpr() matches 'f()' in these statements
   1313  1.1  joerg   T u(f());
   1314  1.1  joerg   g(f());
   1315  1.1  joerg   f().func();
   1316  1.1  joerg but does not match
   1317  1.1  joerg   f();
   1318  1.1  joerg </pre></td></tr>
   1319  1.1  joerg 
   1320  1.1  joerg 
   1321  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>
   1322  1.1  joerg <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
   1323  1.1  joerg 
   1324  1.1  joerg Given
   1325  1.1  joerg   class Y {
   1326  1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   1327  1.1  joerg     int a; static int b;
   1328  1.1  joerg   };
   1329  1.1  joerg memberExpr()
   1330  1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   1331  1.1  joerg </pre></td></tr>
   1332  1.1  joerg 
   1333  1.1  joerg 
   1334  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>
   1335  1.1  joerg <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
   1336  1.1  joerg 
   1337  1.1  joerg   foo();;
   1338  1.1  joerg nullStmt()
   1339  1.1  joerg   matches the second ';'
   1340  1.1  joerg </pre></td></tr>
   1341  1.1  joerg 
   1342  1.1  joerg 
   1343  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>
   1344  1.1  joerg <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
   1345  1.1  joerg 
   1346  1.1  joerg Example matches @catch
   1347  1.1  joerg   @try {}
   1348  1.1  joerg   @catch (...) {}
   1349  1.1  joerg </pre></td></tr>
   1350  1.1  joerg 
   1351  1.1  joerg 
   1352  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>
   1353  1.1  joerg <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
   1354  1.1  joerg 
   1355  1.1  joerg Example matches @finally
   1356  1.1  joerg   @try {}
   1357  1.1  joerg   @finally {}
   1358  1.1  joerg </pre></td></tr>
   1359  1.1  joerg 
   1360  1.1  joerg 
   1361  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>
   1362  1.1  joerg <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
   1363  1.1  joerg 
   1364  1.1  joerg Example: matches "a" in "init" method:
   1365  1.1  joerg @implementation A {
   1366  1.1  joerg   NSString *a;
   1367  1.1  joerg }
   1368  1.1  joerg - (void) init {
   1369  1.1  joerg   a = @"hello";
   1370  1.1  joerg }
   1371  1.1  joerg </pre></td></tr>
   1372  1.1  joerg 
   1373  1.1  joerg 
   1374  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>
   1375  1.1  joerg <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
   1376  1.1  joerg 
   1377  1.1  joerg The innermost message send invokes the "alloc" class method on the
   1378  1.1  joerg NSString class, while the outermost message send invokes the
   1379  1.1  joerg "initWithString" instance method on the object returned from
   1380  1.1  joerg NSString's "alloc". This matcher should match both message sends.
   1381  1.1  joerg   [[NSString alloc] initWithString:@"Hello"]
   1382  1.1  joerg </pre></td></tr>
   1383  1.1  joerg 
   1384  1.1  joerg 
   1385  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>
   1386  1.1  joerg <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
   1387  1.1  joerg 
   1388  1.1  joerg Example matches @throw obj;
   1389  1.1  joerg </pre></td></tr>
   1390  1.1  joerg 
   1391  1.1  joerg 
   1392  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>
   1393  1.1  joerg <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
   1394  1.1  joerg 
   1395  1.1  joerg Example matches @try
   1396  1.1  joerg   @try {}
   1397  1.1  joerg   @catch (...) {}
   1398  1.1  joerg </pre></td></tr>
   1399  1.1  joerg 
   1400  1.1  joerg 
   1401  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>
   1402  1.1  joerg <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
   1403  1.1  joerg 
   1404  1.1  joerg Given
   1405  1.1  joerg 
   1406  1.1  joerg   #pragma omp parallel
   1407  1.1  joerg   #pragma omp parallel default(none)
   1408  1.1  joerg   #pragma omp taskyield
   1409  1.1  joerg 
   1410  1.1  joerg ``ompExecutableDirective()`` matches ``omp parallel``,
   1411  1.1  joerg ``omp parallel default(none)`` and ``omp taskyield``.
   1412  1.1  joerg </pre></td></tr>
   1413  1.1  joerg 
   1414  1.1  joerg 
   1415  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>
   1416  1.1  joerg <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
   1417  1.1  joerg to reference another expressions and can be met
   1418  1.1  joerg in BinaryConditionalOperators, for example.
   1419  1.1  joerg 
   1420  1.1  joerg Example matches 'a'
   1421  1.1  joerg   (a ?: c) + 42;
   1422  1.1  joerg </pre></td></tr>
   1423  1.1  joerg 
   1424  1.1  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('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>
   1426  1.1  joerg <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
   1427  1.1  joerg 
   1428  1.1  joerg Example matches (foo() + 1)
   1429  1.1  joerg   int foo() { return 1; }
   1430  1.1  joerg   int a = (foo() + 1);
   1431  1.1  joerg </pre></td></tr>
   1432  1.1  joerg 
   1433  1.1  joerg 
   1434  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>
   1435  1.1  joerg <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
   1436  1.1  joerg ParenListExprs don't have a predefined type and are used for late parsing.
   1437  1.1  joerg In the final AST, they can be met in template declarations.
   1438  1.1  joerg 
   1439  1.1  joerg Given
   1440  1.1  joerg   template&lt;typename T&gt; class X {
   1441  1.1  joerg     void f() {
   1442  1.1  joerg       X x(*this);
   1443  1.1  joerg       int a = 0, b = 1; int i = (a, b);
   1444  1.1  joerg     }
   1445  1.1  joerg   };
   1446  1.1  joerg parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
   1447  1.1  joerg has a predefined type and is a ParenExpr, not a ParenListExpr.
   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('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>
   1452  1.1  joerg <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
   1453  1.1  joerg 
   1454  1.1  joerg Example: Matches __func__
   1455  1.1  joerg   printf("%s", __func__);
   1456  1.1  joerg </pre></td></tr>
   1457  1.1  joerg 
   1458  1.1  joerg 
   1459  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>
   1460  1.1  joerg <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
   1461  1.1  joerg 
   1462  1.1  joerg Given
   1463  1.1  joerg   return 1;
   1464  1.1  joerg returnStmt()
   1465  1.1  joerg   matches 'return 1'
   1466  1.1  joerg </pre></td></tr>
   1467  1.1  joerg 
   1468  1.1  joerg 
   1469  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>
   1470  1.1  joerg <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
   1471  1.1  joerg 
   1472  1.1  joerg Given
   1473  1.1  joerg   { ++a; }
   1474  1.1  joerg stmt()
   1475  1.1  joerg   matches both the compound statement '{ ++a; }' and '++a'.
   1476  1.1  joerg </pre></td></tr>
   1477  1.1  joerg 
   1478  1.1  joerg 
   1479  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>
   1480  1.1  joerg <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
   1481  1.1  joerg 
   1482  1.1  joerg Example match: ({ int X = 4; X; })
   1483  1.1  joerg   int C = ({ int X = 4; X; });
   1484  1.1  joerg </pre></td></tr>
   1485  1.1  joerg 
   1486  1.1  joerg 
   1487  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>
   1488  1.1  joerg <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
   1489  1.1  joerg 
   1490  1.1  joerg Example matches "abcd", L"abcd"
   1491  1.1  joerg   char *s = "abcd";
   1492  1.1  joerg   wchar_t *ws = L"abcd";
   1493  1.1  joerg </pre></td></tr>
   1494  1.1  joerg 
   1495  1.1  joerg 
   1496  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>
   1497  1.1  joerg <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
   1498  1.1  joerg 
   1499  1.1  joerg Given
   1500  1.1  joerg   template &lt;int N&gt;
   1501  1.1  joerg   struct A { static const int n = N; };
   1502  1.1  joerg   struct B : public A&lt;42&gt; {};
   1503  1.1  joerg substNonTypeTemplateParmExpr()
   1504  1.1  joerg   matches "N" in the right-hand side of "static const int n = N;"
   1505  1.1  joerg </pre></td></tr>
   1506  1.1  joerg 
   1507  1.1  joerg 
   1508  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>
   1509  1.1  joerg <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
   1510  1.1  joerg 
   1511  1.1  joerg Given
   1512  1.1  joerg   switch(a) { case 42: break; default: break; }
   1513  1.1  joerg switchCase()
   1514  1.1  joerg   matches 'case 42:' and 'default:'.
   1515  1.1  joerg </pre></td></tr>
   1516  1.1  joerg 
   1517  1.1  joerg 
   1518  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>
   1519  1.1  joerg <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
   1520  1.1  joerg 
   1521  1.1  joerg Given
   1522  1.1  joerg   switch(a) { case 42: break; default: break; }
   1523  1.1  joerg switchStmt()
   1524  1.1  joerg   matches 'switch(a)'.
   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('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>
   1529  1.1  joerg <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
   1530  1.1  joerg 
   1531  1.1  joerg Given
   1532  1.1  joerg   Foo x = bar;
   1533  1.1  joerg   int y = sizeof(x) + alignof(x);
   1534  1.1  joerg unaryExprOrTypeTraitExpr()
   1535  1.1  joerg   matches sizeof(x) and alignof(x)
   1536  1.1  joerg </pre></td></tr>
   1537  1.1  joerg 
   1538  1.1  joerg 
   1539  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>
   1540  1.1  joerg <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
   1541  1.1  joerg 
   1542  1.1  joerg Example matches !a
   1543  1.1  joerg   !a || b
   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('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>
   1548  1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
   1549  1.1  joerg but could not be resolved to a specific declaration.
   1550  1.1  joerg 
   1551  1.1  joerg Given
   1552  1.1  joerg   template&lt;typename T&gt;
   1553  1.1  joerg   T foo() { T a; return a; }
   1554  1.1  joerg   template&lt;typename T&gt;
   1555  1.1  joerg   void bar() {
   1556  1.1  joerg     foo&lt;T&gt;();
   1557  1.1  joerg   }
   1558  1.1  joerg unresolvedLookupExpr()
   1559  1.1  joerg   matches foo&lt;T&gt;() </pre></td></tr>
   1560  1.1  joerg 
   1561  1.1  joerg 
   1562  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>
   1563  1.1  joerg <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
   1564  1.1  joerg 
   1565  1.1  joerg Given
   1566  1.1  joerg   struct X {
   1567  1.1  joerg     template &lt;class T&gt; void f();
   1568  1.1  joerg     void g();
   1569  1.1  joerg   };
   1570  1.1  joerg   template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
   1571  1.1  joerg unresolvedMemberExpr()
   1572  1.1  joerg   matches x.f&lt;T&gt;
   1573  1.1  joerg </pre></td></tr>
   1574  1.1  joerg 
   1575  1.1  joerg 
   1576  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>
   1577  1.1  joerg <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
   1578  1.1  joerg 
   1579  1.1  joerg Example match: "foo"_suffix
   1580  1.1  joerg </pre></td></tr>
   1581  1.1  joerg 
   1582  1.1  joerg 
   1583  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>
   1584  1.1  joerg <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
   1585  1.1  joerg 
   1586  1.1  joerg Given
   1587  1.1  joerg   while (true) {}
   1588  1.1  joerg whileStmt()
   1589  1.1  joerg   matches 'while (true) {}'.
   1590  1.1  joerg </pre></td></tr>
   1591  1.1  joerg 
   1592  1.1  joerg 
   1593  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>
   1594  1.1  joerg <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
   1595  1.1  joerg 
   1596  1.1  joerg Given
   1597  1.1  joerg   template &lt;typename T&gt; struct C {};
   1598  1.1  joerg   C&lt;int&gt; c;
   1599  1.1  joerg templateArgument()
   1600  1.1  joerg   matches 'int' in C&lt;int&gt;.
   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_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>
   1605  1.1  joerg <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
   1606  1.1  joerg 
   1607  1.1  joerg Given
   1608  1.1  joerg   template &lt;typename T&gt; class X { };
   1609  1.1  joerg   X&lt;int&gt; xi;
   1610  1.1  joerg templateName()
   1611  1.1  joerg   matches 'X' in X&lt;int&gt;.
   1612  1.1  joerg </pre></td></tr>
   1613  1.1  joerg 
   1614  1.1  joerg 
   1615  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>
   1616  1.1  joerg <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
   1617  1.1  joerg </pre></td></tr>
   1618  1.1  joerg 
   1619  1.1  joerg 
   1620  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>
   1621  1.1  joerg <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
   1622  1.1  joerg 
   1623  1.1  joerg Given
   1624  1.1  joerg   int a[] = { 2, 3 };
   1625  1.1  joerg   int b[4];
   1626  1.1  joerg   void f() { int c[a[0]]; }
   1627  1.1  joerg arrayType()
   1628  1.1  joerg   matches "int a[]", "int b[4]" and "int c[a[0]]";
   1629  1.1  joerg </pre></td></tr>
   1630  1.1  joerg 
   1631  1.1  joerg 
   1632  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>
   1633  1.1  joerg <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
   1634  1.1  joerg 
   1635  1.1  joerg Given
   1636  1.1  joerg   _Atomic(int) i;
   1637  1.1  joerg atomicType()
   1638  1.1  joerg   matches "_Atomic(int) i"
   1639  1.1  joerg </pre></td></tr>
   1640  1.1  joerg 
   1641  1.1  joerg 
   1642  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>
   1643  1.1  joerg <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
   1644  1.1  joerg 
   1645  1.1  joerg Given:
   1646  1.1  joerg   auto n = 4;
   1647  1.1  joerg   int v[] = { 2, 3 }
   1648  1.1  joerg   for (auto i : v) { }
   1649  1.1  joerg autoType()
   1650  1.1  joerg   matches "auto n" and "auto i"
   1651  1.1  joerg </pre></td></tr>
   1652  1.1  joerg 
   1653  1.1  joerg 
   1654  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>
   1655  1.1  joerg <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
   1656  1.1  joerg "void (^)(int)".
   1657  1.1  joerg 
   1658  1.1  joerg The pointee is always required to be a FunctionType.
   1659  1.1  joerg </pre></td></tr>
   1660  1.1  joerg 
   1661  1.1  joerg 
   1662  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>
   1663  1.1  joerg <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
   1664  1.1  joerg 
   1665  1.1  joerg Given
   1666  1.1  joerg   struct A {};
   1667  1.1  joerg   A a;
   1668  1.1  joerg   int b;
   1669  1.1  joerg   float c;
   1670  1.1  joerg   bool d;
   1671  1.1  joerg builtinType()
   1672  1.1  joerg   matches "int b", "float c" and "bool d"
   1673  1.1  joerg </pre></td></tr>
   1674  1.1  joerg 
   1675  1.1  joerg 
   1676  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>
   1677  1.1  joerg <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
   1678  1.1  joerg 
   1679  1.1  joerg Given
   1680  1.1  joerg   _Complex float f;
   1681  1.1  joerg complexType()
   1682  1.1  joerg   matches "_Complex float f"
   1683  1.1  joerg </pre></td></tr>
   1684  1.1  joerg 
   1685  1.1  joerg 
   1686  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>
   1687  1.1  joerg <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
   1688  1.1  joerg 
   1689  1.1  joerg Given
   1690  1.1  joerg   void() {
   1691  1.1  joerg     int a[2];
   1692  1.1  joerg     int b[] = { 2, 3 };
   1693  1.1  joerg     int c[b[0]];
   1694  1.1  joerg   }
   1695  1.1  joerg constantArrayType()
   1696  1.1  joerg   matches "int a[2]"
   1697  1.1  joerg </pre></td></tr>
   1698  1.1  joerg 
   1699  1.1  joerg 
   1700  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>
   1701  1.1  joerg <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
   1702  1.1  joerg Example matches i[] in declaration of f.
   1703  1.1  joerg     (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
   1704  1.1  joerg Example matches i[1].
   1705  1.1  joerg     (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
   1706  1.1  joerg   void f(int i[]) {
   1707  1.1  joerg     i[1] = 0;
   1708  1.1  joerg   }
   1709  1.1  joerg </pre></td></tr>
   1710  1.1  joerg 
   1711  1.1  joerg 
   1712  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>
   1713  1.1  joerg <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
   1714  1.1  joerg 
   1715  1.1  joerg Given:
   1716  1.1  joerg   short i = 1;
   1717  1.1  joerg   int j = 42;
   1718  1.1  joerg   decltype(i + j) result = i + j;
   1719  1.1  joerg decltypeType()
   1720  1.1  joerg   matches "decltype(i + j)"
   1721  1.1  joerg </pre></td></tr>
   1722  1.1  joerg 
   1723  1.1  joerg 
   1724  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>
   1725  1.1  joerg <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
   1726  1.1  joerg 
   1727  1.1  joerg Given
   1728  1.1  joerg   template&lt;typename T, int Size&gt;
   1729  1.1  joerg   class array {
   1730  1.1  joerg     T data[Size];
   1731  1.1  joerg   };
   1732  1.1  joerg dependentSizedArrayType
   1733  1.1  joerg   matches "T data[Size]"
   1734  1.1  joerg </pre></td></tr>
   1735  1.1  joerg 
   1736  1.1  joerg 
   1737  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>
   1738  1.1  joerg <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
   1739  1.1  joerg qualified name.
   1740  1.1  joerg 
   1741  1.1  joerg Given
   1742  1.1  joerg   namespace N {
   1743  1.1  joerg     namespace M {
   1744  1.1  joerg       class D {};
   1745  1.1  joerg     }
   1746  1.1  joerg   }
   1747  1.1  joerg   class C {};
   1748  1.1  joerg 
   1749  1.1  joerg   class C c;
   1750  1.1  joerg   N::M::D d;
   1751  1.1  joerg 
   1752  1.1  joerg elaboratedType() matches the type of the variable declarations of both
   1753  1.1  joerg c and d.
   1754  1.1  joerg </pre></td></tr>
   1755  1.1  joerg 
   1756  1.1  joerg 
   1757  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>
   1758  1.1  joerg <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
   1759  1.1  joerg 
   1760  1.1  joerg Given
   1761  1.1  joerg   enum C { Green };
   1762  1.1  joerg   enum class S { Red };
   1763  1.1  joerg 
   1764  1.1  joerg   C c;
   1765  1.1  joerg   S s;
   1766  1.1  joerg 
   1767  1.1  joerg enumType() matches the type of the variable declarations of both c and
   1768  1.1  joerg s.
   1769  1.1  joerg </pre></td></tr>
   1770  1.1  joerg 
   1771  1.1  joerg 
   1772  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>
   1773  1.1  joerg <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
   1774  1.1  joerg 
   1775  1.1  joerg Given
   1776  1.1  joerg   int (*f)(int);
   1777  1.1  joerg   void g();
   1778  1.1  joerg functionProtoType()
   1779  1.1  joerg   matches "int (*f)(int)" and the type of "g" in C++ mode.
   1780  1.1  joerg   In C mode, "g" is not matched because it does not contain a prototype.
   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_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>
   1785  1.1  joerg <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
   1786  1.1  joerg 
   1787  1.1  joerg Given
   1788  1.1  joerg   int (*f)(int);
   1789  1.1  joerg   void g();
   1790  1.1  joerg functionType()
   1791  1.1  joerg   matches "int (*f)(int)" and the type of "g".
   1792  1.1  joerg </pre></td></tr>
   1793  1.1  joerg 
   1794  1.1  joerg 
   1795  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>
   1796  1.1  joerg <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
   1797  1.1  joerg 
   1798  1.1  joerg Given
   1799  1.1  joerg   int a[] = { 2, 3 };
   1800  1.1  joerg   int b[42];
   1801  1.1  joerg   void f(int c[]) { int d[a[0]]; };
   1802  1.1  joerg incompleteArrayType()
   1803  1.1  joerg   matches "int a[]" and "int c[]"
   1804  1.1  joerg </pre></td></tr>
   1805  1.1  joerg 
   1806  1.1  joerg 
   1807  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>
   1808  1.1  joerg <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
   1809  1.1  joerg 
   1810  1.1  joerg Example matches S s, but not S&lt;T&gt; s.
   1811  1.1  joerg     (matcher = parmVarDecl(hasType(injectedClassNameType())))
   1812  1.1  joerg   template &lt;typename T&gt; struct S {
   1813  1.1  joerg     void f(S s);
   1814  1.1  joerg     void g(S&lt;T&gt; s);
   1815  1.1  joerg   };
   1816  1.1  joerg </pre></td></tr>
   1817  1.1  joerg 
   1818  1.1  joerg 
   1819  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>
   1820  1.1  joerg <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
   1821  1.1  joerg 
   1822  1.1  joerg Given:
   1823  1.1  joerg   int *a;
   1824  1.1  joerg   int &amp;b = *a;
   1825  1.1  joerg   int &amp;&amp;c = 1;
   1826  1.1  joerg   auto &amp;d = b;
   1827  1.1  joerg   auto &amp;&amp;e = c;
   1828  1.1  joerg   auto &amp;&amp;f = 2;
   1829  1.1  joerg   int g = 5;
   1830  1.1  joerg 
   1831  1.1  joerg lValueReferenceType() matches the types of b, d, and e. e is
   1832  1.1  joerg matched since the type is deduced as int&amp; by reference collapsing rules.
   1833  1.1  joerg </pre></td></tr>
   1834  1.1  joerg 
   1835  1.1  joerg 
   1836  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>
   1837  1.1  joerg <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
   1838  1.1  joerg Given
   1839  1.1  joerg   struct A { int i; }
   1840  1.1  joerg   A::* ptr = A::i;
   1841  1.1  joerg memberPointerType()
   1842  1.1  joerg   matches "A::* ptr"
   1843  1.1  joerg </pre></td></tr>
   1844  1.1  joerg 
   1845  1.1  joerg 
   1846  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>
   1847  1.1  joerg <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
   1848  1.1  joerg a pointer type, despite being syntactically similar.
   1849  1.1  joerg 
   1850  1.1  joerg Given
   1851  1.1  joerg   int *a;
   1852  1.1  joerg 
   1853  1.1  joerg   @interface Foo
   1854  1.1  joerg   @end
   1855  1.1  joerg   Foo *f;
   1856  1.1  joerg pointerType()
   1857  1.1  joerg   matches "Foo *f", but does not match "int *a".
   1858  1.1  joerg </pre></td></tr>
   1859  1.1  joerg 
   1860  1.1  joerg 
   1861  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>
   1862  1.1  joerg <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
   1863  1.1  joerg 
   1864  1.1  joerg Given
   1865  1.1  joerg   int (*ptr_to_array)[4];
   1866  1.1  joerg   int *array_of_ptrs[4];
   1867  1.1  joerg 
   1868  1.1  joerg varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
   1869  1.1  joerg array_of_ptrs.
   1870  1.1  joerg </pre></td></tr>
   1871  1.1  joerg 
   1872  1.1  joerg 
   1873  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>
   1874  1.1  joerg <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
   1875  1.1  joerg types.
   1876  1.1  joerg 
   1877  1.1  joerg Given
   1878  1.1  joerg   int *a;
   1879  1.1  joerg   int &amp;b = *a;
   1880  1.1  joerg   int c = 5;
   1881  1.1  joerg 
   1882  1.1  joerg   @interface Foo
   1883  1.1  joerg   @end
   1884  1.1  joerg   Foo *f;
   1885  1.1  joerg pointerType()
   1886  1.1  joerg   matches "int *a", but does not match "Foo *f".
   1887  1.1  joerg </pre></td></tr>
   1888  1.1  joerg 
   1889  1.1  joerg 
   1890  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>
   1891  1.1  joerg <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
   1892  1.1  joerg 
   1893  1.1  joerg Given:
   1894  1.1  joerg   int *a;
   1895  1.1  joerg   int &amp;b = *a;
   1896  1.1  joerg   int &amp;&amp;c = 1;
   1897  1.1  joerg   auto &amp;d = b;
   1898  1.1  joerg   auto &amp;&amp;e = c;
   1899  1.1  joerg   auto &amp;&amp;f = 2;
   1900  1.1  joerg   int g = 5;
   1901  1.1  joerg 
   1902  1.1  joerg rValueReferenceType() matches the types of c and f. e is not
   1903  1.1  joerg matched as it is deduced to int&amp; by reference collapsing rules.
   1904  1.1  joerg </pre></td></tr>
   1905  1.1  joerg 
   1906  1.1  joerg 
   1907  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>
   1908  1.1  joerg <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
   1909  1.1  joerg 
   1910  1.1  joerg Given
   1911  1.1  joerg   class C {};
   1912  1.1  joerg   struct S {};
   1913  1.1  joerg 
   1914  1.1  joerg   C c;
   1915  1.1  joerg   S s;
   1916  1.1  joerg 
   1917  1.1  joerg recordType() matches the type of the variable declarations of both c
   1918  1.1  joerg and s.
   1919  1.1  joerg </pre></td></tr>
   1920  1.1  joerg 
   1921  1.1  joerg 
   1922  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>
   1923  1.1  joerg <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
   1924  1.1  joerg 
   1925  1.1  joerg Given
   1926  1.1  joerg   int *a;
   1927  1.1  joerg   int &amp;b = *a;
   1928  1.1  joerg   int &amp;&amp;c = 1;
   1929  1.1  joerg   auto &amp;d = b;
   1930  1.1  joerg   auto &amp;&amp;e = c;
   1931  1.1  joerg   auto &amp;&amp;f = 2;
   1932  1.1  joerg   int g = 5;
   1933  1.1  joerg 
   1934  1.1  joerg referenceType() matches the types of b, c, d, e, and f.
   1935  1.1  joerg </pre></td></tr>
   1936  1.1  joerg 
   1937  1.1  joerg 
   1938  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>
   1939  1.1  joerg <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
   1940  1.1  joerg template type parameter.
   1941  1.1  joerg 
   1942  1.1  joerg Given
   1943  1.1  joerg   template &lt;typename T&gt;
   1944  1.1  joerg   void F(T t) {
   1945  1.1  joerg     int i = 1 + t;
   1946  1.1  joerg   }
   1947  1.1  joerg 
   1948  1.1  joerg substTemplateTypeParmType() matches the type of 't' but not '1'
   1949  1.1  joerg </pre></td></tr>
   1950  1.1  joerg 
   1951  1.1  joerg 
   1952  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>
   1953  1.1  joerg <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
   1954  1.1  joerg 
   1955  1.1  joerg Given
   1956  1.1  joerg   enum E {};
   1957  1.1  joerg   class C {};
   1958  1.1  joerg 
   1959  1.1  joerg   E e;
   1960  1.1  joerg   C c;
   1961  1.1  joerg 
   1962  1.1  joerg tagType() matches the type of the variable declarations of both e
   1963  1.1  joerg and c.
   1964  1.1  joerg </pre></td></tr>
   1965  1.1  joerg 
   1966  1.1  joerg 
   1967  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>
   1968  1.1  joerg <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
   1969  1.1  joerg 
   1970  1.1  joerg Given
   1971  1.1  joerg   template &lt;typename T&gt;
   1972  1.1  joerg   class C { };
   1973  1.1  joerg 
   1974  1.1  joerg   template class C&lt;int&gt;;  // A
   1975  1.1  joerg   C&lt;char&gt; var;            // B
   1976  1.1  joerg 
   1977  1.1  joerg templateSpecializationType() matches the type of the explicit
   1978  1.1  joerg instantiation in A and the type of the variable declaration in B.
   1979  1.1  joerg </pre></td></tr>
   1980  1.1  joerg 
   1981  1.1  joerg 
   1982  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>
   1983  1.1  joerg <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
   1984  1.1  joerg 
   1985  1.1  joerg Example matches T, but not int.
   1986  1.1  joerg     (matcher = templateTypeParmType())
   1987  1.1  joerg   template &lt;typename T&gt; void f(int i);
   1988  1.1  joerg </pre></td></tr>
   1989  1.1  joerg 
   1990  1.1  joerg 
   1991  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>
   1992  1.1  joerg <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
   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_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>
   1997  1.1  joerg <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
   1998  1.1  joerg 
   1999  1.1  joerg Given
   2000  1.1  joerg   typedef int X;
   2001  1.1  joerg typedefType()
   2002  1.1  joerg   matches "typedef int X"
   2003  1.1  joerg </pre></td></tr>
   2004  1.1  joerg 
   2005  1.1  joerg 
   2006  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>
   2007  1.1  joerg <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
   2008  1.1  joerg 
   2009  1.1  joerg Given:
   2010  1.1  joerg   typedef __underlying_type(T) type;
   2011  1.1  joerg unaryTransformType()
   2012  1.1  joerg   matches "__underlying_type(T)"
   2013  1.1  joerg </pre></td></tr>
   2014  1.1  joerg 
   2015  1.1  joerg 
   2016  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>
   2017  1.1  joerg <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
   2018  1.1  joerg integer-constant-expression.
   2019  1.1  joerg 
   2020  1.1  joerg Given
   2021  1.1  joerg   void f() {
   2022  1.1  joerg     int a[] = { 2, 3 }
   2023  1.1  joerg     int b[42];
   2024  1.1  joerg     int c[a[0]];
   2025  1.1  joerg   }
   2026  1.1  joerg variableArrayType()
   2027  1.1  joerg   matches "int c[a[0]]"
   2028  1.1  joerg </pre></td></tr>
   2029  1.1  joerg 
   2030  1.1  joerg <!--END_DECL_MATCHERS -->
   2031  1.1  joerg </table>
   2032  1.1  joerg 
   2033  1.1  joerg <!-- ======================================================================= -->
   2034  1.1  joerg <h2 id="narrowing-matchers">Narrowing Matchers</h2>
   2035  1.1  joerg <!-- ======================================================================= -->
   2036  1.1  joerg 
   2037  1.1  joerg <p>Narrowing matchers match certain attributes on the current node, thus
   2038  1.1  joerg narrowing down the set of nodes of the current type to match on.</p>
   2039  1.1  joerg 
   2040  1.1  joerg <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
   2041  1.1  joerg which allow users to create more powerful match expressions.</p>
   2042  1.1  joerg 
   2043  1.1  joerg <table>
   2044  1.1  joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
   2045  1.1  joerg <!-- START_NARROWING_MATCHERS -->
   2046  1.1  joerg 
   2047  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>
   2048  1.1  joerg <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
   2049  1.1  joerg 
   2050  1.1  joerg Usable as: Any Matcher
   2051  1.1  joerg </pre></td></tr>
   2052  1.1  joerg 
   2053  1.1  joerg 
   2054  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>
   2055  1.1  joerg <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
   2056  1.1  joerg 
   2057  1.1  joerg Usable as: Any Matcher
   2058  1.1  joerg </pre></td></tr>
   2059  1.1  joerg 
   2060  1.1  joerg 
   2061  1.1  joerg <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
   2062  1.1  joerg <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
   2063  1.1  joerg 
   2064  1.1  joerg Useful when another matcher requires a child matcher, but there's no
   2065  1.1  joerg additional constraint. This will often be used with an explicit conversion
   2066  1.1  joerg to an internal::Matcher&lt;&gt; type such as TypeMatcher.
   2067  1.1  joerg 
   2068  1.1  joerg Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
   2069  1.1  joerg "int* p" and "void f()" in
   2070  1.1  joerg   int* p;
   2071  1.1  joerg   void f();
   2072  1.1  joerg 
   2073  1.1  joerg Usable as: Any Matcher
   2074  1.1  joerg </pre></td></tr>
   2075  1.1  joerg 
   2076  1.1  joerg 
   2077  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>
   2078  1.1  joerg <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
   2079  1.1  joerg 
   2080  1.1  joerg Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
   2081  1.1  joerg   class X {};
   2082  1.1  joerg   class Y {};
   2083  1.1  joerg 
   2084  1.1  joerg Usable as: Any Matcher
   2085  1.1  joerg </pre></td></tr>
   2086  1.1  joerg 
   2087  1.1  joerg 
   2088  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>
   2089  1.1  joerg <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
   2090  1.1  joerg unary).
   2091  1.1  joerg 
   2092  1.1  joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   2093  1.1  joerg   !(a || b)
   2094  1.1  joerg </pre></td></tr>
   2095  1.1  joerg 
   2096  1.1  joerg 
   2097  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>
   2098  1.1  joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
   2099  1.1  joerg 
   2100  1.1  joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   2101  1.1  joerg   if (a == b)
   2102  1.1  joerg     a += b;
   2103  1.1  joerg 
   2104  1.1  joerg Example 2: matches s1 = s2
   2105  1.1  joerg            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   2106  1.1  joerg   struct S { S&amp; operator=(const S&amp;); };
   2107  1.1  joerg   void x() { S s1, s2; s1 = s2; })
   2108  1.1  joerg </pre></td></tr>
   2109  1.1  joerg 
   2110  1.1  joerg 
   2111  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('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
   2112  1.1  joerg <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
   2113  1.1  joerg 
   2114  1.1  joerg 
   2115  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('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
   2116  1.1  joerg <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
   2117  1.1  joerg 
   2118  1.1  joerg Given
   2119  1.1  joerg   f('false, 3.14, 42);
   2120  1.1  joerg characterLiteral(equals(0))
   2121  1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   2122  1.1  joerg   match false
   2123  1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   2124  1.1  joerg   match 3.14
   2125  1.1  joerg integerLiteral(equals(42))
   2126  1.1  joerg   matches 42
   2127  1.1  joerg 
   2128  1.1  joerg Note that you cannot directly match a negative numeric literal because the
   2129  1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   2130  1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   2131  1.1  joerg matcher to match the minus sign:
   2132  1.1  joerg 
   2133  1.1  joerg unaryOperator(hasOperatorName("-"),
   2134  1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   2135  1.1  joerg 
   2136  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;,
   2137  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;
   2138  1.1  joerg </pre></td></tr>
   2139  1.1  joerg 
   2140  1.1  joerg 
   2141  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>
   2142  1.1  joerg <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
   2143  1.1  joerg 
   2144  1.1  joerg 
   2145  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>
   2146  1.1  joerg <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
   2147  1.1  joerg 
   2148  1.1  joerg 
   2149  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>
   2150  1.1  joerg <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
   2151  1.1  joerg 
   2152  1.1  joerg Given
   2153  1.1  joerg   try {
   2154  1.1  joerg     // ...
   2155  1.1  joerg   } catch (int) {
   2156  1.1  joerg     // ...
   2157  1.1  joerg   } catch (...) {
   2158  1.1  joerg     // ...
   2159  1.1  joerg   }
   2160  1.1  joerg cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
   2161  1.1  joerg </pre></td></tr>
   2162  1.1  joerg 
   2163  1.1  joerg 
   2164  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>
   2165  1.1  joerg <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
   2166  1.1  joerg a specific number of arguments (including absent default arguments).
   2167  1.1  joerg 
   2168  1.1  joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   2169  1.1  joerg   void f(int x, int y);
   2170  1.1  joerg   f(0, 0);
   2171  1.1  joerg </pre></td></tr>
   2172  1.1  joerg 
   2173  1.1  joerg 
   2174  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>
   2175  1.1  joerg <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
   2176  1.1  joerg </pre></td></tr>
   2177  1.1  joerg 
   2178  1.1  joerg 
   2179  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>
   2180  1.1  joerg <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
   2181  1.1  joerg zero initialization.
   2182  1.1  joerg 
   2183  1.1  joerg Given
   2184  1.1  joerg void foo() {
   2185  1.1  joerg   struct point { double x; double y; };
   2186  1.1  joerg   point pt[2] = { { 1.0, 2.0 } };
   2187  1.1  joerg }
   2188  1.1  joerg initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
   2189  1.1  joerg will match the implicit array filler for pt[1].
   2190  1.1  joerg </pre></td></tr>
   2191  1.1  joerg 
   2192  1.1  joerg 
   2193  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>
   2194  1.1  joerg <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
   2195  1.1  joerg 
   2196  1.1  joerg Given
   2197  1.1  joerg   struct S {
   2198  1.1  joerg     S(); // #1
   2199  1.1  joerg     S(const S &amp;); // #2
   2200  1.1  joerg     S(S &amp;&amp;); // #3
   2201  1.1  joerg   };
   2202  1.1  joerg cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
   2203  1.1  joerg </pre></td></tr>
   2204  1.1  joerg 
   2205  1.1  joerg 
   2206  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>
   2207  1.1  joerg <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
   2208  1.1  joerg 
   2209  1.1  joerg Given
   2210  1.1  joerg   struct S {
   2211  1.1  joerg     S(); // #1
   2212  1.1  joerg     S(const S &amp;); // #2
   2213  1.1  joerg     S(S &amp;&amp;); // #3
   2214  1.1  joerg   };
   2215  1.1  joerg cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
   2216  1.1  joerg </pre></td></tr>
   2217  1.1  joerg 
   2218  1.1  joerg 
   2219  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>
   2220  1.1  joerg <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
   2221  1.1  joerg 
   2222  1.1  joerg Given
   2223  1.1  joerg   struct S {
   2224  1.1  joerg     S(); // #1
   2225  1.1  joerg     S(int) {} // #2
   2226  1.1  joerg     S(S &amp;&amp;) : S() {} // #3
   2227  1.1  joerg   };
   2228  1.1  joerg   S::S() : S(0) {} // #4
   2229  1.1  joerg cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
   2230  1.1  joerg #1 or #2.
   2231  1.1  joerg </pre></td></tr>
   2232  1.1  joerg 
   2233  1.1  joerg 
   2234  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>
   2235  1.1  joerg <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
   2236  1.1  joerg that have an explicit specifier if this explicit specifier is resolved to
   2237  1.1  joerg true.
   2238  1.1  joerg 
   2239  1.1  joerg Given
   2240  1.1  joerg   template&lt;bool b&gt;
   2241  1.1  joerg   struct S {
   2242  1.1  joerg     S(int); // #1
   2243  1.1  joerg     explicit S(double); // #2
   2244  1.1  joerg     operator int(); // #3
   2245  1.1  joerg     explicit operator bool(); // #4
   2246  1.1  joerg     explicit(false) S(bool) // # 7
   2247  1.1  joerg     explicit(true) S(char) // # 8
   2248  1.1  joerg     explicit(b) S(S) // # 9
   2249  1.1  joerg   };
   2250  1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   2251  1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   2252  1.1  joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   2253  1.1  joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
   2254  1.1  joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   2255  1.1  joerg </pre></td></tr>
   2256  1.1  joerg 
   2257  1.1  joerg 
   2258  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>
   2259  1.1  joerg <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
   2260  1.1  joerg 
   2261  1.1  joerg Given
   2262  1.1  joerg   struct S {
   2263  1.1  joerg     S(); // #1
   2264  1.1  joerg     S(const S &amp;); // #2
   2265  1.1  joerg     S(S &amp;&amp;); // #3
   2266  1.1  joerg   };
   2267  1.1  joerg cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
   2268  1.1  joerg </pre></td></tr>
   2269  1.1  joerg 
   2270  1.1  joerg 
   2271  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>
   2272  1.1  joerg <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
   2273  1.1  joerg that have an explicit specifier if this explicit specifier is resolved to
   2274  1.1  joerg true.
   2275  1.1  joerg 
   2276  1.1  joerg Given
   2277  1.1  joerg   template&lt;bool b&gt;
   2278  1.1  joerg   struct S {
   2279  1.1  joerg     S(int); // #1
   2280  1.1  joerg     explicit S(double); // #2
   2281  1.1  joerg     operator int(); // #3
   2282  1.1  joerg     explicit operator bool(); // #4
   2283  1.1  joerg     explicit(false) S(bool) // # 7
   2284  1.1  joerg     explicit(true) S(char) // # 8
   2285  1.1  joerg     explicit(b) S(S) // # 9
   2286  1.1  joerg   };
   2287  1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   2288  1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   2289  1.1  joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   2290  1.1  joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
   2291  1.1  joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   2292  1.1  joerg </pre></td></tr>
   2293  1.1  joerg 
   2294  1.1  joerg 
   2295  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>
   2296  1.1  joerg <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
   2297  1.1  joerg opposed to a member.
   2298  1.1  joerg 
   2299  1.1  joerg Given
   2300  1.1  joerg   struct B {};
   2301  1.1  joerg   struct D : B {
   2302  1.1  joerg     int I;
   2303  1.1  joerg     D(int i) : I(i) {}
   2304  1.1  joerg   };
   2305  1.1  joerg   struct E : B {
   2306  1.1  joerg     E() : B() {}
   2307  1.1  joerg   };
   2308  1.1  joerg cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
   2309  1.1  joerg   will match E(), but not match D(int).
   2310  1.1  joerg </pre></td></tr>
   2311  1.1  joerg 
   2312  1.1  joerg 
   2313  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>
   2314  1.1  joerg <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
   2315  1.1  joerg opposed to a base.
   2316  1.1  joerg 
   2317  1.1  joerg Given
   2318  1.1  joerg   struct B {};
   2319  1.1  joerg   struct D : B {
   2320  1.1  joerg     int I;
   2321  1.1  joerg     D(int i) : I(i) {}
   2322  1.1  joerg   };
   2323  1.1  joerg   struct E : B {
   2324  1.1  joerg     E() : B() {}
   2325  1.1  joerg   };
   2326  1.1  joerg cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
   2327  1.1  joerg   will match D(int), but not match E().
   2328  1.1  joerg </pre></td></tr>
   2329  1.1  joerg 
   2330  1.1  joerg 
   2331  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>
   2332  1.1  joerg <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
   2333  1.1  joerg code (as opposed to implicitly added by the compiler).
   2334  1.1  joerg 
   2335  1.1  joerg Given
   2336  1.1  joerg   struct Foo {
   2337  1.1  joerg     Foo() { }
   2338  1.1  joerg     Foo(int) : foo_("A") { }
   2339  1.1  joerg     string foo_;
   2340  1.1  joerg   };
   2341  1.1  joerg cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
   2342  1.1  joerg   will match Foo(int), but not Foo()
   2343  1.1  joerg </pre></td></tr>
   2344  1.1  joerg 
   2345  1.1  joerg 
   2346  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>
   2347  1.1  joerg <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
   2348  1.1  joerg that have an explicit specifier if this explicit specifier is resolved to
   2349  1.1  joerg true.
   2350  1.1  joerg 
   2351  1.1  joerg Given
   2352  1.1  joerg   template&lt;bool b&gt;
   2353  1.1  joerg   struct S {
   2354  1.1  joerg     S(int); // #1
   2355  1.1  joerg     explicit S(double); // #2
   2356  1.1  joerg     operator int(); // #3
   2357  1.1  joerg     explicit operator bool(); // #4
   2358  1.1  joerg     explicit(false) S(bool) // # 7
   2359  1.1  joerg     explicit(true) S(char) // # 8
   2360  1.1  joerg     explicit(b) S(S) // # 9
   2361  1.1  joerg   };
   2362  1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   2363  1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   2364  1.1  joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
   2365  1.1  joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
   2366  1.1  joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
   2367  1.1  joerg </pre></td></tr>
   2368  1.1  joerg 
   2369  1.1  joerg 
   2370  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>
   2371  1.1  joerg <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
   2372  1.1  joerg to '.'.
   2373  1.1  joerg 
   2374  1.1  joerg Member calls on the implicit this pointer match as called with '-&gt;'.
   2375  1.1  joerg 
   2376  1.1  joerg Given
   2377  1.1  joerg   class Y {
   2378  1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   2379  1.1  joerg     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   2380  1.1  joerg     int a;
   2381  1.1  joerg     static int b;
   2382  1.1  joerg   };
   2383  1.1  joerg   template &lt;class T&gt;
   2384  1.1  joerg   class Z {
   2385  1.1  joerg     void x() { this-&gt;m; }
   2386  1.1  joerg   };
   2387  1.1  joerg memberExpr(isArrow())
   2388  1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   2389  1.1  joerg cxxDependentScopeMemberExpr(isArrow())
   2390  1.1  joerg   matches this-&gt;m
   2391  1.1  joerg unresolvedMemberExpr(isArrow())
   2392  1.1  joerg   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   2393  1.1  joerg </pre></td></tr>
   2394  1.1  joerg 
   2395  1.1  joerg 
   2396  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>
   2397  1.1  joerg <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
   2398  1.1  joerg 
   2399  1.1  joerg Given
   2400  1.1  joerg struct A {
   2401  1.1  joerg   void foo() const;
   2402  1.1  joerg   void bar();
   2403  1.1  joerg };
   2404  1.1  joerg 
   2405  1.1  joerg cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
   2406  1.1  joerg </pre></td></tr>
   2407  1.1  joerg 
   2408  1.1  joerg 
   2409  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>
   2410  1.1  joerg <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
   2411  1.1  joerg operator.
   2412  1.1  joerg 
   2413  1.1  joerg Given
   2414  1.1  joerg struct A {
   2415  1.1  joerg   A &amp;operator=(const A &amp;);
   2416  1.1  joerg   A &amp;operator=(A &amp;&amp;);
   2417  1.1  joerg };
   2418  1.1  joerg 
   2419  1.1  joerg cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
   2420  1.1  joerg the second one.
   2421  1.1  joerg </pre></td></tr>
   2422  1.1  joerg 
   2423  1.1  joerg 
   2424  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>
   2425  1.1  joerg <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
   2426  1.1  joerg 
   2427  1.1  joerg Given:
   2428  1.1  joerg   class A final {};
   2429  1.1  joerg 
   2430  1.1  joerg   struct B {
   2431  1.1  joerg     virtual void f();
   2432  1.1  joerg   };
   2433  1.1  joerg 
   2434  1.1  joerg   struct C : B {
   2435  1.1  joerg     void f() final;
   2436  1.1  joerg   };
   2437  1.1  joerg matches A and C::f, but not B, C, or B::f
   2438  1.1  joerg </pre></td></tr>
   2439  1.1  joerg 
   2440  1.1  joerg 
   2441  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>
   2442  1.1  joerg <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
   2443  1.1  joerg operator.
   2444  1.1  joerg 
   2445  1.1  joerg Given
   2446  1.1  joerg struct A {
   2447  1.1  joerg   A &amp;operator=(const A &amp;);
   2448  1.1  joerg   A &amp;operator=(A &amp;&amp;);
   2449  1.1  joerg };
   2450  1.1  joerg 
   2451  1.1  joerg cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
   2452  1.1  joerg the first one.
   2453  1.1  joerg </pre></td></tr>
   2454  1.1  joerg 
   2455  1.1  joerg 
   2456  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>
   2457  1.1  joerg <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
   2458  1.1  joerg 
   2459  1.1  joerg Given
   2460  1.1  joerg   class A {
   2461  1.1  joerg    public:
   2462  1.1  joerg     virtual void x();
   2463  1.1  joerg   };
   2464  1.1  joerg   class B : public A {
   2465  1.1  joerg    public:
   2466  1.1  joerg     virtual void x();
   2467  1.1  joerg   };
   2468  1.1  joerg   matches B::x
   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_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
   2473  1.1  joerg <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
   2474  1.1  joerg 
   2475  1.1  joerg Given
   2476  1.1  joerg   class A {
   2477  1.1  joerg    public:
   2478  1.1  joerg     virtual void x() = 0;
   2479  1.1  joerg   };
   2480  1.1  joerg   matches A::x
   2481  1.1  joerg </pre></td></tr>
   2482  1.1  joerg 
   2483  1.1  joerg 
   2484  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>
   2485  1.1  joerg <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
   2486  1.1  joerg 
   2487  1.1  joerg Given
   2488  1.1  joerg   struct S {
   2489  1.1  joerg     S(); // #1
   2490  1.1  joerg     S(const S &amp;) = default; // #2
   2491  1.1  joerg     S(S &amp;&amp;) = delete; // #3
   2492  1.1  joerg   };
   2493  1.1  joerg cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
   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_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
   2498  1.1  joerg <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
   2499  1.1  joerg 
   2500  1.1  joerg Given
   2501  1.1  joerg   class A {
   2502  1.1  joerg    public:
   2503  1.1  joerg     virtual void x();
   2504  1.1  joerg   };
   2505  1.1  joerg   matches A::x
   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_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
   2510  1.1  joerg <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
   2511  1.1  joerg 
   2512  1.1  joerg Given
   2513  1.1  joerg   class A {
   2514  1.1  joerg    public:
   2515  1.1  joerg     virtual void x();
   2516  1.1  joerg   };
   2517  1.1  joerg   class B : public A {
   2518  1.1  joerg    public:
   2519  1.1  joerg     void x();
   2520  1.1  joerg   };
   2521  1.1  joerg   matches A::x but not B::x
   2522  1.1  joerg </pre></td></tr>
   2523  1.1  joerg 
   2524  1.1  joerg 
   2525  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>
   2526  1.1  joerg <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
   2527  1.1  joerg 
   2528  1.1  joerg Given:
   2529  1.1  joerg   MyClass *p1 = new MyClass[10];
   2530  1.1  joerg cxxNewExpr(isArray())
   2531  1.1  joerg   matches the expression 'new MyClass[10]'.
   2532  1.1  joerg </pre></td></tr>
   2533  1.1  joerg 
   2534  1.1  joerg 
   2535  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>
   2536  1.1  joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
   2537  1.1  joerg 
   2538  1.1  joerg Matches overloaded operator names specified in strings without the
   2539  1.1  joerg "operator" prefix: e.g. "&lt;&lt;".
   2540  1.1  joerg 
   2541  1.1  joerg Given:
   2542  1.1  joerg   class A { int operator*(); };
   2543  1.1  joerg   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
   2544  1.1  joerg   A a;
   2545  1.1  joerg   a &lt;&lt; a;   // &lt;-- This matches
   2546  1.1  joerg 
   2547  1.1  joerg cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
   2548  1.1  joerg specified line and
   2549  1.1  joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
   2550  1.1  joerg matches the declaration of A.
   2551  1.1  joerg 
   2552  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;
   2553  1.1  joerg </pre></td></tr>
   2554  1.1  joerg 
   2555  1.1  joerg 
   2556  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>
   2557  1.1  joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
   2558  1.1  joerg 
   2559  1.1  joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   2560  1.1  joerg   if (a == b)
   2561  1.1  joerg     a += b;
   2562  1.1  joerg 
   2563  1.1  joerg Example 2: matches s1 = s2
   2564  1.1  joerg            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   2565  1.1  joerg   struct S { S&amp; operator=(const S&amp;); };
   2566  1.1  joerg   void x() { S s1, s2; s1 = s2; })
   2567  1.1  joerg </pre></td></tr>
   2568  1.1  joerg 
   2569  1.1  joerg 
   2570  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>
   2571  1.1  joerg <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
   2572  1.1  joerg 
   2573  1.1  joerg Example matches x (matcher = cxxRecordDecl(hasDefinition()))
   2574  1.1  joerg class x {};
   2575  1.1  joerg class y;
   2576  1.1  joerg </pre></td></tr>
   2577  1.1  joerg 
   2578  1.1  joerg 
   2579  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>
   2580  1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
   2581  1.1  joerg </pre></td></tr>
   2582  1.1  joerg 
   2583  1.1  joerg 
   2584  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>
   2585  1.1  joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
   2586  1.1  joerg </pre></td></tr>
   2587  1.1  joerg 
   2588  1.1  joerg 
   2589  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>
   2590  1.1  joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
   2591  1.1  joerg static member variable template instantiations.
   2592  1.1  joerg 
   2593  1.1  joerg Given
   2594  1.1  joerg   template&lt;typename T&gt; void A(T t) { }
   2595  1.1  joerg   template&lt;&gt; void A(int N) { }
   2596  1.1  joerg functionDecl(isExplicitTemplateSpecialization())
   2597  1.1  joerg   matches the specialization A&lt;int&gt;().
   2598  1.1  joerg 
   2599  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;
   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_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
   2604  1.1  joerg <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
   2605  1.1  joerg 
   2606  1.1  joerg Given:
   2607  1.1  joerg   class A final {};
   2608  1.1  joerg 
   2609  1.1  joerg   struct B {
   2610  1.1  joerg     virtual void f();
   2611  1.1  joerg   };
   2612  1.1  joerg 
   2613  1.1  joerg   struct C : B {
   2614  1.1  joerg     void f() final;
   2615  1.1  joerg   };
   2616  1.1  joerg matches A and C::f, but not B, C, or B::f
   2617  1.1  joerg </pre></td></tr>
   2618  1.1  joerg 
   2619  1.1  joerg 
   2620  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>
   2621  1.1  joerg <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
   2622  1.1  joerg 
   2623  1.1  joerg Given:
   2624  1.1  joerg   auto x = []{};
   2625  1.1  joerg 
   2626  1.1  joerg cxxRecordDecl(isLambda()) matches the implicit class declaration of
   2627  1.1  joerg decltype(x)
   2628  1.1  joerg </pre></td></tr>
   2629  1.1  joerg 
   2630  1.1  joerg 
   2631  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>
   2632  1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
   2633  1.1  joerg isSameOrDerivedFrom(hasName(...)).
   2634  1.1  joerg </pre></td></tr>
   2635  1.1  joerg 
   2636  1.1  joerg 
   2637  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>
   2638  1.1  joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
   2639  1.1  joerg member variable template instantiations.
   2640  1.1  joerg 
   2641  1.1  joerg Given
   2642  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   2643  1.1  joerg or
   2644  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   2645  1.1  joerg or
   2646  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   2647  1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   2648  1.1  joerg   matches the template instantiation of X&lt;A&gt;.
   2649  1.1  joerg 
   2650  1.1  joerg But given
   2651  1.1  joerg   template &lt;typename T&gt;  class X {}; class A {};
   2652  1.1  joerg   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   2653  1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   2654  1.1  joerg   does not match, as X&lt;A&gt; is an explicit template specialization.
   2655  1.1  joerg 
   2656  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;
   2657  1.1  joerg </pre></td></tr>
   2658  1.1  joerg 
   2659  1.1  joerg 
   2660  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>
   2661  1.1  joerg <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
   2662  1.1  joerg a specific number of arguments (including absent default arguments).
   2663  1.1  joerg 
   2664  1.1  joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   2665  1.1  joerg   void f(int x, int y);
   2666  1.1  joerg   f(0, 0);
   2667  1.1  joerg </pre></td></tr>
   2668  1.1  joerg 
   2669  1.1  joerg 
   2670  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>
   2671  1.1  joerg <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
   2672  1.1  joerg 
   2673  1.1  joerg Example matches y(x) but not y(42) or NS::y(x).
   2674  1.1  joerg   namespace NS {
   2675  1.1  joerg     struct X {};
   2676  1.1  joerg     void y(X);
   2677  1.1  joerg   }
   2678  1.1  joerg 
   2679  1.1  joerg   void y(...);
   2680  1.1  joerg 
   2681  1.1  joerg   void test() {
   2682  1.1  joerg     NS::X x;
   2683  1.1  joerg     y(x); // Matches
   2684  1.1  joerg     NS::y(x); // Doesn't match
   2685  1.1  joerg     y(42); // Doesn't match
   2686  1.1  joerg     using NS::y;
   2687  1.1  joerg     y(x); // Found by both unqualified lookup and ADL, doesn't match
   2688  1.1  joerg    }
   2689  1.1  joerg </pre></td></tr>
   2690  1.1  joerg 
   2691  1.1  joerg 
   2692  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>
   2693  1.1  joerg <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
   2694  1.1  joerg 
   2695  1.1  joerg Example: matches the implicit cast around 0
   2696  1.1  joerg (matcher = castExpr(hasCastKind(CK_NullToPointer)))
   2697  1.1  joerg   int *p = 0;
   2698  1.1  joerg 
   2699  1.1  joerg If the matcher is use from clang-query, CastKind parameter
   2700  1.1  joerg should be passed as a quoted string. e.g., ofKind("CK_NullToPointer").
   2701  1.1  joerg </pre></td></tr>
   2702  1.1  joerg 
   2703  1.1  joerg 
   2704  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>
   2705  1.1  joerg <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
   2706  1.1  joerg 
   2707  1.1  joerg 
   2708  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>
   2709  1.1  joerg <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
   2710  1.1  joerg 
   2711  1.1  joerg Given
   2712  1.1  joerg   f('false, 3.14, 42);
   2713  1.1  joerg characterLiteral(equals(0))
   2714  1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   2715  1.1  joerg   match false
   2716  1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   2717  1.1  joerg   match 3.14
   2718  1.1  joerg integerLiteral(equals(42))
   2719  1.1  joerg   matches 42
   2720  1.1  joerg 
   2721  1.1  joerg Note that you cannot directly match a negative numeric literal because the
   2722  1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   2723  1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   2724  1.1  joerg matcher to match the minus sign:
   2725  1.1  joerg 
   2726  1.1  joerg unaryOperator(hasOperatorName("-"),
   2727  1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   2728  1.1  joerg 
   2729  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;,
   2730  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;
   2731  1.1  joerg </pre></td></tr>
   2732  1.1  joerg 
   2733  1.1  joerg 
   2734  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>
   2735  1.1  joerg <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
   2736  1.1  joerg 
   2737  1.1  joerg 
   2738  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>
   2739  1.1  joerg <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
   2740  1.1  joerg 
   2741  1.1  joerg 
   2742  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>
   2743  1.1  joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
   2744  1.1  joerg 
   2745  1.1  joerg Given
   2746  1.1  joerg   template&lt;typename T&gt; struct C {};
   2747  1.1  joerg   C&lt;int&gt; c;
   2748  1.1  joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
   2749  1.1  joerg   matches C&lt;int&gt;.
   2750  1.1  joerg </pre></td></tr>
   2751  1.1  joerg 
   2752  1.1  joerg 
   2753  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>
   2754  1.1  joerg <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
   2755  1.1  joerg child statements.
   2756  1.1  joerg 
   2757  1.1  joerg Example: Given
   2758  1.1  joerg   { for (;;) {} }
   2759  1.1  joerg compoundStmt(statementCountIs(0)))
   2760  1.1  joerg   matches '{}'
   2761  1.1  joerg   but does not match the outer compound statement.
   2762  1.1  joerg </pre></td></tr>
   2763  1.1  joerg 
   2764  1.1  joerg 
   2765  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>
   2766  1.1  joerg <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
   2767  1.1  joerg 
   2768  1.1  joerg Given
   2769  1.1  joerg   int a[42];
   2770  1.1  joerg   int b[2 * 21];
   2771  1.1  joerg   int c[41], d[43];
   2772  1.1  joerg   char *s = "abcd";
   2773  1.1  joerg   wchar_t *ws = L"abcd";
   2774  1.1  joerg   char *w = "a";
   2775  1.1  joerg constantArrayType(hasSize(42))
   2776  1.1  joerg   matches "int a[42]" and "int b[2 * 21]"
   2777  1.1  joerg stringLiteral(hasSize(4))
   2778  1.1  joerg   matches "abcd", L"abcd"
   2779  1.1  joerg </pre></td></tr>
   2780  1.1  joerg 
   2781  1.1  joerg 
   2782  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>
   2783  1.1  joerg <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
   2784  1.1  joerg declarations.
   2785  1.1  joerg 
   2786  1.1  joerg Example: Given
   2787  1.1  joerg   int a, b;
   2788  1.1  joerg   int c;
   2789  1.1  joerg   int d = 2, e;
   2790  1.1  joerg declCountIs(2)
   2791  1.1  joerg   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
   2792  1.1  joerg </pre></td></tr>
   2793  1.1  joerg 
   2794  1.1  joerg 
   2795  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>
   2796  1.1  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
   2797  1.1  joerg 
   2798  1.1  joerg Matches a node if it equals the node previously bound to ID.
   2799  1.1  joerg 
   2800  1.1  joerg Given
   2801  1.1  joerg   class X { int a; int b; };
   2802  1.1  joerg cxxRecordDecl(
   2803  1.1  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   2804  1.1  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   2805  1.1  joerg   matches the class X, as a and b have the same type.
   2806  1.1  joerg 
   2807  1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   2808  1.1  joerg equalsBoundNodes acts as a filter.
   2809  1.1  joerg For example:
   2810  1.1  joerg compoundStmt(
   2811  1.1  joerg     forEachDescendant(varDecl().bind("d")),
   2812  1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   2813  1.1  joerg will trigger a match for each combination of variable declaration
   2814  1.1  joerg and reference to that variable declaration within a compound statement.
   2815  1.1  joerg </pre></td></tr>
   2816  1.1  joerg 
   2817  1.1  joerg 
   2818  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>
   2819  1.1  joerg <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
   2820  1.1  joerg 
   2821  1.1  joerg Decl has pointer identity in the AST.
   2822  1.1  joerg </pre></td></tr>
   2823  1.1  joerg 
   2824  1.1  joerg 
   2825  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>
   2826  1.1  joerg <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
   2827  1.1  joerg 
   2828  1.1  joerg Given
   2829  1.1  joerg   __attribute__((device)) void f() { ... }
   2830  1.1  joerg decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
   2831  1.1  joerg f. If the matcher is used from clang-query, attr::Kind parameter should be
   2832  1.1  joerg passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
   2833  1.1  joerg </pre></td></tr>
   2834  1.1  joerg 
   2835  1.1  joerg 
   2836  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('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
   2837  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
   2838  1.1  joerg partially matching a given regex.
   2839  1.1  joerg 
   2840  1.1  joerg Example matches Y but not X
   2841  1.1  joerg     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   2842  1.1  joerg   #include "ASTMatcher.h"
   2843  1.1  joerg   class X {};
   2844  1.1  joerg ASTMatcher.h:
   2845  1.1  joerg   class Y {};
   2846  1.1  joerg 
   2847  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;
   2848  1.1  joerg </pre></td></tr>
   2849  1.1  joerg 
   2850  1.1  joerg 
   2851  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>
   2852  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
   2853  1.1  joerg 
   2854  1.1  joerg Example matches X but not Y
   2855  1.1  joerg   (matcher = cxxRecordDecl(isExpansionInMainFile())
   2856  1.1  joerg   #include &lt;Y.h&gt;
   2857  1.1  joerg   class X {};
   2858  1.1  joerg Y.h:
   2859  1.1  joerg   class Y {};
   2860  1.1  joerg 
   2861  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;
   2862  1.1  joerg </pre></td></tr>
   2863  1.1  joerg 
   2864  1.1  joerg 
   2865  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>
   2866  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
   2867  1.1  joerg 
   2868  1.1  joerg Example matches Y but not X
   2869  1.1  joerg     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   2870  1.1  joerg   #include &lt;SystemHeader.h&gt;
   2871  1.1  joerg   class X {};
   2872  1.1  joerg SystemHeader.h:
   2873  1.1  joerg   class Y {};
   2874  1.1  joerg 
   2875  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;
   2876  1.1  joerg </pre></td></tr>
   2877  1.1  joerg 
   2878  1.1  joerg 
   2879  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>
   2880  1.1  joerg <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
   2881  1.1  joerg by the compiler (eg. implicit default/copy constructors).
   2882  1.1  joerg </pre></td></tr>
   2883  1.1  joerg 
   2884  1.1  joerg 
   2885  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>
   2886  1.1  joerg <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
   2887  1.1  joerg 
   2888  1.1  joerg Given
   2889  1.1  joerg   class vector {};
   2890  1.1  joerg   namespace foo {
   2891  1.1  joerg     class vector {};
   2892  1.1  joerg     namespace std {
   2893  1.1  joerg       class vector {};
   2894  1.1  joerg     }
   2895  1.1  joerg   }
   2896  1.1  joerg   namespace std {
   2897  1.1  joerg     inline namespace __1 {
   2898  1.1  joerg       class vector {}; // #1
   2899  1.1  joerg       namespace experimental {
   2900  1.1  joerg         class vector {};
   2901  1.1  joerg       }
   2902  1.1  joerg     }
   2903  1.1  joerg   }
   2904  1.1  joerg cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
   2905  1.1  joerg </pre></td></tr>
   2906  1.1  joerg 
   2907  1.1  joerg 
   2908  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('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
   2909  1.1  joerg <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
   2910  1.1  joerg 
   2911  1.1  joerg Given
   2912  1.1  joerg   class C {
   2913  1.1  joerg   public:    int a;
   2914  1.1  joerg   protected: int b;
   2915  1.1  joerg   private:   int c;
   2916  1.1  joerg   };
   2917  1.1  joerg fieldDecl(isPrivate())
   2918  1.1  joerg   matches 'int c;'
   2919  1.1  joerg </pre></td></tr>
   2920  1.1  joerg 
   2921  1.1  joerg 
   2922  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>
   2923  1.1  joerg <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
   2924  1.1  joerg 
   2925  1.1  joerg Given
   2926  1.1  joerg   class C {
   2927  1.1  joerg   public:    int a;
   2928  1.1  joerg   protected: int b;
   2929  1.1  joerg   private:   int c;
   2930  1.1  joerg   };
   2931  1.1  joerg fieldDecl(isProtected())
   2932  1.1  joerg   matches 'int b;'
   2933  1.1  joerg </pre></td></tr>
   2934  1.1  joerg 
   2935  1.1  joerg 
   2936  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>
   2937  1.1  joerg <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
   2938  1.1  joerg 
   2939  1.1  joerg Given
   2940  1.1  joerg   class C {
   2941  1.1  joerg   public:    int a;
   2942  1.1  joerg   protected: int b;
   2943  1.1  joerg   private:   int c;
   2944  1.1  joerg   };
   2945  1.1  joerg fieldDecl(isPublic())
   2946  1.1  joerg   matches 'int a;'
   2947  1.1  joerg </pre></td></tr>
   2948  1.1  joerg 
   2949  1.1  joerg 
   2950  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>
   2951  1.1  joerg <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
   2952  1.1  joerg a specific number of designators.
   2953  1.1  joerg 
   2954  1.1  joerg Example: Given
   2955  1.1  joerg   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
   2956  1.1  joerg   point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
   2957  1.1  joerg designatorCountIs(2)
   2958  1.1  joerg   matches '{ [2].y = 1.0, [0].x = 1.0 }',
   2959  1.1  joerg   but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
   2960  1.1  joerg </pre></td></tr>
   2961  1.1  joerg 
   2962  1.1  joerg 
   2963  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>
   2964  1.1  joerg <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
   2965  1.1  joerg 
   2966  1.1  joerg Example matches Y (matcher = enumDecl(isScoped()))
   2967  1.1  joerg enum X {};
   2968  1.1  joerg enum class Y {};
   2969  1.1  joerg </pre></td></tr>
   2970  1.1  joerg 
   2971  1.1  joerg 
   2972  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>
   2973  1.1  joerg <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
   2974  1.1  joerg neither type- nor value-dependent.
   2975  1.1  joerg 
   2976  1.1  joerg In the following example, the expression sizeof(sizeof(T() + T()))
   2977  1.1  joerg is instantiation-dependent (since it involves a template parameter T),
   2978  1.1  joerg but is neither type- nor value-dependent, since the type of the inner
   2979  1.1  joerg sizeof is known (std::size_t) and therefore the size of the outer
   2980  1.1  joerg sizeof is known.
   2981  1.1  joerg   template&lt;typename T&gt;
   2982  1.1  joerg   void f(T x, T y) { sizeof(sizeof(T() + T()); }
   2983  1.1  joerg expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
   2984  1.1  joerg </pre></td></tr>
   2985  1.1  joerg 
   2986  1.1  joerg 
   2987  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>
   2988  1.1  joerg <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
   2989  1.1  joerg is not yet instantiated.
   2990  1.1  joerg 
   2991  1.1  joerg For example, the expressions "x" and "x + y" are type-dependent in
   2992  1.1  joerg the following code, but "y" is not type-dependent:
   2993  1.1  joerg   template&lt;typename T&gt;
   2994  1.1  joerg   void add(T x, int y) {
   2995  1.1  joerg     x + y;
   2996  1.1  joerg   }
   2997  1.1  joerg expr(isTypeDependent()) matches x + y
   2998  1.1  joerg </pre></td></tr>
   2999  1.1  joerg 
   3000  1.1  joerg 
   3001  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>
   3002  1.1  joerg <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
   3003  1.1  joerg non-type template parameter.
   3004  1.1  joerg 
   3005  1.1  joerg For example, the array bound of "Chars" in the following example is
   3006  1.1  joerg value-dependent.
   3007  1.1  joerg   template&lt;int Size&gt; int f() { return Size; }
   3008  1.1  joerg expr(isValueDependent()) matches return Size
   3009  1.1  joerg </pre></td></tr>
   3010  1.1  joerg 
   3011  1.1  joerg 
   3012  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>
   3013  1.1  joerg <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
   3014  1.1  joerg bit width.
   3015  1.1  joerg 
   3016  1.1  joerg Given
   3017  1.1  joerg   class C {
   3018  1.1  joerg     int a : 2;
   3019  1.1  joerg     int b : 4;
   3020  1.1  joerg     int c : 2;
   3021  1.1  joerg   };
   3022  1.1  joerg fieldDecl(hasBitWidth(2))
   3023  1.1  joerg   matches 'int a;' and 'int c;' but not 'int b;'.
   3024  1.1  joerg </pre></td></tr>
   3025  1.1  joerg 
   3026  1.1  joerg 
   3027  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>
   3028  1.1  joerg <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
   3029  1.1  joerg 
   3030  1.1  joerg Given
   3031  1.1  joerg   class C {
   3032  1.1  joerg     int a : 2;
   3033  1.1  joerg     int b;
   3034  1.1  joerg   };
   3035  1.1  joerg fieldDecl(isBitField())
   3036  1.1  joerg   matches 'int a;' but not 'int b;'.
   3037  1.1  joerg </pre></td></tr>
   3038  1.1  joerg 
   3039  1.1  joerg 
   3040  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>
   3041  1.1  joerg <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
   3042  1.1  joerg 
   3043  1.1  joerg Given
   3044  1.1  joerg   f('false, 3.14, 42);
   3045  1.1  joerg characterLiteral(equals(0))
   3046  1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   3047  1.1  joerg   match false
   3048  1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   3049  1.1  joerg   match 3.14
   3050  1.1  joerg integerLiteral(equals(42))
   3051  1.1  joerg   matches 42
   3052  1.1  joerg 
   3053  1.1  joerg Note that you cannot directly match a negative numeric literal because the
   3054  1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   3055  1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   3056  1.1  joerg matcher to match the minus sign:
   3057  1.1  joerg 
   3058  1.1  joerg unaryOperator(hasOperatorName("-"),
   3059  1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   3060  1.1  joerg 
   3061  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;,
   3062  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;
   3063  1.1  joerg </pre></td></tr>
   3064  1.1  joerg 
   3065  1.1  joerg 
   3066  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>
   3067  1.1  joerg <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
   3068  1.1  joerg 
   3069  1.1  joerg 
   3070  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>
   3071  1.1  joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
   3072  1.1  joerg 
   3073  1.1  joerg Given:
   3074  1.1  joerg   void f();
   3075  1.1  joerg   void g() noexcept;
   3076  1.1  joerg   void h() noexcept(true);
   3077  1.1  joerg   void i() noexcept(false);
   3078  1.1  joerg   void j() throw();
   3079  1.1  joerg   void k() throw(int);
   3080  1.1  joerg   void l() throw(...);
   3081  1.1  joerg functionDecl(hasDynamicExceptionSpec()) and
   3082  1.1  joerg   functionProtoType(hasDynamicExceptionSpec())
   3083  1.1  joerg   match the declarations of j, k, and l, but not f, g, h, or i.
   3084  1.1  joerg </pre></td></tr>
   3085  1.1  joerg 
   3086  1.1  joerg 
   3087  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>
   3088  1.1  joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
   3089  1.1  joerg 
   3090  1.1  joerg Matches overloaded operator names specified in strings without the
   3091  1.1  joerg "operator" prefix: e.g. "&lt;&lt;".
   3092  1.1  joerg 
   3093  1.1  joerg Given:
   3094  1.1  joerg   class A { int operator*(); };
   3095  1.1  joerg   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
   3096  1.1  joerg   A a;
   3097  1.1  joerg   a &lt;&lt; a;   // &lt;-- This matches
   3098  1.1  joerg 
   3099  1.1  joerg cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
   3100  1.1  joerg specified line and
   3101  1.1  joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
   3102  1.1  joerg matches the declaration of A.
   3103  1.1  joerg 
   3104  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;
   3105  1.1  joerg </pre></td></tr>
   3106  1.1  joerg 
   3107  1.1  joerg 
   3108  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>
   3109  1.1  joerg <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
   3110  1.1  joerg 
   3111  1.1  joerg Example matches Y (matcher = functionDecl(hasTrailingReturn()))
   3112  1.1  joerg int X() {}
   3113  1.1  joerg auto Y() -&gt; int {}
   3114  1.1  joerg </pre></td></tr>
   3115  1.1  joerg 
   3116  1.1  joerg 
   3117  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>
   3118  1.1  joerg <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
   3119  1.1  joerg        and if constexpr.
   3120  1.1  joerg 
   3121  1.1  joerg Given:
   3122  1.1  joerg   constexpr int foo = 42;
   3123  1.1  joerg   constexpr int bar();
   3124  1.1  joerg   void baz() { if constexpr(1 &gt; 0) {} }
   3125  1.1  joerg varDecl(isConstexpr())
   3126  1.1  joerg   matches the declaration of foo.
   3127  1.1  joerg functionDecl(isConstexpr())
   3128  1.1  joerg   matches the declaration of bar.
   3129  1.1  joerg ifStmt(isConstexpr())
   3130  1.1  joerg   matches the if statement in baz.
   3131  1.1  joerg </pre></td></tr>
   3132  1.1  joerg 
   3133  1.1  joerg 
   3134  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>
   3135  1.1  joerg <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
   3136  1.1  joerg 
   3137  1.1  joerg Given:
   3138  1.1  joerg   class A { ~A(); };
   3139  1.1  joerg   class B { ~B() = default; };
   3140  1.1  joerg functionDecl(isDefaulted())
   3141  1.1  joerg   matches the declaration of ~B, but not ~A.
   3142  1.1  joerg </pre></td></tr>
   3143  1.1  joerg 
   3144  1.1  joerg 
   3145  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>
   3146  1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
   3147  1.1  joerg 
   3148  1.1  joerg Example matches A, va, fa
   3149  1.1  joerg   class A {};
   3150  1.1  joerg   class B;  // Doesn't match, as it has no body.
   3151  1.1  joerg   int va;
   3152  1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   3153  1.1  joerg   void fa() {}
   3154  1.1  joerg   void fb();  // Doesn't match, as it has no body.
   3155  1.1  joerg   @interface X
   3156  1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   3157  1.1  joerg   @end
   3158  1.1  joerg   @implementation X
   3159  1.1  joerg   - (void)ma {}
   3160  1.1  joerg   @end
   3161  1.1  joerg 
   3162  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;,
   3163  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   3164  1.1  joerg </pre></td></tr>
   3165  1.1  joerg 
   3166  1.1  joerg 
   3167  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>
   3168  1.1  joerg <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
   3169  1.1  joerg 
   3170  1.1  joerg Given:
   3171  1.1  joerg   void Func();
   3172  1.1  joerg   void DeletedFunc() = delete;
   3173  1.1  joerg functionDecl(isDeleted())
   3174  1.1  joerg   matches the declaration of DeletedFunc, but not Func.
   3175  1.1  joerg </pre></td></tr>
   3176  1.1  joerg 
   3177  1.1  joerg 
   3178  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>
   3179  1.1  joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
   3180  1.1  joerg static member variable template instantiations.
   3181  1.1  joerg 
   3182  1.1  joerg Given
   3183  1.1  joerg   template&lt;typename T&gt; void A(T t) { }
   3184  1.1  joerg   template&lt;&gt; void A(int N) { }
   3185  1.1  joerg functionDecl(isExplicitTemplateSpecialization())
   3186  1.1  joerg   matches the specialization A&lt;int&gt;().
   3187  1.1  joerg 
   3188  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;
   3189  1.1  joerg </pre></td></tr>
   3190  1.1  joerg 
   3191  1.1  joerg 
   3192  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>
   3193  1.1  joerg <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
   3194  1.1  joerg 
   3195  1.1  joerg Given:
   3196  1.1  joerg   extern "C" void f() {}
   3197  1.1  joerg   extern "C" { void g() {} }
   3198  1.1  joerg   void h() {}
   3199  1.1  joerg   extern "C" int x = 1;
   3200  1.1  joerg   extern "C" int y = 2;
   3201  1.1  joerg   int z = 3;
   3202  1.1  joerg functionDecl(isExternC())
   3203  1.1  joerg   matches the declaration of f and g, but not the declaration of h.
   3204  1.1  joerg varDecl(isExternC())
   3205  1.1  joerg   matches the declaration of x and y, but not the declaration of z.
   3206  1.1  joerg </pre></td></tr>
   3207  1.1  joerg 
   3208  1.1  joerg 
   3209  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>
   3210  1.1  joerg <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
   3211  1.1  joerg the inline keyword.
   3212  1.1  joerg 
   3213  1.1  joerg Given
   3214  1.1  joerg   inline void f();
   3215  1.1  joerg   void g();
   3216  1.1  joerg   namespace n {
   3217  1.1  joerg   inline namespace m {}
   3218  1.1  joerg   }
   3219  1.1  joerg functionDecl(isInline()) will match ::f().
   3220  1.1  joerg namespaceDecl(isInline()) will match n::m.
   3221  1.1  joerg </pre></td></tr>
   3222  1.1  joerg 
   3223  1.1  joerg 
   3224  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>
   3225  1.1  joerg <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
   3226  1.1  joerg into an executable program.
   3227  1.1  joerg </pre></td></tr>
   3228  1.1  joerg 
   3229  1.1  joerg 
   3230  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>
   3231  1.1  joerg <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
   3232  1.1  joerg 
   3233  1.1  joerg Given
   3234  1.1  joerg   void nope();
   3235  1.1  joerg   [[noreturn]] void a();
   3236  1.1  joerg   __attribute__((noreturn)) void b();
   3237  1.1  joerg   struct c { [[noreturn]] c(); };
   3238  1.1  joerg functionDecl(isNoReturn())
   3239  1.1  joerg   matches all of those except
   3240  1.1  joerg   void nope();
   3241  1.1  joerg </pre></td></tr>
   3242  1.1  joerg 
   3243  1.1  joerg 
   3244  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>
   3245  1.1  joerg <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
   3246  1.1  joerg 
   3247  1.1  joerg Given:
   3248  1.1  joerg   void f();
   3249  1.1  joerg   void g() noexcept;
   3250  1.1  joerg   void h() throw();
   3251  1.1  joerg   void i() throw(int);
   3252  1.1  joerg   void j() noexcept(false);
   3253  1.1  joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
   3254  1.1  joerg   match the declarations of g, and h, but not f, i or j.
   3255  1.1  joerg </pre></td></tr>
   3256  1.1  joerg 
   3257  1.1  joerg 
   3258  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>
   3259  1.1  joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
   3260  1.1  joerg class specifier ("static" keyword) written in the source.
   3261  1.1  joerg 
   3262  1.1  joerg Given:
   3263  1.1  joerg   static void f() {}
   3264  1.1  joerg   static int i = 0;
   3265  1.1  joerg   extern int j;
   3266  1.1  joerg   int k;
   3267  1.1  joerg functionDecl(isStaticStorageClass())
   3268  1.1  joerg   matches the function declaration f.
   3269  1.1  joerg varDecl(isStaticStorageClass())
   3270  1.1  joerg   matches the variable declaration i.
   3271  1.1  joerg </pre></td></tr>
   3272  1.1  joerg 
   3273  1.1  joerg 
   3274  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>
   3275  1.1  joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
   3276  1.1  joerg member variable template instantiations.
   3277  1.1  joerg 
   3278  1.1  joerg Given
   3279  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   3280  1.1  joerg or
   3281  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   3282  1.1  joerg or
   3283  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   3284  1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   3285  1.1  joerg   matches the template instantiation of X&lt;A&gt;.
   3286  1.1  joerg 
   3287  1.1  joerg But given
   3288  1.1  joerg   template &lt;typename T&gt;  class X {}; class A {};
   3289  1.1  joerg   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   3290  1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   3291  1.1  joerg   does not match, as X&lt;A&gt; is an explicit template specialization.
   3292  1.1  joerg 
   3293  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;
   3294  1.1  joerg </pre></td></tr>
   3295  1.1  joerg 
   3296  1.1  joerg 
   3297  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>
   3298  1.1  joerg <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
   3299  1.1  joerg 
   3300  1.1  joerg Example matches f, but not g or h. The function i will not match, even when
   3301  1.1  joerg compiled in C mode.
   3302  1.1  joerg   void f(...);
   3303  1.1  joerg   void g(int);
   3304  1.1  joerg   template &lt;typename... Ts&gt; void h(Ts...);
   3305  1.1  joerg   void i();
   3306  1.1  joerg </pre></td></tr>
   3307  1.1  joerg 
   3308  1.1  joerg 
   3309  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>
   3310  1.1  joerg <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
   3311  1.1  joerg specific parameter count.
   3312  1.1  joerg 
   3313  1.1  joerg Given
   3314  1.1  joerg   void f(int i) {}
   3315  1.1  joerg   void g(int i, int j) {}
   3316  1.1  joerg   void h(int i, int j);
   3317  1.1  joerg   void j(int i);
   3318  1.1  joerg   void k(int x, int y, int z, ...);
   3319  1.1  joerg functionDecl(parameterCountIs(2))
   3320  1.1  joerg   matches g and h
   3321  1.1  joerg functionProtoType(parameterCountIs(2))
   3322  1.1  joerg   matches g and h
   3323  1.1  joerg functionProtoType(parameterCountIs(3))
   3324  1.1  joerg   matches k
   3325  1.1  joerg </pre></td></tr>
   3326  1.1  joerg 
   3327  1.1  joerg 
   3328  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>
   3329  1.1  joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
   3330  1.1  joerg 
   3331  1.1  joerg Given:
   3332  1.1  joerg   void f();
   3333  1.1  joerg   void g() noexcept;
   3334  1.1  joerg   void h() noexcept(true);
   3335  1.1  joerg   void i() noexcept(false);
   3336  1.1  joerg   void j() throw();
   3337  1.1  joerg   void k() throw(int);
   3338  1.1  joerg   void l() throw(...);
   3339  1.1  joerg functionDecl(hasDynamicExceptionSpec()) and
   3340  1.1  joerg   functionProtoType(hasDynamicExceptionSpec())
   3341  1.1  joerg   match the declarations of j, k, and l, but not f, g, h, or i.
   3342  1.1  joerg </pre></td></tr>
   3343  1.1  joerg 
   3344  1.1  joerg 
   3345  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>
   3346  1.1  joerg <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
   3347  1.1  joerg 
   3348  1.1  joerg Given:
   3349  1.1  joerg   void f();
   3350  1.1  joerg   void g() noexcept;
   3351  1.1  joerg   void h() throw();
   3352  1.1  joerg   void i() throw(int);
   3353  1.1  joerg   void j() noexcept(false);
   3354  1.1  joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
   3355  1.1  joerg   match the declarations of g, and h, but not f, i or j.
   3356  1.1  joerg </pre></td></tr>
   3357  1.1  joerg 
   3358  1.1  joerg 
   3359  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>
   3360  1.1  joerg <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
   3361  1.1  joerg specific parameter count.
   3362  1.1  joerg 
   3363  1.1  joerg Given
   3364  1.1  joerg   void f(int i) {}
   3365  1.1  joerg   void g(int i, int j) {}
   3366  1.1  joerg   void h(int i, int j);
   3367  1.1  joerg   void j(int i);
   3368  1.1  joerg   void k(int x, int y, int z, ...);
   3369  1.1  joerg functionDecl(parameterCountIs(2))
   3370  1.1  joerg   matches g and h
   3371  1.1  joerg functionProtoType(parameterCountIs(2))
   3372  1.1  joerg   matches g and h
   3373  1.1  joerg functionProtoType(parameterCountIs(3))
   3374  1.1  joerg   matches k
   3375  1.1  joerg </pre></td></tr>
   3376  1.1  joerg 
   3377  1.1  joerg 
   3378  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>
   3379  1.1  joerg <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
   3380  1.1  joerg        and if constexpr.
   3381  1.1  joerg 
   3382  1.1  joerg Given:
   3383  1.1  joerg   constexpr int foo = 42;
   3384  1.1  joerg   constexpr int bar();
   3385  1.1  joerg   void baz() { if constexpr(1 &gt; 0) {} }
   3386  1.1  joerg varDecl(isConstexpr())
   3387  1.1  joerg   matches the declaration of foo.
   3388  1.1  joerg functionDecl(isConstexpr())
   3389  1.1  joerg   matches the declaration of bar.
   3390  1.1  joerg ifStmt(isConstexpr())
   3391  1.1  joerg   matches the if statement in baz.
   3392  1.1  joerg </pre></td></tr>
   3393  1.1  joerg 
   3394  1.1  joerg 
   3395  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>
   3396  1.1  joerg <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
   3397  1.1  joerg 
   3398  1.1  joerg 
   3399  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>
   3400  1.1  joerg <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
   3401  1.1  joerg 
   3402  1.1  joerg Given
   3403  1.1  joerg   f('false, 3.14, 42);
   3404  1.1  joerg characterLiteral(equals(0))
   3405  1.1  joerg   matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
   3406  1.1  joerg   match false
   3407  1.1  joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
   3408  1.1  joerg   match 3.14
   3409  1.1  joerg integerLiteral(equals(42))
   3410  1.1  joerg   matches 42
   3411  1.1  joerg 
   3412  1.1  joerg Note that you cannot directly match a negative numeric literal because the
   3413  1.1  joerg minus sign is not part of the literal: It is a unary operator whose operand
   3414  1.1  joerg is the positive numeric literal. Instead, you must use a unaryOperator()
   3415  1.1  joerg matcher to match the minus sign:
   3416  1.1  joerg 
   3417  1.1  joerg unaryOperator(hasOperatorName("-"),
   3418  1.1  joerg               hasUnaryOperand(integerLiteral(equals(13))))
   3419  1.1  joerg 
   3420  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;,
   3421  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;
   3422  1.1  joerg </pre></td></tr>
   3423  1.1  joerg 
   3424  1.1  joerg 
   3425  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>
   3426  1.1  joerg <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
   3427  1.1  joerg 
   3428  1.1  joerg 
   3429  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>
   3430  1.1  joerg <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
   3431  1.1  joerg 
   3432  1.1  joerg 
   3433  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>
   3434  1.1  joerg <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
   3435  1.1  joerg to '.'.
   3436  1.1  joerg 
   3437  1.1  joerg Member calls on the implicit this pointer match as called with '-&gt;'.
   3438  1.1  joerg 
   3439  1.1  joerg Given
   3440  1.1  joerg   class Y {
   3441  1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   3442  1.1  joerg     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   3443  1.1  joerg     int a;
   3444  1.1  joerg     static int b;
   3445  1.1  joerg   };
   3446  1.1  joerg   template &lt;class T&gt;
   3447  1.1  joerg   class Z {
   3448  1.1  joerg     void x() { this-&gt;m; }
   3449  1.1  joerg   };
   3450  1.1  joerg memberExpr(isArrow())
   3451  1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   3452  1.1  joerg cxxDependentScopeMemberExpr(isArrow())
   3453  1.1  joerg   matches this-&gt;m
   3454  1.1  joerg unresolvedMemberExpr(isArrow())
   3455  1.1  joerg   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   3456  1.1  joerg </pre></td></tr>
   3457  1.1  joerg 
   3458  1.1  joerg 
   3459  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>
   3460  1.1  joerg <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
   3461  1.1  joerg 
   3462  1.1  joerg Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
   3463  1.1  joerg void f() {
   3464  1.1  joerg   int x;
   3465  1.1  joerg   static int y;
   3466  1.1  joerg }
   3467  1.1  joerg int z;
   3468  1.1  joerg 
   3469  1.1  joerg Example matches f() because it has external formal linkage despite being
   3470  1.1  joerg unique to the translation unit as though it has internal likage
   3471  1.1  joerg (matcher = functionDecl(hasExternalFormalLinkage()))
   3472  1.1  joerg 
   3473  1.1  joerg namespace {
   3474  1.1  joerg void f() {}
   3475  1.1  joerg }
   3476  1.1  joerg </pre></td></tr>
   3477  1.1  joerg 
   3478  1.1  joerg 
   3479  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('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>const std::string  Name</td></tr>
   3480  1.1  joerg <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
   3481  1.1  joerg 
   3482  1.1  joerg Supports specifying enclosing namespaces or classes by prefixing the name
   3483  1.1  joerg with '&lt;enclosing&gt;::'.
   3484  1.1  joerg Does not match typedefs of an underlying type with the given name.
   3485  1.1  joerg 
   3486  1.1  joerg Example matches X (Name == "X")
   3487  1.1  joerg   class X;
   3488  1.1  joerg 
   3489  1.1  joerg Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
   3490  1.1  joerg   namespace a { namespace b { class X; } }
   3491  1.1  joerg </pre></td></tr>
   3492  1.1  joerg 
   3493  1.1  joerg 
   3494  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('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr>
   3495  1.1  joerg <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
   3496  1.1  joerg a substring matched by the given RegExp.
   3497  1.1  joerg 
   3498  1.1  joerg Supports specifying enclosing namespaces or classes by
   3499  1.1  joerg prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
   3500  1.1  joerg of an underlying type with the given name.
   3501  1.1  joerg 
   3502  1.1  joerg Example matches X (regexp == "::X")
   3503  1.1  joerg   class X;
   3504  1.1  joerg 
   3505  1.1  joerg Example matches X (regexp is one of "::X", "^foo::.*X", among others)
   3506  1.1  joerg   namespace foo { namespace bar { class X; } }
   3507  1.1  joerg </pre></td></tr>
   3508  1.1  joerg 
   3509  1.1  joerg 
   3510  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>
   3511  1.1  joerg <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
   3512  1.1  joerg 
   3513  1.1  joerg Given
   3514  1.1  joerg   namespace n {
   3515  1.1  joerg   namespace {} // #1
   3516  1.1  joerg   }
   3517  1.1  joerg namespaceDecl(isAnonymous()) will match #1 but not ::n.
   3518  1.1  joerg </pre></td></tr>
   3519  1.1  joerg 
   3520  1.1  joerg 
   3521  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>
   3522  1.1  joerg <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
   3523  1.1  joerg the inline keyword.
   3524  1.1  joerg 
   3525  1.1  joerg Given
   3526  1.1  joerg   inline void f();
   3527  1.1  joerg   void g();
   3528  1.1  joerg   namespace n {
   3529  1.1  joerg   inline namespace m {}
   3530  1.1  joerg   }
   3531  1.1  joerg functionDecl(isInline()) will match ::f().
   3532  1.1  joerg namespaceDecl(isInline()) will match n::m.
   3533  1.1  joerg </pre></td></tr>
   3534  1.1  joerg 
   3535  1.1  joerg 
   3536  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>
   3537  1.1  joerg <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
   3538  1.1  joerg 
   3539  1.1  joerg Given
   3540  1.1  joerg 
   3541  1.1  joerg   #pragma omp parallel
   3542  1.1  joerg   #pragma omp parallel default(none)
   3543  1.1  joerg   #pragma omp parallel default(shared)
   3544  1.1  joerg 
   3545  1.1  joerg ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
   3546  1.1  joerg </pre></td></tr>
   3547  1.1  joerg 
   3548  1.1  joerg 
   3549  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>
   3550  1.1  joerg <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
   3551  1.1  joerg 
   3552  1.1  joerg Given
   3553  1.1  joerg 
   3554  1.1  joerg   #pragma omp parallel
   3555  1.1  joerg   #pragma omp parallel default(none)
   3556  1.1  joerg   #pragma omp parallel default(shared)
   3557  1.1  joerg 
   3558  1.1  joerg ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
   3559  1.1  joerg </pre></td></tr>
   3560  1.1  joerg 
   3561  1.1  joerg 
   3562  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>
   3563  1.1  joerg <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
   3564  1.1  joerg clause kind.
   3565  1.1  joerg 
   3566  1.1  joerg Given
   3567  1.1  joerg 
   3568  1.1  joerg   #pragma omp parallel
   3569  1.1  joerg   #pragma omp parallel for
   3570  1.1  joerg   #pragma omp          for
   3571  1.1  joerg 
   3572  1.1  joerg `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
   3573  1.1  joerg ``omp parallel`` and ``omp parallel for``.
   3574  1.1  joerg 
   3575  1.1  joerg If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
   3576  1.1  joerg should be passed as a quoted string. e.g.,
   3577  1.1  joerg ``isAllowedToContainClauseKind("OMPC_default").``
   3578  1.1  joerg </pre></td></tr>
   3579  1.1  joerg 
   3580  1.1  joerg 
   3581  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>
   3582  1.1  joerg <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
   3583  1.1  joerg i.e., directives that can't have a structured block.
   3584  1.1  joerg 
   3585  1.1  joerg Given
   3586  1.1  joerg 
   3587  1.1  joerg   #pragma omp parallel
   3588  1.1  joerg   {}
   3589  1.1  joerg   #pragma omp taskyield
   3590  1.1  joerg 
   3591  1.1  joerg ``ompExecutableDirective(isStandaloneDirective()))`` matches
   3592  1.1  joerg ``omp taskyield``.
   3593  1.1  joerg </pre></td></tr>
   3594  1.1  joerg 
   3595  1.1  joerg 
   3596  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>
   3597  1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
   3598  1.1  joerg </pre></td></tr>
   3599  1.1  joerg 
   3600  1.1  joerg 
   3601  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>
   3602  1.1  joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
   3603  1.1  joerg </pre></td></tr>
   3604  1.1  joerg 
   3605  1.1  joerg 
   3606  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>
   3607  1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
   3608  1.1  joerg isSameOrDerivedFrom(hasName(...)).
   3609  1.1  joerg </pre></td></tr>
   3610  1.1  joerg 
   3611  1.1  joerg 
   3612  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('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
   3613  1.1  joerg <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
   3614  1.1  joerg a specific number of arguments (including absent default arguments).
   3615  1.1  joerg 
   3616  1.1  joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   3617  1.1  joerg   void f(int x, int y);
   3618  1.1  joerg   f(0, 0);
   3619  1.1  joerg </pre></td></tr>
   3620  1.1  joerg 
   3621  1.1  joerg 
   3622  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>
   3623  1.1  joerg <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
   3624  1.1  joerg 
   3625  1.1  joerg objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
   3626  1.1  joerg message expression in
   3627  1.1  joerg 
   3628  1.1  joerg   UIWebView *webView = ...;
   3629  1.1  joerg   CGRect bodyFrame = webView.frame;
   3630  1.1  joerg   bodyFrame.size.height = self.bodyContentHeight;
   3631  1.1  joerg   webView.frame = bodyFrame;
   3632  1.1  joerg   //     ^---- matches here
   3633  1.1  joerg </pre></td></tr>
   3634  1.1  joerg 
   3635  1.1  joerg 
   3636  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>
   3637  1.1  joerg <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
   3638  1.1  joerg 
   3639  1.1  joerg Matches only when the selector of the objCMessageExpr is NULL. This may
   3640  1.1  joerg represent an error condition in the tree!
   3641  1.1  joerg </pre></td></tr>
   3642  1.1  joerg 
   3643  1.1  joerg 
   3644  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>
   3645  1.1  joerg <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
   3646  1.1  joerg 
   3647  1.1  joerg  matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
   3648  1.1  joerg  matches the outer message expr in the code below, but NOT the message
   3649  1.1  joerg  invocation for self.bodyView.
   3650  1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   3651  1.1  joerg </pre></td></tr>
   3652  1.1  joerg 
   3653  1.1  joerg 
   3654  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>
   3655  1.1  joerg <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
   3656  1.1  joerg 
   3657  1.1  joerg  matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
   3658  1.1  joerg  matches self.bodyView in the code below, but NOT the outer message
   3659  1.1  joerg  invocation of "loadHTMLString:baseURL:".
   3660  1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   3661  1.1  joerg </pre></td></tr>
   3662  1.1  joerg 
   3663  1.1  joerg 
   3664  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>
   3665  1.1  joerg <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
   3666  1.1  joerg 
   3667  1.1  joerg Example
   3668  1.1  joerg matcher = objcMessageExpr(isClassMessage())
   3669  1.1  joerg matches
   3670  1.1  joerg   [NSString stringWithFormat:@"format"];
   3671  1.1  joerg but not
   3672  1.1  joerg   NSString *x = @"hello";
   3673  1.1  joerg   [x containsString:@"h"];
   3674  1.1  joerg </pre></td></tr>
   3675  1.1  joerg 
   3676  1.1  joerg 
   3677  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>
   3678  1.1  joerg <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
   3679  1.1  joerg 
   3680  1.1  joerg Example
   3681  1.1  joerg matcher = objcMessageExpr(isInstanceMessage())
   3682  1.1  joerg matches
   3683  1.1  joerg   NSString *x = @"hello";
   3684  1.1  joerg   [x containsString:@"h"];
   3685  1.1  joerg but not
   3686  1.1  joerg   [NSString stringWithFormat:@"format"];
   3687  1.1  joerg </pre></td></tr>
   3688  1.1  joerg 
   3689  1.1  joerg 
   3690  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('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
   3691  1.1  joerg <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
   3692  1.1  joerg a substring matched by the given RegExp.
   3693  1.1  joerg  matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
   3694  1.1  joerg  invocation for self.bodyView.
   3695  1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   3696  1.1  joerg </pre></td></tr>
   3697  1.1  joerg 
   3698  1.1  joerg 
   3699  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>
   3700  1.1  joerg <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
   3701  1.1  joerg 
   3702  1.1  joerg  matcher = objCMessageExpr(numSelectorArgs(0));
   3703  1.1  joerg  matches self.bodyView in the code below
   3704  1.1  joerg 
   3705  1.1  joerg  matcher = objCMessageExpr(numSelectorArgs(2));
   3706  1.1  joerg  matches the invocation of "loadHTMLString:baseURL:" but not that
   3707  1.1  joerg  of self.bodyView
   3708  1.1  joerg     [self.bodyView loadHTMLString:html baseURL:NULL];
   3709  1.1  joerg </pre></td></tr>
   3710  1.1  joerg 
   3711  1.1  joerg 
   3712  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>
   3713  1.1  joerg <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
   3714  1.1  joerg 
   3715  1.1  joerg Example
   3716  1.1  joerg matcher = objcMethodDecl(isClassMethod())
   3717  1.1  joerg matches
   3718  1.1  joerg @interface I + (void)foo; @end
   3719  1.1  joerg but not
   3720  1.1  joerg @interface I - (void)bar; @end
   3721  1.1  joerg </pre></td></tr>
   3722  1.1  joerg 
   3723  1.1  joerg 
   3724  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>
   3725  1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
   3726  1.1  joerg 
   3727  1.1  joerg Example matches A, va, fa
   3728  1.1  joerg   class A {};
   3729  1.1  joerg   class B;  // Doesn't match, as it has no body.
   3730  1.1  joerg   int va;
   3731  1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   3732  1.1  joerg   void fa() {}
   3733  1.1  joerg   void fb();  // Doesn't match, as it has no body.
   3734  1.1  joerg   @interface X
   3735  1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   3736  1.1  joerg   @end
   3737  1.1  joerg   @implementation X
   3738  1.1  joerg   - (void)ma {}
   3739  1.1  joerg   @end
   3740  1.1  joerg 
   3741  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;,
   3742  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   3743  1.1  joerg </pre></td></tr>
   3744  1.1  joerg 
   3745  1.1  joerg 
   3746  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>
   3747  1.1  joerg <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
   3748  1.1  joerg 
   3749  1.1  joerg Example
   3750  1.1  joerg matcher = objcMethodDecl(isInstanceMethod())
   3751  1.1  joerg matches
   3752  1.1  joerg @interface I - (void)bar; @end
   3753  1.1  joerg but not
   3754  1.1  joerg @interface I + (void)foo; @end
   3755  1.1  joerg </pre></td></tr>
   3756  1.1  joerg 
   3757  1.1  joerg 
   3758  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>
   3759  1.1  joerg <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
   3760  1.1  joerg 
   3761  1.1  joerg Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
   3762  1.1  joerg void x(int val) {}
   3763  1.1  joerg void y(int val = 0) {}
   3764  1.1  joerg </pre></td></tr>
   3765  1.1  joerg 
   3766  1.1  joerg 
   3767  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>
   3768  1.1  joerg <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
   3769  1.1  joerg 
   3770  1.1  joerg Given
   3771  1.1  joerg   class Y { public: void x(); };
   3772  1.1  joerg   void z() { Y* y; y-&gt;x(); }
   3773  1.1  joerg cxxMemberCallExpr(on(hasType(asString("class Y *"))))
   3774  1.1  joerg   matches y-&gt;x()
   3775  1.1  joerg </pre></td></tr>
   3776  1.1  joerg 
   3777  1.1  joerg 
   3778  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>
   3779  1.1  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
   3780  1.1  joerg 
   3781  1.1  joerg Matches a node if it equals the node previously bound to ID.
   3782  1.1  joerg 
   3783  1.1  joerg Given
   3784  1.1  joerg   class X { int a; int b; };
   3785  1.1  joerg cxxRecordDecl(
   3786  1.1  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   3787  1.1  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   3788  1.1  joerg   matches the class X, as a and b have the same type.
   3789  1.1  joerg 
   3790  1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   3791  1.1  joerg equalsBoundNodes acts as a filter.
   3792  1.1  joerg For example:
   3793  1.1  joerg compoundStmt(
   3794  1.1  joerg     forEachDescendant(varDecl().bind("d")),
   3795  1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   3796  1.1  joerg will trigger a match for each combination of variable declaration
   3797  1.1  joerg and reference to that variable declaration within a compound statement.
   3798  1.1  joerg </pre></td></tr>
   3799  1.1  joerg 
   3800  1.1  joerg 
   3801  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>
   3802  1.1  joerg <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
   3803  1.1  joerg the node, not hidden within a typedef.
   3804  1.1  joerg 
   3805  1.1  joerg Given
   3806  1.1  joerg   typedef const int const_int;
   3807  1.1  joerg   const_int i;
   3808  1.1  joerg   int *const j;
   3809  1.1  joerg   int *volatile k;
   3810  1.1  joerg   int m;
   3811  1.1  joerg varDecl(hasType(hasLocalQualifiers())) matches only j and k.
   3812  1.1  joerg i is const-qualified but the qualifier is not local.
   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_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
   3817  1.1  joerg <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
   3818  1.1  joerg 
   3819  1.1  joerg Given
   3820  1.1  joerg   void a(char);
   3821  1.1  joerg   void b(wchar_t);
   3822  1.1  joerg   void c(double);
   3823  1.1  joerg functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
   3824  1.1  joerg matches "a(char)", "b(wchar_t)", but not "c(double)".
   3825  1.1  joerg </pre></td></tr>
   3826  1.1  joerg 
   3827  1.1  joerg 
   3828  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>
   3829  1.1  joerg <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
   3830  1.1  joerg the Objective-C object pointer type, which is different despite being
   3831  1.1  joerg syntactically similar.
   3832  1.1  joerg 
   3833  1.1  joerg Given
   3834  1.1  joerg   int *i = nullptr;
   3835  1.1  joerg 
   3836  1.1  joerg   @interface Foo
   3837  1.1  joerg   @end
   3838  1.1  joerg   Foo *f;
   3839  1.1  joerg 
   3840  1.1  joerg   int j;
   3841  1.1  joerg varDecl(hasType(isAnyPointer()))
   3842  1.1  joerg   matches "int *i" and "Foo *f", but not "int j".
   3843  1.1  joerg </pre></td></tr>
   3844  1.1  joerg 
   3845  1.1  joerg 
   3846  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>
   3847  1.1  joerg <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
   3848  1.1  joerg include "top-level" const.
   3849  1.1  joerg 
   3850  1.1  joerg Given
   3851  1.1  joerg   void a(int);
   3852  1.1  joerg   void b(int const);
   3853  1.1  joerg   void c(const int);
   3854  1.1  joerg   void d(const int*);
   3855  1.1  joerg   void e(int const) {};
   3856  1.1  joerg functionDecl(hasAnyParameter(hasType(isConstQualified())))
   3857  1.1  joerg   matches "void b(int const)", "void c(const int)" and
   3858  1.1  joerg   "void e(int const) {}". It does not match d as there
   3859  1.1  joerg   is no top-level const on the parameter type "const int *".
   3860  1.1  joerg </pre></td></tr>
   3861  1.1  joerg 
   3862  1.1  joerg 
   3863  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>
   3864  1.1  joerg <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
   3865  1.1  joerg 
   3866  1.1  joerg Given
   3867  1.1  joerg   void a(int);
   3868  1.1  joerg   void b(long);
   3869  1.1  joerg   void c(double);
   3870  1.1  joerg functionDecl(hasAnyParameter(hasType(isInteger())))
   3871  1.1  joerg matches "a(int)", "b(long)", but not "c(double)".
   3872  1.1  joerg </pre></td></tr>
   3873  1.1  joerg 
   3874  1.1  joerg 
   3875  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>
   3876  1.1  joerg <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
   3877  1.1  joerg 
   3878  1.1  joerg Given
   3879  1.1  joerg   void a(int);
   3880  1.1  joerg   void b(unsigned long);
   3881  1.1  joerg   void c(double);
   3882  1.1  joerg functionDecl(hasAnyParameter(hasType(isSignedInteger())))
   3883  1.1  joerg matches "a(int)", but not "b(unsigned long)" and "c(double)".
   3884  1.1  joerg </pre></td></tr>
   3885  1.1  joerg 
   3886  1.1  joerg 
   3887  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>
   3888  1.1  joerg <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
   3889  1.1  joerg 
   3890  1.1  joerg Given
   3891  1.1  joerg   void a(int);
   3892  1.1  joerg   void b(unsigned long);
   3893  1.1  joerg   void c(double);
   3894  1.1  joerg functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
   3895  1.1  joerg matches "b(unsigned long)", but not "a(int)" and "c(double)".
   3896  1.1  joerg </pre></td></tr>
   3897  1.1  joerg 
   3898  1.1  joerg 
   3899  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>
   3900  1.1  joerg <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
   3901  1.1  joerg include "top-level" volatile.
   3902  1.1  joerg 
   3903  1.1  joerg Given
   3904  1.1  joerg   void a(int);
   3905  1.1  joerg   void b(int volatile);
   3906  1.1  joerg   void c(volatile int);
   3907  1.1  joerg   void d(volatile int*);
   3908  1.1  joerg   void e(int volatile) {};
   3909  1.1  joerg functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
   3910  1.1  joerg   matches "void b(int volatile)", "void c(volatile int)" and
   3911  1.1  joerg   "void e(int volatile) {}". It does not match d as there
   3912  1.1  joerg   is no top-level volatile on the parameter type "volatile int *".
   3913  1.1  joerg </pre></td></tr>
   3914  1.1  joerg 
   3915  1.1  joerg 
   3916  1.1  joerg <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
   3917  1.1  joerg <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
   3918  1.1  joerg 
   3919  1.1  joerg Example matches C, but not S or U.
   3920  1.1  joerg   struct S {};
   3921  1.1  joerg   class C {};
   3922  1.1  joerg   union U {};
   3923  1.1  joerg </pre></td></tr>
   3924  1.1  joerg 
   3925  1.1  joerg 
   3926  1.1  joerg <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
   3927  1.1  joerg <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
   3928  1.1  joerg 
   3929  1.1  joerg Example matches S, but not C or U.
   3930  1.1  joerg   struct S {};
   3931  1.1  joerg   class C {};
   3932  1.1  joerg   union U {};
   3933  1.1  joerg </pre></td></tr>
   3934  1.1  joerg 
   3935  1.1  joerg 
   3936  1.1  joerg <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
   3937  1.1  joerg <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
   3938  1.1  joerg 
   3939  1.1  joerg Example matches U, but not C or S.
   3940  1.1  joerg   struct S {};
   3941  1.1  joerg   class C {};
   3942  1.1  joerg   union U {};
   3943  1.1  joerg </pre></td></tr>
   3944  1.1  joerg 
   3945  1.1  joerg 
   3946  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('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
   3947  1.1  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
   3948  1.1  joerg 
   3949  1.1  joerg Matches a node if it equals the node previously bound to ID.
   3950  1.1  joerg 
   3951  1.1  joerg Given
   3952  1.1  joerg   class X { int a; int b; };
   3953  1.1  joerg cxxRecordDecl(
   3954  1.1  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   3955  1.1  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   3956  1.1  joerg   matches the class X, as a and b have the same type.
   3957  1.1  joerg 
   3958  1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   3959  1.1  joerg equalsBoundNodes acts as a filter.
   3960  1.1  joerg For example:
   3961  1.1  joerg compoundStmt(
   3962  1.1  joerg     forEachDescendant(varDecl().bind("d")),
   3963  1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   3964  1.1  joerg will trigger a match for each combination of variable declaration
   3965  1.1  joerg and reference to that variable declaration within a compound statement.
   3966  1.1  joerg </pre></td></tr>
   3967  1.1  joerg 
   3968  1.1  joerg 
   3969  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>
   3970  1.1  joerg <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
   3971  1.1  joerg 
   3972  1.1  joerg Stmt has pointer identity in the AST.
   3973  1.1  joerg </pre></td></tr>
   3974  1.1  joerg 
   3975  1.1  joerg 
   3976  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('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
   3977  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
   3978  1.1  joerg partially matching a given regex.
   3979  1.1  joerg 
   3980  1.1  joerg Example matches Y but not X
   3981  1.1  joerg     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   3982  1.1  joerg   #include "ASTMatcher.h"
   3983  1.1  joerg   class X {};
   3984  1.1  joerg ASTMatcher.h:
   3985  1.1  joerg   class Y {};
   3986  1.1  joerg 
   3987  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;
   3988  1.1  joerg </pre></td></tr>
   3989  1.1  joerg 
   3990  1.1  joerg 
   3991  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>
   3992  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
   3993  1.1  joerg 
   3994  1.1  joerg Example matches X but not Y
   3995  1.1  joerg   (matcher = cxxRecordDecl(isExpansionInMainFile())
   3996  1.1  joerg   #include &lt;Y.h&gt;
   3997  1.1  joerg   class X {};
   3998  1.1  joerg Y.h:
   3999  1.1  joerg   class Y {};
   4000  1.1  joerg 
   4001  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;
   4002  1.1  joerg </pre></td></tr>
   4003  1.1  joerg 
   4004  1.1  joerg 
   4005  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>
   4006  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
   4007  1.1  joerg 
   4008  1.1  joerg Example matches Y but not X
   4009  1.1  joerg     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   4010  1.1  joerg   #include &lt;SystemHeader.h&gt;
   4011  1.1  joerg   class X {};
   4012  1.1  joerg SystemHeader.h:
   4013  1.1  joerg   class Y {};
   4014  1.1  joerg 
   4015  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;
   4016  1.1  joerg </pre></td></tr>
   4017  1.1  joerg 
   4018  1.1  joerg 
   4019  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('isOMPStructuredBlock0')"><a name="isOMPStructuredBlock0Anchor">isOMPStructuredBlock</a></td><td></td></tr>
   4020  1.1  joerg <tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block
   4021  1.1  joerg of an OpenMP executable directive.
   4022  1.1  joerg 
   4023  1.1  joerg Given
   4024  1.1  joerg 
   4025  1.1  joerg    #pragma omp parallel
   4026  1.1  joerg    {}
   4027  1.1  joerg 
   4028  1.1  joerg ``stmt(isOMPStructuredBlock()))`` matches ``{}``.
   4029  1.1  joerg </pre></td></tr>
   4030  1.1  joerg 
   4031  1.1  joerg 
   4032  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>
   4033  1.1  joerg <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
   4034  1.1  joerg 
   4035  1.1  joerg Given
   4036  1.1  joerg   int a[42];
   4037  1.1  joerg   int b[2 * 21];
   4038  1.1  joerg   int c[41], d[43];
   4039  1.1  joerg   char *s = "abcd";
   4040  1.1  joerg   wchar_t *ws = L"abcd";
   4041  1.1  joerg   char *w = "a";
   4042  1.1  joerg constantArrayType(hasSize(42))
   4043  1.1  joerg   matches "int a[42]" and "int b[2 * 21]"
   4044  1.1  joerg stringLiteral(hasSize(4))
   4045  1.1  joerg   matches "abcd", L"abcd"
   4046  1.1  joerg </pre></td></tr>
   4047  1.1  joerg 
   4048  1.1  joerg 
   4049  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>
   4050  1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
   4051  1.1  joerg 
   4052  1.1  joerg Example matches A, va, fa
   4053  1.1  joerg   class A {};
   4054  1.1  joerg   class B;  // Doesn't match, as it has no body.
   4055  1.1  joerg   int va;
   4056  1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   4057  1.1  joerg   void fa() {}
   4058  1.1  joerg   void fb();  // Doesn't match, as it has no body.
   4059  1.1  joerg   @interface X
   4060  1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   4061  1.1  joerg   @end
   4062  1.1  joerg   @implementation X
   4063  1.1  joerg   - (void)ma {}
   4064  1.1  joerg   @end
   4065  1.1  joerg 
   4066  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;,
   4067  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   4068  1.1  joerg </pre></td></tr>
   4069  1.1  joerg 
   4070  1.1  joerg 
   4071  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>
   4072  1.1  joerg <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
   4073  1.1  joerg 
   4074  1.1  joerg Note that 'Value' is a string as the template argument's value is
   4075  1.1  joerg an arbitrary precision integer. 'Value' must be euqal to the canonical
   4076  1.1  joerg representation of that integral value in base 10.
   4077  1.1  joerg 
   4078  1.1  joerg Given
   4079  1.1  joerg   template&lt;int T&gt; struct C {};
   4080  1.1  joerg   C&lt;42&gt; c;
   4081  1.1  joerg classTemplateSpecializationDecl(
   4082  1.1  joerg   hasAnyTemplateArgument(equalsIntegralValue("42")))
   4083  1.1  joerg   matches the implicit instantiation of C in C&lt;42&gt;.
   4084  1.1  joerg </pre></td></tr>
   4085  1.1  joerg 
   4086  1.1  joerg 
   4087  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>
   4088  1.1  joerg <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
   4089  1.1  joerg 
   4090  1.1  joerg Given
   4091  1.1  joerg   template&lt;int T&gt; struct C {};
   4092  1.1  joerg   C&lt;42&gt; c;
   4093  1.1  joerg classTemplateSpecializationDecl(
   4094  1.1  joerg   hasAnyTemplateArgument(isIntegral()))
   4095  1.1  joerg   matches the implicit instantiation of C in C&lt;42&gt;
   4096  1.1  joerg   with isIntegral() matching 42.
   4097  1.1  joerg </pre></td></tr>
   4098  1.1  joerg 
   4099  1.1  joerg 
   4100  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>
   4101  1.1  joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
   4102  1.1  joerg 
   4103  1.1  joerg Given
   4104  1.1  joerg   template&lt;typename T&gt; struct C {};
   4105  1.1  joerg   C&lt;int&gt; c;
   4106  1.1  joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
   4107  1.1  joerg   matches C&lt;int&gt;.
   4108  1.1  joerg </pre></td></tr>
   4109  1.1  joerg 
   4110  1.1  joerg 
   4111  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('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
   4112  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
   4113  1.1  joerg partially matching a given regex.
   4114  1.1  joerg 
   4115  1.1  joerg Example matches Y but not X
   4116  1.1  joerg     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
   4117  1.1  joerg   #include "ASTMatcher.h"
   4118  1.1  joerg   class X {};
   4119  1.1  joerg ASTMatcher.h:
   4120  1.1  joerg   class Y {};
   4121  1.1  joerg 
   4122  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;
   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_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
   4127  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
   4128  1.1  joerg 
   4129  1.1  joerg Example matches X but not Y
   4130  1.1  joerg   (matcher = cxxRecordDecl(isExpansionInMainFile())
   4131  1.1  joerg   #include &lt;Y.h&gt;
   4132  1.1  joerg   class X {};
   4133  1.1  joerg Y.h:
   4134  1.1  joerg   class Y {};
   4135  1.1  joerg 
   4136  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;
   4137  1.1  joerg </pre></td></tr>
   4138  1.1  joerg 
   4139  1.1  joerg 
   4140  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>
   4141  1.1  joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
   4142  1.1  joerg 
   4143  1.1  joerg Example matches Y but not X
   4144  1.1  joerg     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   4145  1.1  joerg   #include &lt;SystemHeader.h&gt;
   4146  1.1  joerg   class X {};
   4147  1.1  joerg SystemHeader.h:
   4148  1.1  joerg   class Y {};
   4149  1.1  joerg 
   4150  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;
   4151  1.1  joerg </pre></td></tr>
   4152  1.1  joerg 
   4153  1.1  joerg 
   4154  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>
   4155  1.1  joerg <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
   4156  1.1  joerg 
   4157  1.1  joerg Given
   4158  1.1  joerg  struct S { bool func(); };
   4159  1.1  joerg functionDecl(returns(booleanType()))
   4160  1.1  joerg   matches "bool func();"
   4161  1.1  joerg </pre></td></tr>
   4162  1.1  joerg 
   4163  1.1  joerg 
   4164  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>
   4165  1.1  joerg <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
   4166  1.1  joerg 
   4167  1.1  joerg Matches a node if it equals the node previously bound to ID.
   4168  1.1  joerg 
   4169  1.1  joerg Given
   4170  1.1  joerg   class X { int a; int b; };
   4171  1.1  joerg cxxRecordDecl(
   4172  1.1  joerg     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
   4173  1.1  joerg     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
   4174  1.1  joerg   matches the class X, as a and b have the same type.
   4175  1.1  joerg 
   4176  1.1  joerg Note that when multiple matches are involved via forEach* matchers,
   4177  1.1  joerg equalsBoundNodes acts as a filter.
   4178  1.1  joerg For example:
   4179  1.1  joerg compoundStmt(
   4180  1.1  joerg     forEachDescendant(varDecl().bind("d")),
   4181  1.1  joerg     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
   4182  1.1  joerg will trigger a match for each combination of variable declaration
   4183  1.1  joerg and reference to that variable declaration within a compound statement.
   4184  1.1  joerg </pre></td></tr>
   4185  1.1  joerg 
   4186  1.1  joerg 
   4187  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>
   4188  1.1  joerg <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
   4189  1.1  joerg 
   4190  1.1  joerg Type has pointer identity in the AST.
   4191  1.1  joerg </pre></td></tr>
   4192  1.1  joerg 
   4193  1.1  joerg 
   4194  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>
   4195  1.1  joerg <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
   4196  1.1  joerg 
   4197  1.1  joerg Given
   4198  1.1  joerg   int i;
   4199  1.1  joerg   float f;
   4200  1.1  joerg realFloatingPointType()
   4201  1.1  joerg   matches "float f" but not "int i"
   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_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
   4206  1.1  joerg <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
   4207  1.1  joerg 
   4208  1.1  joerg Given
   4209  1.1  joerg  struct S { void func(); };
   4210  1.1  joerg functionDecl(returns(voidType()))
   4211  1.1  joerg   matches "void func();"
   4212  1.1  joerg </pre></td></tr>
   4213  1.1  joerg 
   4214  1.1  joerg 
   4215  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>
   4216  1.1  joerg <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
   4217  1.1  joerg 
   4218  1.1  joerg Given
   4219  1.1  joerg   int x;
   4220  1.1  joerg   int s = sizeof(x) + alignof(x)
   4221  1.1  joerg unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
   4222  1.1  joerg   matches sizeof(x)
   4223  1.1  joerg 
   4224  1.1  joerg If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
   4225  1.1  joerg should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
   4226  1.1  joerg </pre></td></tr>
   4227  1.1  joerg 
   4228  1.1  joerg 
   4229  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('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
   4230  1.1  joerg <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
   4231  1.1  joerg unary).
   4232  1.1  joerg 
   4233  1.1  joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   4234  1.1  joerg   !(a || b)
   4235  1.1  joerg </pre></td></tr>
   4236  1.1  joerg 
   4237  1.1  joerg 
   4238  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>
   4239  1.1  joerg <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
   4240  1.1  joerg to '.'.
   4241  1.1  joerg 
   4242  1.1  joerg Member calls on the implicit this pointer match as called with '-&gt;'.
   4243  1.1  joerg 
   4244  1.1  joerg Given
   4245  1.1  joerg   class Y {
   4246  1.1  joerg     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
   4247  1.1  joerg     template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
   4248  1.1  joerg     int a;
   4249  1.1  joerg     static int b;
   4250  1.1  joerg   };
   4251  1.1  joerg   template &lt;class T&gt;
   4252  1.1  joerg   class Z {
   4253  1.1  joerg     void x() { this-&gt;m; }
   4254  1.1  joerg   };
   4255  1.1  joerg memberExpr(isArrow())
   4256  1.1  joerg   matches this-&gt;x, x, y.x, a, this-&gt;b
   4257  1.1  joerg cxxDependentScopeMemberExpr(isArrow())
   4258  1.1  joerg   matches this-&gt;m
   4259  1.1  joerg unresolvedMemberExpr(isArrow())
   4260  1.1  joerg   matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
   4261  1.1  joerg </pre></td></tr>
   4262  1.1  joerg 
   4263  1.1  joerg 
   4264  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>
   4265  1.1  joerg <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
   4266  1.1  joerg 
   4267  1.1  joerg Example matches x, but not y, z, or a.
   4268  1.1  joerg (matcher = varDecl(hasAutomaticStorageDuration())
   4269  1.1  joerg void f() {
   4270  1.1  joerg   int x;
   4271  1.1  joerg   static int y;
   4272  1.1  joerg   thread_local int z;
   4273  1.1  joerg }
   4274  1.1  joerg int a;
   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_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
   4279  1.1  joerg <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
   4280  1.1  joerg 
   4281  1.1  joerg Example matches y and z (matcher = varDecl(hasGlobalStorage())
   4282  1.1  joerg void f() {
   4283  1.1  joerg   int x;
   4284  1.1  joerg   static int y;
   4285  1.1  joerg }
   4286  1.1  joerg int z;
   4287  1.1  joerg </pre></td></tr>
   4288  1.1  joerg 
   4289  1.1  joerg 
   4290  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>
   4291  1.1  joerg <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
   4292  1.1  joerg non-static local variable.
   4293  1.1  joerg 
   4294  1.1  joerg Example matches x (matcher = varDecl(hasLocalStorage())
   4295  1.1  joerg void f() {
   4296  1.1  joerg   int x;
   4297  1.1  joerg   static int y;
   4298  1.1  joerg }
   4299  1.1  joerg int z;
   4300  1.1  joerg </pre></td></tr>
   4301  1.1  joerg 
   4302  1.1  joerg 
   4303  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>
   4304  1.1  joerg <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
   4305  1.1  joerg It includes the variable declared at namespace scope and those declared
   4306  1.1  joerg with "static" and "extern" storage class specifiers.
   4307  1.1  joerg 
   4308  1.1  joerg void f() {
   4309  1.1  joerg   int x;
   4310  1.1  joerg   static int y;
   4311  1.1  joerg   thread_local int z;
   4312  1.1  joerg }
   4313  1.1  joerg int a;
   4314  1.1  joerg static int b;
   4315  1.1  joerg extern int c;
   4316  1.1  joerg varDecl(hasStaticStorageDuration())
   4317  1.1  joerg   matches the function declaration y, a, b and c.
   4318  1.1  joerg </pre></td></tr>
   4319  1.1  joerg 
   4320  1.1  joerg 
   4321  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>
   4322  1.1  joerg <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
   4323  1.1  joerg 
   4324  1.1  joerg Example matches z, but not x, z, or a.
   4325  1.1  joerg (matcher = varDecl(hasThreadStorageDuration())
   4326  1.1  joerg void f() {
   4327  1.1  joerg   int x;
   4328  1.1  joerg   static int y;
   4329  1.1  joerg   thread_local int z;
   4330  1.1  joerg }
   4331  1.1  joerg int a;
   4332  1.1  joerg </pre></td></tr>
   4333  1.1  joerg 
   4334  1.1  joerg 
   4335  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>
   4336  1.1  joerg <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
   4337  1.1  joerg        and if constexpr.
   4338  1.1  joerg 
   4339  1.1  joerg Given:
   4340  1.1  joerg   constexpr int foo = 42;
   4341  1.1  joerg   constexpr int bar();
   4342  1.1  joerg   void baz() { if constexpr(1 &gt; 0) {} }
   4343  1.1  joerg varDecl(isConstexpr())
   4344  1.1  joerg   matches the declaration of foo.
   4345  1.1  joerg functionDecl(isConstexpr())
   4346  1.1  joerg   matches the declaration of bar.
   4347  1.1  joerg ifStmt(isConstexpr())
   4348  1.1  joerg   matches the if statement in baz.
   4349  1.1  joerg </pre></td></tr>
   4350  1.1  joerg 
   4351  1.1  joerg 
   4352  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>
   4353  1.1  joerg <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
   4354  1.1  joerg 
   4355  1.1  joerg Example matches A, va, fa
   4356  1.1  joerg   class A {};
   4357  1.1  joerg   class B;  // Doesn't match, as it has no body.
   4358  1.1  joerg   int va;
   4359  1.1  joerg   extern int vb;  // Doesn't match, as it doesn't define the variable.
   4360  1.1  joerg   void fa() {}
   4361  1.1  joerg   void fb();  // Doesn't match, as it has no body.
   4362  1.1  joerg   @interface X
   4363  1.1  joerg   - (void)ma; // Doesn't match, interface is declaration.
   4364  1.1  joerg   @end
   4365  1.1  joerg   @implementation X
   4366  1.1  joerg   - (void)ma {}
   4367  1.1  joerg   @end
   4368  1.1  joerg 
   4369  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;,
   4370  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
   4371  1.1  joerg </pre></td></tr>
   4372  1.1  joerg 
   4373  1.1  joerg 
   4374  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>
   4375  1.1  joerg <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
   4376  1.1  joerg a C++ catch block, or an Objective-C statement.
   4377  1.1  joerg 
   4378  1.1  joerg Example matches x (matcher = varDecl(isExceptionVariable())
   4379  1.1  joerg void f(int y) {
   4380  1.1  joerg   try {
   4381  1.1  joerg   } catch (int x) {
   4382  1.1  joerg   }
   4383  1.1  joerg }
   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_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
   4388  1.1  joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
   4389  1.1  joerg static member variable template instantiations.
   4390  1.1  joerg 
   4391  1.1  joerg Given
   4392  1.1  joerg   template&lt;typename T&gt; void A(T t) { }
   4393  1.1  joerg   template&lt;&gt; void A(int N) { }
   4394  1.1  joerg functionDecl(isExplicitTemplateSpecialization())
   4395  1.1  joerg   matches the specialization A&lt;int&gt;().
   4396  1.1  joerg 
   4397  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;
   4398  1.1  joerg </pre></td></tr>
   4399  1.1  joerg 
   4400  1.1  joerg 
   4401  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>
   4402  1.1  joerg <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
   4403  1.1  joerg 
   4404  1.1  joerg Given:
   4405  1.1  joerg   extern "C" void f() {}
   4406  1.1  joerg   extern "C" { void g() {} }
   4407  1.1  joerg   void h() {}
   4408  1.1  joerg   extern "C" int x = 1;
   4409  1.1  joerg   extern "C" int y = 2;
   4410  1.1  joerg   int z = 3;
   4411  1.1  joerg functionDecl(isExternC())
   4412  1.1  joerg   matches the declaration of f and g, but not the declaration of h.
   4413  1.1  joerg varDecl(isExternC())
   4414  1.1  joerg   matches the declaration of x and y, but not the declaration of z.
   4415  1.1  joerg </pre></td></tr>
   4416  1.1  joerg 
   4417  1.1  joerg 
   4418  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>
   4419  1.1  joerg <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
   4420  1.1  joerg 
   4421  1.1  joerg Example matches y (matcher = varDecl(isStaticLocal()))
   4422  1.1  joerg void f() {
   4423  1.1  joerg   int x;
   4424  1.1  joerg   static int y;
   4425  1.1  joerg }
   4426  1.1  joerg static int z;
   4427  1.1  joerg </pre></td></tr>
   4428  1.1  joerg 
   4429  1.1  joerg 
   4430  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>
   4431  1.1  joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
   4432  1.1  joerg class specifier ("static" keyword) written in the source.
   4433  1.1  joerg 
   4434  1.1  joerg Given:
   4435  1.1  joerg   static void f() {}
   4436  1.1  joerg   static int i = 0;
   4437  1.1  joerg   extern int j;
   4438  1.1  joerg   int k;
   4439  1.1  joerg functionDecl(isStaticStorageClass())
   4440  1.1  joerg   matches the function declaration f.
   4441  1.1  joerg varDecl(isStaticStorageClass())
   4442  1.1  joerg   matches the variable declaration i.
   4443  1.1  joerg </pre></td></tr>
   4444  1.1  joerg 
   4445  1.1  joerg 
   4446  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>
   4447  1.1  joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
   4448  1.1  joerg member variable template instantiations.
   4449  1.1  joerg 
   4450  1.1  joerg Given
   4451  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   4452  1.1  joerg or
   4453  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   4454  1.1  joerg or
   4455  1.1  joerg   template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
   4456  1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   4457  1.1  joerg   matches the template instantiation of X&lt;A&gt;.
   4458  1.1  joerg 
   4459  1.1  joerg But given
   4460  1.1  joerg   template &lt;typename T&gt;  class X {}; class A {};
   4461  1.1  joerg   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   4462  1.1  joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
   4463  1.1  joerg   does not match, as X&lt;A&gt; is an explicit template specialization.
   4464  1.1  joerg 
   4465  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;
   4466  1.1  joerg </pre></td></tr>
   4467  1.1  joerg 
   4468  1.1  joerg 
   4469  1.1  joerg <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
   4470  1.1  joerg <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
   4471  1.1  joerg template instantiations.
   4472  1.1  joerg 
   4473  1.1  joerg Given
   4474  1.1  joerg   template&lt;typename T&gt; void A(T t) { T i; }
   4475  1.1  joerg   A(0);
   4476  1.1  joerg   A(0U);
   4477  1.1  joerg functionDecl(isInstantiated())
   4478  1.1  joerg   matches 'A(int) {...};' and 'A(unsigned) {...}'.
   4479  1.1  joerg </pre></td></tr>
   4480  1.1  joerg 
   4481  1.1  joerg 
   4482  1.1  joerg <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
   4483  1.1  joerg <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
   4484  1.1  joerg GNU's __null, C++11's nullptr, or C's NULL macro.
   4485  1.1  joerg 
   4486  1.1  joerg Given:
   4487  1.1  joerg   void *v1 = NULL;
   4488  1.1  joerg   void *v2 = nullptr;
   4489  1.1  joerg   void *v3 = __null; // GNU extension
   4490  1.1  joerg   char *cp = (char *)0;
   4491  1.1  joerg   int *ip = 0;
   4492  1.1  joerg   int i = 0;
   4493  1.1  joerg expr(nullPointerConstant())
   4494  1.1  joerg   matches the initializer for v1, v2, v3, cp, and ip. Does not match the
   4495  1.1  joerg   initializer for i.
   4496  1.1  joerg </pre></td></tr>
   4497  1.1  joerg 
   4498  1.1  joerg 
   4499  1.1  joerg <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
   4500  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
   4501  1.1  joerg 
   4502  1.1  joerg This matcher is only provided as a performance optimization of hasName.
   4503  1.1  joerg     hasAnyName(a, b, c)
   4504  1.1  joerg  is equivalent to, but faster than
   4505  1.1  joerg     anyOf(hasName(a), hasName(b), hasName(c))
   4506  1.1  joerg </pre></td></tr>
   4507  1.1  joerg 
   4508  1.1  joerg 
   4509  1.1  joerg <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
   4510  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
   4511  1.1  joerg Selector.getAsString()
   4512  1.1  joerg 
   4513  1.1  joerg  matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
   4514  1.1  joerg  matches both of the expressions below:
   4515  1.1  joerg     [myObj methodA:argA];
   4516  1.1  joerg     [myObj methodB:argB];
   4517  1.1  joerg </pre></td></tr>
   4518  1.1  joerg 
   4519  1.1  joerg 
   4520  1.1  joerg <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
   4521  1.1  joerg <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
   4522  1.1  joerg 
   4523  1.1  joerg Given
   4524  1.1  joerg   int j;
   4525  1.1  joerg   template&lt;typename T&gt; void A(T t) { T i; j += 42;}
   4526  1.1  joerg   A(0);
   4527  1.1  joerg   A(0U);
   4528  1.1  joerg declStmt(isInTemplateInstantiation())
   4529  1.1  joerg   matches 'int i;' and 'unsigned i'.
   4530  1.1  joerg unless(stmt(isInTemplateInstantiation()))
   4531  1.1  joerg   will NOT match j += 42; as it's shared between the template definition and
   4532  1.1  joerg   instantiation.
   4533  1.1  joerg </pre></td></tr>
   4534  1.1  joerg 
   4535  1.1  joerg <!--END_NARROWING_MATCHERS -->
   4536  1.1  joerg </table>
   4537  1.1  joerg 
   4538  1.1  joerg <!-- ======================================================================= -->
   4539  1.1  joerg <h2 id="traversal-matchers">AST Traversal Matchers</h2>
   4540  1.1  joerg <!-- ======================================================================= -->
   4541  1.1  joerg 
   4542  1.1  joerg <p>Traversal matchers specify the relationship to other nodes that are
   4543  1.1  joerg reachable from the current node.</p>
   4544  1.1  joerg 
   4545  1.1  joerg <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
   4546  1.1  joerg forEachDescendant) which work on all nodes and allow users to write more generic
   4547  1.1  joerg match expressions.</p>
   4548  1.1  joerg 
   4549  1.1  joerg <table>
   4550  1.1  joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
   4551  1.1  joerg <!-- START_TRAVERSAL_MATCHERS -->
   4552  1.1  joerg 
   4553  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>
   4554  1.1  joerg <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
   4555  1.1  joerg 
   4556  1.1  joerg Unlike anyOf, eachOf will generate a match result for each
   4557  1.1  joerg matching submatcher.
   4558  1.1  joerg 
   4559  1.1  joerg For example, in:
   4560  1.1  joerg   class A { int a; int b; };
   4561  1.1  joerg The matcher:
   4562  1.1  joerg   cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
   4563  1.1  joerg                        has(fieldDecl(hasName("b")).bind("v"))))
   4564  1.1  joerg will generate two results binding "v", the first of which binds
   4565  1.1  joerg the field declaration of a, the second the field declaration of
   4566  1.1  joerg b.
   4567  1.1  joerg 
   4568  1.1  joerg Usable as: Any Matcher
   4569  1.1  joerg </pre></td></tr>
   4570  1.1  joerg 
   4571  1.1  joerg 
   4572  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>
   4573  1.1  joerg <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   4574  1.1  joerg provided matcher.
   4575  1.1  joerg 
   4576  1.1  joerg Example matches X, A, A::X, B, B::C, B::C::X
   4577  1.1  joerg   (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
   4578  1.1  joerg   class X {};
   4579  1.1  joerg   class A { class X {}; };  // Matches A, because A::X is a class of name
   4580  1.1  joerg                             // X inside A.
   4581  1.1  joerg   class B { class C { class X {}; }; };
   4582  1.1  joerg 
   4583  1.1  joerg DescendantT must be an AST base type.
   4584  1.1  joerg 
   4585  1.1  joerg As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
   4586  1.1  joerg each result that matches instead of only on the first one.
   4587  1.1  joerg 
   4588  1.1  joerg Note: Recursively combined ForEachDescendant can cause many matches:
   4589  1.1  joerg   cxxRecordDecl(forEachDescendant(cxxRecordDecl(
   4590  1.1  joerg     forEachDescendant(cxxRecordDecl())
   4591  1.1  joerg   )))
   4592  1.1  joerg will match 10 times (plus injected class name matches) on:
   4593  1.1  joerg   class A { class B { class C { class D { class E {}; }; }; }; };
   4594  1.1  joerg 
   4595  1.1  joerg Usable as: Any Matcher
   4596  1.1  joerg </pre></td></tr>
   4597  1.1  joerg 
   4598  1.1  joerg 
   4599  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>
   4600  1.1  joerg <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
   4601  1.1  joerg provided matcher.
   4602  1.1  joerg 
   4603  1.1  joerg Example matches X, Y, Y::X, Z::Y, Z::Y::X
   4604  1.1  joerg   (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
   4605  1.1  joerg   class X {};
   4606  1.1  joerg   class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
   4607  1.1  joerg                             // inside Y.
   4608  1.1  joerg   class Z { class Y { class X {}; }; };  // Does not match Z.
   4609  1.1  joerg 
   4610  1.1  joerg ChildT must be an AST base type.
   4611  1.1  joerg 
   4612  1.1  joerg As opposed to 'has', 'forEach' will cause a match for each result that
   4613  1.1  joerg matches instead of only on the first one.
   4614  1.1  joerg 
   4615  1.1  joerg Usable as: Any Matcher
   4616  1.1  joerg </pre></td></tr>
   4617  1.1  joerg 
   4618  1.1  joerg 
   4619  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>
   4620  1.1  joerg <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
   4621  1.1  joerg matcher.
   4622  1.1  joerg 
   4623  1.1  joerg Given
   4624  1.1  joerg void f() { if (true) { int x = 42; } }
   4625  1.1  joerg void g() { for (;;) { int x = 43; } }
   4626  1.1  joerg expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
   4627  1.1  joerg 
   4628  1.1  joerg Usable as: Any Matcher
   4629  1.1  joerg </pre></td></tr>
   4630  1.1  joerg 
   4631  1.1  joerg 
   4632  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>
   4633  1.1  joerg <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   4634  1.1  joerg provided matcher.
   4635  1.1  joerg 
   4636  1.1  joerg Example matches X, Y, Z
   4637  1.1  joerg     (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
   4638  1.1  joerg   class X {};  // Matches X, because X::X is a class of name X inside X.
   4639  1.1  joerg   class Y { class X {}; };
   4640  1.1  joerg   class Z { class Y { class X {}; }; };
   4641  1.1  joerg 
   4642  1.1  joerg DescendantT must be an AST base type.
   4643  1.1  joerg 
   4644  1.1  joerg Usable as: Any Matcher
   4645  1.1  joerg </pre></td></tr>
   4646  1.1  joerg 
   4647  1.1  joerg 
   4648  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>
   4649  1.1  joerg <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
   4650  1.1  joerg provided matcher.
   4651  1.1  joerg 
   4652  1.1  joerg Example matches X, Y
   4653  1.1  joerg   (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
   4654  1.1  joerg   class X {};  // Matches X, because X::X is a class of name X inside X.
   4655  1.1  joerg   class Y { class X {}; };
   4656  1.1  joerg   class Z { class Y { class X {}; }; };  // Does not match Z.
   4657  1.1  joerg 
   4658  1.1  joerg ChildT must be an AST base type.
   4659  1.1  joerg 
   4660  1.1  joerg Usable as: Any Matcher
   4661  1.1  joerg Note that has is direct matcher, so it also matches things like implicit
   4662  1.1  joerg casts and paren casts. If you are matching with expr then you should
   4663  1.1  joerg probably consider using ignoringParenImpCasts like:
   4664  1.1  joerg has(ignoringParenImpCasts(expr())).
   4665  1.1  joerg </pre></td></tr>
   4666  1.1  joerg 
   4667  1.1  joerg 
   4668  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>
   4669  1.1  joerg <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
   4670  1.1  joerg matcher.
   4671  1.1  joerg 
   4672  1.1  joerg Given
   4673  1.1  joerg void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
   4674  1.1  joerg compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
   4675  1.1  joerg 
   4676  1.1  joerg Usable as: Any Matcher
   4677  1.1  joerg </pre></td></tr>
   4678  1.1  joerg 
   4679  1.1  joerg 
   4680  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>
   4681  1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
   4682  1.1  joerg switch statement or conditional operator.
   4683  1.1  joerg 
   4684  1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   4685  1.1  joerg   if (true) {}
   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_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>
   4690  1.1  joerg <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
   4691  1.1  joerg (binary or ternary).
   4692  1.1  joerg 
   4693  1.1  joerg Example matches b
   4694  1.1  joerg   condition ? a : b
   4695  1.1  joerg   condition ?: b
   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_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>
   4700  1.1  joerg <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
   4701  1.1  joerg 
   4702  1.1  joerg Example 1 (conditional ternary operator): matches a
   4703  1.1  joerg   condition ? a : b
   4704  1.1  joerg 
   4705  1.1  joerg Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
   4706  1.1  joerg   condition ?: b
   4707  1.1  joerg </pre></td></tr>
   4708  1.1  joerg 
   4709  1.1  joerg 
   4710  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   4711  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
   4712  1.1  joerg matches the given matcher.
   4713  1.1  joerg 
   4714  1.1  joerg The associated declaration is:
   4715  1.1  joerg - for type nodes, the declaration of the underlying type
   4716  1.1  joerg - for CallExpr, the declaration of the callee
   4717  1.1  joerg - for MemberExpr, the declaration of the referenced member
   4718  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   4719  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   4720  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   4721  1.1  joerg 
   4722  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   4723  1.1  joerg sugared type. Given
   4724  1.1  joerg   class X {};
   4725  1.1  joerg   typedef X Y;
   4726  1.1  joerg   Y y;
   4727  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   4728  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   4729  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   4730  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   4731  1.1  joerg       recordType(hasDeclaration(decl())))))
   4732  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   4733  1.1  joerg 
   4734  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;,
   4735  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;,
   4736  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;,
   4737  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;,
   4738  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;,
   4739  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;,
   4740  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   4741  1.1  joerg </pre></td></tr>
   4742  1.1  joerg 
   4743  1.1  joerg 
   4744  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>
   4745  1.1  joerg <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
   4746  1.1  joerg 
   4747  1.1  joerg Given
   4748  1.1  joerg   int i[5];
   4749  1.1  joerg   void f() { i[1] = 42; }
   4750  1.1  joerg arraySubscriptExpression(hasBase(implicitCastExpr(
   4751  1.1  joerg     hasSourceExpression(declRefExpr()))))
   4752  1.1  joerg   matches i[1] with the declRefExpr() matching i
   4753  1.1  joerg </pre></td></tr>
   4754  1.1  joerg 
   4755  1.1  joerg 
   4756  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>
   4757  1.1  joerg <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
   4758  1.1  joerg 
   4759  1.1  joerg Given
   4760  1.1  joerg   int i[5];
   4761  1.1  joerg   void f() { i[1] = 42; }
   4762  1.1  joerg arraySubscriptExpression(hasIndex(integerLiteral()))
   4763  1.1  joerg   matches i[1] with the integerLiteral() matching 1
   4764  1.1  joerg </pre></td></tr>
   4765  1.1  joerg 
   4766  1.1  joerg 
   4767  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('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>
   4768  1.1  joerg <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
   4769  1.1  joerg 
   4770  1.1  joerg Example matches a (matcher = binaryOperator(hasLHS()))
   4771  1.1  joerg   a || b
   4772  1.1  joerg </pre></td></tr>
   4773  1.1  joerg 
   4774  1.1  joerg 
   4775  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('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>
   4776  1.1  joerg <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
   4777  1.1  joerg 
   4778  1.1  joerg Example matches b (matcher = binaryOperator(hasRHS()))
   4779  1.1  joerg   a || b
   4780  1.1  joerg </pre></td></tr>
   4781  1.1  joerg 
   4782  1.1  joerg 
   4783  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>
   4784  1.1  joerg <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
   4785  1.1  joerg type.
   4786  1.1  joerg 
   4787  1.1  joerg Given
   4788  1.1  joerg   struct A {};
   4789  1.1  joerg   A a[7];
   4790  1.1  joerg   int b[7];
   4791  1.1  joerg arrayType(hasElementType(builtinType()))
   4792  1.1  joerg   matches "int b[7]"
   4793  1.1  joerg 
   4794  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;
   4795  1.1  joerg </pre></td></tr>
   4796  1.1  joerg 
   4797  1.1  joerg 
   4798  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>
   4799  1.1  joerg <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
   4800  1.1  joerg 
   4801  1.1  joerg Given
   4802  1.1  joerg   _Atomic(int) i;
   4803  1.1  joerg   _Atomic(float) f;
   4804  1.1  joerg atomicType(hasValueType(isInteger()))
   4805  1.1  joerg  matches "_Atomic(int) i"
   4806  1.1  joerg 
   4807  1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
   4808  1.1  joerg </pre></td></tr>
   4809  1.1  joerg 
   4810  1.1  joerg 
   4811  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>
   4812  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
   4813  1.1  joerg 
   4814  1.1  joerg Note: There is no TypeLoc for the deduced type and thus no
   4815  1.1  joerg getDeducedLoc() matcher.
   4816  1.1  joerg 
   4817  1.1  joerg Given
   4818  1.1  joerg   auto a = 1;
   4819  1.1  joerg   auto b = 2.0;
   4820  1.1  joerg autoType(hasDeducedType(isInteger()))
   4821  1.1  joerg   matches "auto a"
   4822  1.1  joerg 
   4823  1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
   4824  1.1  joerg </pre></td></tr>
   4825  1.1  joerg 
   4826  1.1  joerg 
   4827  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('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;  InnerMatcher</td></tr>
   4828  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
   4829  1.1  joerg binary operator matches.
   4830  1.1  joerg </pre></td></tr>
   4831  1.1  joerg 
   4832  1.1  joerg 
   4833  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>
   4834  1.1  joerg <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
   4835  1.1  joerg 
   4836  1.1  joerg Example matches a (matcher = binaryOperator(hasLHS()))
   4837  1.1  joerg   a || b
   4838  1.1  joerg </pre></td></tr>
   4839  1.1  joerg 
   4840  1.1  joerg 
   4841  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>
   4842  1.1  joerg <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
   4843  1.1  joerg 
   4844  1.1  joerg Example matches b (matcher = binaryOperator(hasRHS()))
   4845  1.1  joerg   a || b
   4846  1.1  joerg </pre></td></tr>
   4847  1.1  joerg 
   4848  1.1  joerg 
   4849  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>
   4850  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
   4851  1.1  joerg block.
   4852  1.1  joerg 
   4853  1.1  joerg Does not match the 'this' parameter of a method.
   4854  1.1  joerg 
   4855  1.1  joerg Given
   4856  1.1  joerg   class X { void f(int x, int y, int z) {} };
   4857  1.1  joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
   4858  1.1  joerg   matches f(int x, int y, int z) {}
   4859  1.1  joerg with hasAnyParameter(...)
   4860  1.1  joerg   matching int y
   4861  1.1  joerg 
   4862  1.1  joerg For ObjectiveC, given
   4863  1.1  joerg   @interface I - (void) f:(int) y; @end
   4864  1.1  joerg 
   4865  1.1  joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   4866  1.1  joerg matches the declaration of method f with hasParameter
   4867  1.1  joerg matching y.
   4868  1.1  joerg 
   4869  1.1  joerg For blocks, given
   4870  1.1  joerg   b = ^(int y) { printf("%d", y) };
   4871  1.1  joerg 
   4872  1.1  joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
   4873  1.1  joerg matches the declaration of the block b with hasParameter
   4874  1.1  joerg matching y.
   4875  1.1  joerg </pre></td></tr>
   4876  1.1  joerg 
   4877  1.1  joerg 
   4878  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>
   4879  1.1  joerg <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
   4880  1.1  joerg declaration or a block.
   4881  1.1  joerg 
   4882  1.1  joerg Given
   4883  1.1  joerg   class X { void f(int x) {} };
   4884  1.1  joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   4885  1.1  joerg   matches f(int x) {}
   4886  1.1  joerg with hasParameter(...)
   4887  1.1  joerg   matching int x
   4888  1.1  joerg 
   4889  1.1  joerg For ObjectiveC, given
   4890  1.1  joerg   @interface I - (void) f:(int) y; @end
   4891  1.1  joerg 
   4892  1.1  joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   4893  1.1  joerg matches the declaration of method f with hasParameter
   4894  1.1  joerg matching y.
   4895  1.1  joerg </pre></td></tr>
   4896  1.1  joerg 
   4897  1.1  joerg 
   4898  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>
   4899  1.1  joerg <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
   4900  1.1  joerg pointee matches a given matcher.
   4901  1.1  joerg 
   4902  1.1  joerg Given
   4903  1.1  joerg   int *a;
   4904  1.1  joerg   int const *b;
   4905  1.1  joerg   float const *f;
   4906  1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   4907  1.1  joerg   matches "int const *b"
   4908  1.1  joerg 
   4909  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;,
   4910  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;
   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_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>
   4915  1.1  joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
   4916  1.1  joerg 
   4917  1.1  joerg Given
   4918  1.1  joerg   void f(int i);
   4919  1.1  joerg   int y;
   4920  1.1  joerg   f(y);
   4921  1.1  joerg callExpr(
   4922  1.1  joerg   forEachArgumentWithParam(
   4923  1.1  joerg     declRefExpr(to(varDecl(hasName("y")))),
   4924  1.1  joerg     parmVarDecl(hasType(isInteger()))
   4925  1.1  joerg ))
   4926  1.1  joerg   matches f(y);
   4927  1.1  joerg with declRefExpr(...)
   4928  1.1  joerg   matching int y
   4929  1.1  joerg and parmVarDecl(...)
   4930  1.1  joerg   matching int i
   4931  1.1  joerg </pre></td></tr>
   4932  1.1  joerg 
   4933  1.1  joerg 
   4934  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>
   4935  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
   4936  1.1  joerg expression, or an ObjC-message-send expression.
   4937  1.1  joerg 
   4938  1.1  joerg Given
   4939  1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   4940  1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   4941  1.1  joerg   matches x(1, y, 42)
   4942  1.1  joerg with hasAnyArgument(...)
   4943  1.1  joerg   matching y
   4944  1.1  joerg 
   4945  1.1  joerg For ObjectiveC, given
   4946  1.1  joerg   @interface I - (void) f:(int) y; @end
   4947  1.1  joerg   void foo(I *i) { [i f:12]; }
   4948  1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   4949  1.1  joerg   matches [i f:12]
   4950  1.1  joerg </pre></td></tr>
   4951  1.1  joerg 
   4952  1.1  joerg 
   4953  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>
   4954  1.1  joerg <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
   4955  1.1  joerg call expression.
   4956  1.1  joerg 
   4957  1.1  joerg Example matches y in x(y)
   4958  1.1  joerg     (matcher = callExpr(hasArgument(0, declRefExpr())))
   4959  1.1  joerg   void x(int) { int y; x(y); }
   4960  1.1  joerg </pre></td></tr>
   4961  1.1  joerg 
   4962  1.1  joerg 
   4963  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('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   4964  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
   4965  1.1  joerg matches the given matcher.
   4966  1.1  joerg 
   4967  1.1  joerg The associated declaration is:
   4968  1.1  joerg - for type nodes, the declaration of the underlying type
   4969  1.1  joerg - for CallExpr, the declaration of the callee
   4970  1.1  joerg - for MemberExpr, the declaration of the referenced member
   4971  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   4972  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   4973  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   4974  1.1  joerg 
   4975  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   4976  1.1  joerg sugared type. Given
   4977  1.1  joerg   class X {};
   4978  1.1  joerg   typedef X Y;
   4979  1.1  joerg   Y y;
   4980  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   4981  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   4982  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   4983  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   4984  1.1  joerg       recordType(hasDeclaration(decl())))))
   4985  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   4986  1.1  joerg 
   4987  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;,
   4988  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;,
   4989  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;,
   4990  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;,
   4991  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;,
   4992  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;,
   4993  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   4994  1.1  joerg </pre></td></tr>
   4995  1.1  joerg 
   4996  1.1  joerg 
   4997  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>
   4998  1.1  joerg <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
   4999  1.1  joerg 
   5000  1.1  joerg Given
   5001  1.1  joerg   class A { A() : i(42), j(42) {} int i; int j; };
   5002  1.1  joerg cxxConstructorDecl(forEachConstructorInitializer(
   5003  1.1  joerg   forField(decl().bind("x"))
   5004  1.1  joerg ))
   5005  1.1  joerg   will trigger two matches, binding for 'i' and 'j' respectively.
   5006  1.1  joerg </pre></td></tr>
   5007  1.1  joerg 
   5008  1.1  joerg 
   5009  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>
   5010  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
   5011  1.1  joerg 
   5012  1.1  joerg Given
   5013  1.1  joerg   struct Foo {
   5014  1.1  joerg     Foo() : foo_(1) { }
   5015  1.1  joerg     int foo_;
   5016  1.1  joerg   };
   5017  1.1  joerg cxxRecordDecl(has(cxxConstructorDecl(
   5018  1.1  joerg   hasAnyConstructorInitializer(anything())
   5019  1.1  joerg )))
   5020  1.1  joerg   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
   5021  1.1  joerg </pre></td></tr>
   5022  1.1  joerg 
   5023  1.1  joerg 
   5024  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>
   5025  1.1  joerg <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
   5026  1.1  joerg 
   5027  1.1  joerg Given
   5028  1.1  joerg   struct Foo {
   5029  1.1  joerg     Foo() : foo_(1) { }
   5030  1.1  joerg     int foo_;
   5031  1.1  joerg   };
   5032  1.1  joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
   5033  1.1  joerg     forField(hasName("foo_"))))))
   5034  1.1  joerg   matches Foo
   5035  1.1  joerg with forField matching foo_
   5036  1.1  joerg </pre></td></tr>
   5037  1.1  joerg 
   5038  1.1  joerg 
   5039  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>
   5040  1.1  joerg <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
   5041  1.1  joerg 
   5042  1.1  joerg Given
   5043  1.1  joerg   struct Foo {
   5044  1.1  joerg     Foo() : foo_(1) { }
   5045  1.1  joerg     int foo_;
   5046  1.1  joerg   };
   5047  1.1  joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
   5048  1.1  joerg     withInitializer(integerLiteral(equals(1)))))))
   5049  1.1  joerg   matches Foo
   5050  1.1  joerg with withInitializer matching (1)
   5051  1.1  joerg </pre></td></tr>
   5052  1.1  joerg 
   5053  1.1  joerg 
   5054  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>
   5055  1.1  joerg <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
   5056  1.1  joerg given matcher. Implicit object expressions are included; that is, it matches
   5057  1.1  joerg use of implicit `this`.
   5058  1.1  joerg 
   5059  1.1  joerg Given
   5060  1.1  joerg   struct X {
   5061  1.1  joerg     int m;
   5062  1.1  joerg     int f(X x) { x.m; return m; }
   5063  1.1  joerg   };
   5064  1.1  joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   5065  1.1  joerg   matches `x.m`, but not `m`; however,
   5066  1.1  joerg memberExpr(hasObjectExpression(hasType(pointsTo(
   5067  1.1  joerg      cxxRecordDecl(hasName("X"))))))
   5068  1.1  joerg   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   5069  1.1  joerg </pre></td></tr>
   5070  1.1  joerg 
   5071  1.1  joerg 
   5072  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>
   5073  1.1  joerg <tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
   5074  1.1  joerg definition that has a given body.
   5075  1.1  joerg 
   5076  1.1  joerg Given
   5077  1.1  joerg   for (;;) {}
   5078  1.1  joerg hasBody(compoundStmt())
   5079  1.1  joerg   matches 'for (;;) {}'
   5080  1.1  joerg with compoundStmt()
   5081  1.1  joerg   matching '{}'
   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_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>
   5086  1.1  joerg <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
   5087  1.1  joerg 
   5088  1.1  joerg Example:
   5089  1.1  joerg     forStmt(hasLoopVariable(anything()))
   5090  1.1  joerg matches 'int x' in
   5091  1.1  joerg     for (int x : a) { }
   5092  1.1  joerg </pre></td></tr>
   5093  1.1  joerg 
   5094  1.1  joerg 
   5095  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>
   5096  1.1  joerg <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
   5097  1.1  joerg 
   5098  1.1  joerg Example:
   5099  1.1  joerg     forStmt(hasRangeInit(anything()))
   5100  1.1  joerg matches 'a' in
   5101  1.1  joerg     for (int x : a) { }
   5102  1.1  joerg </pre></td></tr>
   5103  1.1  joerg 
   5104  1.1  joerg 
   5105  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>
   5106  1.1  joerg <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
   5107  1.1  joerg `on`, matches the argument directly without stripping away anything.
   5108  1.1  joerg 
   5109  1.1  joerg Given
   5110  1.1  joerg   class Y { public: void m(); };
   5111  1.1  joerg   Y g();
   5112  1.1  joerg   class X : public Y { void g(); };
   5113  1.1  joerg   void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
   5114  1.1  joerg cxxMemberCallExpr(onImplicitObjectArgument(hasType(
   5115  1.1  joerg     cxxRecordDecl(hasName("Y")))))
   5116  1.1  joerg   matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
   5117  1.1  joerg cxxMemberCallExpr(on(callExpr()))
   5118  1.1  joerg   does not match `(g()).m()`, because the parens are not ignored.
   5119  1.1  joerg 
   5120  1.1  joerg FIXME: Overload to allow directly matching types?
   5121  1.1  joerg </pre></td></tr>
   5122  1.1  joerg 
   5123  1.1  joerg 
   5124  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>
   5125  1.1  joerg <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
   5126  1.1  joerg stripping off any parentheses or implicit casts.
   5127  1.1  joerg 
   5128  1.1  joerg Given
   5129  1.1  joerg   class Y { public: void m(); };
   5130  1.1  joerg   Y g();
   5131  1.1  joerg   class X : public Y {};
   5132  1.1  joerg   void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
   5133  1.1  joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
   5134  1.1  joerg   matches `y.m()` and `(g()).m()`.
   5135  1.1  joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
   5136  1.1  joerg   matches `x.m()`.
   5137  1.1  joerg cxxMemberCallExpr(on(callExpr()))
   5138  1.1  joerg   matches `(g()).m()`.
   5139  1.1  joerg 
   5140  1.1  joerg FIXME: Overload to allow directly matching types?
   5141  1.1  joerg </pre></td></tr>
   5142  1.1  joerg 
   5143  1.1  joerg 
   5144  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>
   5145  1.1  joerg <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
   5146  1.1  joerg </pre></td></tr>
   5147  1.1  joerg 
   5148  1.1  joerg 
   5149  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>
   5150  1.1  joerg <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
   5151  1.1  joerg matches the InnerMatcher, or is a pointer to a type that matches the
   5152  1.1  joerg InnerMatcher.
   5153  1.1  joerg 
   5154  1.1  joerg Given
   5155  1.1  joerg   class Y { public: void m(); };
   5156  1.1  joerg   class X : public Y { void g(); };
   5157  1.1  joerg   void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
   5158  1.1  joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
   5159  1.1  joerg     cxxRecordDecl(hasName("Y")))))
   5160  1.1  joerg   matches `y.m()`, `p-&gt;m()` and `x.m()`.
   5161  1.1  joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
   5162  1.1  joerg     cxxRecordDecl(hasName("X")))))
   5163  1.1  joerg   matches `x.g()`.
   5164  1.1  joerg </pre></td></tr>
   5165  1.1  joerg 
   5166  1.1  joerg 
   5167  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>
   5168  1.1  joerg <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
   5169  1.1  joerg produce multiple matches.
   5170  1.1  joerg 
   5171  1.1  joerg Given
   5172  1.1  joerg   class A { virtual void f(); };
   5173  1.1  joerg   class B : public A { void f(); };
   5174  1.1  joerg   class C : public B { void f(); };
   5175  1.1  joerg cxxMethodDecl(ofClass(hasName("C")),
   5176  1.1  joerg               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
   5177  1.1  joerg   matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
   5178  1.1  joerg   that B::f is not overridden by C::f).
   5179  1.1  joerg 
   5180  1.1  joerg The check can produce multiple matches in case of multiple inheritance, e.g.
   5181  1.1  joerg   class A1 { virtual void f(); };
   5182  1.1  joerg   class A2 { virtual void f(); };
   5183  1.1  joerg   class C : public A1, public A2 { void f(); };
   5184  1.1  joerg cxxMethodDecl(ofClass(hasName("C")),
   5185  1.1  joerg               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
   5186  1.1  joerg   matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
   5187  1.1  joerg   once with "b" binding "A2::f" and "d" binding "C::f".
   5188  1.1  joerg </pre></td></tr>
   5189  1.1  joerg 
   5190  1.1  joerg 
   5191  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>
   5192  1.1  joerg <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
   5193  1.1  joerg belongs to.
   5194  1.1  joerg 
   5195  1.1  joerg FIXME: Generalize this for other kinds of declarations.
   5196  1.1  joerg FIXME: What other kind of declarations would we need to generalize
   5197  1.1  joerg this to?
   5198  1.1  joerg 
   5199  1.1  joerg Example matches A() in the last line
   5200  1.1  joerg     (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
   5201  1.1  joerg         ofClass(hasName("A"))))))
   5202  1.1  joerg   class A {
   5203  1.1  joerg    public:
   5204  1.1  joerg     A();
   5205  1.1  joerg   };
   5206  1.1  joerg   A a = A();
   5207  1.1  joerg </pre></td></tr>
   5208  1.1  joerg 
   5209  1.1  joerg 
   5210  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>
   5211  1.1  joerg <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
   5212  1.1  joerg 
   5213  1.1  joerg Given:
   5214  1.1  joerg   MyClass *p1 = new MyClass[10];
   5215  1.1  joerg cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
   5216  1.1  joerg   matches the expression 'new MyClass[10]'.
   5217  1.1  joerg </pre></td></tr>
   5218  1.1  joerg 
   5219  1.1  joerg 
   5220  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('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   5221  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
   5222  1.1  joerg matches the given matcher.
   5223  1.1  joerg 
   5224  1.1  joerg The associated declaration is:
   5225  1.1  joerg - for type nodes, the declaration of the underlying type
   5226  1.1  joerg - for CallExpr, the declaration of the callee
   5227  1.1  joerg - for MemberExpr, the declaration of the referenced member
   5228  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   5229  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   5230  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   5231  1.1  joerg 
   5232  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   5233  1.1  joerg sugared type. Given
   5234  1.1  joerg   class X {};
   5235  1.1  joerg   typedef X Y;
   5236  1.1  joerg   Y y;
   5237  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   5238  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   5239  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   5240  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   5241  1.1  joerg       recordType(hasDeclaration(decl())))))
   5242  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   5243  1.1  joerg 
   5244  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;,
   5245  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;,
   5246  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;,
   5247  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;,
   5248  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;,
   5249  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;,
   5250  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   5251  1.1  joerg </pre></td></tr>
   5252  1.1  joerg 
   5253  1.1  joerg 
   5254  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>
   5255  1.1  joerg <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
   5256  1.1  joerg 
   5257  1.1  joerg Given:
   5258  1.1  joerg   class A { void func(); };
   5259  1.1  joerg   class B { void member(); };
   5260  1.1  joerg 
   5261  1.1  joerg cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
   5262  1.1  joerg A but not B.
   5263  1.1  joerg </pre></td></tr>
   5264  1.1  joerg 
   5265  1.1  joerg 
   5266  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>
   5267  1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
   5268  1.1  joerg matching Base, or Objective-C classes that directly or indirectly
   5269  1.1  joerg subclass a class matching Base.
   5270  1.1  joerg 
   5271  1.1  joerg Note that a class is not considered to be derived from itself.
   5272  1.1  joerg 
   5273  1.1  joerg Example matches Y, Z, C (Base == hasName("X"))
   5274  1.1  joerg   class X;
   5275  1.1  joerg   class Y : public X {};  // directly derived
   5276  1.1  joerg   class Z : public Y {};  // indirectly derived
   5277  1.1  joerg   typedef X A;
   5278  1.1  joerg   typedef A B;
   5279  1.1  joerg   class C : public B {};  // derived from a typedef of X
   5280  1.1  joerg 
   5281  1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   5282  1.1  joerg   class Foo;
   5283  1.1  joerg   typedef Foo X;
   5284  1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   5285  1.1  joerg 
   5286  1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
   5287  1.1  joerg   @interface NSObject @end
   5288  1.1  joerg   @interface Bar : NSObject @end
   5289  1.1  joerg 
   5290  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;
   5291  1.1  joerg </pre></td></tr>
   5292  1.1  joerg 
   5293  1.1  joerg 
   5294  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>
   5295  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
   5296  1.1  joerg matching Base.
   5297  1.1  joerg 
   5298  1.1  joerg Note that a class is not considered to be derived from itself.
   5299  1.1  joerg 
   5300  1.1  joerg Example matches Y, C (Base == hasName("X"))
   5301  1.1  joerg   class X;
   5302  1.1  joerg   class Y : public X {};  // directly derived
   5303  1.1  joerg   class Z : public Y {};  // indirectly derived
   5304  1.1  joerg   typedef X A;
   5305  1.1  joerg   typedef A B;
   5306  1.1  joerg   class C : public B {};  // derived from a typedef of X
   5307  1.1  joerg 
   5308  1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   5309  1.1  joerg   class Foo;
   5310  1.1  joerg   typedef Foo X;
   5311  1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   5312  1.1  joerg </pre></td></tr>
   5313  1.1  joerg 
   5314  1.1  joerg 
   5315  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>
   5316  1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
   5317  1.1  joerg match Base.
   5318  1.1  joerg </pre></td></tr>
   5319  1.1  joerg 
   5320  1.1  joerg 
   5321  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>
   5322  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
   5323  1.1  joerg expression, or an ObjC-message-send expression.
   5324  1.1  joerg 
   5325  1.1  joerg Given
   5326  1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   5327  1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   5328  1.1  joerg   matches x(1, y, 42)
   5329  1.1  joerg with hasAnyArgument(...)
   5330  1.1  joerg   matching y
   5331  1.1  joerg 
   5332  1.1  joerg For ObjectiveC, given
   5333  1.1  joerg   @interface I - (void) f:(int) y; @end
   5334  1.1  joerg   void foo(I *i) { [i f:12]; }
   5335  1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   5336  1.1  joerg   matches [i f:12]
   5337  1.1  joerg </pre></td></tr>
   5338  1.1  joerg 
   5339  1.1  joerg 
   5340  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>
   5341  1.1  joerg <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
   5342  1.1  joerg given matcher.
   5343  1.1  joerg 
   5344  1.1  joerg Example matches y.x() (matcher = callExpr(callee(
   5345  1.1  joerg                                    cxxMethodDecl(hasName("x")))))
   5346  1.1  joerg   class Y { public: void x(); };
   5347  1.1  joerg   void z() { Y y; y.x(); }
   5348  1.1  joerg </pre></td></tr>
   5349  1.1  joerg 
   5350  1.1  joerg 
   5351  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>
   5352  1.1  joerg <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
   5353  1.1  joerg 
   5354  1.1  joerg Given
   5355  1.1  joerg   class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
   5356  1.1  joerg   void f() { f(); }
   5357  1.1  joerg callExpr(callee(expr()))
   5358  1.1  joerg   matches this-&gt;x(), x(), y.x(), f()
   5359  1.1  joerg with callee(...)
   5360  1.1  joerg   matching this-&gt;x, x, y.x, f respectively
   5361  1.1  joerg 
   5362  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;
   5363  1.1  joerg because this introduces ambiguous overloads with calls to Callee taking a
   5364  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
   5365  1.1  joerg implemented in terms of implicit casts.
   5366  1.1  joerg </pre></td></tr>
   5367  1.1  joerg 
   5368  1.1  joerg 
   5369  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>
   5370  1.1  joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
   5371  1.1  joerg 
   5372  1.1  joerg Given
   5373  1.1  joerg   void f(int i);
   5374  1.1  joerg   int y;
   5375  1.1  joerg   f(y);
   5376  1.1  joerg callExpr(
   5377  1.1  joerg   forEachArgumentWithParam(
   5378  1.1  joerg     declRefExpr(to(varDecl(hasName("y")))),
   5379  1.1  joerg     parmVarDecl(hasType(isInteger()))
   5380  1.1  joerg ))
   5381  1.1  joerg   matches f(y);
   5382  1.1  joerg with declRefExpr(...)
   5383  1.1  joerg   matching int y
   5384  1.1  joerg and parmVarDecl(...)
   5385  1.1  joerg   matching int i
   5386  1.1  joerg </pre></td></tr>
   5387  1.1  joerg 
   5388  1.1  joerg 
   5389  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>
   5390  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
   5391  1.1  joerg expression, or an ObjC-message-send expression.
   5392  1.1  joerg 
   5393  1.1  joerg Given
   5394  1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   5395  1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   5396  1.1  joerg   matches x(1, y, 42)
   5397  1.1  joerg with hasAnyArgument(...)
   5398  1.1  joerg   matching y
   5399  1.1  joerg 
   5400  1.1  joerg For ObjectiveC, given
   5401  1.1  joerg   @interface I - (void) f:(int) y; @end
   5402  1.1  joerg   void foo(I *i) { [i f:12]; }
   5403  1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   5404  1.1  joerg   matches [i f:12]
   5405  1.1  joerg </pre></td></tr>
   5406  1.1  joerg 
   5407  1.1  joerg 
   5408  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>
   5409  1.1  joerg <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
   5410  1.1  joerg call expression.
   5411  1.1  joerg 
   5412  1.1  joerg Example matches y in x(y)
   5413  1.1  joerg     (matcher = callExpr(hasArgument(0, declRefExpr())))
   5414  1.1  joerg   void x(int) { int y; x(y); }
   5415  1.1  joerg </pre></td></tr>
   5416  1.1  joerg 
   5417  1.1  joerg 
   5418  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('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   5419  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
   5420  1.1  joerg matches the given matcher.
   5421  1.1  joerg 
   5422  1.1  joerg The associated declaration is:
   5423  1.1  joerg - for type nodes, the declaration of the underlying type
   5424  1.1  joerg - for CallExpr, the declaration of the callee
   5425  1.1  joerg - for MemberExpr, the declaration of the referenced member
   5426  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   5427  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   5428  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   5429  1.1  joerg 
   5430  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   5431  1.1  joerg sugared type. Given
   5432  1.1  joerg   class X {};
   5433  1.1  joerg   typedef X Y;
   5434  1.1  joerg   Y y;
   5435  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   5436  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   5437  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   5438  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   5439  1.1  joerg       recordType(hasDeclaration(decl())))))
   5440  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   5441  1.1  joerg 
   5442  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;,
   5443  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;,
   5444  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;,
   5445  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;,
   5446  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;,
   5447  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;,
   5448  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   5449  1.1  joerg </pre></td></tr>
   5450  1.1  joerg 
   5451  1.1  joerg 
   5452  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>
   5453  1.1  joerg <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
   5454  1.1  joerg extension, matches the constant given in the statement.
   5455  1.1  joerg 
   5456  1.1  joerg Given
   5457  1.1  joerg   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
   5458  1.1  joerg caseStmt(hasCaseConstant(integerLiteral()))
   5459  1.1  joerg   matches "case 1:"
   5460  1.1  joerg </pre></td></tr>
   5461  1.1  joerg 
   5462  1.1  joerg 
   5463  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>
   5464  1.1  joerg <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
   5465  1.1  joerg or opaque value's source expression matches the given matcher.
   5466  1.1  joerg 
   5467  1.1  joerg Example 1: matches "a string"
   5468  1.1  joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
   5469  1.1  joerg class URL { URL(string); };
   5470  1.1  joerg URL url = "a string";
   5471  1.1  joerg 
   5472  1.1  joerg Example 2: matches 'b' (matcher =
   5473  1.1  joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
   5474  1.1  joerg int a = b ?: 1;
   5475  1.1  joerg </pre></td></tr>
   5476  1.1  joerg 
   5477  1.1  joerg 
   5478  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>
   5479  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   5480  1.1  joerg functionDecl that have at least one TemplateArgument matching the given
   5481  1.1  joerg InnerMatcher.
   5482  1.1  joerg 
   5483  1.1  joerg Given
   5484  1.1  joerg   template&lt;typename T&gt; class A {};
   5485  1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
   5486  1.1  joerg   A&lt;int&gt; a;
   5487  1.1  joerg 
   5488  1.1  joerg   template&lt;typename T&gt; f() {};
   5489  1.1  joerg   void func() { f&lt;int&gt;(); };
   5490  1.1  joerg 
   5491  1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   5492  1.1  joerg     refersToType(asString("int"))))
   5493  1.1  joerg   matches the specialization A&lt;int&gt;
   5494  1.1  joerg 
   5495  1.1  joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   5496  1.1  joerg   matches the specialization f&lt;int&gt;
   5497  1.1  joerg </pre></td></tr>
   5498  1.1  joerg 
   5499  1.1  joerg 
   5500  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>
   5501  1.1  joerg <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
   5502  1.1  joerg 
   5503  1.1  joerg Given
   5504  1.1  joerg   template&lt;typename T&gt; class A {}; #1
   5505  1.1  joerg   template&lt;&gt; class A&lt;int&gt; {}; #2
   5506  1.1  joerg classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
   5507  1.1  joerg   matches '#2' with classTemplateDecl() matching the class template
   5508  1.1  joerg   declaration of 'A' at #1.
   5509  1.1  joerg </pre></td></tr>
   5510  1.1  joerg 
   5511  1.1  joerg 
   5512  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>
   5513  1.1  joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   5514  1.1  joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   5515  1.1  joerg 
   5516  1.1  joerg Given
   5517  1.1  joerg   template&lt;typename T, typename U&gt; class A {};
   5518  1.1  joerg   A&lt;bool, int&gt; b;
   5519  1.1  joerg   A&lt;int, bool&gt; c;
   5520  1.1  joerg 
   5521  1.1  joerg   template&lt;typename T&gt; void f() {}
   5522  1.1  joerg   void func() { f&lt;int&gt;(); };
   5523  1.1  joerg classTemplateSpecializationDecl(hasTemplateArgument(
   5524  1.1  joerg     1, refersToType(asString("int"))))
   5525  1.1  joerg   matches the specialization A&lt;bool, int&gt;
   5526  1.1  joerg 
   5527  1.1  joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   5528  1.1  joerg   matches the specialization f&lt;int&gt;
   5529  1.1  joerg </pre></td></tr>
   5530  1.1  joerg 
   5531  1.1  joerg 
   5532  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>
   5533  1.1  joerg <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
   5534  1.1  joerg type.
   5535  1.1  joerg 
   5536  1.1  joerg Given
   5537  1.1  joerg   struct A {};
   5538  1.1  joerg   A a[7];
   5539  1.1  joerg   int b[7];
   5540  1.1  joerg arrayType(hasElementType(builtinType()))
   5541  1.1  joerg   matches "int b[7]"
   5542  1.1  joerg 
   5543  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;
   5544  1.1  joerg </pre></td></tr>
   5545  1.1  joerg 
   5546  1.1  joerg 
   5547  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>
   5548  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
   5549  1.1  joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
   5550  1.1  joerg 
   5551  1.1  joerg Given
   5552  1.1  joerg   { {}; 1+2; }
   5553  1.1  joerg hasAnySubstatement(compoundStmt())
   5554  1.1  joerg   matches '{ {}; 1+2; }'
   5555  1.1  joerg with compoundStmt()
   5556  1.1  joerg   matching '{}'
   5557  1.1  joerg </pre></td></tr>
   5558  1.1  joerg 
   5559  1.1  joerg 
   5560  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>
   5561  1.1  joerg <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
   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_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   5566  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
   5567  1.1  joerg matches the given matcher.
   5568  1.1  joerg 
   5569  1.1  joerg The associated declaration is:
   5570  1.1  joerg - for type nodes, the declaration of the underlying type
   5571  1.1  joerg - for CallExpr, the declaration of the callee
   5572  1.1  joerg - for MemberExpr, the declaration of the referenced member
   5573  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   5574  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   5575  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   5576  1.1  joerg 
   5577  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   5578  1.1  joerg sugared type. Given
   5579  1.1  joerg   class X {};
   5580  1.1  joerg   typedef X Y;
   5581  1.1  joerg   Y y;
   5582  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   5583  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   5584  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   5585  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   5586  1.1  joerg       recordType(hasDeclaration(decl())))))
   5587  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   5588  1.1  joerg 
   5589  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;,
   5590  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;,
   5591  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;,
   5592  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;,
   5593  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;,
   5594  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;,
   5595  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   5596  1.1  joerg </pre></td></tr>
   5597  1.1  joerg 
   5598  1.1  joerg 
   5599  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>
   5600  1.1  joerg <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
   5601  1.1  joerg specific using shadow declaration.
   5602  1.1  joerg 
   5603  1.1  joerg Given
   5604  1.1  joerg   namespace a { void f() {} }
   5605  1.1  joerg   using a::f;
   5606  1.1  joerg   void g() {
   5607  1.1  joerg     f();     // Matches this ..
   5608  1.1  joerg     a::f();  // .. but not this.
   5609  1.1  joerg   }
   5610  1.1  joerg declRefExpr(throughUsingDecl(anything()))
   5611  1.1  joerg   matches f()
   5612  1.1  joerg </pre></td></tr>
   5613  1.1  joerg 
   5614  1.1  joerg 
   5615  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>
   5616  1.1  joerg <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
   5617  1.1  joerg specified matcher.
   5618  1.1  joerg 
   5619  1.1  joerg Example matches x in if(x)
   5620  1.1  joerg     (matcher = declRefExpr(to(varDecl(hasName("x")))))
   5621  1.1  joerg   bool x;
   5622  1.1  joerg   if (x) {}
   5623  1.1  joerg </pre></td></tr>
   5624  1.1  joerg 
   5625  1.1  joerg 
   5626  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>
   5627  1.1  joerg <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
   5628  1.1  joerg 
   5629  1.1  joerg Note that this does not work for global declarations because the AST
   5630  1.1  joerg breaks up multiple-declaration DeclStmt's into multiple single-declaration
   5631  1.1  joerg DeclStmt's.
   5632  1.1  joerg Example: Given non-global declarations
   5633  1.1  joerg   int a, b = 0;
   5634  1.1  joerg   int c;
   5635  1.1  joerg   int d = 2, e;
   5636  1.1  joerg declStmt(containsDeclaration(
   5637  1.1  joerg       0, varDecl(hasInitializer(anything()))))
   5638  1.1  joerg   matches only 'int d = 2, e;', and
   5639  1.1  joerg declStmt(containsDeclaration(1, varDecl()))
   5640  1.1  joerg   matches 'int a, b = 0' as well as 'int d = 2, e;'
   5641  1.1  joerg   but 'int c;' is not matched.
   5642  1.1  joerg </pre></td></tr>
   5643  1.1  joerg 
   5644  1.1  joerg 
   5645  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>
   5646  1.1  joerg <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
   5647  1.1  joerg 
   5648  1.1  joerg Given
   5649  1.1  joerg   int a, b;
   5650  1.1  joerg   int c;
   5651  1.1  joerg declStmt(hasSingleDecl(anything()))
   5652  1.1  joerg   matches 'int c;' but not 'int a, b;'.
   5653  1.1  joerg </pre></td></tr>
   5654  1.1  joerg 
   5655  1.1  joerg 
   5656  1.1  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('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>
   5657  1.1  joerg <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
   5658  1.1  joerg the inner matcher.
   5659  1.1  joerg 
   5660  1.1  joerg Given
   5661  1.1  joerg   int x;
   5662  1.1  joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
   5663  1.1  joerg   matches int x
   5664  1.1  joerg </pre></td></tr>
   5665  1.1  joerg 
   5666  1.1  joerg 
   5667  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>
   5668  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
   5669  1.1  joerg Decl, matches InnerMatcher.
   5670  1.1  joerg 
   5671  1.1  joerg Given
   5672  1.1  joerg   namespace N {
   5673  1.1  joerg     namespace M {
   5674  1.1  joerg       class D {};
   5675  1.1  joerg     }
   5676  1.1  joerg   }
   5677  1.1  joerg 
   5678  1.1  joerg cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
   5679  1.1  joerg declaration of class D.
   5680  1.1  joerg </pre></td></tr>
   5681  1.1  joerg 
   5682  1.1  joerg 
   5683  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>
   5684  1.1  joerg <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
   5685  1.1  joerg 
   5686  1.1  joerg Given
   5687  1.1  joerg   decltype(1) a = 1;
   5688  1.1  joerg   decltype(2.0) b = 2.0;
   5689  1.1  joerg decltypeType(hasUnderlyingType(isInteger()))
   5690  1.1  joerg   matches the type of "a"
   5691  1.1  joerg 
   5692  1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
   5693  1.1  joerg </pre></td></tr>
   5694  1.1  joerg 
   5695  1.1  joerg 
   5696  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('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>
   5697  1.1  joerg <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
   5698  1.1  joerg definition that has a given body.
   5699  1.1  joerg 
   5700  1.1  joerg Given
   5701  1.1  joerg   for (;;) {}
   5702  1.1  joerg hasBody(compoundStmt())
   5703  1.1  joerg   matches 'for (;;) {}'
   5704  1.1  joerg with compoundStmt()
   5705  1.1  joerg   matching '{}'
   5706  1.1  joerg </pre></td></tr>
   5707  1.1  joerg 
   5708  1.1  joerg 
   5709  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>
   5710  1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
   5711  1.1  joerg switch statement or conditional operator.
   5712  1.1  joerg 
   5713  1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   5714  1.1  joerg   if (true) {}
   5715  1.1  joerg </pre></td></tr>
   5716  1.1  joerg 
   5717  1.1  joerg 
   5718  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>
   5719  1.1  joerg <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
   5720  1.1  joerg matches InnerMatcher if the qualifier exists.
   5721  1.1  joerg 
   5722  1.1  joerg Given
   5723  1.1  joerg   namespace N {
   5724  1.1  joerg     namespace M {
   5725  1.1  joerg       class D {};
   5726  1.1  joerg     }
   5727  1.1  joerg   }
   5728  1.1  joerg   N::M::D d;
   5729  1.1  joerg 
   5730  1.1  joerg elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
   5731  1.1  joerg matches the type of the variable declaration of d.
   5732  1.1  joerg </pre></td></tr>
   5733  1.1  joerg 
   5734  1.1  joerg 
   5735  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>
   5736  1.1  joerg <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
   5737  1.1  joerg 
   5738  1.1  joerg Given
   5739  1.1  joerg   namespace N {
   5740  1.1  joerg     namespace M {
   5741  1.1  joerg       class D {};
   5742  1.1  joerg     }
   5743  1.1  joerg   }
   5744  1.1  joerg   N::M::D d;
   5745  1.1  joerg 
   5746  1.1  joerg elaboratedType(namesType(recordType(
   5747  1.1  joerg hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
   5748  1.1  joerg declaration of d.
   5749  1.1  joerg </pre></td></tr>
   5750  1.1  joerg 
   5751  1.1  joerg 
   5752  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   5753  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
   5754  1.1  joerg matches the given matcher.
   5755  1.1  joerg 
   5756  1.1  joerg The associated declaration is:
   5757  1.1  joerg - for type nodes, the declaration of the underlying type
   5758  1.1  joerg - for CallExpr, the declaration of the callee
   5759  1.1  joerg - for MemberExpr, the declaration of the referenced member
   5760  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   5761  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   5762  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   5763  1.1  joerg 
   5764  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   5765  1.1  joerg sugared type. Given
   5766  1.1  joerg   class X {};
   5767  1.1  joerg   typedef X Y;
   5768  1.1  joerg   Y y;
   5769  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   5770  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   5771  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   5772  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   5773  1.1  joerg       recordType(hasDeclaration(decl())))))
   5774  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   5775  1.1  joerg 
   5776  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;,
   5777  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;,
   5778  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;,
   5779  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;,
   5780  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;,
   5781  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;,
   5782  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   5783  1.1  joerg </pre></td></tr>
   5784  1.1  joerg 
   5785  1.1  joerg 
   5786  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>
   5787  1.1  joerg <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
   5788  1.1  joerg 
   5789  1.1  joerg (Note: Clang's AST refers to other conversions as "casts" too, and calls
   5790  1.1  joerg actual casts "explicit" casts.)
   5791  1.1  joerg </pre></td></tr>
   5792  1.1  joerg 
   5793  1.1  joerg 
   5794  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('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   5795  1.1  joerg <tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
   5796  1.1  joerg declaration's type.
   5797  1.1  joerg 
   5798  1.1  joerg In case of a value declaration (for example a variable declaration),
   5799  1.1  joerg this resolves one layer of indirection. For example, in the value
   5800  1.1  joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   5801  1.1  joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   5802  1.1  joerg declaration of x.
   5803  1.1  joerg 
   5804  1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   5805  1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   5806  1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   5807  1.1  joerg  class X {};
   5808  1.1  joerg  void y(X &amp;x) { x; X z; }
   5809  1.1  joerg  class Y { friend class X; };
   5810  1.1  joerg 
   5811  1.1  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_1ValueDecl.html">ValueDecl</a>&gt;
   5812  1.1  joerg </pre></td></tr>
   5813  1.1  joerg 
   5814  1.1  joerg 
   5815  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>
   5816  1.1  joerg <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
   5817  1.1  joerg matcher.
   5818  1.1  joerg 
   5819  1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   5820  1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   5821  1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   5822  1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   5823  1.1  joerg  class X {};
   5824  1.1  joerg  void y(X &amp;x) { x; X z; }
   5825  1.1  joerg  typedef int U;
   5826  1.1  joerg  class Y { friend class X; };
   5827  1.1  joerg </pre></td></tr>
   5828  1.1  joerg 
   5829  1.1  joerg 
   5830  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>
   5831  1.1  joerg <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
   5832  1.1  joerg elidable constructor and other corresponding bookkeeping nodes.
   5833  1.1  joerg 
   5834  1.1  joerg In C++17, elidable copy constructors are no longer being generated in the
   5835  1.1  joerg AST as it is not permitted by the standard. They are, however, part of the
   5836  1.1  joerg AST in C++14 and earlier. So, a matcher must abstract over these differences
   5837  1.1  joerg to work in all language modes. This matcher skips elidable constructor-call
   5838  1.1  joerg AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
   5839  1.1  joerg various implicit nodes inside the constructor calls, all of which will not
   5840  1.1  joerg appear in the C++17 AST.
   5841  1.1  joerg 
   5842  1.1  joerg Given
   5843  1.1  joerg 
   5844  1.1  joerg struct H {};
   5845  1.1  joerg H G();
   5846  1.1  joerg void f() {
   5847  1.1  joerg   H D = G();
   5848  1.1  joerg }
   5849  1.1  joerg 
   5850  1.1  joerg ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
   5851  1.1  joerg matches ``H D = G()`` in C++11 through C++17 (and beyond).
   5852  1.1  joerg </pre></td></tr>
   5853  1.1  joerg 
   5854  1.1  joerg 
   5855  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>
   5856  1.1  joerg <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
   5857  1.1  joerg are stripped off.
   5858  1.1  joerg 
   5859  1.1  joerg Parentheses and explicit casts are not discarded.
   5860  1.1  joerg Given
   5861  1.1  joerg   int arr[5];
   5862  1.1  joerg   int a = 0;
   5863  1.1  joerg   char b = 0;
   5864  1.1  joerg   const int c = a;
   5865  1.1  joerg   int *d = arr;
   5866  1.1  joerg   long e = (long) 0l;
   5867  1.1  joerg The matchers
   5868  1.1  joerg    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
   5869  1.1  joerg    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
   5870  1.1  joerg would match the declarations for a, b, c, and d, but not e.
   5871  1.1  joerg While
   5872  1.1  joerg    varDecl(hasInitializer(integerLiteral()))
   5873  1.1  joerg    varDecl(hasInitializer(declRefExpr()))
   5874  1.1  joerg only match the declarations for b, c, and d.
   5875  1.1  joerg </pre></td></tr>
   5876  1.1  joerg 
   5877  1.1  joerg 
   5878  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>
   5879  1.1  joerg <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
   5880  1.1  joerg nodes are stripped off.
   5881  1.1  joerg 
   5882  1.1  joerg Parentheses and explicit casts are not discarded.
   5883  1.1  joerg Given
   5884  1.1  joerg   class C {};
   5885  1.1  joerg   C a = C();
   5886  1.1  joerg   C b;
   5887  1.1  joerg   C c = b;
   5888  1.1  joerg The matchers
   5889  1.1  joerg    varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
   5890  1.1  joerg would match the declarations for a, b, and c.
   5891  1.1  joerg While
   5892  1.1  joerg    varDecl(hasInitializer(cxxConstructExpr()))
   5893  1.1  joerg only match the declarations for b and c.
   5894  1.1  joerg </pre></td></tr>
   5895  1.1  joerg 
   5896  1.1  joerg 
   5897  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>
   5898  1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
   5899  1.1  joerg casts are stripped off.
   5900  1.1  joerg 
   5901  1.1  joerg Implicit and non-C Style casts are also discarded.
   5902  1.1  joerg Given
   5903  1.1  joerg   int a = 0;
   5904  1.1  joerg   char b = (0);
   5905  1.1  joerg   void* c = reinterpret_cast&lt;char*&gt;(0);
   5906  1.1  joerg   char d = char(0);
   5907  1.1  joerg The matcher
   5908  1.1  joerg    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
   5909  1.1  joerg would match the declarations for a, b, c, and d.
   5910  1.1  joerg while
   5911  1.1  joerg    varDecl(hasInitializer(integerLiteral()))
   5912  1.1  joerg only match the declaration for a.
   5913  1.1  joerg </pre></td></tr>
   5914  1.1  joerg 
   5915  1.1  joerg 
   5916  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>
   5917  1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
   5918  1.1  joerg parentheses are stripped off.
   5919  1.1  joerg 
   5920  1.1  joerg Explicit casts are not discarded.
   5921  1.1  joerg Given
   5922  1.1  joerg   int arr[5];
   5923  1.1  joerg   int a = 0;
   5924  1.1  joerg   char b = (0);
   5925  1.1  joerg   const int c = a;
   5926  1.1  joerg   int *d = (arr);
   5927  1.1  joerg   long e = ((long) 0l);
   5928  1.1  joerg The matchers
   5929  1.1  joerg    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
   5930  1.1  joerg    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
   5931  1.1  joerg would match the declarations for a, b, c, and d, but not e.
   5932  1.1  joerg while
   5933  1.1  joerg    varDecl(hasInitializer(integerLiteral()))
   5934  1.1  joerg    varDecl(hasInitializer(declRefExpr()))
   5935  1.1  joerg would only match the declaration for a.
   5936  1.1  joerg </pre></td></tr>
   5937  1.1  joerg 
   5938  1.1  joerg 
   5939  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>
   5940  1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
   5941  1.1  joerg 
   5942  1.1  joerg Given
   5943  1.1  joerg   const char* str = ("my-string");
   5944  1.1  joerg The matcher
   5945  1.1  joerg   implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
   5946  1.1  joerg would match the implicit cast resulting from the assignment.
   5947  1.1  joerg </pre></td></tr>
   5948  1.1  joerg 
   5949  1.1  joerg 
   5950  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>
   5951  1.1  joerg <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
   5952  1.1  joerg 
   5953  1.1  joerg Given
   5954  1.1  joerg   class C {
   5955  1.1  joerg     int a = 2;
   5956  1.1  joerg     int b = 3;
   5957  1.1  joerg     int c;
   5958  1.1  joerg   };
   5959  1.1  joerg fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
   5960  1.1  joerg   matches 'int a;' but not 'int b;'.
   5961  1.1  joerg fieldDecl(hasInClassInitializer(anything()))
   5962  1.1  joerg   matches 'int a;' and 'int b;' but not 'int c;'.
   5963  1.1  joerg </pre></td></tr>
   5964  1.1  joerg 
   5965  1.1  joerg 
   5966  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>
   5967  1.1  joerg <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
   5968  1.1  joerg definition that has a given body.
   5969  1.1  joerg 
   5970  1.1  joerg Given
   5971  1.1  joerg   for (;;) {}
   5972  1.1  joerg hasBody(compoundStmt())
   5973  1.1  joerg   matches 'for (;;) {}'
   5974  1.1  joerg with compoundStmt()
   5975  1.1  joerg   matching '{}'
   5976  1.1  joerg </pre></td></tr>
   5977  1.1  joerg 
   5978  1.1  joerg 
   5979  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>
   5980  1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
   5981  1.1  joerg switch statement or conditional operator.
   5982  1.1  joerg 
   5983  1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   5984  1.1  joerg   if (true) {}
   5985  1.1  joerg </pre></td></tr>
   5986  1.1  joerg 
   5987  1.1  joerg 
   5988  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>
   5989  1.1  joerg <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
   5990  1.1  joerg 
   5991  1.1  joerg Example:
   5992  1.1  joerg     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
   5993  1.1  joerg matches '++x' in
   5994  1.1  joerg     for (x; x &lt; N; ++x) { }
   5995  1.1  joerg </pre></td></tr>
   5996  1.1  joerg 
   5997  1.1  joerg 
   5998  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>
   5999  1.1  joerg <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
   6000  1.1  joerg 
   6001  1.1  joerg Example:
   6002  1.1  joerg     forStmt(hasLoopInit(declStmt()))
   6003  1.1  joerg matches 'int x = 0' in
   6004  1.1  joerg     for (int x = 0; x &lt; N; ++x) { }
   6005  1.1  joerg </pre></td></tr>
   6006  1.1  joerg 
   6007  1.1  joerg 
   6008  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('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>
   6009  1.1  joerg <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
   6010  1.1  joerg declaration's type.
   6011  1.1  joerg 
   6012  1.1  joerg In case of a value declaration (for example a variable declaration),
   6013  1.1  joerg this resolves one layer of indirection. For example, in the value
   6014  1.1  joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   6015  1.1  joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   6016  1.1  joerg declaration of x.
   6017  1.1  joerg 
   6018  1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   6019  1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   6020  1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   6021  1.1  joerg  class X {};
   6022  1.1  joerg  void y(X &amp;x) { x; X z; }
   6023  1.1  joerg  class Y { friend class X; };
   6024  1.1  joerg 
   6025  1.1  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_1ValueDecl.html">ValueDecl</a>&gt;
   6026  1.1  joerg </pre></td></tr>
   6027  1.1  joerg 
   6028  1.1  joerg 
   6029  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>
   6030  1.1  joerg <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
   6031  1.1  joerg matcher.
   6032  1.1  joerg 
   6033  1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   6034  1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   6035  1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   6036  1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   6037  1.1  joerg  class X {};
   6038  1.1  joerg  void y(X &amp;x) { x; X z; }
   6039  1.1  joerg  typedef int U;
   6040  1.1  joerg  class Y { friend class X; };
   6041  1.1  joerg </pre></td></tr>
   6042  1.1  joerg 
   6043  1.1  joerg 
   6044  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>
   6045  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
   6046  1.1  joerg block.
   6047  1.1  joerg 
   6048  1.1  joerg Does not match the 'this' parameter of a method.
   6049  1.1  joerg 
   6050  1.1  joerg Given
   6051  1.1  joerg   class X { void f(int x, int y, int z) {} };
   6052  1.1  joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
   6053  1.1  joerg   matches f(int x, int y, int z) {}
   6054  1.1  joerg with hasAnyParameter(...)
   6055  1.1  joerg   matching int y
   6056  1.1  joerg 
   6057  1.1  joerg For ObjectiveC, given
   6058  1.1  joerg   @interface I - (void) f:(int) y; @end
   6059  1.1  joerg 
   6060  1.1  joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   6061  1.1  joerg matches the declaration of method f with hasParameter
   6062  1.1  joerg matching y.
   6063  1.1  joerg 
   6064  1.1  joerg For blocks, given
   6065  1.1  joerg   b = ^(int y) { printf("%d", y) };
   6066  1.1  joerg 
   6067  1.1  joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
   6068  1.1  joerg matches the declaration of the block b with hasParameter
   6069  1.1  joerg matching y.
   6070  1.1  joerg </pre></td></tr>
   6071  1.1  joerg 
   6072  1.1  joerg 
   6073  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>
   6074  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   6075  1.1  joerg functionDecl that have at least one TemplateArgument matching the given
   6076  1.1  joerg InnerMatcher.
   6077  1.1  joerg 
   6078  1.1  joerg Given
   6079  1.1  joerg   template&lt;typename T&gt; class A {};
   6080  1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
   6081  1.1  joerg   A&lt;int&gt; a;
   6082  1.1  joerg 
   6083  1.1  joerg   template&lt;typename T&gt; f() {};
   6084  1.1  joerg   void func() { f&lt;int&gt;(); };
   6085  1.1  joerg 
   6086  1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   6087  1.1  joerg     refersToType(asString("int"))))
   6088  1.1  joerg   matches the specialization A&lt;int&gt;
   6089  1.1  joerg 
   6090  1.1  joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   6091  1.1  joerg   matches the specialization f&lt;int&gt;
   6092  1.1  joerg </pre></td></tr>
   6093  1.1  joerg 
   6094  1.1  joerg 
   6095  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>
   6096  1.1  joerg <tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
   6097  1.1  joerg definition that has a given body.
   6098  1.1  joerg 
   6099  1.1  joerg Given
   6100  1.1  joerg   for (;;) {}
   6101  1.1  joerg hasBody(compoundStmt())
   6102  1.1  joerg   matches 'for (;;) {}'
   6103  1.1  joerg with compoundStmt()
   6104  1.1  joerg   matching '{}'
   6105  1.1  joerg </pre></td></tr>
   6106  1.1  joerg 
   6107  1.1  joerg 
   6108  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>
   6109  1.1  joerg <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
   6110  1.1  joerg declaration.
   6111  1.1  joerg 
   6112  1.1  joerg Given
   6113  1.1  joerg   template&lt;bool b&gt;
   6114  1.1  joerg   struct S {
   6115  1.1  joerg     S(int); // #1
   6116  1.1  joerg     explicit S(double); // #2
   6117  1.1  joerg     operator int(); // #3
   6118  1.1  joerg     explicit operator bool(); // #4
   6119  1.1  joerg     explicit(false) S(bool) // # 7
   6120  1.1  joerg     explicit(true) S(char) // # 8
   6121  1.1  joerg     explicit(b) S(S) // # 9
   6122  1.1  joerg   };
   6123  1.1  joerg   S(int) -&gt; S&lt;true&gt; // #5
   6124  1.1  joerg   explicit S(double) -&gt; S&lt;false&gt; // #6
   6125  1.1  joerg cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
   6126  1.1  joerg cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
   6127  1.1  joerg cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
   6128  1.1  joerg </pre></td></tr>
   6129  1.1  joerg 
   6130  1.1  joerg 
   6131  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>
   6132  1.1  joerg <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
   6133  1.1  joerg declaration or a block.
   6134  1.1  joerg 
   6135  1.1  joerg Given
   6136  1.1  joerg   class X { void f(int x) {} };
   6137  1.1  joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   6138  1.1  joerg   matches f(int x) {}
   6139  1.1  joerg with hasParameter(...)
   6140  1.1  joerg   matching int x
   6141  1.1  joerg 
   6142  1.1  joerg For ObjectiveC, given
   6143  1.1  joerg   @interface I - (void) f:(int) y; @end
   6144  1.1  joerg 
   6145  1.1  joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   6146  1.1  joerg matches the declaration of method f with hasParameter
   6147  1.1  joerg matching y.
   6148  1.1  joerg </pre></td></tr>
   6149  1.1  joerg 
   6150  1.1  joerg 
   6151  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>
   6152  1.1  joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   6153  1.1  joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   6154  1.1  joerg 
   6155  1.1  joerg Given
   6156  1.1  joerg   template&lt;typename T, typename U&gt; class A {};
   6157  1.1  joerg   A&lt;bool, int&gt; b;
   6158  1.1  joerg   A&lt;int, bool&gt; c;
   6159  1.1  joerg 
   6160  1.1  joerg   template&lt;typename T&gt; void f() {}
   6161  1.1  joerg   void func() { f&lt;int&gt;(); };
   6162  1.1  joerg classTemplateSpecializationDecl(hasTemplateArgument(
   6163  1.1  joerg     1, refersToType(asString("int"))))
   6164  1.1  joerg   matches the specialization A&lt;bool, int&gt;
   6165  1.1  joerg 
   6166  1.1  joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   6167  1.1  joerg   matches the specialization f&lt;int&gt;
   6168  1.1  joerg </pre></td></tr>
   6169  1.1  joerg 
   6170  1.1  joerg 
   6171  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>
   6172  1.1  joerg <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
   6173  1.1  joerg 
   6174  1.1  joerg Given:
   6175  1.1  joerg   class X { int f() { return 1; } };
   6176  1.1  joerg cxxMethodDecl(returns(asString("int")))
   6177  1.1  joerg   matches int f() { return 1; }
   6178  1.1  joerg </pre></td></tr>
   6179  1.1  joerg 
   6180  1.1  joerg 
   6181  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>
   6182  1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
   6183  1.1  joerg switch statement or conditional operator.
   6184  1.1  joerg 
   6185  1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   6186  1.1  joerg   if (true) {}
   6187  1.1  joerg </pre></td></tr>
   6188  1.1  joerg 
   6189  1.1  joerg 
   6190  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>
   6191  1.1  joerg <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
   6192  1.1  joerg 
   6193  1.1  joerg Given
   6194  1.1  joerg   if (A* a = GetAPointer()) {}
   6195  1.1  joerg hasConditionVariableStatement(...)
   6196  1.1  joerg   matches 'A* a = GetAPointer()'.
   6197  1.1  joerg </pre></td></tr>
   6198  1.1  joerg 
   6199  1.1  joerg 
   6200  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>
   6201  1.1  joerg <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
   6202  1.1  joerg 
   6203  1.1  joerg Examples matches the if statement
   6204  1.1  joerg   (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
   6205  1.1  joerg   if (false) false; else true;
   6206  1.1  joerg </pre></td></tr>
   6207  1.1  joerg 
   6208  1.1  joerg 
   6209  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>
   6210  1.1  joerg <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
   6211  1.1  joerg 
   6212  1.1  joerg Examples matches the if statement
   6213  1.1  joerg   (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
   6214  1.1  joerg   if (false) true; else false;
   6215  1.1  joerg </pre></td></tr>
   6216  1.1  joerg 
   6217  1.1  joerg 
   6218  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>
   6219  1.1  joerg <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
   6220  1.1  joerg matcher.
   6221  1.1  joerg 
   6222  1.1  joerg FIXME: Unit test this matcher
   6223  1.1  joerg </pre></td></tr>
   6224  1.1  joerg 
   6225  1.1  joerg 
   6226  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>
   6227  1.1  joerg <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
   6228  1.1  joerg 
   6229  1.1  joerg Example matches y.
   6230  1.1  joerg     (matcher = initListExpr(hasInit(0, expr())))
   6231  1.1  joerg   int x{y}.
   6232  1.1  joerg </pre></td></tr>
   6233  1.1  joerg 
   6234  1.1  joerg 
   6235  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>
   6236  1.1  joerg <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
   6237  1.1  joerg (if expression have it).
   6238  1.1  joerg </pre></td></tr>
   6239  1.1  joerg 
   6240  1.1  joerg 
   6241  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6242  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
   6243  1.1  joerg matches the given matcher.
   6244  1.1  joerg 
   6245  1.1  joerg The associated declaration is:
   6246  1.1  joerg - for type nodes, the declaration of the underlying type
   6247  1.1  joerg - for CallExpr, the declaration of the callee
   6248  1.1  joerg - for MemberExpr, the declaration of the referenced member
   6249  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   6250  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   6251  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   6252  1.1  joerg 
   6253  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6254  1.1  joerg sugared type. Given
   6255  1.1  joerg   class X {};
   6256  1.1  joerg   typedef X Y;
   6257  1.1  joerg   Y y;
   6258  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6259  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6260  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6261  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6262  1.1  joerg       recordType(hasDeclaration(decl())))))
   6263  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6264  1.1  joerg 
   6265  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;,
   6266  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;,
   6267  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;,
   6268  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;,
   6269  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;,
   6270  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;,
   6271  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6272  1.1  joerg </pre></td></tr>
   6273  1.1  joerg 
   6274  1.1  joerg 
   6275  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6276  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
   6277  1.1  joerg matches the given matcher.
   6278  1.1  joerg 
   6279  1.1  joerg The associated declaration is:
   6280  1.1  joerg - for type nodes, the declaration of the underlying type
   6281  1.1  joerg - for CallExpr, the declaration of the callee
   6282  1.1  joerg - for MemberExpr, the declaration of the referenced member
   6283  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   6284  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   6285  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   6286  1.1  joerg 
   6287  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6288  1.1  joerg sugared type. Given
   6289  1.1  joerg   class X {};
   6290  1.1  joerg   typedef X Y;
   6291  1.1  joerg   Y y;
   6292  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6293  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6294  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6295  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6296  1.1  joerg       recordType(hasDeclaration(decl())))))
   6297  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6298  1.1  joerg 
   6299  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;,
   6300  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;,
   6301  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;,
   6302  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;,
   6303  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;,
   6304  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;,
   6305  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6306  1.1  joerg </pre></td></tr>
   6307  1.1  joerg 
   6308  1.1  joerg 
   6309  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('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6310  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
   6311  1.1  joerg matches the given matcher.
   6312  1.1  joerg 
   6313  1.1  joerg The associated declaration is:
   6314  1.1  joerg - for type nodes, the declaration of the underlying type
   6315  1.1  joerg - for CallExpr, the declaration of the callee
   6316  1.1  joerg - for MemberExpr, the declaration of the referenced member
   6317  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   6318  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   6319  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   6320  1.1  joerg 
   6321  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6322  1.1  joerg sugared type. Given
   6323  1.1  joerg   class X {};
   6324  1.1  joerg   typedef X Y;
   6325  1.1  joerg   Y y;
   6326  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6327  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6328  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6329  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6330  1.1  joerg       recordType(hasDeclaration(decl())))))
   6331  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6332  1.1  joerg 
   6333  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;,
   6334  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;,
   6335  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;,
   6336  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;,
   6337  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;,
   6338  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;,
   6339  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6340  1.1  joerg </pre></td></tr>
   6341  1.1  joerg 
   6342  1.1  joerg 
   6343  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>
   6344  1.1  joerg <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
   6345  1.1  joerg given matcher. Implicit object expressions are included; that is, it matches
   6346  1.1  joerg use of implicit `this`.
   6347  1.1  joerg 
   6348  1.1  joerg Given
   6349  1.1  joerg   struct X {
   6350  1.1  joerg     int m;
   6351  1.1  joerg     int f(X x) { x.m; return m; }
   6352  1.1  joerg   };
   6353  1.1  joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   6354  1.1  joerg   matches `x.m`, but not `m`; however,
   6355  1.1  joerg memberExpr(hasObjectExpression(hasType(pointsTo(
   6356  1.1  joerg      cxxRecordDecl(hasName("X"))))))
   6357  1.1  joerg   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   6358  1.1  joerg </pre></td></tr>
   6359  1.1  joerg 
   6360  1.1  joerg 
   6361  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>
   6362  1.1  joerg <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
   6363  1.1  joerg given matcher.
   6364  1.1  joerg 
   6365  1.1  joerg Given
   6366  1.1  joerg   struct { int first, second; } first, second;
   6367  1.1  joerg   int i(second.first);
   6368  1.1  joerg   int j(first.second);
   6369  1.1  joerg memberExpr(member(hasName("first")))
   6370  1.1  joerg   matches second.first
   6371  1.1  joerg   but not first.second (because the member name there is "second").
   6372  1.1  joerg </pre></td></tr>
   6373  1.1  joerg 
   6374  1.1  joerg 
   6375  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>
   6376  1.1  joerg <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
   6377  1.1  joerg pointee matches a given matcher.
   6378  1.1  joerg 
   6379  1.1  joerg Given
   6380  1.1  joerg   int *a;
   6381  1.1  joerg   int const *b;
   6382  1.1  joerg   float const *f;
   6383  1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   6384  1.1  joerg   matches "int const *b"
   6385  1.1  joerg 
   6386  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;,
   6387  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;
   6388  1.1  joerg </pre></td></tr>
   6389  1.1  joerg 
   6390  1.1  joerg 
   6391  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>
   6392  1.1  joerg <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
   6393  1.1  joerg matcher.
   6394  1.1  joerg 
   6395  1.1  joerg Given
   6396  1.1  joerg   namespace N { template&lt;class T&gt; void f(T t); }
   6397  1.1  joerg   template &lt;class T&gt; void g() { using N::f; f(T()); }
   6398  1.1  joerg unresolvedLookupExpr(hasAnyDeclaration(
   6399  1.1  joerg     namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
   6400  1.1  joerg   matches the use of f in g() .
   6401  1.1  joerg </pre></td></tr>
   6402  1.1  joerg 
   6403  1.1  joerg 
   6404  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>
   6405  1.1  joerg <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
   6406  1.1  joerg 
   6407  1.1  joerg Given
   6408  1.1  joerg   struct A { struct B { struct C {}; }; };
   6409  1.1  joerg   A::B::C c;
   6410  1.1  joerg nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
   6411  1.1  joerg   matches "A::"
   6412  1.1  joerg </pre></td></tr>
   6413  1.1  joerg 
   6414  1.1  joerg 
   6415  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>
   6416  1.1  joerg <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
   6417  1.1  joerg given TypeLoc.
   6418  1.1  joerg 
   6419  1.1  joerg Given
   6420  1.1  joerg   struct A { struct B { struct C {}; }; };
   6421  1.1  joerg   A::B::C c;
   6422  1.1  joerg nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
   6423  1.1  joerg   hasDeclaration(cxxRecordDecl(hasName("A")))))))
   6424  1.1  joerg   matches "A::"
   6425  1.1  joerg </pre></td></tr>
   6426  1.1  joerg 
   6427  1.1  joerg 
   6428  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>
   6429  1.1  joerg <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
   6430  1.1  joerg 
   6431  1.1  joerg Given
   6432  1.1  joerg   struct A { struct B { struct C {}; }; };
   6433  1.1  joerg   A::B::C c;
   6434  1.1  joerg nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
   6435  1.1  joerg   matches "A::"
   6436  1.1  joerg </pre></td></tr>
   6437  1.1  joerg 
   6438  1.1  joerg 
   6439  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>
   6440  1.1  joerg <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
   6441  1.1  joerg given namespace matcher.
   6442  1.1  joerg 
   6443  1.1  joerg Given
   6444  1.1  joerg   namespace ns { struct A {}; }
   6445  1.1  joerg   ns::A a;
   6446  1.1  joerg nestedNameSpecifier(specifiesNamespace(hasName("ns")))
   6447  1.1  joerg   matches "ns::"
   6448  1.1  joerg </pre></td></tr>
   6449  1.1  joerg 
   6450  1.1  joerg 
   6451  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>
   6452  1.1  joerg <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
   6453  1.1  joerg given QualType matcher without qualifiers.
   6454  1.1  joerg 
   6455  1.1  joerg Given
   6456  1.1  joerg   struct A { struct B { struct C {}; }; };
   6457  1.1  joerg   A::B::C c;
   6458  1.1  joerg nestedNameSpecifier(specifiesType(
   6459  1.1  joerg   hasDeclaration(cxxRecordDecl(hasName("A")))
   6460  1.1  joerg ))
   6461  1.1  joerg   matches "A::"
   6462  1.1  joerg </pre></td></tr>
   6463  1.1  joerg 
   6464  1.1  joerg 
   6465  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>
   6466  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
   6467  1.1  joerg 
   6468  1.1  joerg Given
   6469  1.1  joerg 
   6470  1.1  joerg   #pragma omp parallel
   6471  1.1  joerg   #pragma omp parallel default(none)
   6472  1.1  joerg 
   6473  1.1  joerg ``ompExecutableDirective(hasAnyClause(anything()))`` matches
   6474  1.1  joerg ``omp parallel default(none)``.
   6475  1.1  joerg </pre></td></tr>
   6476  1.1  joerg 
   6477  1.1  joerg 
   6478  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>
   6479  1.1  joerg <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
   6480  1.1  joerg 
   6481  1.1  joerg Prerequisite: the executable directive must not be standalone directive.
   6482  1.1  joerg If it is, it will never match.
   6483  1.1  joerg 
   6484  1.1  joerg Given
   6485  1.1  joerg 
   6486  1.1  joerg    #pragma omp parallel
   6487  1.1  joerg    ;
   6488  1.1  joerg    #pragma omp parallel
   6489  1.1  joerg    {}
   6490  1.1  joerg 
   6491  1.1  joerg ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
   6492  1.1  joerg </pre></td></tr>
   6493  1.1  joerg 
   6494  1.1  joerg 
   6495  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>
   6496  1.1  joerg <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
   6497  1.1  joerg matching Base, or Objective-C classes that directly or indirectly
   6498  1.1  joerg subclass a class matching Base.
   6499  1.1  joerg 
   6500  1.1  joerg Note that a class is not considered to be derived from itself.
   6501  1.1  joerg 
   6502  1.1  joerg Example matches Y, Z, C (Base == hasName("X"))
   6503  1.1  joerg   class X;
   6504  1.1  joerg   class Y : public X {};  // directly derived
   6505  1.1  joerg   class Z : public Y {};  // indirectly derived
   6506  1.1  joerg   typedef X A;
   6507  1.1  joerg   typedef A B;
   6508  1.1  joerg   class C : public B {};  // derived from a typedef of X
   6509  1.1  joerg 
   6510  1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   6511  1.1  joerg   class Foo;
   6512  1.1  joerg   typedef Foo X;
   6513  1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   6514  1.1  joerg 
   6515  1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
   6516  1.1  joerg   @interface NSObject @end
   6517  1.1  joerg   @interface Bar : NSObject @end
   6518  1.1  joerg 
   6519  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;
   6520  1.1  joerg </pre></td></tr>
   6521  1.1  joerg 
   6522  1.1  joerg 
   6523  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>
   6524  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
   6525  1.1  joerg matching Base.
   6526  1.1  joerg 
   6527  1.1  joerg Note that a class is not considered to be derived from itself.
   6528  1.1  joerg 
   6529  1.1  joerg Example matches Y, C (Base == hasName("X"))
   6530  1.1  joerg   class X;
   6531  1.1  joerg   class Y : public X {};  // directly derived
   6532  1.1  joerg   class Z : public Y {};  // indirectly derived
   6533  1.1  joerg   typedef X A;
   6534  1.1  joerg   typedef A B;
   6535  1.1  joerg   class C : public B {};  // derived from a typedef of X
   6536  1.1  joerg 
   6537  1.1  joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
   6538  1.1  joerg   class Foo;
   6539  1.1  joerg   typedef Foo X;
   6540  1.1  joerg   class Bar : public Foo {};  // derived from a type that X is a typedef of
   6541  1.1  joerg </pre></td></tr>
   6542  1.1  joerg 
   6543  1.1  joerg 
   6544  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>
   6545  1.1  joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
   6546  1.1  joerg match Base.
   6547  1.1  joerg </pre></td></tr>
   6548  1.1  joerg 
   6549  1.1  joerg 
   6550  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>
   6551  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
   6552  1.1  joerg expression, or an ObjC-message-send expression.
   6553  1.1  joerg 
   6554  1.1  joerg Given
   6555  1.1  joerg   void x(int, int, int) { int y; x(1, y, 42); }
   6556  1.1  joerg callExpr(hasAnyArgument(declRefExpr()))
   6557  1.1  joerg   matches x(1, y, 42)
   6558  1.1  joerg with hasAnyArgument(...)
   6559  1.1  joerg   matching y
   6560  1.1  joerg 
   6561  1.1  joerg For ObjectiveC, given
   6562  1.1  joerg   @interface I - (void) f:(int) y; @end
   6563  1.1  joerg   void foo(I *i) { [i f:12]; }
   6564  1.1  joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
   6565  1.1  joerg   matches [i f:12]
   6566  1.1  joerg </pre></td></tr>
   6567  1.1  joerg 
   6568  1.1  joerg 
   6569  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('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>
   6570  1.1  joerg <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
   6571  1.1  joerg call expression.
   6572  1.1  joerg 
   6573  1.1  joerg Example matches y in x(y)
   6574  1.1  joerg     (matcher = callExpr(hasArgument(0, declRefExpr())))
   6575  1.1  joerg   void x(int) { int y; x(y); }
   6576  1.1  joerg </pre></td></tr>
   6577  1.1  joerg 
   6578  1.1  joerg 
   6579  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>
   6580  1.1  joerg <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
   6581  1.1  joerg and the inner matcher matches on that instance.
   6582  1.1  joerg 
   6583  1.1  joerg For example the method call in
   6584  1.1  joerg   NSString *x = @"hello";
   6585  1.1  joerg   [x containsString:@"h"];
   6586  1.1  joerg is matched by
   6587  1.1  joerg objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
   6588  1.1  joerg </pre></td></tr>
   6589  1.1  joerg 
   6590  1.1  joerg 
   6591  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>
   6592  1.1  joerg <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
   6593  1.1  joerg 
   6594  1.1  joerg Example
   6595  1.1  joerg matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
   6596  1.1  joerg matches the [webView ...] message invocation.
   6597  1.1  joerg   NSString *webViewJavaScript = ...
   6598  1.1  joerg   UIWebView *webView = ...
   6599  1.1  joerg   [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
   6600  1.1  joerg </pre></td></tr>
   6601  1.1  joerg 
   6602  1.1  joerg 
   6603  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>
   6604  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
   6605  1.1  joerg block.
   6606  1.1  joerg 
   6607  1.1  joerg Does not match the 'this' parameter of a method.
   6608  1.1  joerg 
   6609  1.1  joerg Given
   6610  1.1  joerg   class X { void f(int x, int y, int z) {} };
   6611  1.1  joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
   6612  1.1  joerg   matches f(int x, int y, int z) {}
   6613  1.1  joerg with hasAnyParameter(...)
   6614  1.1  joerg   matching int y
   6615  1.1  joerg 
   6616  1.1  joerg For ObjectiveC, given
   6617  1.1  joerg   @interface I - (void) f:(int) y; @end
   6618  1.1  joerg 
   6619  1.1  joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
   6620  1.1  joerg matches the declaration of method f with hasParameter
   6621  1.1  joerg matching y.
   6622  1.1  joerg 
   6623  1.1  joerg For blocks, given
   6624  1.1  joerg   b = ^(int y) { printf("%d", y) };
   6625  1.1  joerg 
   6626  1.1  joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
   6627  1.1  joerg matches the declaration of the block b with hasParameter
   6628  1.1  joerg matching y.
   6629  1.1  joerg </pre></td></tr>
   6630  1.1  joerg 
   6631  1.1  joerg 
   6632  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>
   6633  1.1  joerg <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
   6634  1.1  joerg declaration or a block.
   6635  1.1  joerg 
   6636  1.1  joerg Given
   6637  1.1  joerg   class X { void f(int x) {} };
   6638  1.1  joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
   6639  1.1  joerg   matches f(int x) {}
   6640  1.1  joerg with hasParameter(...)
   6641  1.1  joerg   matching int x
   6642  1.1  joerg 
   6643  1.1  joerg For ObjectiveC, given
   6644  1.1  joerg   @interface I - (void) f:(int) y; @end
   6645  1.1  joerg 
   6646  1.1  joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
   6647  1.1  joerg matches the declaration of method f with hasParameter
   6648  1.1  joerg matching y.
   6649  1.1  joerg </pre></td></tr>
   6650  1.1  joerg 
   6651  1.1  joerg 
   6652  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>
   6653  1.1  joerg <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
   6654  1.1  joerg or opaque value's source expression matches the given matcher.
   6655  1.1  joerg 
   6656  1.1  joerg Example 1: matches "a string"
   6657  1.1  joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
   6658  1.1  joerg class URL { URL(string); };
   6659  1.1  joerg URL url = "a string";
   6660  1.1  joerg 
   6661  1.1  joerg Example 2: matches 'b' (matcher =
   6662  1.1  joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
   6663  1.1  joerg int a = b ?: 1;
   6664  1.1  joerg </pre></td></tr>
   6665  1.1  joerg 
   6666  1.1  joerg 
   6667  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>
   6668  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
   6669  1.1  joerg overloads matches the given matcher.
   6670  1.1  joerg 
   6671  1.1  joerg Given
   6672  1.1  joerg   template &lt;typename T&gt; void foo(T);
   6673  1.1  joerg   template &lt;typename T&gt; void bar(T);
   6674  1.1  joerg   template &lt;typename T&gt; void baz(T t) {
   6675  1.1  joerg     foo(t);
   6676  1.1  joerg     bar(t);
   6677  1.1  joerg   }
   6678  1.1  joerg unresolvedLookupExpr(hasAnyDeclaration(
   6679  1.1  joerg     functionTemplateDecl(hasName("foo"))))
   6680  1.1  joerg   matches foo in foo(t); but not bar in bar(t);
   6681  1.1  joerg </pre></td></tr>
   6682  1.1  joerg 
   6683  1.1  joerg 
   6684  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>
   6685  1.1  joerg <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
   6686  1.1  joerg 
   6687  1.1  joerg Given
   6688  1.1  joerg   int (*ptr_to_array)[4];
   6689  1.1  joerg   int (*ptr_to_func)(int);
   6690  1.1  joerg 
   6691  1.1  joerg varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
   6692  1.1  joerg ptr_to_func but not ptr_to_array.
   6693  1.1  joerg 
   6694  1.1  joerg Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
   6695  1.1  joerg </pre></td></tr>
   6696  1.1  joerg 
   6697  1.1  joerg 
   6698  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>
   6699  1.1  joerg <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
   6700  1.1  joerg pointee matches a given matcher.
   6701  1.1  joerg 
   6702  1.1  joerg Given
   6703  1.1  joerg   int *a;
   6704  1.1  joerg   int const *b;
   6705  1.1  joerg   float const *f;
   6706  1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   6707  1.1  joerg   matches "int const *b"
   6708  1.1  joerg 
   6709  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;,
   6710  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;
   6711  1.1  joerg </pre></td></tr>
   6712  1.1  joerg 
   6713  1.1  joerg 
   6714  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>
   6715  1.1  joerg <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
   6716  1.1  joerg 
   6717  1.1  joerg Given:
   6718  1.1  joerg   typedef int &amp;int_ref;
   6719  1.1  joerg   int a;
   6720  1.1  joerg   int_ref b = a;
   6721  1.1  joerg 
   6722  1.1  joerg varDecl(hasType(qualType(referenceType()))))) will not match the
   6723  1.1  joerg declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
   6724  1.1  joerg </pre></td></tr>
   6725  1.1  joerg 
   6726  1.1  joerg 
   6727  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('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6728  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
   6729  1.1  joerg matches the given matcher.
   6730  1.1  joerg 
   6731  1.1  joerg The associated declaration is:
   6732  1.1  joerg - for type nodes, the declaration of the underlying type
   6733  1.1  joerg - for CallExpr, the declaration of the callee
   6734  1.1  joerg - for MemberExpr, the declaration of the referenced member
   6735  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   6736  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   6737  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   6738  1.1  joerg 
   6739  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6740  1.1  joerg sugared type. Given
   6741  1.1  joerg   class X {};
   6742  1.1  joerg   typedef X Y;
   6743  1.1  joerg   Y y;
   6744  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6745  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6746  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6747  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6748  1.1  joerg       recordType(hasDeclaration(decl())))))
   6749  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6750  1.1  joerg 
   6751  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;,
   6752  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;,
   6753  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;,
   6754  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;,
   6755  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;,
   6756  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;,
   6757  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6758  1.1  joerg </pre></td></tr>
   6759  1.1  joerg 
   6760  1.1  joerg 
   6761  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>
   6762  1.1  joerg <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
   6763  1.1  joerg 
   6764  1.1  joerg Given
   6765  1.1  joerg   void (*fp)(void);
   6766  1.1  joerg The matcher
   6767  1.1  joerg   varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
   6768  1.1  joerg would match the declaration for fp.
   6769  1.1  joerg </pre></td></tr>
   6770  1.1  joerg 
   6771  1.1  joerg 
   6772  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>
   6773  1.1  joerg <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
   6774  1.1  joerg </pre></td></tr>
   6775  1.1  joerg 
   6776  1.1  joerg 
   6777  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>
   6778  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
   6779  1.1  joerg matches the specified matcher.
   6780  1.1  joerg 
   6781  1.1  joerg Example matches y-&gt;x()
   6782  1.1  joerg   (matcher = cxxMemberCallExpr(on(hasType(pointsTo
   6783  1.1  joerg      cxxRecordDecl(hasName("Y")))))))
   6784  1.1  joerg   class Y { public: void x(); };
   6785  1.1  joerg   void z() { Y *y; y-&gt;x(); }
   6786  1.1  joerg </pre></td></tr>
   6787  1.1  joerg 
   6788  1.1  joerg 
   6789  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>
   6790  1.1  joerg <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
   6791  1.1  joerg </pre></td></tr>
   6792  1.1  joerg 
   6793  1.1  joerg 
   6794  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>
   6795  1.1  joerg <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
   6796  1.1  joerg type matches the specified matcher.
   6797  1.1  joerg 
   6798  1.1  joerg Example matches X &amp;x and const X &amp;y
   6799  1.1  joerg     (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
   6800  1.1  joerg   class X {
   6801  1.1  joerg     void a(X b) {
   6802  1.1  joerg       X &amp;x = b;
   6803  1.1  joerg       const X &amp;y = b;
   6804  1.1  joerg     }
   6805  1.1  joerg   };
   6806  1.1  joerg </pre></td></tr>
   6807  1.1  joerg 
   6808  1.1  joerg 
   6809  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6810  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
   6811  1.1  joerg matches the given matcher.
   6812  1.1  joerg 
   6813  1.1  joerg The associated declaration is:
   6814  1.1  joerg - for type nodes, the declaration of the underlying type
   6815  1.1  joerg - for CallExpr, the declaration of the callee
   6816  1.1  joerg - for MemberExpr, the declaration of the referenced member
   6817  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   6818  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   6819  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   6820  1.1  joerg 
   6821  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6822  1.1  joerg sugared type. Given
   6823  1.1  joerg   class X {};
   6824  1.1  joerg   typedef X Y;
   6825  1.1  joerg   Y y;
   6826  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6827  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6828  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6829  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6830  1.1  joerg       recordType(hasDeclaration(decl())))))
   6831  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6832  1.1  joerg 
   6833  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;,
   6834  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;,
   6835  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;,
   6836  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;,
   6837  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;,
   6838  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;,
   6839  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6840  1.1  joerg </pre></td></tr>
   6841  1.1  joerg 
   6842  1.1  joerg 
   6843  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>
   6844  1.1  joerg <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
   6845  1.1  joerg pointee matches a given matcher.
   6846  1.1  joerg 
   6847  1.1  joerg Given
   6848  1.1  joerg   int *a;
   6849  1.1  joerg   int const *b;
   6850  1.1  joerg   float const *f;
   6851  1.1  joerg pointerType(pointee(isConstQualified(), isInteger()))
   6852  1.1  joerg   matches "int const *b"
   6853  1.1  joerg 
   6854  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;,
   6855  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;
   6856  1.1  joerg </pre></td></tr>
   6857  1.1  joerg 
   6858  1.1  joerg 
   6859  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>
   6860  1.1  joerg <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
   6861  1.1  joerg 
   6862  1.1  joerg Given
   6863  1.1  joerg   return a + b;
   6864  1.1  joerg hasReturnValue(binaryOperator())
   6865  1.1  joerg   matches 'return a + b'
   6866  1.1  joerg with binaryOperator()
   6867  1.1  joerg   matching 'a + b'
   6868  1.1  joerg </pre></td></tr>
   6869  1.1  joerg 
   6870  1.1  joerg 
   6871  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>
   6872  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
   6873  1.1  joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
   6874  1.1  joerg 
   6875  1.1  joerg Given
   6876  1.1  joerg   { {}; 1+2; }
   6877  1.1  joerg hasAnySubstatement(compoundStmt())
   6878  1.1  joerg   matches '{ {}; 1+2; }'
   6879  1.1  joerg with compoundStmt()
   6880  1.1  joerg   matching '{}'
   6881  1.1  joerg </pre></td></tr>
   6882  1.1  joerg 
   6883  1.1  joerg 
   6884  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('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
   6885  1.1  joerg <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   6886  1.1  joerg alignof.
   6887  1.1  joerg </pre></td></tr>
   6888  1.1  joerg 
   6889  1.1  joerg 
   6890  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>
   6891  1.1  joerg <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
   6892  1.1  joerg 
   6893  1.1  joerg Given:
   6894  1.1  joerg F&amp; operator=(const F&amp; o) {
   6895  1.1  joerg   std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
   6896  1.1  joerg   return *this;
   6897  1.1  joerg }
   6898  1.1  joerg returnStmt(forFunction(hasName("operator=")))
   6899  1.1  joerg   matches 'return *this'
   6900  1.1  joerg   but does not match 'return v &gt; 0'
   6901  1.1  joerg </pre></td></tr>
   6902  1.1  joerg 
   6903  1.1  joerg 
   6904  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('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
   6905  1.1  joerg <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   6906  1.1  joerg sizeof.
   6907  1.1  joerg </pre></td></tr>
   6908  1.1  joerg 
   6909  1.1  joerg 
   6910  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>
   6911  1.1  joerg <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
   6912  1.1  joerg type that matches the provided matcher.
   6913  1.1  joerg 
   6914  1.1  joerg Given
   6915  1.1  joerg   template &lt;typename T&gt;
   6916  1.1  joerg   double F(T t);
   6917  1.1  joerg   int i;
   6918  1.1  joerg   double j = F(i);
   6919  1.1  joerg 
   6920  1.1  joerg substTemplateTypeParmType(hasReplacementType(type())) matches int
   6921  1.1  joerg </pre></td></tr>
   6922  1.1  joerg 
   6923  1.1  joerg 
   6924  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>
   6925  1.1  joerg <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
   6926  1.1  joerg statement. This matcher may produce multiple matches.
   6927  1.1  joerg 
   6928  1.1  joerg Given
   6929  1.1  joerg   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
   6930  1.1  joerg switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
   6931  1.1  joerg   matches four times, with "c" binding each of "case 1:", "case 2:",
   6932  1.1  joerg "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
   6933  1.1  joerg "switch (1)", "switch (2)" and "switch (2)".
   6934  1.1  joerg </pre></td></tr>
   6935  1.1  joerg 
   6936  1.1  joerg 
   6937  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>
   6938  1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
   6939  1.1  joerg switch statement or conditional operator.
   6940  1.1  joerg 
   6941  1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   6942  1.1  joerg   if (true) {}
   6943  1.1  joerg </pre></td></tr>
   6944  1.1  joerg 
   6945  1.1  joerg 
   6946  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   6947  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
   6948  1.1  joerg matches the given matcher.
   6949  1.1  joerg 
   6950  1.1  joerg The associated declaration is:
   6951  1.1  joerg - for type nodes, the declaration of the underlying type
   6952  1.1  joerg - for CallExpr, the declaration of the callee
   6953  1.1  joerg - for MemberExpr, the declaration of the referenced member
   6954  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   6955  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   6956  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   6957  1.1  joerg 
   6958  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   6959  1.1  joerg sugared type. Given
   6960  1.1  joerg   class X {};
   6961  1.1  joerg   typedef X Y;
   6962  1.1  joerg   Y y;
   6963  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   6964  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   6965  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   6966  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   6967  1.1  joerg       recordType(hasDeclaration(decl())))))
   6968  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   6969  1.1  joerg 
   6970  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;,
   6971  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;,
   6972  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;,
   6973  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;,
   6974  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;,
   6975  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;,
   6976  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   6977  1.1  joerg </pre></td></tr>
   6978  1.1  joerg 
   6979  1.1  joerg 
   6980  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>
   6981  1.1  joerg <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
   6982  1.1  joerg 
   6983  1.1  joerg Given
   6984  1.1  joerg   struct B { int next; };
   6985  1.1  joerg   template&lt;int(B::*next_ptr)&gt; struct A {};
   6986  1.1  joerg   A&lt;&amp;B::next&gt; a;
   6987  1.1  joerg templateSpecializationType(hasAnyTemplateArgument(
   6988  1.1  joerg   isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
   6989  1.1  joerg   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
   6990  1.1  joerg     B::next
   6991  1.1  joerg </pre></td></tr>
   6992  1.1  joerg 
   6993  1.1  joerg 
   6994  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>
   6995  1.1  joerg <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
   6996  1.1  joerg declaration.
   6997  1.1  joerg 
   6998  1.1  joerg Given
   6999  1.1  joerg   struct B { int next; };
   7000  1.1  joerg   template&lt;int(B::*next_ptr)&gt; struct A {};
   7001  1.1  joerg   A&lt;&amp;B::next&gt; a;
   7002  1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7003  1.1  joerg     refersToDeclaration(fieldDecl(hasName("next")))))
   7004  1.1  joerg   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
   7005  1.1  joerg     B::next
   7006  1.1  joerg </pre></td></tr>
   7007  1.1  joerg 
   7008  1.1  joerg 
   7009  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>
   7010  1.1  joerg <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
   7011  1.1  joerg 
   7012  1.1  joerg Given
   7013  1.1  joerg   template&lt;int T&gt; struct C {};
   7014  1.1  joerg   C&lt;42&gt; c;
   7015  1.1  joerg classTemplateSpecializationDecl(
   7016  1.1  joerg   hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
   7017  1.1  joerg   matches the implicit instantiation of C in C&lt;42&gt;.
   7018  1.1  joerg </pre></td></tr>
   7019  1.1  joerg 
   7020  1.1  joerg 
   7021  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>
   7022  1.1  joerg <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
   7023  1.1  joerg 
   7024  1.1  joerg Given
   7025  1.1  joerg   template&lt;template &lt;typename&gt; class S&gt; class X {};
   7026  1.1  joerg   template&lt;typename T&gt; class Y {};
   7027  1.1  joerg   X&lt;Y&gt; xi;
   7028  1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7029  1.1  joerg     refersToTemplate(templateName())))
   7030  1.1  joerg   matches the specialization X&lt;Y&gt;
   7031  1.1  joerg </pre></td></tr>
   7032  1.1  joerg 
   7033  1.1  joerg 
   7034  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>
   7035  1.1  joerg <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
   7036  1.1  joerg 
   7037  1.1  joerg Given
   7038  1.1  joerg   struct X {};
   7039  1.1  joerg   template&lt;typename T&gt; struct A {};
   7040  1.1  joerg   A&lt;X&gt; a;
   7041  1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7042  1.1  joerg     refersToType(class(hasName("X")))))
   7043  1.1  joerg   matches the specialization A&lt;X&gt;
   7044  1.1  joerg </pre></td></tr>
   7045  1.1  joerg 
   7046  1.1  joerg 
   7047  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>
   7048  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7049  1.1  joerg functionDecl that have at least one TemplateArgument matching the given
   7050  1.1  joerg InnerMatcher.
   7051  1.1  joerg 
   7052  1.1  joerg Given
   7053  1.1  joerg   template&lt;typename T&gt; class A {};
   7054  1.1  joerg   template&lt;&gt; class A&lt;double&gt; {};
   7055  1.1  joerg   A&lt;int&gt; a;
   7056  1.1  joerg 
   7057  1.1  joerg   template&lt;typename T&gt; f() {};
   7058  1.1  joerg   void func() { f&lt;int&gt;(); };
   7059  1.1  joerg 
   7060  1.1  joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
   7061  1.1  joerg     refersToType(asString("int"))))
   7062  1.1  joerg   matches the specialization A&lt;int&gt;
   7063  1.1  joerg 
   7064  1.1  joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
   7065  1.1  joerg   matches the specialization f&lt;int&gt;
   7066  1.1  joerg </pre></td></tr>
   7067  1.1  joerg 
   7068  1.1  joerg 
   7069  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('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   7070  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
   7071  1.1  joerg matches the given matcher.
   7072  1.1  joerg 
   7073  1.1  joerg The associated declaration is:
   7074  1.1  joerg - for type nodes, the declaration of the underlying type
   7075  1.1  joerg - for CallExpr, the declaration of the callee
   7076  1.1  joerg - for MemberExpr, the declaration of the referenced member
   7077  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   7078  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   7079  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   7080  1.1  joerg 
   7081  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   7082  1.1  joerg sugared type. Given
   7083  1.1  joerg   class X {};
   7084  1.1  joerg   typedef X Y;
   7085  1.1  joerg   Y y;
   7086  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7087  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   7088  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7089  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   7090  1.1  joerg       recordType(hasDeclaration(decl())))))
   7091  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   7092  1.1  joerg 
   7093  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;,
   7094  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;,
   7095  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;,
   7096  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;,
   7097  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;,
   7098  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;,
   7099  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7100  1.1  joerg </pre></td></tr>
   7101  1.1  joerg 
   7102  1.1  joerg 
   7103  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>
   7104  1.1  joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
   7105  1.1  joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
   7106  1.1  joerg 
   7107  1.1  joerg Given
   7108  1.1  joerg   template&lt;typename T, typename U&gt; class A {};
   7109  1.1  joerg   A&lt;bool, int&gt; b;
   7110  1.1  joerg   A&lt;int, bool&gt; c;
   7111  1.1  joerg 
   7112  1.1  joerg   template&lt;typename T&gt; void f() {}
   7113  1.1  joerg   void func() { f&lt;int&gt;(); };
   7114  1.1  joerg classTemplateSpecializationDecl(hasTemplateArgument(
   7115  1.1  joerg     1, refersToType(asString("int"))))
   7116  1.1  joerg   matches the specialization A&lt;bool, int&gt;
   7117  1.1  joerg 
   7118  1.1  joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
   7119  1.1  joerg   matches the specialization f&lt;int&gt;
   7120  1.1  joerg </pre></td></tr>
   7121  1.1  joerg 
   7122  1.1  joerg 
   7123  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   7124  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
   7125  1.1  joerg matches the given matcher.
   7126  1.1  joerg 
   7127  1.1  joerg The associated declaration is:
   7128  1.1  joerg - for type nodes, the declaration of the underlying type
   7129  1.1  joerg - for CallExpr, the declaration of the callee
   7130  1.1  joerg - for MemberExpr, the declaration of the referenced member
   7131  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   7132  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   7133  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   7134  1.1  joerg 
   7135  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   7136  1.1  joerg sugared type. Given
   7137  1.1  joerg   class X {};
   7138  1.1  joerg   typedef X Y;
   7139  1.1  joerg   Y y;
   7140  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7141  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   7142  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7143  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   7144  1.1  joerg       recordType(hasDeclaration(decl())))))
   7145  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   7146  1.1  joerg 
   7147  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;,
   7148  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;,
   7149  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;,
   7150  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;,
   7151  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;,
   7152  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;,
   7153  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7154  1.1  joerg </pre></td></tr>
   7155  1.1  joerg 
   7156  1.1  joerg 
   7157  1.1  joerg <tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher&lt;T&gt;  Matcher</td></tr>
   7158  1.1  joerg <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
   7159  1.1  joerg 
   7160  1.1  joerg Generates results for each match.
   7161  1.1  joerg 
   7162  1.1  joerg For example, in:
   7163  1.1  joerg   class A { class B {}; class C {}; };
   7164  1.1  joerg The matcher:
   7165  1.1  joerg   cxxRecordDecl(hasName("::A"),
   7166  1.1  joerg                 findAll(cxxRecordDecl(isDefinition()).bind("m")))
   7167  1.1  joerg will generate results for A, B and C.
   7168  1.1  joerg 
   7169  1.1  joerg Usable as: Any Matcher
   7170  1.1  joerg </pre></td></tr>
   7171  1.1  joerg 
   7172  1.1  joerg 
   7173  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>
   7174  1.1  joerg <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
   7175  1.1  joerg matcher.
   7176  1.1  joerg 
   7177  1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7178  1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7179  1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   7180  1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   7181  1.1  joerg  class X {};
   7182  1.1  joerg  void y(X &amp;x) { x; X z; }
   7183  1.1  joerg  typedef int U;
   7184  1.1  joerg  class Y { friend class X; };
   7185  1.1  joerg </pre></td></tr>
   7186  1.1  joerg 
   7187  1.1  joerg 
   7188  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   7189  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
   7190  1.1  joerg matches the given matcher.
   7191  1.1  joerg 
   7192  1.1  joerg The associated declaration is:
   7193  1.1  joerg - for type nodes, the declaration of the underlying type
   7194  1.1  joerg - for CallExpr, the declaration of the callee
   7195  1.1  joerg - for MemberExpr, the declaration of the referenced member
   7196  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   7197  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   7198  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   7199  1.1  joerg 
   7200  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   7201  1.1  joerg sugared type. Given
   7202  1.1  joerg   class X {};
   7203  1.1  joerg   typedef X Y;
   7204  1.1  joerg   Y y;
   7205  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7206  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   7207  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7208  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   7209  1.1  joerg       recordType(hasDeclaration(decl())))))
   7210  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   7211  1.1  joerg 
   7212  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;,
   7213  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;,
   7214  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;,
   7215  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;,
   7216  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;,
   7217  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;,
   7218  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7219  1.1  joerg </pre></td></tr>
   7220  1.1  joerg 
   7221  1.1  joerg 
   7222  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>
   7223  1.1  joerg <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
   7224  1.1  joerg type of the matched node.
   7225  1.1  joerg 
   7226  1.1  joerg For example, in:
   7227  1.1  joerg   class A {};
   7228  1.1  joerg   using B = A;
   7229  1.1  joerg The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
   7230  1.1  joerg both B and A.
   7231  1.1  joerg </pre></td></tr>
   7232  1.1  joerg 
   7233  1.1  joerg 
   7234  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>
   7235  1.1  joerg <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
   7236  1.1  joerg 
   7237  1.1  joerg Given
   7238  1.1  joerg   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
   7239  1.1  joerg unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
   7240  1.1  joerg   matches sizeof(a) and alignof(c)
   7241  1.1  joerg </pre></td></tr>
   7242  1.1  joerg 
   7243  1.1  joerg 
   7244  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>
   7245  1.1  joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
   7246  1.1  joerg 
   7247  1.1  joerg Example matches true (matcher = hasUnaryOperand(
   7248  1.1  joerg                                   cxxBoolLiteral(equals(true))))
   7249  1.1  joerg   !true
   7250  1.1  joerg </pre></td></tr>
   7251  1.1  joerg 
   7252  1.1  joerg 
   7253  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>
   7254  1.1  joerg <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
   7255  1.1  joerg given matcher. Implicit object expressions are included; that is, it matches
   7256  1.1  joerg use of implicit `this`.
   7257  1.1  joerg 
   7258  1.1  joerg Given
   7259  1.1  joerg   struct X {
   7260  1.1  joerg     int m;
   7261  1.1  joerg     int f(X x) { x.m; return m; }
   7262  1.1  joerg   };
   7263  1.1  joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
   7264  1.1  joerg   matches `x.m`, but not `m`; however,
   7265  1.1  joerg memberExpr(hasObjectExpression(hasType(pointsTo(
   7266  1.1  joerg      cxxRecordDecl(hasName("X"))))))
   7267  1.1  joerg   matches `m` (aka. `this-&gt;m`), but not `x.m`.
   7268  1.1  joerg </pre></td></tr>
   7269  1.1  joerg 
   7270  1.1  joerg 
   7271  1.1  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>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   7272  1.1  joerg <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
   7273  1.1  joerg matches the given matcher.
   7274  1.1  joerg 
   7275  1.1  joerg The associated declaration is:
   7276  1.1  joerg - for type nodes, the declaration of the underlying type
   7277  1.1  joerg - for CallExpr, the declaration of the callee
   7278  1.1  joerg - for MemberExpr, the declaration of the referenced member
   7279  1.1  joerg - for CXXConstructExpr, the declaration of the constructor
   7280  1.1  joerg - for CXXNewExpr, the declaration of the operator new
   7281  1.1  joerg - for ObjCIvarExpr, the declaration of the ivar
   7282  1.1  joerg 
   7283  1.1  joerg For type nodes, hasDeclaration will generally match the declaration of the
   7284  1.1  joerg sugared type. Given
   7285  1.1  joerg   class X {};
   7286  1.1  joerg   typedef X Y;
   7287  1.1  joerg   Y y;
   7288  1.1  joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
   7289  1.1  joerg typedefDecl. A common use case is to match the underlying, desugared type.
   7290  1.1  joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
   7291  1.1  joerg   varDecl(hasType(hasUnqualifiedDesugaredType(
   7292  1.1  joerg       recordType(hasDeclaration(decl())))))
   7293  1.1  joerg In this matcher, the decl will match the CXXRecordDecl of class X.
   7294  1.1  joerg 
   7295  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;,
   7296  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;,
   7297  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;,
   7298  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;,
   7299  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;,
   7300  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;,
   7301  1.1  joerg   Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
   7302  1.1  joerg </pre></td></tr>
   7303  1.1  joerg 
   7304  1.1  joerg 
   7305  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>
   7306  1.1  joerg <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
   7307  1.1  joerg 
   7308  1.1  joerg Given
   7309  1.1  joerg   namespace X { void b(); }
   7310  1.1  joerg   using X::b;
   7311  1.1  joerg usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
   7312  1.1  joerg   matches using X::b </pre></td></tr>
   7313  1.1  joerg 
   7314  1.1  joerg 
   7315  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>
   7316  1.1  joerg <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
   7317  1.1  joerg matched by the given matcher.
   7318  1.1  joerg 
   7319  1.1  joerg Given
   7320  1.1  joerg   namespace X { int a; void b(); }
   7321  1.1  joerg   using X::a;
   7322  1.1  joerg   using X::b;
   7323  1.1  joerg usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
   7324  1.1  joerg   matches using X::b but not using X::a </pre></td></tr>
   7325  1.1  joerg 
   7326  1.1  joerg 
   7327  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('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>
   7328  1.1  joerg <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
   7329  1.1  joerg declaration's type.
   7330  1.1  joerg 
   7331  1.1  joerg In case of a value declaration (for example a variable declaration),
   7332  1.1  joerg this resolves one layer of indirection. For example, in the value
   7333  1.1  joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
   7334  1.1  joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
   7335  1.1  joerg declaration of x.
   7336  1.1  joerg 
   7337  1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7338  1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7339  1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   7340  1.1  joerg  class X {};
   7341  1.1  joerg  void y(X &amp;x) { x; X z; }
   7342  1.1  joerg  class Y { friend class X; };
   7343  1.1  joerg 
   7344  1.1  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_1ValueDecl.html">ValueDecl</a>&gt;
   7345  1.1  joerg </pre></td></tr>
   7346  1.1  joerg 
   7347  1.1  joerg 
   7348  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>
   7349  1.1  joerg <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
   7350  1.1  joerg matcher.
   7351  1.1  joerg 
   7352  1.1  joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
   7353  1.1  joerg             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
   7354  1.1  joerg             and U (matcher = typedefDecl(hasType(asString("int")))
   7355  1.1  joerg             and friend class X (matcher = friendDecl(hasType("X"))
   7356  1.1  joerg  class X {};
   7357  1.1  joerg  void y(X &amp;x) { x; X z; }
   7358  1.1  joerg  typedef int U;
   7359  1.1  joerg  class Y { friend class X; };
   7360  1.1  joerg </pre></td></tr>
   7361  1.1  joerg 
   7362  1.1  joerg 
   7363  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>
   7364  1.1  joerg <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
   7365  1.1  joerg that matches the given matcher.
   7366  1.1  joerg 
   7367  1.1  joerg Example matches x (matcher = varDecl(hasInitializer(callExpr())))
   7368  1.1  joerg   bool y() { return true; }
   7369  1.1  joerg   bool x = y();
   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_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>
   7374  1.1  joerg <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
   7375  1.1  joerg expression.
   7376  1.1  joerg 
   7377  1.1  joerg Given
   7378  1.1  joerg   void f(int b) {
   7379  1.1  joerg     int a[b];
   7380  1.1  joerg   }
   7381  1.1  joerg variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
   7382  1.1  joerg   varDecl(hasName("b")))))))
   7383  1.1  joerg   matches "int a[b]"
   7384  1.1  joerg </pre></td></tr>
   7385  1.1  joerg 
   7386  1.1  joerg 
   7387  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>
   7388  1.1  joerg <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
   7389  1.1  joerg definition that has a given body.
   7390  1.1  joerg 
   7391  1.1  joerg Given
   7392  1.1  joerg   for (;;) {}
   7393  1.1  joerg hasBody(compoundStmt())
   7394  1.1  joerg   matches 'for (;;) {}'
   7395  1.1  joerg with compoundStmt()
   7396  1.1  joerg   matching '{}'
   7397  1.1  joerg </pre></td></tr>
   7398  1.1  joerg 
   7399  1.1  joerg 
   7400  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>
   7401  1.1  joerg <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
   7402  1.1  joerg switch statement or conditional operator.
   7403  1.1  joerg 
   7404  1.1  joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   7405  1.1  joerg   if (true) {}
   7406  1.1  joerg </pre></td></tr>
   7407  1.1  joerg 
   7408  1.1  joerg 
   7409  1.1  joerg <tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&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>
   7410  1.1  joerg <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
   7411  1.1  joerg NestedNameSpecifier-matcher matches.
   7412  1.1  joerg </pre></td></tr>
   7413  1.1  joerg 
   7414  1.1  joerg 
   7415  1.1  joerg <tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&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>
   7416  1.1  joerg <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
   7417  1.1  joerg QualType-matcher matches.
   7418  1.1  joerg </pre></td></tr>
   7419  1.1  joerg 
   7420  1.1  joerg <!--END_TRAVERSAL_MATCHERS -->
   7421  1.1  joerg </table>
   7422  1.1  joerg 
   7423  1.1  joerg </div>
   7424  1.1  joerg </body>
   7425  1.1  joerg </html>
   7426  1.1  joerg 
   7427  1.1  joerg 
   7428