Home | History | Annotate | Download | only in docs
      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
      2           "http://www.w3.org/TR/html4/strict.dtd">
      3 <html>
      4 <head>
      5 <title>AST Matcher Reference</title>
      6 <link type="text/css" rel="stylesheet" href="../menu.css" />
      7 <link type="text/css" rel="stylesheet" href="../content.css" />
      8 <style type="text/css">
      9 td {
     10   padding: .33em;
     11 }
     12 td.doc {
     13   display: none;
     14   border-bottom: 1px solid black;
     15 }
     16 td.name:hover {
     17   color: blue;
     18   cursor: pointer;
     19 }
     20 </style>
     21 <script type="text/javascript">
     22 function toggle(id) {
     23   if (!id) return;
     24   row = document.getElementById(id);
     25   if (row.style.display != 'table-cell')
     26     row.style.display = 'table-cell';
     27   else
     28     row.style.display = 'none';
     29 }
     30 </script>
     31 </head>
     32 <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
     33 
     34 <!--#include virtual="../menu.html.incl"-->
     35 
     36 <div id="content">
     37 
     38 <h1>AST Matcher Reference</h1>
     39 
     40 <p>This document shows all currently implemented matchers. The matchers are grouped
     41 by category and node type they match. You can click on matcher names to show the
     42 matcher's source documentation.</p>
     43 
     44 <p>There are three different basic categories of matchers:
     45 <ul>
     46 <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
     47 <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
     48 <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
     49 </ul>
     50 </p>
     51 
     52 <p>Within each category the matchers are ordered by node type they match on.
     53 Note that if a matcher can match multiple node types, it will it will appear
     54 multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
     55 find all matchers that can be used to match on Stmt nodes.</p>
     56 
     57 <p>The exception to that rule are matchers that can match on any node. Those
     58 are marked with a * and are listed in the beginning of each category.</p>
     59 
     60 <!-- ======================================================================= -->
     61 <h2 id="decl-matchers">Node Matchers</h2>
     62 <!-- ======================================================================= -->
     63 
     64 <p>Node matchers are at the core of matcher expressions - they specify the type
     65 of node that is expected. Every match expression starts with a node matcher,
     66 which can then be further refined with a narrowing or traversal matcher. All
     67 traversal matchers take node matchers as their arguments.</p>
     68 
     69 <p>For convenience, all node matchers take an arbitrary number of arguments
     70 and implicitly act as allOf matchers.</p>
     71 
     72 <p>Node matchers are the only matchers that support the bind("id") call to
     73 bind the matched node to the given string, to be later retrieved from the
     74 match callback.</p>
     75 
     76 <table>
     77 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
     78 <!-- START_DECL_MATCHERS -->
     79 
     80 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
     81 <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
     82 
     83 Example matches Z
     84   template&lt;class T&gt; class Z {};
     85 </pre></td></tr>
     86 
     87 
     88 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
     89 <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
     90 
     91 Given
     92   template&lt;typename T&gt; class A {};
     93   template&lt;&gt; class A&lt;double&gt; {};
     94   A&lt;int&gt; a;
     95 classTemplateSpecializationDecl()
     96   matches the specializations A&lt;int&gt; and A&lt;double&gt;
     97 </pre></td></tr>
     98 
     99 
    100 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
    101 <tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
    102 
    103 Example matches Foo::Foo() and Foo::Foo(int)
    104   class Foo {
    105    public:
    106     Foo();
    107     Foo(int);
    108     int DoSomething();
    109   };
    110 </pre></td></tr>
    111 
    112 
    113 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
    114 <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
    115 
    116 Examples matches X, C, and the friend declaration inside C;
    117   void X();
    118   class C {
    119     friend X;
    120   };
    121 </pre></td></tr>
    122 
    123 
    124 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
    125 <tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
    126 
    127 Example matches Foo::~Foo()
    128   class Foo {
    129    public:
    130     virtual ~Foo();
    131   };
    132 </pre></td></tr>
    133 
    134 
    135 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
    136 <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
    137 
    138 Example matches A, B, C
    139   enum X {
    140     A, B, C
    141   };
    142 </pre></td></tr>
    143 
    144 
    145 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
    146 <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
    147 
    148 Example matches X
    149   enum X {
    150     A, B, C
    151   };
    152 </pre></td></tr>
    153 
    154 
    155 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
    156 <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
    157 
    158 Given
    159   class X { int m; };
    160 fieldDecl()
    161   matches 'm'.
    162 </pre></td></tr>
    163 
    164 
    165 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
    166 <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
    167 
    168 Example matches f
    169   void f();
    170 </pre></td></tr>
    171 
    172 
    173 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
    174 <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
    175 
    176 Example matches f
    177   template&lt;class T&gt; void f(T t) {}
    178 </pre></td></tr>
    179 
    180 
    181 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
    182 <tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
    183 
    184 Example matches y
    185   class X { void y() };
    186 </pre></td></tr>
    187 
    188 
    189 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
    190 <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
    191 
    192 Example matches X, S, the anonymous union type, i, and U;
    193   typedef int X;
    194   struct S {
    195     union {
    196       int i;
    197     } U;
    198   };
    199 </pre></td></tr>
    200 
    201 
    202 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
    203 <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
    204 
    205 Example matches X, Z
    206   class X;
    207   template&lt;class T&gt; class Z {};
    208 </pre></td></tr>
    209 
    210 
    211 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
    212 <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
    213 
    214 Given
    215   namespace X { int x; }
    216   using X::x;
    217 usingDecl()
    218   matches using X::x </pre></td></tr>
    219 
    220 
    221 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
    222 <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
    223 
    224 Note: this does not match declarations of member variables, which are
    225 "field" declarations in Clang parlance.
    226 
    227 Example matches a
    228   int a;
    229 </pre></td></tr>
    230 
    231 
    232 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
    233 <tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
    234 
    235 Example matches true
    236   true
    237 </pre></td></tr>
    238 
    239 
    240 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
    241 <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
    242 
    243 Example: castExpr() matches each of the following:
    244   (int) 3;
    245   const_cast&lt;Expr *&gt;(SubExpr);
    246   char c = 0;
    247 but does not match
    248   int i = (0);
    249   int k = 0;
    250 </pre></td></tr>
    251 
    252 
    253 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
    254 <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
    255 
    256 Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
    257 though.
    258 
    259 Example matches 'a', L'a'
    260   char ch = 'a'; wchar_t chw = L'a';
    261 </pre></td></tr>
    262 
    263 
    264 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
    265 <tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
    266 
    267 Example: Matches const_cast&lt;int*&gt;(&amp;r) in
    268   int n = 42;
    269   const int &amp;r(n);
    270   int* p = const_cast&lt;int*&gt;(&amp;r);
    271 </pre></td></tr>
    272 
    273 
    274 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
    275 <tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
    276 
    277 Example:
    278   dynamicCastExpr()
    279 matches
    280   dynamic_cast&lt;D*&gt;(&amp;b);
    281 in
    282   struct B { virtual ~B() {} }; struct D : B {};
    283   B b;
    284   D* p = dynamic_cast&lt;D*&gt;(&amp;b);
    285 </pre></td></tr>
    286 
    287 
    288 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
    289 <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
    290 
    291 Matches any cast expression written in user code, whether it be a
    292 C-style cast, a functional-style cast, or a keyword cast.
    293 
    294 Does not match implicit conversions.
    295 
    296 Note: the name "explicitCast" is chosen to match Clang's terminology, as
    297 Clang uses the term "cast" to apply to implicit conversions as well as to
    298 actual cast expressions.
    299 
    300 hasDestinationType.
    301 
    302 Example: matches all five of the casts in
    303   int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
    304 but does not match the implicit conversion in
    305   long ell = 42;
    306 </pre></td></tr>
    307 
    308 
    309 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
    310 <tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
    311 
    312 Example: Matches Foo(bar);
    313   Foo f = bar;
    314   Foo g = (Foo) bar;
    315   Foo h = Foo(bar);
    316 </pre></td></tr>
    317 
    318 
    319 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
    320 <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
    321 
    322 This matches many different places, including function call return value
    323 eliding, as well as any type conversions.
    324 </pre></td></tr>
    325 
    326 
    327 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
    328 <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
    329 
    330 Not matching character-encoded integers such as L'a'.
    331 
    332 Example matches 1, 1L, 0x1, 1U
    333 </pre></td></tr>
    334 
    335 
    336 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
    337 <tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
    338 
    339 Either the source expression or the destination type can be matched
    340 using has(), but hasDestinationType() is more specific and can be
    341 more readable.
    342 
    343 Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
    344   void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
    345 </pre></td></tr>
    346 
    347 
    348 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
    349 <tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
    350 
    351 hasDestinationType
    352 reinterpretCast
    353 
    354 Example:
    355   staticCastExpr()
    356 matches
    357   static_cast&lt;long&gt;(8)
    358 in
    359   long eight(static_cast&lt;long&gt;(8));
    360 </pre></td></tr>
    361 
    362 
    363 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
    364 <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
    365 
    366 Example matches "abcd", L"abcd"
    367   char *s = "abcd"; wchar_t *ws = L"abcd"
    368 </pre></td></tr>
    369 
    370 
    371 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
    372 <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
    373 
    374 Given
    375   int i = a[1];
    376 arraySubscriptExpr()
    377   matches "a[1]"
    378 </pre></td></tr>
    379 
    380 
    381 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
    382 <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
    383 
    384 Example matches a || b
    385   !(a || b)
    386 </pre></td></tr>
    387 
    388 
    389 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
    390 <tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
    391 
    392 Example matches FunctionTakesString(GetStringByValue())
    393     (matcher = bindTemporaryExpr())
    394   FunctionTakesString(GetStringByValue());
    395   FunctionTakesStringByPointer(GetStringPointer());
    396 </pre></td></tr>
    397 
    398 
    399 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
    400 <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
    401 
    402 Example matches x.y() and y()
    403   X x;
    404   x.y();
    405   y();
    406 </pre></td></tr>
    407 
    408 
    409 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
    410 <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
    411 
    412 Example matches '{}' and '{{}}'in 'for (;;) {{}}'
    413   for (;;) {{}}
    414 </pre></td></tr>
    415 
    416 
    417 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
    418 <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
    419 
    420 Example matches a ? b : c
    421   (a ? b : c) + 42
    422 </pre></td></tr>
    423 
    424 
    425 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
    426 <tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
    427 
    428 Example matches string(ptr, n) and ptr within arguments of f
    429     (matcher = constructExpr())
    430   void f(const string &amp;a, const string &amp;b);
    431   char *ptr;
    432   int n;
    433   f(string(ptr, n), ptr);
    434 </pre></td></tr>
    435 
    436 
    437 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
    438 <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
    439 
    440 Example matches x in if (x)
    441   bool x;
    442   if (x) {}
    443 </pre></td></tr>
    444 
    445 
    446 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
    447 <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
    448 
    449 Given
    450   int a;
    451 declStmt()
    452   matches 'int a'.
    453 </pre></td></tr>
    454 
    455 
    456 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
    457 <tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site.
    458 
    459 Example matches the CXXDefaultArgExpr placeholder inserted for the
    460     default value of the second parameter in the call expression f(42)
    461     (matcher = defaultArgExpr())
    462   void f(int x, int y = 0);
    463   f(42);
    464 </pre></td></tr>
    465 
    466 
    467 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
    468 <tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
    469 
    470 Given
    471   delete X;
    472 deleteExpr()
    473   matches 'delete X'.
    474 </pre></td></tr>
    475 
    476 
    477 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
    478 <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
    479 
    480 Given
    481   do {} while (true);
    482 doStmt()
    483   matches 'do {} while(true)'
    484 </pre></td></tr>
    485 
    486 
    487 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
    488 <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
    489 
    490 Example matches x()
    491   void f() { x(); }
    492 </pre></td></tr>
    493 
    494 
    495 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
    496 <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
    497 
    498 Example matches 'for (;;) {}'
    499   for (;;) {}
    500 </pre></td></tr>
    501 
    502 
    503 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
    504 <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
    505 
    506 Example matches 'if (x) {}'
    507   if (x) {}
    508 </pre></td></tr>
    509 
    510 
    511 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
    512 <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
    513 
    514 Given
    515   int a[] = { 1, 2 };
    516   struct B { int x, y; };
    517   B b = { 5, 6 };
    518 initList()
    519   matches "{ 1, 2 }" and "{ 5, 6 }"
    520 </pre></td></tr>
    521 
    522 
    523 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
    524 <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
    525 
    526 Example: Given
    527   struct T {void func()};
    528   T f();
    529   void g(T);
    530 materializeTemporaryExpr() matches 'f()' in these statements
    531   T u(f());
    532   g(f());
    533 but does not match
    534   f();
    535   f().func();
    536 </pre></td></tr>
    537 
    538 
    539 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
    540 <tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
    541 
    542 Example matches x.y()
    543   X x;
    544   x.y();
    545 </pre></td></tr>
    546 
    547 
    548 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
    549 <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
    550 
    551 Given
    552   class Y {
    553     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
    554     int a; static int b;
    555   };
    556 memberExpr()
    557   matches this-&gt;x, x, y.x, a, this-&gt;b
    558 </pre></td></tr>
    559 
    560 
    561 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
    562 <tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
    563 
    564 Given
    565   new X;
    566 newExpr()
    567   matches 'new X'.
    568 </pre></td></tr>
    569 
    570 
    571 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
    572 <tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
    573 
    574 Note that if an operator isn't overloaded, it won't match. Instead, use
    575 binaryOperator matcher.
    576 Currently it does not match operators such as new delete.
    577 FIXME: figure out why these do not match?
    578 
    579 Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
    580     (matcher = operatorCallExpr())
    581   ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
    582   ostream &amp;o; int b = 1, c = 1;
    583   o &lt;&lt; b &lt;&lt; c;
    584 </pre></td></tr>
    585 
    586 
    587 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
    588 <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
    589 
    590 Given
    591   { ++a; }
    592 stmt()
    593   matches both the compound statement '{ ++a; }' and '++a'.
    594 </pre></td></tr>
    595 
    596 
    597 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
    598 <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
    599 
    600 Given
    601   switch(a) { case 42: break; default: break; }
    602 switchCase()
    603   matches 'case 42: break;' and 'default: break;'.
    604 </pre></td></tr>
    605 
    606 
    607 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
    608 <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
    609 
    610 Given
    611   Foo x = bar;
    612   int y = sizeof(x) + alignof(x);
    613 unaryExprOrTypeTraitExpr()
    614   matches sizeof(x) and alignof(x)
    615 </pre></td></tr>
    616 
    617 
    618 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
    619 <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
    620 
    621 Example matches !a
    622   !a || b
    623 </pre></td></tr>
    624 
    625 
    626 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
    627 <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
    628 
    629 Given
    630   while (true) {}
    631 whileStmt()
    632   matches 'while (true) {}'.
    633 </pre></td></tr>
    634 
    635 <!--END_DECL_MATCHERS -->
    636 </table>
    637 
    638 <!-- ======================================================================= -->
    639 <h2 id="narrowing-matchers">Narrowing Matchers</h2>
    640 <!-- ======================================================================= -->
    641 
    642 <p>Narrowing matchers match certain attributes on the current node, thus
    643 narrowing down the set of nodes of the current type to match on.</p>
    644 
    645 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
    646 which allow users to create more powerful match expressions.</p>
    647 
    648 <table>
    649 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
    650 <!-- START_NARROWING_MATCHERS -->
    651 
    652 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;  P1, Matcher&lt;*&gt;  P2</td></tr>
    653 <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
    654 
    655 Usable as: Any Matcher
    656 </pre></td></tr>
    657 
    658 
    659 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;  P1, Matcher&lt;*&gt;  P2</td></tr>
    660 <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
    661 
    662 Usable as: Any Matcher
    663 </pre></td></tr>
    664 
    665 
    666 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
    667 <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
    668 
    669 Useful when another matcher requires a child matcher, but there's no
    670 additional constraint. This will often be used with an explicit conversion
    671 to an internal::Matcher&lt;&gt; type such as TypeMatcher.
    672 
    673 Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
    674 "int* p" and "void f()" in
    675   int* p;
    676   void f();
    677 
    678 Usable as: Any Matcher
    679 </pre></td></tr>
    680 
    681 
    682 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;  InnerMatcher</td></tr>
    683 <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
    684 
    685 Example matches Y (matcher = recordDecl(unless(hasName("X"))))
    686   class X {};
    687   class Y {};
    688 
    689 Usable as: Any Matcher
    690 </pre></td></tr>
    691 
    692 
    693 <tr><td>Matcher&lt<a href="http://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>
    694 <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
    695 unary).
    696 
    697 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
    698   !(a || b)
    699 </pre></td></tr>
    700 
    701 
    702 <tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT  Value</td></tr>
    703 <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
    704 
    705 Example matches true (matcher = boolLiteral(equals(true)))
    706   true
    707 
    708 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
    709            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
    710 </pre></td></tr>
    711 
    712 
    713 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
    714 <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
    715 by the compiler (eg. implicit defaultcopy constructors).
    716 </pre></td></tr>
    717 
    718 
    719 <tr><td>Matcher&lt<a href="http://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>
    720 <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
    721 code (as opposed to implicitly added by the compiler).
    722 
    723 Given
    724   struct Foo {
    725     Foo() { }
    726     Foo(int) : foo_("A") { }
    727     string foo_;
    728   };
    729 constructorDecl(hasAnyConstructorInitializer(isWritten()))
    730   will match Foo(int), but not Foo()
    731 </pre></td></tr>
    732 
    733 
    734 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>std::string Name</td></tr>
    735 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
    736 
    737 Matches overloaded operator names specified in strings without the
    738 "operator" prefix, such as "&lt;&lt;", for OverloadedOperatorCall's.
    739 
    740 Example matches a &lt;&lt; b
    741     (matcher == operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;")))
    742   a &lt;&lt; b;
    743   c &amp;&amp; d;  assuming both operator&lt;&lt;
    744            and operator&amp;&amp; are overloaded somewhere.
    745 </pre></td></tr>
    746 
    747 
    748 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isA1')"><a name="isA1Anchor">isA</a></td><td>StringRef BaseName</td></tr>
    749 <tr><td colspan="4" class="doc" id="isA1"><pre>Overloaded method as shortcut for isA(hasName(...)).
    750 </pre></td></tr>
    751 
    752 
    753 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>StringRef BaseName</td></tr>
    754 <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
    755 </pre></td></tr>
    756 
    757 
    758 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
    759 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
    760 static member variable template instantiations.
    761 
    762 Given
    763   template&lt;typename T&gt; void A(T t) { }
    764   template&lt;&gt; void A(int N) { }
    765 functionDecl(isExplicitTemplateSpecialization())
    766   matches the specialization A&lt;int&gt;().
    767 
    768 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
    769 </pre></td></tr>
    770 
    771 
    772 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
    773 <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
    774 member variable template instantiations.
    775 
    776 Given
    777   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
    778 or
    779   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
    780 recordDecl(hasName("::X"), isTemplateInstantiation())
    781   matches the template instantiation of X&lt;A&gt;.
    782 
    783 But given
    784   template &lt;typename T&gt;  class X {}; class A {};
    785   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
    786 recordDecl(hasName("::X"), isTemplateInstantiation())
    787   does not match, as X&lt;A&gt; is an explicit template specialization.
    788 
    789 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
    790 </pre></td></tr>
    791 
    792 
    793 <tr><td>Matcher&lt<a href="http://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>
    794 <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
    795 a specific number of arguments (including absent default arguments).
    796 
    797 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
    798   void f(int x, int y);
    799   f(0, 0);
    800 </pre></td></tr>
    801 
    802 
    803 <tr><td>Matcher&lt<a href="http://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>ValueT  Value</td></tr>
    804 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
    805 
    806 Example matches true (matcher = boolLiteral(equals(true)))
    807   true
    808 
    809 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
    810            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
    811 </pre></td></tr>
    812 
    813 
    814 <tr><td>Matcher&lt<a href="http://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>
    815 <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
    816 child statements.
    817 
    818 Example: Given
    819   { for (;;) {} }
    820 compoundStmt(statementCountIs(0)))
    821   matches '{}'
    822   but does not match the outer compound statement.
    823 </pre></td></tr>
    824 
    825 
    826 <tr><td>Matcher&lt<a href="http://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>
    827 <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
    828 declarations.
    829 
    830 Example: Given
    831   int a, b;
    832   int c;
    833   int d = 2, e;
    834 declCountIs(2)
    835   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
    836 </pre></td></tr>
    837 
    838 
    839 <tr><td>Matcher&lt<a href="http://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>ValueT  Value</td></tr>
    840 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
    841 
    842 Example matches true (matcher = boolLiteral(equals(true)))
    843   true
    844 
    845 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
    846            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
    847 </pre></td></tr>
    848 
    849 
    850 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
    851 <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
    852 
    853 Example matches A, va, fa
    854   class A {};
    855   class B;  Doesn't match, as it has no body.
    856   int va;
    857   extern int vb;  Doesn't match, as it doesn't define the variable.
    858   void fa() {}
    859   void fb();  Doesn't match, as it has no body.
    860 
    861 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
    862 </pre></td></tr>
    863 
    864 
    865 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
    866 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
    867 static member variable template instantiations.
    868 
    869 Given
    870   template&lt;typename T&gt; void A(T t) { }
    871   template&lt;&gt; void A(int N) { }
    872 functionDecl(isExplicitTemplateSpecialization())
    873   matches the specialization A&lt;int&gt;().
    874 
    875 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
    876 </pre></td></tr>
    877 
    878 
    879 <tr><td>Matcher&lt<a href="http://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>
    880 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
    881 
    882 Given:
    883   extern "C" void f() {}
    884   extern "C" { void g() {} }
    885   void h() {}
    886 functionDecl(isExternC())
    887   matches the declaration of f and g, but not the declaration h
    888 </pre></td></tr>
    889 
    890 
    891 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
    892 <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
    893 member variable template instantiations.
    894 
    895 Given
    896   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
    897 or
    898   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
    899 recordDecl(hasName("::X"), isTemplateInstantiation())
    900   matches the template instantiation of X&lt;A&gt;.
    901 
    902 But given
    903   template &lt;typename T&gt;  class X {}; class A {};
    904   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
    905 recordDecl(hasName("::X"), isTemplateInstantiation())
    906   does not match, as X&lt;A&gt; is an explicit template specialization.
    907 
    908 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
    909 </pre></td></tr>
    910 
    911 
    912 <tr><td>Matcher&lt<a href="http://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>ValueT  Value</td></tr>
    913 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
    914 
    915 Example matches true (matcher = boolLiteral(equals(true)))
    916   true
    917 
    918 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
    919            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
    920 </pre></td></tr>
    921 
    922 
    923 <tr><td>Matcher&lt<a href="http://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>
    924 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
    925 to '.'.
    926 
    927 Member calls on the implicit this pointer match as called with '-&gt;'.
    928 
    929 Given
    930   class Y {
    931     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
    932     int a;
    933     static int b;
    934   };
    935 memberExpr(isArrow())
    936   matches this-&gt;x, x, y.x, a, this-&gt;b
    937 </pre></td></tr>
    938 
    939 
    940 <tr><td>Matcher&lt<a href="http://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>std::string Name</td></tr>
    941 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
    942 
    943 Supports specifying enclosing namespaces or classes by prefixing the name
    944 with '&lt;enclosing&gt;::'.
    945 Does not match typedefs of an underlying type with the given name.
    946 
    947 Example matches X (Name == "X")
    948   class X;
    949 
    950 Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
    951   namespace a { namespace b { class X; } }
    952 </pre></td></tr>
    953 
    954 
    955 <tr><td>Matcher&lt<a href="http://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>
    956 <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose full names partially match the
    957 given RegExp.
    958 
    959 Supports specifying enclosing namespaces or classes by
    960 prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
    961 of an underlying type with the given name.
    962 
    963 Example matches X (regexp == "::X")
    964   class X;
    965 
    966 Example matches X (regexp is one of "::X", "^foo::.*X", among others)
    967   namespace foo { namespace bar { class X; } }
    968 </pre></td></tr>
    969 
    970 
    971 <tr><td>Matcher&lt<a href="http://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>
    972 <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
    973 
    974 Given
    975   class Y { public: void x(); };
    976   void z() { Y* y; y-&gt;x(); }
    977 callExpr(on(hasType(asString("class Y *"))))
    978   matches y-&gt;x()
    979 </pre></td></tr>
    980 
    981 
    982 <tr><td>Matcher&lt<a href="http://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>
    983 <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
    984 include "top-level" const.
    985 
    986 Given
    987   void a(int);
    988   void b(int const);
    989   void c(const int);
    990   void d(const int*);
    991   void e(int const) {};
    992 functionDecl(hasAnyParameter(hasType(isConstQualified())))
    993   matches "void b(int const)", "void c(const int)" and
    994   "void e(int const) {}". It does not match d as there
    995   is no top-level const on the parameter type "const int *".
    996 </pre></td></tr>
    997 
    998 
    999 <tr><td>Matcher&lt<a href="http://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>
   1000 <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
   1001 
   1002 Given
   1003   void a(int);
   1004   void b(long);
   1005   void c(double);
   1006 functionDecl(hasAnyParameter(hasType(isInteger())))
   1007 matches "a(int)", "b(long)", but not "c(double)".
   1008 </pre></td></tr>
   1009 
   1010 
   1011 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
   1012 <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
   1013 
   1014 Example matches A, va, fa
   1015   class A {};
   1016   class B;  Doesn't match, as it has no body.
   1017   int va;
   1018   extern int vb;  Doesn't match, as it doesn't define the variable.
   1019   void fa() {}
   1020   void fb();  Doesn't match, as it has no body.
   1021 
   1022 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
   1023 </pre></td></tr>
   1024 
   1025 
   1026 <tr><td>Matcher&lt<a href="http://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>
   1027 <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
   1028 
   1029 Given
   1030   int x;
   1031   int s = sizeof(x) + alignof(x)
   1032 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
   1033   matches sizeof(x)
   1034 </pre></td></tr>
   1035 
   1036 
   1037 <tr><td>Matcher&lt<a href="http://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>
   1038 <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
   1039 unary).
   1040 
   1041 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
   1042   !(a || b)
   1043 </pre></td></tr>
   1044 
   1045 
   1046 <tr><td>Matcher&lt<a href="http://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>
   1047 <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
   1048 
   1049 Example matches A, va, fa
   1050   class A {};
   1051   class B;  Doesn't match, as it has no body.
   1052   int va;
   1053   extern int vb;  Doesn't match, as it doesn't define the variable.
   1054   void fa() {}
   1055   void fb();  Doesn't match, as it has no body.
   1056 
   1057 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
   1058 </pre></td></tr>
   1059 
   1060 
   1061 <tr><td>Matcher&lt<a href="http://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>
   1062 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
   1063 static member variable template instantiations.
   1064 
   1065 Given
   1066   template&lt;typename T&gt; void A(T t) { }
   1067   template&lt;&gt; void A(int N) { }
   1068 functionDecl(isExplicitTemplateSpecialization())
   1069   matches the specialization A&lt;int&gt;().
   1070 
   1071 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   1072 </pre></td></tr>
   1073 
   1074 
   1075 <tr><td>Matcher&lt<a href="http://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>
   1076 <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
   1077 member variable template instantiations.
   1078 
   1079 Given
   1080   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
   1081 or
   1082   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
   1083 recordDecl(hasName("::X"), isTemplateInstantiation())
   1084   matches the template instantiation of X&lt;A&gt;.
   1085 
   1086 But given
   1087   template &lt;typename T&gt;  class X {}; class A {};
   1088   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
   1089 recordDecl(hasName("::X"), isTemplateInstantiation())
   1090   does not match, as X&lt;A&gt; is an explicit template specialization.
   1091 
   1092 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
   1093 </pre></td></tr>
   1094 
   1095 <!--END_NARROWING_MATCHERS -->
   1096 </table>
   1097 
   1098 <!-- ======================================================================= -->
   1099 <h2 id="traversal-matchers">AST Traversal Matchers</h2>
   1100 <!-- ======================================================================= -->
   1101 
   1102 <p>Traversal matchers specify the relationship to other nodes that are
   1103 reachable from the current node.</p>
   1104 
   1105 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
   1106 forEachDescendant) which work on all nodes and allow users to write more generic
   1107 match expressions.</p>
   1108 
   1109 <table>
   1110 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
   1111 <!-- START_TRAVERSAL_MATCHERS -->
   1112 
   1113 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;ChildT&gt;  ChildMatcher</td></tr>
   1114 <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
   1115 provided matcher.
   1116 
   1117 Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
   1118   class X {};  Matches X, because X::X is a class of name X inside X.
   1119   class Y { class X {}; };
   1120   class Z { class Y { class X {}; }; };  Does not match Z.
   1121 
   1122 ChildT must be an AST base type.
   1123 
   1124 As opposed to 'has', 'forEach' will cause a match for each result that
   1125 matches instead of only on the first one.
   1126 
   1127 Usable as: Any Matcher
   1128 </pre></td></tr>
   1129 
   1130 
   1131 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;DescendantT&gt;  DescendantMatcher</td></tr>
   1132 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   1133 provided matcher.
   1134 
   1135 Example matches X, A, B, C
   1136     (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
   1137   class X {};  Matches X, because X::X is a class of name X inside X.
   1138   class A { class X {}; };
   1139   class B { class C { class X {}; }; };
   1140 
   1141 DescendantT must be an AST base type.
   1142 
   1143 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
   1144 each result that matches instead of only on the first one.
   1145 
   1146 Note: Recursively combined ForEachDescendant can cause many matches:
   1147   recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
   1148 will match 10 times (plus injected class name matches) on:
   1149   class A { class B { class C { class D { class E {}; }; }; }; };
   1150 
   1151 Usable as: Any Matcher
   1152 </pre></td></tr>
   1153 
   1154 
   1155 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;ChildT&gt;  ChildMatcher</td></tr>
   1156 <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
   1157 provided matcher.
   1158 
   1159 Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
   1160   class X {};  Matches X, because X::X is a class of name X inside X.
   1161   class Y { class X {}; };
   1162   class Z { class Y { class X {}; }; };  Does not match Z.
   1163 
   1164 ChildT must be an AST base type.
   1165 
   1166 Usable as: Any Matcher
   1167 </pre></td></tr>
   1168 
   1169 
   1170 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;AncestorT&gt;  AncestorMatcher</td></tr>
   1171 <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
   1172 matcher.
   1173 
   1174 Given
   1175 void f() { if (true) { int x = 42; } }
   1176 void g() { for (;;) { int x = 43; } }
   1177 expr(integerLiteral(hasAncsestor(ifStmt()))) matches 42, but not 43.
   1178 
   1179 Usable as: Any Matcher
   1180 </pre></td></tr>
   1181 
   1182 
   1183 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;DescendantT&gt;  DescendantMatcher</td></tr>
   1184 <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
   1185 provided matcher.
   1186 
   1187 Example matches X, Y, Z
   1188     (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
   1189   class X {};  Matches X, because X::X is a class of name X inside X.
   1190   class Y { class X {}; };
   1191   class Z { class Y { class X {}; }; };
   1192 
   1193 DescendantT must be an AST base type.
   1194 
   1195 Usable as: Any Matcher
   1196 </pre></td></tr>
   1197 
   1198 
   1199 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1200 <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
   1201 
   1202 Given
   1203   int i[5];
   1204   void f() { i[1] = 42; }
   1205 arraySubscriptExpression(hasBase(implicitCastExpr(
   1206     hasSourceExpression(declRefExpr()))))
   1207   matches i[1] with the declRefExpr() matching i
   1208 </pre></td></tr>
   1209 
   1210 
   1211 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1212 <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
   1213 
   1214 Given
   1215   int i[5];
   1216   void f() { i[1] = 42; }
   1217 arraySubscriptExpression(hasIndex(integerLiteral()))
   1218   matches i[1] with the integerLiteral() matching 1
   1219 </pre></td></tr>
   1220 
   1221 
   1222 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;  InnerMatcher</td></tr>
   1223 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
   1224 binary operator matches.
   1225 </pre></td></tr>
   1226 
   1227 
   1228 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1229 <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
   1230 
   1231 Example matches a (matcher = binaryOperator(hasLHS()))
   1232   a || b
   1233 </pre></td></tr>
   1234 
   1235 
   1236 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1237 <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
   1238 
   1239 Example matches b (matcher = binaryOperator(hasRHS()))
   1240   a || b
   1241 </pre></td></tr>
   1242 
   1243 
   1244 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1245 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if the declaration of the type matches the given
   1246 matcher.
   1247 
   1248 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;
   1249 </pre></td></tr>
   1250 
   1251 
   1252 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
   1253 <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
   1254 
   1255 Given
   1256   struct Foo {
   1257     Foo() : foo_(1) { }
   1258     int foo_;
   1259   };
   1260 recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
   1261   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
   1262 </pre></td></tr>
   1263 
   1264 
   1265 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt; InnerMatcher</td></tr>
   1266 <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
   1267 
   1268 Given
   1269   struct Foo {
   1270     Foo() : foo_(1) { }
   1271     int foo_;
   1272   };
   1273 recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
   1274     forField(hasName("foo_"))))))
   1275   matches Foo
   1276 with forField matching foo_
   1277 </pre></td></tr>
   1278 
   1279 
   1280 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1281 <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
   1282 
   1283 Given
   1284   struct Foo {
   1285     Foo() : foo_(1) { }
   1286     int foo_;
   1287   };
   1288 recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
   1289     withInitializer(integerLiteral(equals(1)))))))
   1290   matches Foo
   1291 with withInitializer matching (1)
   1292 </pre></td></tr>
   1293 
   1294 
   1295 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1296 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
   1297 
   1298 Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
   1299   class Y { public: void x(); };
   1300   void z() { Y y; y.x(); }",
   1301 
   1302 FIXME: Overload to allow directly matching types?
   1303 </pre></td></tr>
   1304 
   1305 
   1306 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1307 <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
   1308 
   1309 
   1310 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1311 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
   1312 </pre></td></tr>
   1313 
   1314 
   1315 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt; InnerMatcher</td></tr>
   1316 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
   1317 belongs to.
   1318 
   1319 FIXME: Generalize this for other kinds of declarations.
   1320 FIXME: What other kind of declarations would we need to generalize
   1321 this to?
   1322 
   1323 Example matches A() in the last line
   1324     (matcher = constructExpr(hasDeclaration(methodDecl(
   1325         ofClass(hasName("A"))))))
   1326   class A {
   1327    public:
   1328     A();
   1329   };
   1330   A a = A();
   1331 </pre></td></tr>
   1332 
   1333 
   1334 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isA0')"><a name="isA0Anchor">isA</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   1335 <tr><td colspan="4" class="doc" id="isA0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
   1336 match Base.
   1337 </pre></td></tr>
   1338 
   1339 
   1340 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
   1341 <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
   1342 a class matching Base.
   1343 
   1344 Note that a class is not considered to be derived from itself.
   1345 
   1346 Example matches Y, Z, C (Base == hasName("X"))
   1347   class X;
   1348   class Y : public X {};  directly derived
   1349   class Z : public Y {};  indirectly derived
   1350   typedef X A;
   1351   typedef A B;
   1352   class C : public B {};  derived from a typedef of X
   1353 
   1354 In the following example, Bar matches isDerivedFrom(hasName("X")):
   1355   class Foo;
   1356   typedef Foo X;
   1357   class Bar : public Foo {};  derived from a type that X is a typedef of
   1358 </pre></td></tr>
   1359 
   1360 
   1361 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1362 <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
   1363 given matcher.
   1364 
   1365 Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
   1366   class Y { public: void x(); };
   1367   void z() { Y y; y.x();
   1368 </pre></td></tr>
   1369 
   1370 
   1371 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1372 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
   1373 expression.
   1374 
   1375 Given
   1376   void x(int, int, int) { int y; x(1, y, 42); }
   1377 callExpr(hasAnyArgument(declRefExpr()))
   1378   matches x(1, y, 42)
   1379 with hasAnyArgument(...)
   1380   matching y
   1381 </pre></td></tr>
   1382 
   1383 
   1384 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1385 <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
   1386 call expression.
   1387 
   1388 Example matches y in x(y)
   1389     (matcher = callExpr(hasArgument(0, declRefExpr())))
   1390   void x(int) { int y; x(y); }
   1391 </pre></td></tr>
   1392 
   1393 
   1394 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1395 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if the declaration of the type matches the given
   1396 matcher.
   1397 
   1398 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;
   1399 </pre></td></tr>
   1400 
   1401 
   1402 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1403 <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
   1404 
   1405 Example: matches "a string" (matcher =
   1406                                  hasSourceExpression(constructExpr()))
   1407 class URL { URL(string); };
   1408 URL url = "a string";
   1409 </pre></td></tr>
   1410 
   1411 
   1412 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   1413 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
   1414 TemplateArgument matching the given InnerMatcher.
   1415 
   1416 Given
   1417   template&lt;typename T&gt; class A {};
   1418   template&lt;&gt; class A&lt;double&gt; {};
   1419   A&lt;int&gt; a;
   1420 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   1421     refersToType(asString("int"))))
   1422   matches the specialization A&lt;int&gt;
   1423 </pre></td></tr>
   1424 
   1425 
   1426 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
   1427 <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
   1428 matches the given InnerMatcher.
   1429 
   1430 Given
   1431   template&lt;typename T, typename U&gt; class A {};
   1432   A&lt;bool, int&gt; b;
   1433   A&lt;int, bool&gt; c;
   1434 classTemplateSpecializationDecl(hasTemplateArgument(
   1435     1, refersToType(asString("int"))))
   1436   matches the specialization A&lt;bool, int&gt;
   1437 </pre></td></tr>
   1438 
   1439 
   1440 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   1441 <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
   1442 a given matcher.
   1443 
   1444 Given
   1445   { {}; 1+2; }
   1446 hasAnySubstatement(compoundStmt())
   1447   matches '{ {}; 1+2; }'
   1448 with compoundStmt()
   1449   matching '{}'
   1450 </pre></td></tr>
   1451 
   1452 
   1453 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1454 <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
   1455 or conditional operator.
   1456 
   1457 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
   1458   if (true) {}
   1459 </pre></td></tr>
   1460 
   1461 
   1462 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1463 <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
   1464 
   1465 Example matches b
   1466   condition ? a : b
   1467 </pre></td></tr>
   1468 
   1469 
   1470 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1471 <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
   1472 
   1473 Example matches a
   1474   condition ? a : b
   1475 </pre></td></tr>
   1476 
   1477 
   1478 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
   1479 <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
   1480 specific using shadow declaration.
   1481 
   1482 FIXME: This currently only works for functions. Fix.
   1483 
   1484 Given
   1485   namespace a { void f() {} }
   1486   using a::f;
   1487   void g() {
   1488     f();     Matches this ..
   1489     a::f();  .. but not this.
   1490   }
   1491 declRefExpr(throughUsingDeclaration(anything()))
   1492   matches f()
   1493 </pre></td></tr>
   1494 
   1495 
   1496 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   1497 <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
   1498 specified matcher.
   1499 
   1500 Example matches x in if(x)
   1501     (matcher = declRefExpr(to(varDecl(hasName("x")))))
   1502   bool x;
   1503   if (x) {}
   1504 </pre></td></tr>
   1505 
   1506 
   1507 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   1508 <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
   1509 
   1510 Note that this does not work for global declarations because the AST
   1511 breaks up multiple-declaration DeclStmt's into multiple single-declaration
   1512 DeclStmt's.
   1513 Example: Given non-global declarations
   1514   int a, b = 0;
   1515   int c;
   1516   int d = 2, e;
   1517 declStmt(containsDeclaration(
   1518       0, varDecl(hasInitializer(anything()))))
   1519   matches only 'int d = 2, e;', and
   1520 declStmt(containsDeclaration(1, varDecl()))
   1521   matches 'int a, b = 0' as well as 'int d = 2, e;'
   1522   but 'int c;' is not matched.
   1523 </pre></td></tr>
   1524 
   1525 
   1526 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   1527 <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
   1528 
   1529 Given
   1530   int a, b;
   1531   int c;
   1532 declStmt(hasSingleDecl(anything()))
   1533   matches 'int c;' but not 'int a, b;'.
   1534 </pre></td></tr>
   1535 
   1536 
   1537 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   1538 <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
   1539 a given body.
   1540 
   1541 Given
   1542   for (;;) {}
   1543 hasBody(compoundStmt())
   1544   matches 'for (;;) {}'
   1545 with compoundStmt()
   1546   matching '{}'
   1547 </pre></td></tr>
   1548 
   1549 
   1550 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1551 <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
   1552 or conditional operator.
   1553 
   1554 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
   1555   if (true) {}
   1556 </pre></td></tr>
   1557 
   1558 
   1559 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   1560 <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
   1561 
   1562 (Note: Clang's AST refers to other conversions as "casts" too, and calls
   1563 actual casts "explicit" casts.)
   1564 </pre></td></tr>
   1565 
   1566 
   1567 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1568 <tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
   1569 declaration's type.
   1570 
   1571 In case of a value declaration (for example a variable declaration),
   1572 this resolves one layer of indirection. For example, in the value
   1573 declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
   1574 while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
   1575 of x."
   1576 
   1577 Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
   1578             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
   1579  class X {};
   1580  void y(X &amp;x) { x; X z; }
   1581 
   1582 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
   1583 </pre></td></tr>
   1584 
   1585 
   1586 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1587 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
   1588 are stripped off.
   1589 
   1590 Parentheses and explicit casts are not discarded.
   1591 Given
   1592   int arr[5];
   1593   int a = 0;
   1594   char b = 0;
   1595   const int c = a;
   1596   int *d = arr;
   1597   long e = (long) 0l;
   1598 The matchers
   1599    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
   1600    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
   1601 would match the declarations for a, b, c, and d, but not e.
   1602 While
   1603    varDecl(hasInitializer(integerLiteral()))
   1604    varDecl(hasInitializer(declRefExpr()))
   1605 only match the declarations for b, c, and d.
   1606 </pre></td></tr>
   1607 
   1608 
   1609 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1610 <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
   1611 casts are stripped off.
   1612 
   1613 Implicit and non-C Style casts are also discarded.
   1614 Given
   1615   int a = 0;
   1616   char b = (0);
   1617   void* c = reinterpret_cast&lt;char*&gt;(0);
   1618   char d = char(0);
   1619 The matcher
   1620    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
   1621 would match the declarations for a, b, c, and d.
   1622 while
   1623    varDecl(hasInitializer(integerLiteral()))
   1624 only match the declaration for a.
   1625 </pre></td></tr>
   1626 
   1627 
   1628 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1629 <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
   1630 parentheses are stripped off.
   1631 
   1632 Explicit casts are not discarded.
   1633 Given
   1634   int arr[5];
   1635   int a = 0;
   1636   char b = (0);
   1637   const int c = a;
   1638   int *d = (arr);
   1639   long e = ((long) 0l);
   1640 The matchers
   1641    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
   1642    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
   1643 would match the declarations for a, b, c, and d, but not e.
   1644 while
   1645    varDecl(hasInitializer(integerLiteral()))
   1646    varDecl(hasInitializer(declRefExpr()))
   1647 would only match the declaration for a.
   1648 </pre></td></tr>
   1649 
   1650 
   1651 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   1652 <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
   1653 a given body.
   1654 
   1655 Given
   1656   for (;;) {}
   1657 hasBody(compoundStmt())
   1658   matches 'for (;;) {}'
   1659 with compoundStmt()
   1660   matching '{}'
   1661 </pre></td></tr>
   1662 
   1663 
   1664 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1665 <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
   1666 or conditional operator.
   1667 
   1668 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
   1669   if (true) {}
   1670 </pre></td></tr>
   1671 
   1672 
   1673 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   1674 <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
   1675 
   1676 Example:
   1677     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
   1678 matches '++x' in
   1679     for (x; x &lt; N; ++x) { }
   1680 </pre></td></tr>
   1681 
   1682 
   1683 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   1684 <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
   1685 
   1686 Example:
   1687     forStmt(hasLoopInit(declStmt()))
   1688 matches 'int x = 0' in
   1689     for (int x = 0; x &lt; N; ++x) { }
   1690 </pre></td></tr>
   1691 
   1692 
   1693 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   1694 <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
   1695 
   1696 Does not match the 'this' parameter of a method.
   1697 
   1698 Given
   1699   class X { void f(int x, int y, int z) {} };
   1700 methodDecl(hasAnyParameter(hasName("y")))
   1701   matches f(int x, int y, int z) {}
   1702 with hasAnyParameter(...)
   1703   matching int y
   1704 </pre></td></tr>
   1705 
   1706 
   1707 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
   1708 <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
   1709 
   1710 Given
   1711   class X { void f(int x) {} };
   1712 methodDecl(hasParameter(0, hasType(varDecl())))
   1713   matches f(int x) {}
   1714 with hasParameter(...)
   1715   matching int x
   1716 </pre></td></tr>
   1717 
   1718 
   1719 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   1720 <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
   1721 
   1722 Given:
   1723   class X { int f() { return 1; } };
   1724 methodDecl(returns(asString("int")))
   1725   matches int f() { return 1; }
   1726 </pre></td></tr>
   1727 
   1728 
   1729 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1730 <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
   1731 or conditional operator.
   1732 
   1733 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
   1734   if (true) {}
   1735 </pre></td></tr>
   1736 
   1737 
   1738 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt; InnerMatcher</td></tr>
   1739 <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
   1740 
   1741 Given
   1742   if (A* a = GetAPointer()) {}
   1743 hasConditionVariableStatment(...)
   1744   matches 'A* a = GetAPointer()'.
   1745 </pre></td></tr>
   1746 
   1747 
   1748 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   1749 <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
   1750 matcher.
   1751 
   1752 FIXME: Unit test this matcher
   1753 </pre></td></tr>
   1754 
   1755 
   1756 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1757 <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
   1758 matched by a given matcher.
   1759 
   1760 Given
   1761   struct X { int m; };
   1762   void f(X x) { x.m; m; }
   1763 memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
   1764   matches "x.m" and "m"
   1765 with hasObjectExpression(...)
   1766   matching "x" and the implicit object expression of "m" which has type X*.
   1767 </pre></td></tr>
   1768 
   1769 
   1770 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
   1771 <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
   1772 given matcher.
   1773 
   1774 Given
   1775   struct { int first, second; } first, second;
   1776   int i(second.first);
   1777   int j(first.second);
   1778 memberExpr(member(hasName("first")))
   1779   matches second.first
   1780   but not first.second (because the member name there is "second").
   1781 </pre></td></tr>
   1782 
   1783 
   1784 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1785 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if the declaration of the type matches the given
   1786 matcher.
   1787 
   1788 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;
   1789 </pre></td></tr>
   1790 
   1791 
   1792 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1793 <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
   1794 </pre></td></tr>
   1795 
   1796 
   1797 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1798 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
   1799 </pre></td></tr>
   1800 
   1801 
   1802 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
   1803 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   1804 alignof.
   1805 </pre></td></tr>
   1806 
   1807 
   1808 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
   1809 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
   1810 sizeof.
   1811 </pre></td></tr>
   1812 
   1813 
   1814 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
   1815 <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
   1816 
   1817 Given
   1818   template&lt;typename T&gt; struct A {};
   1819   struct B { B* next; };
   1820   A&lt;&amp;B::next&gt; a;
   1821 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   1822     refersToDeclaration(fieldDecl(hasName("next"))))
   1823   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
   1824     B::next
   1825 </pre></td></tr>
   1826 
   1827 
   1828 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   1829 <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
   1830 
   1831 Given
   1832   struct X {};
   1833   template&lt;typename T&gt; struct A {};
   1834   A&lt;X&gt; a;
   1835 classTemplateSpecializationDecl(hasAnyTemplateArgument(
   1836     refersToType(class(hasName("X")))))
   1837   matches the specialization A&lt;X&gt;
   1838 </pre></td></tr>
   1839 
   1840 
   1841 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
   1842 <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
   1843 
   1844 Given
   1845   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
   1846 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
   1847   matches sizeof(a) and alignof(c)
   1848 </pre></td></tr>
   1849 
   1850 
   1851 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1852 <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
   1853 
   1854 Example matches true (matcher = hasOperand(boolLiteral(equals(true))))
   1855   !true
   1856 </pre></td></tr>
   1857 
   1858 
   1859 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
   1860 <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
   1861 
   1862 Given
   1863   namespace X { void b(); }
   1864   using X::b;
   1865 usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
   1866   matches using X::b </pre></td></tr>
   1867 
   1868 
   1869 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
   1870 <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
   1871 matched by the given matcher.
   1872 
   1873 Given
   1874   namespace X { int a; void b(); }
   1875   using X::a;
   1876   using X::b;
   1877 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
   1878   matches using X::b but not using X::a </pre></td></tr>
   1879 
   1880 
   1881 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
   1882 <tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
   1883 declaration's type.
   1884 
   1885 In case of a value declaration (for example a variable declaration),
   1886 this resolves one layer of indirection. For example, in the value
   1887 declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
   1888 while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
   1889 of x."
   1890 
   1891 Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
   1892             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
   1893  class X {};
   1894  void y(X &amp;x) { x; X z; }
   1895 
   1896 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
   1897 </pre></td></tr>
   1898 
   1899 
   1900 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1901 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
   1902 that matches the given matcher.
   1903 
   1904 Example matches x (matcher = varDecl(hasInitializer(callExpr())))
   1905   bool y() { return true; }
   1906   bool x = y();
   1907 </pre></td></tr>
   1908 
   1909 
   1910 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
   1911 <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
   1912 a given body.
   1913 
   1914 Given
   1915   for (;;) {}
   1916 hasBody(compoundStmt())
   1917   matches 'for (;;) {}'
   1918 with compoundStmt()
   1919   matching '{}'
   1920 </pre></td></tr>
   1921 
   1922 
   1923 <tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
   1924 <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
   1925 or conditional operator.
   1926 
   1927 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
   1928   if (true) {}
   1929 </pre></td></tr>
   1930 
   1931 <!--END_TRAVERSAL_MATCHERS -->
   1932 </table>
   1933 
   1934 </div>
   1935 </body>
   1936 </html>
   1937 
   1938 
   1939