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<Stmt> 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 <p>Note that the categorization of matchers is a great help when you combine 61 them into matcher expressions. You will usually want to form matcher expressions 62 that read like english sentences by alternating between node matchers and 63 narrowing or traversal matchers, like this: 64 <pre> 65 recordDecl(hasDescendant( 66 ifStmt(hasTrueExpression( 67 expr(hasDescendant( 68 ifStmt())))))) 69 </pre> 70 </p> 71 72 <!-- ======================================================================= --> 73 <h2 id="decl-matchers">Node Matchers</h2> 74 <!-- ======================================================================= --> 75 76 <p>Node matchers are at the core of matcher expressions - they specify the type 77 of node that is expected. Every match expression starts with a node matcher, 78 which can then be further refined with a narrowing or traversal matcher. All 79 traversal matchers take node matchers as their arguments.</p> 80 81 <p>For convenience, all node matchers take an arbitrary number of arguments 82 and implicitly act as allOf matchers.</p> 83 84 <p>Node matchers are the only matchers that support the bind("id") call to 85 bind the matched node to the given string, to be later retrieved from the 86 match callback.</p> 87 88 <p>It is important to remember that the arguments to node matchers are 89 predicates on the same node, just with additional information about the type. 90 This is often useful to make matcher expression more readable by inlining bind 91 calls into redundant node matchers inside another node matcher: 92 <pre> 93 // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 94 // the same node. 95 recordDecl(decl().bind("id"), hasName("::MyClass")) 96 </pre> 97 </p> 98 99 <table> 100 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 101 <!-- START_DECL_MATCHERS --> 102 103 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 104 <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 105 106 Examples matches i(42). 107 class C { 108 C() : i(42) {} 109 int i; 110 }; 111 </pre></td></tr> 112 113 114 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 115 <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 116 117 Given 118 class C { 119 public: 120 int a; 121 }; 122 accessSpecDecl() 123 matches 'public:' 124 </pre></td></tr> 125 126 127 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 128 <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 129 130 Example matches Z 131 template<class T> class Z {}; 132 </pre></td></tr> 133 134 135 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 136 <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 137 138 Given 139 template<typename T> class A {}; 140 template<> class A<double> {}; 141 A<int> a; 142 classTemplateSpecializationDecl() 143 matches the specializations A<int> and A<double> 144 </pre></td></tr> 145 146 147 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 148 <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 149 150 Example matches Foo::Foo() and Foo::Foo(int) 151 class Foo { 152 public: 153 Foo(); 154 Foo(int); 155 int DoSomething(); 156 }; 157 </pre></td></tr> 158 159 160 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 161 <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 162 163 Example matches the operator. 164 class X { operator int() const; }; 165 </pre></td></tr> 166 167 168 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 169 <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 170 171 Example matches Foo::~Foo() 172 class Foo { 173 public: 174 virtual ~Foo(); 175 }; 176 </pre></td></tr> 177 178 179 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 180 <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 181 182 Example matches y 183 class X { void y(); }; 184 </pre></td></tr> 185 186 187 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 188 <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 189 190 Example matches X, Z 191 class X; 192 template<class T> class Z {}; 193 </pre></td></tr> 194 195 196 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 197 <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 198 199 Examples matches X, C, and the friend declaration inside C; 200 void X(); 201 class C { 202 friend X; 203 }; 204 </pre></td></tr> 205 206 207 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 208 <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 209 and non-type template parameter declarations). 210 211 Given 212 class X { int y; }; 213 declaratorDecl() 214 matches int y. 215 </pre></td></tr> 216 217 218 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 219 <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 220 221 Example matches A, B, C 222 enum X { 223 A, B, C 224 }; 225 </pre></td></tr> 226 227 228 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 229 <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 230 231 Example matches X 232 enum X { 233 A, B, C 234 }; 235 </pre></td></tr> 236 237 238 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 239 <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 240 241 Given 242 class X { int m; }; 243 fieldDecl() 244 matches 'm'. 245 </pre></td></tr> 246 247 248 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 249 <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 250 251 Given 252 class X { friend void foo(); }; 253 friendDecl() 254 matches 'friend void foo()'. 255 </pre></td></tr> 256 257 258 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 259 <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 260 261 Example matches f 262 void f(); 263 </pre></td></tr> 264 265 266 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 267 <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 268 269 Example matches f 270 template<class T> void f(T t) {} 271 </pre></td></tr> 272 273 274 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 275 <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 276 277 Given 278 goto FOO; 279 FOO: bar(); 280 labelDecl() 281 matches 'FOO:' 282 </pre></td></tr> 283 284 285 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 286 <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 287 288 Given 289 extern "C" {} 290 linkageSpecDecl() 291 matches "extern "C" {}" 292 </pre></td></tr> 293 294 295 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 296 <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 297 298 Example matches X, S, the anonymous union type, i, and U; 299 typedef int X; 300 struct S { 301 union { 302 int i; 303 } U; 304 }; 305 </pre></td></tr> 306 307 308 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 309 <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 310 311 Given 312 namespace test {} 313 namespace alias = ::test; 314 namespaceAliasDecl() 315 matches "namespace alias" but not "namespace test" 316 </pre></td></tr> 317 318 319 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 320 <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 321 322 Given 323 namespace {} 324 namespace test {} 325 namespaceDecl() 326 matches "namespace {}" and "namespace test {}" 327 </pre></td></tr> 328 329 330 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 331 <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 332 333 Given 334 template <typename T, int N> struct C {}; 335 nonTypeTemplateParmDecl() 336 matches 'N', but not 'T'. 337 </pre></td></tr> 338 339 340 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 341 <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 342 343 Example matches Foo 344 @interface Foo 345 @end 346 </pre></td></tr> 347 348 349 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 350 <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 351 352 Given 353 void f(int x); 354 parmVarDecl() 355 matches int x. 356 </pre></td></tr> 357 358 359 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 360 <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 361 362 Example matches X, Z, U, and S 363 class X; 364 template<class T> class Z {}; 365 struct S {}; 366 union U {}; 367 </pre></td></tr> 368 369 370 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 371 <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 372 373 Example: 374 staticAssertExpr() 375 matches 376 static_assert(sizeof(S) == sizeof(int)) 377 in 378 struct S { 379 int x; 380 }; 381 static_assert(sizeof(S) == sizeof(int)); 382 </pre></td></tr> 383 384 385 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 386 <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 387 388 Given 389 template <typename T, int N> struct C {}; 390 templateTypeParmDecl() 391 matches 'T', but not 'N'. 392 </pre></td></tr> 393 394 395 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 396 <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 397 398 Given 399 int X; 400 namespace NS { 401 int Y; 402 } namespace NS 403 decl(hasDeclContext(translationUnitDecl())) 404 matches "int X", but not "int Y". 405 </pre></td></tr> 406 407 408 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 409 <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 410 411 Given 412 typedef int X; 413 using Y = int; 414 typeAliasDecl() 415 matches "using Y = int", but not "typedef int X" 416 </pre></td></tr> 417 418 419 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 420 <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 421 422 Given 423 typedef int X; 424 using Y = int; 425 typedefDecl() 426 matches "typedef int X", but not "using Y = int" 427 </pre></td></tr> 428 429 430 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 431 <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 432 433 Given 434 typedef int X; 435 using Y = int; 436 typedefNameDecl() 437 matches "typedef int X" and "using Y = int" 438 </pre></td></tr> 439 440 441 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 442 <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 443 typename. 444 445 Given 446 template <typename T> 447 struct Base { typedef T Foo; }; 448 449 template<typename T> 450 struct S : private Base<T> { 451 using typename Base<T>::Foo; 452 }; 453 unresolvedUsingTypenameDecl() 454 matches using Base<T>::Foo </pre></td></tr> 455 456 457 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 458 <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 459 460 Given 461 template<typename X> 462 class C : private X { 463 using X::x; 464 }; 465 unresolvedUsingValueDecl() 466 matches using X::x </pre></td></tr> 467 468 469 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 470 <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 471 472 Given 473 namespace X { int x; } 474 using X::x; 475 usingDecl() 476 matches using X::x </pre></td></tr> 477 478 479 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 480 <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 481 482 Given 483 namespace X { int x; } 484 using namespace X; 485 usingDirectiveDecl() 486 matches using namespace X </pre></td></tr> 487 488 489 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 490 <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 491 492 Example matches A, B, C and F 493 enum X { A, B, C }; 494 void F(); 495 </pre></td></tr> 496 497 498 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 499 <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 500 501 Note: this does not match declarations of member variables, which are 502 "field" declarations in Clang parlance. 503 504 Example matches a 505 int a; 506 </pre></td></tr> 507 508 509 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 510 <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 511 </pre></td></tr> 512 513 514 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 515 <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 516 517 Given 518 namespace ns { 519 struct A { static void f(); }; 520 void A::f() {} 521 void g() { A::f(); } 522 } 523 ns::A a; 524 nestedNameSpecifier() 525 matches "ns::" and both "A::" 526 </pre></td></tr> 527 528 529 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 530 <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 531 </pre></td></tr> 532 533 534 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 535 <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 536 537 Given 538 FOO: bar(); 539 void *ptr = &&FOO; 540 goto *bar; 541 addrLabelExpr() 542 matches '&&FOO' 543 </pre></td></tr> 544 545 546 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 547 <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 548 549 Given 550 int i = a[1]; 551 arraySubscriptExpr() 552 matches "a[1]" 553 </pre></td></tr> 554 555 556 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 557 <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 558 559 int i = 100; 560 __asm("mov al, 2"); 561 asmStmt() 562 matches '__asm("mov al, 2")' 563 </pre></td></tr> 564 565 566 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 567 <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 568 Example matches __atomic_load_n(ptr, 1) 569 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 570 </pre></td></tr> 571 572 573 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 574 <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 575 576 Example matches a ?: b 577 (a ?: b) + 42; 578 </pre></td></tr> 579 580 581 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 582 <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 583 584 Example matches a || b 585 !(a || b) 586 </pre></td></tr> 587 588 589 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 590 <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 591 592 Given 593 while (true) { break; } 594 breakStmt() 595 matches 'break' 596 </pre></td></tr> 597 598 599 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 600 <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 601 602 Example: Matches (int*) 2.2f in 603 int i = (int) 2.2f; 604 </pre></td></tr> 605 606 607 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 608 <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 609 610 Example matches x.y() and y() 611 X x; 612 x.y(); 613 y(); 614 </pre></td></tr> 615 616 617 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 618 <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 619 620 Given 621 switch(a) { case 42: break; default: break; } 622 caseStmt() 623 matches 'case 42: break;'. 624 </pre></td></tr> 625 626 627 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 628 <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 629 630 Example: castExpr() matches each of the following: 631 (int) 3; 632 const_cast<Expr *>(SubExpr); 633 char c = 0; 634 but does not match 635 int i = (0); 636 int k = 0; 637 </pre></td></tr> 638 639 640 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 641 <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 642 643 Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 644 though. 645 646 Example matches 'a', L'a' 647 char ch = 'a'; 648 wchar_t chw = L'a'; 649 </pre></td></tr> 650 651 652 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 653 <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 654 655 Example match: {1}, (1, 2) 656 int array[4] = {1}; 657 vector int myvec = (vector int)(1, 2); 658 </pre></td></tr> 659 660 661 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 662 <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 663 664 Example matches '{}' and '{{}}'in 'for (;;) {{}}' 665 for (;;) {{}} 666 </pre></td></tr> 667 668 669 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 670 <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 671 672 Example matches a ? b : c 673 (a ? b : c) + 42 674 </pre></td></tr> 675 676 677 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 678 <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 679 680 Given 681 while (true) { continue; } 682 continueStmt() 683 matches 'continue' 684 </pre></td></tr> 685 686 687 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 688 <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 689 690 Example matches, 691 kernel<<<i,j>>>(); 692 </pre></td></tr> 693 694 695 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 696 <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 697 698 Example matches FunctionTakesString(GetStringByValue()) 699 (matcher = cxxBindTemporaryExpr()) 700 FunctionTakesString(GetStringByValue()); 701 FunctionTakesStringByPointer(GetStringPointer()); 702 </pre></td></tr> 703 704 705 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 706 <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 707 708 Example matches true 709 true 710 </pre></td></tr> 711 712 713 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 714 <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 715 716 try {} catch(int i) {} 717 cxxCatchStmt() 718 matches 'catch(int i)' 719 </pre></td></tr> 720 721 722 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 723 <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 724 725 Example: Matches const_cast<int*>(&r) in 726 int n = 42; 727 const int &r(n); 728 int* p = const_cast<int*>(&r); 729 </pre></td></tr> 730 731 732 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 733 <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 734 735 Example matches string(ptr, n) and ptr within arguments of f 736 (matcher = cxxConstructExpr()) 737 void f(const string &a, const string &b); 738 char *ptr; 739 int n; 740 f(string(ptr, n), ptr); 741 </pre></td></tr> 742 743 744 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 745 <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 746 747 Example matches the CXXDefaultArgExpr placeholder inserted for the 748 default value of the second parameter in the call expression f(42) 749 (matcher = cxxDefaultArgExpr()) 750 void f(int x, int y = 0); 751 f(42); 752 </pre></td></tr> 753 754 755 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 756 <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 757 758 Given 759 delete X; 760 cxxDeleteExpr() 761 matches 'delete X'. 762 </pre></td></tr> 763 764 765 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 766 <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 767 768 Example: 769 cxxDynamicCastExpr() 770 matches 771 dynamic_cast<D*>(&b); 772 in 773 struct B { virtual ~B() {} }; struct D : B {}; 774 B b; 775 D* p = dynamic_cast<D*>(&b); 776 </pre></td></tr> 777 778 779 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 780 <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 781 782 cxxForRangeStmt() matches 'for (auto a : i)' 783 int i[] = {1, 2, 3}; for (auto a : i); 784 for(int j = 0; j < 5; ++j); 785 </pre></td></tr> 786 787 788 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 789 <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 790 791 Example: Matches Foo(bar); 792 Foo f = bar; 793 Foo g = (Foo) bar; 794 Foo h = Foo(bar); 795 </pre></td></tr> 796 797 798 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 799 <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 800 801 Example matches x.y() 802 X x; 803 x.y(); 804 </pre></td></tr> 805 806 807 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 808 <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 809 810 Given 811 new X; 812 cxxNewExpr() 813 matches 'new X'. 814 </pre></td></tr> 815 816 817 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 818 <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 819 </pre></td></tr> 820 821 822 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 823 <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 824 825 Note that if an operator isn't overloaded, it won't match. Instead, use 826 binaryOperator matcher. 827 Currently it does not match operators such as new delete. 828 FIXME: figure out why these do not match? 829 830 Example matches both operator<<((o << b), c) and operator<<(o, b) 831 (matcher = cxxOperatorCallExpr()) 832 ostream &operator<< (ostream &out, int i) { }; 833 ostream &o; int b = 1, c = 1; 834 o << b << c; 835 </pre></td></tr> 836 837 838 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 839 <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 840 841 Either the source expression or the destination type can be matched 842 using has(), but hasDestinationType() is more specific and can be 843 more readable. 844 845 Example matches reinterpret_cast<char*>(&p) in 846 void* p = reinterpret_cast<char*>(&p); 847 </pre></td></tr> 848 849 850 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 851 <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 852 853 See also: hasDestinationType 854 See also: reinterpretCast 855 856 Example: 857 cxxStaticCastExpr() 858 matches 859 static_cast<long>(8) 860 in 861 long eight(static_cast<long>(8)); 862 </pre></td></tr> 863 864 865 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 866 <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 867 868 Example: Matches Foo(bar, bar) 869 Foo h = Foo(bar, bar); 870 </pre></td></tr> 871 872 873 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 874 <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 875 876 Example matches the implicit this expression in "return i". 877 (matcher = cxxThisExpr()) 878 struct foo { 879 int i; 880 int f() { return i; } 881 }; 882 </pre></td></tr> 883 884 885 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 886 <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 887 888 try { throw 5; } catch(int i) {} 889 cxxThrowExpr() 890 matches 'throw 5' 891 </pre></td></tr> 892 893 894 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 895 <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 896 897 try {} catch(int i) {} 898 cxxTryStmt() 899 matches 'try {}' 900 </pre></td></tr> 901 902 903 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 904 <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 905 906 Example matches T(t) in return statement of f 907 (matcher = cxxUnresolvedConstructExpr()) 908 template <typename T> 909 void f(const T& t) { return T(t); } 910 </pre></td></tr> 911 912 913 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 914 <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 915 916 Example matches x in if (x) 917 bool x; 918 if (x) {} 919 </pre></td></tr> 920 921 922 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 923 <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 924 925 Given 926 int a; 927 declStmt() 928 matches 'int a'. 929 </pre></td></tr> 930 931 932 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 933 <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 934 935 Given 936 switch(a) { case 42: break; default: break; } 937 defaultStmt() 938 matches 'default: break;'. 939 </pre></td></tr> 940 941 942 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 943 <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 944 945 Example: Matches { [2].y = 1.0, [0].x = 1.0 } 946 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 947 </pre></td></tr> 948 949 950 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 951 <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 952 953 Given 954 do {} while (true); 955 doStmt() 956 matches 'do {} while(true)' 957 </pre></td></tr> 958 959 960 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 961 <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 962 963 Matches any cast expression written in user code, whether it be a 964 C-style cast, a functional-style cast, or a keyword cast. 965 966 Does not match implicit conversions. 967 968 Note: the name "explicitCast" is chosen to match Clang's terminology, as 969 Clang uses the term "cast" to apply to implicit conversions as well as to 970 actual cast expressions. 971 972 See also: hasDestinationType. 973 974 Example: matches all five of the casts in 975 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 976 but does not match the implicit conversion in 977 long ell = 42; 978 </pre></td></tr> 979 980 981 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 982 <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 983 984 Example matches x() 985 void f() { x(); } 986 </pre></td></tr> 987 988 989 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 990 <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 991 of the sub-expression's evaluation. 992 993 Example matches std::string() 994 const std::string str = std::string(); 995 </pre></td></tr> 996 997 998 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 999 <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g. 1000 1.0, 1.0f, 1.0L and 1e10. 1001 1002 Does not match implicit conversions such as 1003 float a = 10; 1004 </pre></td></tr> 1005 1006 1007 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1008 <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1009 1010 Example matches 'for (;;) {}' 1011 for (;;) {} 1012 int i[] = {1, 2, 3}; for (auto a : i); 1013 </pre></td></tr> 1014 1015 1016 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1017 <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1018 </pre></td></tr> 1019 1020 1021 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1022 <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1023 1024 Given 1025 goto FOO; 1026 FOO: bar(); 1027 gotoStmt() 1028 matches 'goto FOO' 1029 </pre></td></tr> 1030 1031 1032 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1033 <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1034 1035 Example matches 'if (x) {}' 1036 if (x) {} 1037 </pre></td></tr> 1038 1039 1040 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1041 <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1042 1043 This matches many different places, including function call return value 1044 eliding, as well as any type conversions. 1045 </pre></td></tr> 1046 1047 1048 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1049 <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1050 1051 Given 1052 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1053 implicitValueInitExpr() 1054 matches "[0].y" (implicitly) 1055 </pre></td></tr> 1056 1057 1058 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1059 <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1060 1061 Given 1062 int a[] = { 1, 2 }; 1063 struct B { int x, y; }; 1064 B b = { 5, 6 }; 1065 initListExpr() 1066 matches "{ 1, 2 }" and "{ 5, 6 }" 1067 </pre></td></tr> 1068 1069 1070 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1071 <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g. 1072 1, 1L, 0x1 and 1U. 1073 1074 Does not match character-encoded integers such as L'a'. 1075 </pre></td></tr> 1076 1077 1078 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1079 <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1080 1081 Given 1082 goto FOO; 1083 FOO: bar(); 1084 labelStmt() 1085 matches 'FOO:' 1086 </pre></td></tr> 1087 1088 1089 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1090 <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1091 1092 Example matches [&](){return 5;} 1093 [&](){return 5;} 1094 </pre></td></tr> 1095 1096 1097 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1098 <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1099 1100 Example: Given 1101 struct T {void func()}; 1102 T f(); 1103 void g(T); 1104 materializeTemporaryExpr() matches 'f()' in these statements 1105 T u(f()); 1106 g(f()); 1107 but does not match 1108 f(); 1109 f().func(); 1110 </pre></td></tr> 1111 1112 1113 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1114 <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1115 1116 Given 1117 class Y { 1118 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1119 int a; static int b; 1120 }; 1121 memberExpr() 1122 matches this->x, x, y.x, a, this->b 1123 </pre></td></tr> 1124 1125 1126 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1127 <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1128 1129 foo();; 1130 nullStmt() 1131 matches the second ';' 1132 </pre></td></tr> 1133 1134 1135 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1136 <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1137 1138 The innermost message send invokes the "alloc" class method on the 1139 NSString class, while the outermost message send invokes the 1140 "initWithString" instance method on the object returned from 1141 NSString's "alloc". This matcher should match both message sends. 1142 [[NSString alloc] initWithString:@"Hello"] 1143 </pre></td></tr> 1144 1145 1146 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1147 <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1148 to reference another expressions and can be met 1149 in BinaryConditionalOperators, for example. 1150 1151 Example matches 'a' 1152 (a ?: c) + 42; 1153 </pre></td></tr> 1154 1155 1156 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 1157 <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1158 1159 Example matches (foo() + 1) 1160 int foo() { return 1; } 1161 int a = (foo() + 1); 1162 </pre></td></tr> 1163 1164 1165 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 1166 <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1167 ParenListExprs don't have a predefined type and are used for late parsing. 1168 In the final AST, they can be met in template declarations. 1169 1170 Given 1171 template<typename T> class X { 1172 void f() { 1173 X x(*this); 1174 int a = 0, b = 1; int i = (a, b); 1175 } 1176 }; 1177 parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1178 has a predefined type and is a ParenExpr, not a ParenListExpr. 1179 </pre></td></tr> 1180 1181 1182 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 1183 <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1184 1185 Example: Matches __func__ 1186 printf("%s", __func__); 1187 </pre></td></tr> 1188 1189 1190 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 1191 <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1192 1193 Given 1194 return 1; 1195 returnStmt() 1196 matches 'return 1' 1197 </pre></td></tr> 1198 1199 1200 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 1201 <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1202 1203 Given 1204 { ++a; } 1205 stmt() 1206 matches both the compound statement '{ ++a; }' and '++a'. 1207 </pre></td></tr> 1208 1209 1210 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 1211 <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1212 1213 Example match: ({ int X = 4; X; }) 1214 int C = ({ int X = 4; X; }); 1215 </pre></td></tr> 1216 1217 1218 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 1219 <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1220 1221 Example matches "abcd", L"abcd" 1222 char *s = "abcd"; 1223 wchar_t *ws = L"abcd"; 1224 </pre></td></tr> 1225 1226 1227 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1228 <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1229 1230 Given 1231 template <int N> 1232 struct A { static const int n = N; }; 1233 struct B : public A<42> {}; 1234 substNonTypeTemplateParmExpr() 1235 matches "N" in the right-hand side of "static const int n = N;" 1236 </pre></td></tr> 1237 1238 1239 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 1240 <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1241 1242 Given 1243 switch(a) { case 42: break; default: break; } 1244 switchCase() 1245 matches 'case 42: break;' and 'default: break;'. 1246 </pre></td></tr> 1247 1248 1249 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 1250 <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1251 1252 Given 1253 switch(a) { case 42: break; default: break; } 1254 switchStmt() 1255 matches 'switch(a)'. 1256 </pre></td></tr> 1257 1258 1259 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 1260 <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1261 1262 Given 1263 Foo x = bar; 1264 int y = sizeof(x) + alignof(x); 1265 unaryExprOrTypeTraitExpr() 1266 matches sizeof(x) and alignof(x) 1267 </pre></td></tr> 1268 1269 1270 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 1271 <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1272 1273 Example matches !a 1274 !a || b 1275 </pre></td></tr> 1276 1277 1278 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 1279 <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 1280 but could not be resolved to a specific declaration. 1281 1282 Given 1283 template<typename T> 1284 T foo() { T a; return a; } 1285 template<typename T> 1286 void bar() { 1287 foo<T>(); 1288 } 1289 unresolvedLookupExpr() 1290 matches foo<T>() </pre></td></tr> 1291 1292 1293 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 1294 <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1295 1296 Example match: "foo"_suffix 1297 </pre></td></tr> 1298 1299 1300 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 1301 <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1302 1303 Given 1304 while (true) {} 1305 whileStmt() 1306 matches 'while (true) {}'. 1307 </pre></td></tr> 1308 1309 1310 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 1311 <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1312 1313 Given 1314 template <typename T> struct C {}; 1315 C<int> c; 1316 templateArgument() 1317 matches 'int' in C<int>. 1318 </pre></td></tr> 1319 1320 1321 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 1322 <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1323 </pre></td></tr> 1324 1325 1326 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 1327 <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1328 1329 Given 1330 int a[] = { 2, 3 }; 1331 int b[4]; 1332 void f() { int c[a[0]]; } 1333 arrayType() 1334 matches "int a[]", "int b[4]" and "int c[a[0]]"; 1335 </pre></td></tr> 1336 1337 1338 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 1339 <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1340 1341 Given 1342 _Atomic(int) i; 1343 atomicType() 1344 matches "_Atomic(int) i" 1345 </pre></td></tr> 1346 1347 1348 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 1349 <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1350 1351 Given: 1352 auto n = 4; 1353 int v[] = { 2, 3 } 1354 for (auto i : v) { } 1355 autoType() 1356 matches "auto n" and "auto i" 1357 </pre></td></tr> 1358 1359 1360 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 1361 <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1362 "void (^)(int)". 1363 1364 The pointee is always required to be a FunctionType. 1365 </pre></td></tr> 1366 1367 1368 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 1369 <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1370 1371 Given 1372 struct A {}; 1373 A a; 1374 int b; 1375 float c; 1376 bool d; 1377 builtinType() 1378 matches "int b", "float c" and "bool d" 1379 </pre></td></tr> 1380 1381 1382 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 1383 <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1384 1385 Given 1386 _Complex float f; 1387 complexType() 1388 matches "_Complex float f" 1389 </pre></td></tr> 1390 1391 1392 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 1393 <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1394 1395 Given 1396 void() { 1397 int a[2]; 1398 int b[] = { 2, 3 }; 1399 int c[b[0]]; 1400 } 1401 constantArrayType() 1402 matches "int a[2]" 1403 </pre></td></tr> 1404 1405 1406 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 1407 <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1408 Example matches i[] in declaration of f. 1409 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1410 Example matches i[1]. 1411 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1412 void f(int i[]) { 1413 i[1] = 0; 1414 } 1415 </pre></td></tr> 1416 1417 1418 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 1419 <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1420 1421 Given 1422 template<typename T, int Size> 1423 class array { 1424 T data[Size]; 1425 }; 1426 dependentSizedArrayType 1427 matches "T data[Size]" 1428 </pre></td></tr> 1429 1430 1431 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 1432 <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1433 qualified name. 1434 1435 Given 1436 namespace N { 1437 namespace M { 1438 class D {}; 1439 } 1440 } 1441 class C {}; 1442 1443 class C c; 1444 N::M::D d; 1445 1446 elaboratedType() matches the type of the variable declarations of both 1447 c and d. 1448 </pre></td></tr> 1449 1450 1451 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 1452 <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 1453 1454 Given 1455 enum C { Green }; 1456 enum class S { Red }; 1457 1458 C c; 1459 S s; 1460 1461 enumType() matches the type of the variable declarations of both c and 1462 s. 1463 </pre></td></tr> 1464 1465 1466 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 1467 <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 1468 1469 Given 1470 int (*f)(int); 1471 void g(); 1472 functionProtoType() 1473 matches "int (*f)(int)" and the type of "g" in C++ mode. 1474 In C mode, "g" is not matched because it does not contain a prototype. 1475 </pre></td></tr> 1476 1477 1478 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 1479 <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1480 1481 Given 1482 int (*f)(int); 1483 void g(); 1484 functionType() 1485 matches "int (*f)(int)" and the type of "g". 1486 </pre></td></tr> 1487 1488 1489 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 1490 <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1491 1492 Given 1493 int a[] = { 2, 3 }; 1494 int b[42]; 1495 void f(int c[]) { int d[a[0]]; }; 1496 incompleteArrayType() 1497 matches "int a[]" and "int c[]" 1498 </pre></td></tr> 1499 1500 1501 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 1502 <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1503 1504 Example matches S s, but not S<T> s. 1505 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1506 template <typename T> struct S { 1507 void f(S s); 1508 void g(S<T> s); 1509 }; 1510 </pre></td></tr> 1511 1512 1513 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 1514 <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1515 1516 Given: 1517 int *a; 1518 int &b = *a; 1519 int &&c = 1; 1520 auto &d = b; 1521 auto &&e = c; 1522 auto &&f = 2; 1523 int g = 5; 1524 1525 lValueReferenceType() matches the types of b, d, and e. e is 1526 matched since the type is deduced as int& by reference collapsing rules. 1527 </pre></td></tr> 1528 1529 1530 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 1531 <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1532 Given 1533 struct A { int i; } 1534 A::* ptr = A::i; 1535 memberPointerType() 1536 matches "A::* ptr" 1537 </pre></td></tr> 1538 1539 1540 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 1541 <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1542 a pointer type, despite being syntactically similar. 1543 1544 Given 1545 int *a; 1546 1547 @interface Foo 1548 @end 1549 Foo *f; 1550 pointerType() 1551 matches "Foo *f", but does not match "int *a". 1552 </pre></td></tr> 1553 1554 1555 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 1556 <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1557 1558 Given 1559 int (*ptr_to_array)[4]; 1560 int *array_of_ptrs[4]; 1561 1562 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1563 array_of_ptrs. 1564 </pre></td></tr> 1565 1566 1567 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 1568 <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1569 types. 1570 1571 Given 1572 int *a; 1573 int &b = *a; 1574 int c = 5; 1575 1576 @interface Foo 1577 @end 1578 Foo *f; 1579 pointerType() 1580 matches "int *a", but does not match "Foo *f". 1581 </pre></td></tr> 1582 1583 1584 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 1585 <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1586 1587 Given: 1588 int *a; 1589 int &b = *a; 1590 int &&c = 1; 1591 auto &d = b; 1592 auto &&e = c; 1593 auto &&f = 2; 1594 int g = 5; 1595 1596 rValueReferenceType() matches the types of c and f. e is not 1597 matched as it is deduced to int& by reference collapsing rules. 1598 </pre></td></tr> 1599 1600 1601 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 1602 <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1603 1604 Given 1605 class C {}; 1606 struct S {}; 1607 1608 C c; 1609 S s; 1610 1611 recordType() matches the type of the variable declarations of both c 1612 and s. 1613 </pre></td></tr> 1614 1615 1616 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 1617 <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 1618 1619 Given 1620 int *a; 1621 int &b = *a; 1622 int &&c = 1; 1623 auto &d = b; 1624 auto &&e = c; 1625 auto &&f = 2; 1626 int g = 5; 1627 1628 referenceType() matches the types of b, c, d, e, and f. 1629 </pre></td></tr> 1630 1631 1632 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 1633 <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 1634 template type parameter. 1635 1636 Given 1637 template <typename T> 1638 void F(T t) { 1639 int i = 1 + t; 1640 } 1641 1642 substTemplateTypeParmType() matches the type of 't' but not '1' 1643 </pre></td></tr> 1644 1645 1646 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 1647 <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 1648 1649 Given 1650 template <typename T> 1651 class C { }; 1652 1653 template class C<int>; A 1654 C<char> var; B 1655 1656 templateSpecializationType() matches the type of the explicit 1657 instantiation in A and the type of the variable declaration in B. 1658 </pre></td></tr> 1659 1660 1661 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 1662 <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 1663 1664 Example matches T, but not int. 1665 (matcher = templateTypeParmType()) 1666 template <typename T> void f(int i); 1667 </pre></td></tr> 1668 1669 1670 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 1671 <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 1672 </pre></td></tr> 1673 1674 1675 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 1676 <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 1677 1678 Given 1679 typedef int X; 1680 typedefType() 1681 matches "typedef int X" 1682 </pre></td></tr> 1683 1684 1685 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 1686 <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 1687 1688 Given: 1689 typedef __underlying_type(T) type; 1690 unaryTransformType() 1691 matches "__underlying_type(T)" 1692 </pre></td></tr> 1693 1694 1695 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 1696 <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 1697 integer-constant-expression. 1698 1699 Given 1700 void f() { 1701 int a[] = { 2, 3 } 1702 int b[42]; 1703 int c[a[0]]; 1704 } 1705 variableArrayType() 1706 matches "int c[a[0]]" 1707 </pre></td></tr> 1708 1709 <!--END_DECL_MATCHERS --> 1710 </table> 1711 1712 <!-- ======================================================================= --> 1713 <h2 id="narrowing-matchers">Narrowing Matchers</h2> 1714 <!-- ======================================================================= --> 1715 1716 <p>Narrowing matchers match certain attributes on the current node, thus 1717 narrowing down the set of nodes of the current type to match on.</p> 1718 1719 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 1720 which allow users to create more powerful match expressions.</p> 1721 1722 <table> 1723 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 1724 <!-- START_NARROWING_MATCHERS --> 1725 1726 <tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1727 <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 1728 1729 Usable as: Any Matcher 1730 </pre></td></tr> 1731 1732 1733 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1734 <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 1735 1736 Usable as: Any Matcher 1737 </pre></td></tr> 1738 1739 1740 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 1741 <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 1742 1743 Useful when another matcher requires a child matcher, but there's no 1744 additional constraint. This will often be used with an explicit conversion 1745 to an internal::Matcher<> type such as TypeMatcher. 1746 1747 Example: DeclarationMatcher(anything()) matches all declarations, e.g., 1748 "int* p" and "void f()" in 1749 int* p; 1750 void f(); 1751 1752 Usable as: Any Matcher 1753 </pre></td></tr> 1754 1755 1756 <tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 1757 <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 1758 1759 Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 1760 class X {}; 1761 class Y {}; 1762 1763 Usable as: Any Matcher 1764 </pre></td></tr> 1765 1766 1767 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 1768 <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 1769 unary). 1770 1771 Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 1772 !(a || b) 1773 </pre></td></tr> 1774 1775 1776 <tr><td>Matcher<CXXBoolLiteral></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr> 1777 <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value. 1778 1779 Example matches true (matcher = cxxBoolLiteral(equals(true))) 1780 true 1781 1782 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1783 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 1784 </pre></td></tr> 1785 1786 1787 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr> 1788 <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 1789 1790 Given 1791 try { 1792 ... 1793 } catch (int) { 1794 ... 1795 } catch (...) { 1796 ... 1797 } 1798 endcode 1799 cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 1800 </pre></td></tr> 1801 1802 1803 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 1804 <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 1805 a specific number of arguments (including absent default arguments). 1806 1807 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 1808 void f(int x, int y); 1809 f(0, 0); 1810 </pre></td></tr> 1811 1812 1813 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr> 1814 <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 1815 </pre></td></tr> 1816 1817 1818 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 1819 <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 1820 zero initialization. 1821 1822 Given 1823 void foo() { 1824 struct point { double x; double y; }; 1825 point pt[2] = { { 1.0, 2.0 } }; 1826 } 1827 initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 1828 will match the implicit array filler for pt[1]. 1829 </pre></td></tr> 1830 1831 1832 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr> 1833 <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 1834 1835 Given 1836 struct S { 1837 S(); #1 1838 S(const S &); #2 1839 S(S &&); #3 1840 }; 1841 cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 1842 </pre></td></tr> 1843 1844 1845 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 1846 <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 1847 1848 Given 1849 struct S { 1850 S(); #1 1851 S(const S &); #2 1852 S(S &&); #3 1853 }; 1854 cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 1855 </pre></td></tr> 1856 1857 1858 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 1859 <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 1860 1861 Given 1862 struct S { 1863 S(); #1 1864 S(int) {} #2 1865 S(S &&) : S() {} #3 1866 }; 1867 S::S() : S(0) {} #4 1868 cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 1869 #1 or #2. 1870 </pre></td></tr> 1871 1872 1873 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 1874 <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with 1875 the explicit keyword. 1876 1877 Given 1878 struct S { 1879 S(int); #1 1880 explicit S(double); #2 1881 operator int(); #3 1882 explicit operator bool(); #4 1883 }; 1884 cxxConstructorDecl(isExplicit()) will match #2, but not #1. 1885 cxxConversionDecl(isExplicit()) will match #4, but not #3. 1886 </pre></td></tr> 1887 1888 1889 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr> 1890 <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 1891 1892 Given 1893 struct S { 1894 S(); #1 1895 S(const S &); #2 1896 S(S &&); #3 1897 }; 1898 cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 1899 </pre></td></tr> 1900 1901 1902 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr> 1903 <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with 1904 the explicit keyword. 1905 1906 Given 1907 struct S { 1908 S(int); #1 1909 explicit S(double); #2 1910 operator int(); #3 1911 explicit operator bool(); #4 1912 }; 1913 cxxConstructorDecl(isExplicit()) will match #2, but not #1. 1914 cxxConversionDecl(isExplicit()) will match #4, but not #3. 1915 </pre></td></tr> 1916 1917 1918 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr> 1919 <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 1920 opposed to a member. 1921 1922 Given 1923 struct B {}; 1924 struct D : B { 1925 int I; 1926 D(int i) : I(i) {} 1927 }; 1928 struct E : B { 1929 E() : B() {} 1930 }; 1931 cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 1932 will match E(), but not match D(int). 1933 </pre></td></tr> 1934 1935 1936 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr> 1937 <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 1938 opposed to a base. 1939 1940 Given 1941 struct B {}; 1942 struct D : B { 1943 int I; 1944 D(int i) : I(i) {} 1945 }; 1946 struct E : B { 1947 E() : B() {} 1948 }; 1949 cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 1950 will match D(int), but not match E(). 1951 </pre></td></tr> 1952 1953 1954 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr> 1955 <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 1956 code (as opposed to implicitly added by the compiler). 1957 1958 Given 1959 struct Foo { 1960 Foo() { } 1961 Foo(int) : foo_("A") { } 1962 string foo_; 1963 }; 1964 cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 1965 will match Foo(int), but not Foo() 1966 </pre></td></tr> 1967 1968 1969 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr> 1970 <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 1971 1972 Given 1973 struct A { 1974 void foo() const; 1975 void bar(); 1976 }; 1977 1978 cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 1979 </pre></td></tr> 1980 1981 1982 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 1983 <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 1984 operator. 1985 1986 Given 1987 struct A { 1988 A &operator=(const A &); 1989 A &operator=(A &&); 1990 }; 1991 1992 cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 1993 the second one. 1994 </pre></td></tr> 1995 1996 1997 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 1998 <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 1999 2000 Given: 2001 class A final {}; 2002 2003 struct B { 2004 virtual void f(); 2005 }; 2006 2007 struct C : B { 2008 void f() final; 2009 }; 2010 matches A and C::f, but not B, C, or B::f 2011 </pre></td></tr> 2012 2013 2014 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 2015 <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2016 operator. 2017 2018 Given 2019 struct A { 2020 A &operator=(const A &); 2021 A &operator=(A &&); 2022 }; 2023 2024 cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2025 the first one. 2026 </pre></td></tr> 2027 2028 2029 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr> 2030 <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2031 2032 Given 2033 class A { 2034 public: 2035 virtual void x(); 2036 }; 2037 class B : public A { 2038 public: 2039 virtual void x(); 2040 }; 2041 matches B::x 2042 </pre></td></tr> 2043 2044 2045 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 2046 <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2047 2048 Given 2049 class A { 2050 public: 2051 virtual void x() = 0; 2052 }; 2053 matches A::x 2054 </pre></td></tr> 2055 2056 2057 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 2058 <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2059 2060 Given 2061 struct S { 2062 S(); #1 2063 S(const S &) = default; #2 2064 S(S &&) = delete; #3 2065 }; 2066 cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2067 </pre></td></tr> 2068 2069 2070 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr> 2071 <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual. 2072 2073 Given 2074 class A { 2075 public: 2076 virtual void x(); 2077 }; 2078 matches A::x 2079 </pre></td></tr> 2080 2081 2082 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 2083 <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2084 2085 Given 2086 class A { 2087 public: 2088 virtual void x(); 2089 }; 2090 class B : public A { 2091 public: 2092 void x(); 2093 }; 2094 matches A::x but not B::x 2095 </pre></td></tr> 2096 2097 2098 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 2099 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2100 2101 Matches overloaded operator names specified in strings without the 2102 "operator" prefix: e.g. "<<". 2103 2104 Given: 2105 class A { int operator*(); }; 2106 const A &operator<<(const A &a, const A &b); 2107 A a; 2108 a << a; <-- This matches 2109 2110 cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2111 specified line and 2112 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2113 matches the declaration of A. 2114 2115 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2116 </pre></td></tr> 2117 2118 2119 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 2120 <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2121 </pre></td></tr> 2122 2123 2124 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 2125 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2126 static member variable template instantiations. 2127 2128 Given 2129 template<typename T> void A(T t) { } 2130 template<> void A(int N) { } 2131 functionDecl(isExplicitTemplateSpecialization()) 2132 matches the specialization A<int>(). 2133 2134 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2135 </pre></td></tr> 2136 2137 2138 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr> 2139 <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2140 2141 Given: 2142 class A final {}; 2143 2144 struct B { 2145 virtual void f(); 2146 }; 2147 2148 struct C : B { 2149 void f() final; 2150 }; 2151 matches A and C::f, but not B, C, or B::f 2152 </pre></td></tr> 2153 2154 2155 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 2156 <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2157 2158 Given: 2159 auto x = []{}; 2160 2161 cxxRecordDecl(isLambda()) matches the implicit class declaration of 2162 decltype(x) 2163 </pre></td></tr> 2164 2165 2166 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 2167 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for 2168 isSameOrDerivedFrom(hasName(...)). 2169 </pre></td></tr> 2170 2171 2172 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr> 2173 <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2174 member variable template instantiations. 2175 2176 Given 2177 template <typename T> class X {}; class A {}; X<A> x; 2178 or 2179 template <typename T> class X {}; class A {}; template class X<A>; 2180 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2181 matches the template instantiation of X<A>. 2182 2183 But given 2184 template <typename T> class X {}; class A {}; 2185 template <> class X<A> {}; X<A> x; 2186 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2187 does not match, as X<A> is an explicit template specialization. 2188 2189 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2190 </pre></td></tr> 2191 2192 2193 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2194 <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2195 a specific number of arguments (including absent default arguments). 2196 2197 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2198 void f(int x, int y); 2199 f(0, 0); 2200 </pre></td></tr> 2201 2202 2203 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 2204 <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2205 2206 Example: matches the implicit cast around 0 2207 (matcher = castExpr(hasCastKind(CK_NullToPointer))) 2208 int *p = 0; 2209 </pre></td></tr> 2210 2211 2212 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT Value</td></tr> 2213 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value. 2214 2215 Example matches true (matcher = cxxBoolLiteral(equals(true))) 2216 true 2217 2218 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2219 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2220 </pre></td></tr> 2221 2222 2223 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 2224 <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2225 2226 Given 2227 template<typename T> struct C {}; 2228 C<int> c; 2229 classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2230 matches C<int>. 2231 </pre></td></tr> 2232 2233 2234 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr> 2235 <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2236 child statements. 2237 2238 Example: Given 2239 { for (;;) {} } 2240 compoundStmt(statementCountIs(0))) 2241 matches '{}' 2242 but does not match the outer compound statement. 2243 </pre></td></tr> 2244 2245 2246 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr> 2247 <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2248 2249 Given 2250 int a[42]; 2251 int b[2 * 21]; 2252 int c[41], d[43]; 2253 char *s = "abcd"; 2254 wchar_t *ws = L"abcd"; 2255 char *w = "a"; 2256 constantArrayType(hasSize(42)) 2257 matches "int a[42]" and "int b[2 * 21]" 2258 stringLiteral(hasSize(4)) 2259 matches "abcd", L"abcd" 2260 </pre></td></tr> 2261 2262 2263 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr> 2264 <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2265 declarations. 2266 2267 Example: Given 2268 int a, b; 2269 int c; 2270 int d = 2, e; 2271 declCountIs(2) 2272 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 2273 </pre></td></tr> 2274 2275 2276 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 2277 <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 2278 2279 Matches a node if it equals the node previously bound to ID. 2280 2281 Given 2282 class X { int a; int b; }; 2283 cxxRecordDecl( 2284 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2285 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2286 matches the class X, as a and b have the same type. 2287 2288 Note that when multiple matches are involved via forEach* matchers, 2289 equalsBoundNodes acts as a filter. 2290 For example: 2291 compoundStmt( 2292 forEachDescendant(varDecl().bind("d")), 2293 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2294 will trigger a match for each combination of variable declaration 2295 and reference to that variable declaration within a compound statement. 2296 </pre></td></tr> 2297 2298 2299 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 2300 <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 2301 2302 Decl has pointer identity in the AST. 2303 </pre></td></tr> 2304 2305 2306 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr> 2307 <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 2308 2309 Given 2310 __attribute__((device)) void f() { ... } 2311 decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 2312 f. If the matcher is use from clang-query, attr::Kind parameter should be 2313 passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 2314 </pre></td></tr> 2315 2316 2317 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 2318 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 2319 partially matching a given regex. 2320 2321 Example matches Y but not X 2322 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2323 #include "ASTMatcher.h" 2324 class X {}; 2325 ASTMatcher.h: 2326 class Y {}; 2327 2328 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2329 </pre></td></tr> 2330 2331 2332 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr> 2333 <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 2334 2335 Example matches X but not Y 2336 (matcher = cxxRecordDecl(isExpansionInMainFile()) 2337 #include <Y.h> 2338 class X {}; 2339 Y.h: 2340 class Y {}; 2341 2342 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2343 </pre></td></tr> 2344 2345 2346 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 2347 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 2348 2349 Example matches Y but not X 2350 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2351 #include <SystemHeader.h> 2352 class X {}; 2353 SystemHeader.h: 2354 class Y {}; 2355 2356 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2357 </pre></td></tr> 2358 2359 2360 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr> 2361 <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 2362 by the compiler (eg. implicit defaultcopy constructors). 2363 </pre></td></tr> 2364 2365 2366 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr> 2367 <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. 2368 2369 Given 2370 class C { 2371 public: int a; 2372 protected: int b; 2373 private: int c; 2374 }; 2375 fieldDecl(isPrivate()) 2376 matches 'int c;' 2377 </pre></td></tr> 2378 2379 2380 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr> 2381 <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations. 2382 2383 Given 2384 class C { 2385 public: int a; 2386 protected: int b; 2387 private: int c; 2388 }; 2389 fieldDecl(isProtected()) 2390 matches 'int b;' 2391 </pre></td></tr> 2392 2393 2394 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr> 2395 <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations. 2396 2397 Given 2398 class C { 2399 public: int a; 2400 protected: int b; 2401 private: int c; 2402 }; 2403 fieldDecl(isPublic()) 2404 matches 'int a;' 2405 </pre></td></tr> 2406 2407 2408 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr> 2409 <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 2410 a specific number of designators. 2411 2412 Example: Given 2413 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 2414 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 2415 designatorCountIs(2) 2416 matches '{ [2].y = 1.0, [0].x = 1.0 }', 2417 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 2418 </pre></td></tr> 2419 2420 2421 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 2422 <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields. 2423 2424 Given 2425 class C { 2426 int a : 2; 2427 int b : 4; 2428 int c : 2; 2429 }; 2430 fieldDecl(isBitField()) 2431 matches 'int a;' and 'int c;' but not 'int b;'. 2432 </pre></td></tr> 2433 2434 2435 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 2436 <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 2437 2438 Given 2439 class C { 2440 int a : 2; 2441 int b; 2442 }; 2443 fieldDecl(isBitField()) 2444 matches 'int a;' but not 'int b;'. 2445 </pre></td></tr> 2446 2447 2448 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT Value</td></tr> 2449 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value. 2450 2451 Example matches true (matcher = cxxBoolLiteral(equals(true))) 2452 true 2453 2454 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2455 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2456 </pre></td></tr> 2457 2458 2459 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 2460 <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 2461 2462 Given: 2463 void f(); 2464 void g() noexcept; 2465 void h() noexcept(true); 2466 void i() noexcept(false); 2467 void j() throw(); 2468 void k() throw(int); 2469 void l() throw(...); 2470 functionDecl(hasDynamicExceptionSpec()) and 2471 functionProtoType(hasDynamicExceptionSpec()) 2472 match the declarations of j, k, and l, but not f, g, h, or i. 2473 </pre></td></tr> 2474 2475 2476 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 2477 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 2478 2479 Matches overloaded operator names specified in strings without the 2480 "operator" prefix: e.g. "<<". 2481 2482 Given: 2483 class A { int operator*(); }; 2484 const A &operator<<(const A &a, const A &b); 2485 A a; 2486 a << a; <-- This matches 2487 2488 cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2489 specified line and 2490 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2491 matches the declaration of A. 2492 2493 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2494 </pre></td></tr> 2495 2496 2497 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> 2498 <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations. 2499 2500 Given: 2501 constexpr int foo = 42; 2502 constexpr int bar(); 2503 varDecl(isConstexpr()) 2504 matches the declaration of foo. 2505 functionDecl(isConstexpr()) 2506 matches the declaration of bar. 2507 </pre></td></tr> 2508 2509 2510 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 2511 <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 2512 2513 Given: 2514 class A { ~A(); }; 2515 class B { ~B() = default; }; 2516 functionDecl(isDefaulted()) 2517 matches the declaration of ~B, but not ~A. 2518 </pre></td></tr> 2519 2520 2521 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 2522 <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 2523 2524 Example matches A, va, fa 2525 class A {}; 2526 class B; Doesn't match, as it has no body. 2527 int va; 2528 extern int vb; Doesn't match, as it doesn't define the variable. 2529 void fa() {} 2530 void fb(); Doesn't match, as it has no body. 2531 2532 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2533 </pre></td></tr> 2534 2535 2536 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr> 2537 <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 2538 2539 Given: 2540 void Func(); 2541 void DeletedFunc() = delete; 2542 functionDecl(isDeleted()) 2543 matches the declaration of DeletedFunc, but not Func. 2544 </pre></td></tr> 2545 2546 2547 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 2548 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 2549 static member variable template instantiations. 2550 2551 Given 2552 template<typename T> void A(T t) { } 2553 template<> void A(int N) { } 2554 functionDecl(isExplicitTemplateSpecialization()) 2555 matches the specialization A<int>(). 2556 2557 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2558 </pre></td></tr> 2559 2560 2561 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr> 2562 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations. 2563 2564 Given: 2565 extern "C" void f() {} 2566 extern "C" { void g() {} } 2567 void h() {} 2568 functionDecl(isExternC()) 2569 matches the declaration of f and g, but not the declaration h 2570 </pre></td></tr> 2571 2572 2573 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> 2574 <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 2575 the inline keyword. 2576 2577 Given 2578 inline void f(); 2579 void g(); 2580 namespace n { 2581 inline namespace m {} 2582 } 2583 functionDecl(isInline()) will match ::f(). 2584 namespaceDecl(isInline()) will match n::m. 2585 </pre></td></tr> 2586 2587 2588 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 2589 <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 2590 2591 Given: 2592 void f(); 2593 void g() noexcept; 2594 void h() throw(); 2595 void i() throw(int); 2596 void j() noexcept(false); 2597 functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2598 match the declarations of g, and h, but not f, i or j. 2599 </pre></td></tr> 2600 2601 2602 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr> 2603 <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 2604 member variable template instantiations. 2605 2606 Given 2607 template <typename T> class X {}; class A {}; X<A> x; 2608 or 2609 template <typename T> class X {}; class A {}; template class X<A>; 2610 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2611 matches the template instantiation of X<A>. 2612 2613 But given 2614 template <typename T> class X {}; class A {}; 2615 template <> class X<A> {}; X<A> x; 2616 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2617 does not match, as X<A> is an explicit template specialization. 2618 2619 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2620 </pre></td></tr> 2621 2622 2623 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr> 2624 <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 2625 2626 Example matches f, but not g or h. The function i will not match, even when 2627 compiled in C mode. 2628 void f(...); 2629 void g(int); 2630 template <typename... Ts> void h(Ts...); 2631 void i(); 2632 </pre></td></tr> 2633 2634 2635 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 2636 <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2637 specific parameter count. 2638 2639 Given 2640 void f(int i) {} 2641 void g(int i, int j) {} 2642 void h(int i, int j); 2643 void j(int i); 2644 void k(int x, int y, int z, ...); 2645 functionDecl(parameterCountIs(2)) 2646 matches void g(int i, int j) {} 2647 functionProtoType(parameterCountIs(2)) 2648 matches void h(int i, int j) 2649 functionProtoType(parameterCountIs(3)) 2650 matches void k(int x, int y, int z, ...); 2651 </pre></td></tr> 2652 2653 2654 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 2655 <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 2656 2657 Given: 2658 void f(); 2659 void g() noexcept; 2660 void h() noexcept(true); 2661 void i() noexcept(false); 2662 void j() throw(); 2663 void k() throw(int); 2664 void l() throw(...); 2665 functionDecl(hasDynamicExceptionSpec()) and 2666 functionProtoType(hasDynamicExceptionSpec()) 2667 match the declarations of j, k, and l, but not f, g, h, or i. 2668 </pre></td></tr> 2669 2670 2671 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 2672 <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 2673 2674 Given: 2675 void f(); 2676 void g() noexcept; 2677 void h() throw(); 2678 void i() throw(int); 2679 void j() noexcept(false); 2680 functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2681 match the declarations of g, and h, but not f, i or j. 2682 </pre></td></tr> 2683 2684 2685 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 2686 <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2687 specific parameter count. 2688 2689 Given 2690 void f(int i) {} 2691 void g(int i, int j) {} 2692 void h(int i, int j); 2693 void j(int i); 2694 void k(int x, int y, int z, ...); 2695 functionDecl(parameterCountIs(2)) 2696 matches void g(int i, int j) {} 2697 functionProtoType(parameterCountIs(2)) 2698 matches void h(int i, int j) 2699 functionProtoType(parameterCountIs(3)) 2700 matches void k(int x, int y, int z, ...); 2701 </pre></td></tr> 2702 2703 2704 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT Value</td></tr> 2705 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value. 2706 2707 Example matches true (matcher = cxxBoolLiteral(equals(true))) 2708 true 2709 2710 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2711 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2712 </pre></td></tr> 2713 2714 2715 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr> 2716 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 2717 to '.'. 2718 2719 Member calls on the implicit this pointer match as called with '->'. 2720 2721 Given 2722 class Y { 2723 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2724 int a; 2725 static int b; 2726 }; 2727 memberExpr(isArrow()) 2728 matches this->x, x, y.x, a, this->b 2729 </pre></td></tr> 2730 2731 2732 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr> 2733 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 2734 2735 Supports specifying enclosing namespaces or classes by prefixing the name 2736 with '<enclosing>::'. 2737 Does not match typedefs of an underlying type with the given name. 2738 2739 Example matches X (Name == "X") 2740 class X; 2741 2742 Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 2743 namespace a { namespace b { class X; } } 2744 </pre></td></tr> 2745 2746 2747 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr> 2748 <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 2749 a substring matched by the given RegExp. 2750 2751 Supports specifying enclosing namespaces or classes by 2752 prefixing the name with '<enclosing>::'. Does not match typedefs 2753 of an underlying type with the given name. 2754 2755 Example matches X (regexp == "::X") 2756 class X; 2757 2758 Example matches X (regexp is one of "::X", "^foo::.*X", among others) 2759 namespace foo { namespace bar { class X; } } 2760 </pre></td></tr> 2761 2762 2763 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr> 2764 <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 2765 2766 Given 2767 namespace n { 2768 namespace {} #1 2769 } 2770 namespaceDecl(isAnonymous()) will match #1 but not ::n. 2771 </pre></td></tr> 2772 2773 2774 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr> 2775 <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 2776 the inline keyword. 2777 2778 Given 2779 inline void f(); 2780 void g(); 2781 namespace n { 2782 inline namespace m {} 2783 } 2784 functionDecl(isInline()) will match ::f(). 2785 namespaceDecl(isInline()) will match n::m. 2786 </pre></td></tr> 2787 2788 2789 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2790 <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 2791 a specific number of arguments (including absent default arguments). 2792 2793 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2794 void f(int x, int y); 2795 f(0, 0); 2796 </pre></td></tr> 2797 2798 2799 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr> 2800 <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 2801 2802 objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 2803 message expression in 2804 2805 UIWebView *webView = ...; 2806 CGRect bodyFrame = webView.frame; 2807 bodyFrame.size.height = self.bodyContentHeight; 2808 webView.frame = bodyFrame; 2809 ^---- matches here 2810 </pre></td></tr> 2811 2812 2813 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr> 2814 <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 2815 2816 Matches only when the selector of the objCMessageExpr is NULL. This may 2817 represent an error condition in the tree! 2818 </pre></td></tr> 2819 2820 2821 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr> 2822 <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 2823 2824 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 2825 matches the outer message expr in the code below, but NOT the message 2826 invocation for self.bodyView. 2827 [self.bodyView loadHTMLString:html baseURL:NULL]; 2828 </pre></td></tr> 2829 2830 2831 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr> 2832 <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 2833 2834 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 2835 matches self.bodyView in the code below, but NOT the outer message 2836 invocation of "loadHTMLString:baseURL:". 2837 [self.bodyView loadHTMLString:html baseURL:NULL]; 2838 </pre></td></tr> 2839 2840 2841 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr> 2842 <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 2843 a substring matched by the given RegExp. 2844 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 2845 invocation for self.bodyView. 2846 [self.bodyView loadHTMLString:html baseURL:NULL]; 2847 </pre></td></tr> 2848 2849 2850 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr> 2851 <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 2852 2853 matcher = objCMessageExpr(numSelectorArgs(0)); 2854 matches self.bodyView in the code below 2855 2856 matcher = objCMessageExpr(numSelectorArgs(2)); 2857 matches the invocation of "loadHTMLString:baseURL:" but not that 2858 of self.bodyView 2859 [self.bodyView loadHTMLString:html baseURL:NULL]; 2860 </pre></td></tr> 2861 2862 2863 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr> 2864 <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 2865 2866 Given 2867 class Y { public: void x(); }; 2868 void z() { Y* y; y->x(); } 2869 cxxMemberCallExpr(on(hasType(asString("class Y *")))) 2870 matches y->x() 2871 </pre></td></tr> 2872 2873 2874 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 2875 <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 2876 2877 Matches a node if it equals the node previously bound to ID. 2878 2879 Given 2880 class X { int a; int b; }; 2881 cxxRecordDecl( 2882 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2883 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2884 matches the class X, as a and b have the same type. 2885 2886 Note that when multiple matches are involved via forEach* matchers, 2887 equalsBoundNodes acts as a filter. 2888 For example: 2889 compoundStmt( 2890 forEachDescendant(varDecl().bind("d")), 2891 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2892 will trigger a match for each combination of variable declaration 2893 and reference to that variable declaration within a compound statement. 2894 </pre></td></tr> 2895 2896 2897 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr> 2898 <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 2899 the node, not hidden within a typedef. 2900 2901 Given 2902 typedef const int const_int; 2903 const_int i; 2904 int *const j; 2905 int *volatile k; 2906 int m; 2907 varDecl(hasType(hasLocalQualifiers())) matches only j and k. 2908 i is const-qualified but the qualifier is not local. 2909 </pre></td></tr> 2910 2911 2912 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 2913 <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 2914 2915 Given 2916 void a(char); 2917 void b(wchar_t); 2918 void c(double); 2919 functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 2920 matches "a(char)", "b(wchar_t)", but not "c(double)". 2921 </pre></td></tr> 2922 2923 2924 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr> 2925 <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 2926 the Objective-C object pointer type, which is different despite being 2927 syntactically similar. 2928 2929 Given 2930 int *i = nullptr; 2931 2932 @interface Foo 2933 @end 2934 Foo *f; 2935 2936 int j; 2937 varDecl(hasType(isAnyPointer())) 2938 matches "int *i" and "Foo *f", but not "int j". 2939 </pre></td></tr> 2940 2941 2942 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr> 2943 <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 2944 include "top-level" const. 2945 2946 Given 2947 void a(int); 2948 void b(int const); 2949 void c(const int); 2950 void d(const int*); 2951 void e(int const) {}; 2952 functionDecl(hasAnyParameter(hasType(isConstQualified()))) 2953 matches "void b(int const)", "void c(const int)" and 2954 "void e(int const) {}". It does not match d as there 2955 is no top-level const on the parameter type "const int *". 2956 </pre></td></tr> 2957 2958 2959 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr> 2960 <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 2961 2962 Given 2963 void a(int); 2964 void b(long); 2965 void c(double); 2966 functionDecl(hasAnyParameter(hasType(isInteger()))) 2967 matches "a(int)", "b(long)", but not "c(double)". 2968 </pre></td></tr> 2969 2970 2971 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 2972 <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 2973 2974 Given 2975 void a(int); 2976 void b(unsigned long); 2977 void c(double); 2978 functionDecl(hasAnyParameter(hasType(isInteger()))) 2979 matches "a(int)", but not "b(unsigned long)" and "c(double)". 2980 </pre></td></tr> 2981 2982 2983 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 2984 <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 2985 2986 Given 2987 void a(int); 2988 void b(unsigned long); 2989 void c(double); 2990 functionDecl(hasAnyParameter(hasType(isInteger()))) 2991 matches "b(unsigned long)", but not "a(int)" and "c(double)". 2992 </pre></td></tr> 2993 2994 2995 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr> 2996 <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 2997 include "top-level" volatile. 2998 2999 Given 3000 void a(int); 3001 void b(int volatile); 3002 void c(volatile int); 3003 void d(volatile int*); 3004 void e(int volatile) {}; 3005 functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 3006 matches "void b(int volatile)", "void c(volatile int)" and 3007 "void e(int volatile) {}". It does not match d as there 3008 is no top-level volatile on the parameter type "volatile int *". 3009 </pre></td></tr> 3010 3011 3012 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 3013 <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 3014 3015 Example matches C, but not S or U. 3016 struct S {}; 3017 class C {}; 3018 union U {}; 3019 </pre></td></tr> 3020 3021 3022 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 3023 <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 3024 3025 Example matches S, but not C or U. 3026 struct S {}; 3027 class C {}; 3028 union U {}; 3029 </pre></td></tr> 3030 3031 3032 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 3033 <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 3034 3035 Example matches U, but not C or S. 3036 struct S {}; 3037 class C {}; 3038 union U {}; 3039 </pre></td></tr> 3040 3041 3042 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3043 <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 3044 3045 Matches a node if it equals the node previously bound to ID. 3046 3047 Given 3048 class X { int a; int b; }; 3049 cxxRecordDecl( 3050 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3051 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3052 matches the class X, as a and b have the same type. 3053 3054 Note that when multiple matches are involved via forEach* matchers, 3055 equalsBoundNodes acts as a filter. 3056 For example: 3057 compoundStmt( 3058 forEachDescendant(varDecl().bind("d")), 3059 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3060 will trigger a match for each combination of variable declaration 3061 and reference to that variable declaration within a compound statement. 3062 </pre></td></tr> 3063 3064 3065 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr> 3066 <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 3067 3068 Stmt has pointer identity in the AST. 3069 </pre></td></tr> 3070 3071 3072 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 3073 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 3074 partially matching a given regex. 3075 3076 Example matches Y but not X 3077 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3078 #include "ASTMatcher.h" 3079 class X {}; 3080 ASTMatcher.h: 3081 class Y {}; 3082 3083 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3084 </pre></td></tr> 3085 3086 3087 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr> 3088 <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 3089 3090 Example matches X but not Y 3091 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3092 #include <Y.h> 3093 class X {}; 3094 Y.h: 3095 class Y {}; 3096 3097 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3098 </pre></td></tr> 3099 3100 3101 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3102 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 3103 3104 Example matches Y but not X 3105 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3106 #include <SystemHeader.h> 3107 class X {}; 3108 SystemHeader.h: 3109 class Y {}; 3110 3111 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3112 </pre></td></tr> 3113 3114 3115 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr> 3116 <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 3117 3118 Given 3119 int a[42]; 3120 int b[2 * 21]; 3121 int c[41], d[43]; 3122 char *s = "abcd"; 3123 wchar_t *ws = L"abcd"; 3124 char *w = "a"; 3125 constantArrayType(hasSize(42)) 3126 matches "int a[42]" and "int b[2 * 21]" 3127 stringLiteral(hasSize(4)) 3128 matches "abcd", L"abcd" 3129 </pre></td></tr> 3130 3131 3132 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr> 3133 <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 3134 3135 Example matches A, va, fa 3136 class A {}; 3137 class B; Doesn't match, as it has no body. 3138 int va; 3139 extern int vb; Doesn't match, as it doesn't define the variable. 3140 void fa() {} 3141 void fb(); Doesn't match, as it has no body. 3142 3143 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3144 </pre></td></tr> 3145 3146 3147 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 3148 <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 3149 3150 Note that 'Value' is a string as the template argument's value is 3151 an arbitrary precision integer. 'Value' must be euqal to the canonical 3152 representation of that integral value in base 10. 3153 3154 Given 3155 template<int T> struct A {}; 3156 C<42> c; 3157 classTemplateSpecializationDecl( 3158 hasAnyTemplateArgument(equalsIntegralValue("42"))) 3159 matches the implicit instantiation of C in C<42>. 3160 </pre></td></tr> 3161 3162 3163 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr> 3164 <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 3165 3166 Given 3167 template<int T> struct A {}; 3168 C<42> c; 3169 classTemplateSpecializationDecl( 3170 hasAnyTemplateArgument(isIntegral())) 3171 matches the implicit instantiation of C in C<42> 3172 with isIntegral() matching 42. 3173 </pre></td></tr> 3174 3175 3176 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 3177 <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 3178 3179 Given 3180 template<typename T> struct C {}; 3181 C<int> c; 3182 classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3183 matches C<int>. 3184 </pre></td></tr> 3185 3186 3187 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 3188 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 3189 partially matching a given regex. 3190 3191 Example matches Y but not X 3192 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3193 #include "ASTMatcher.h" 3194 class X {}; 3195 ASTMatcher.h: 3196 class Y {}; 3197 3198 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3199 </pre></td></tr> 3200 3201 3202 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr> 3203 <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 3204 3205 Example matches X but not Y 3206 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3207 #include <Y.h> 3208 class X {}; 3209 Y.h: 3210 class Y {}; 3211 3212 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3213 </pre></td></tr> 3214 3215 3216 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3217 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 3218 3219 Example matches Y but not X 3220 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3221 #include <SystemHeader.h> 3222 class X {}; 3223 SystemHeader.h: 3224 class Y {}; 3225 3226 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3227 </pre></td></tr> 3228 3229 3230 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr> 3231 <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 3232 3233 Given 3234 struct S { bool func(); }; 3235 functionDecl(returns(booleanType())) 3236 matches "bool func();" 3237 </pre></td></tr> 3238 3239 3240 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3241 <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 3242 3243 Matches a node if it equals the node previously bound to ID. 3244 3245 Given 3246 class X { int a; int b; }; 3247 cxxRecordDecl( 3248 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3249 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3250 matches the class X, as a and b have the same type. 3251 3252 Note that when multiple matches are involved via forEach* matchers, 3253 equalsBoundNodes acts as a filter. 3254 For example: 3255 compoundStmt( 3256 forEachDescendant(varDecl().bind("d")), 3257 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3258 will trigger a match for each combination of variable declaration 3259 and reference to that variable declaration within a compound statement. 3260 </pre></td></tr> 3261 3262 3263 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr> 3264 <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 3265 3266 Type has pointer identity in the AST. 3267 </pre></td></tr> 3268 3269 3270 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr> 3271 <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 3272 3273 Given 3274 int i; 3275 float f; 3276 realFloatingPointType() 3277 matches "float f" but not "int i" 3278 </pre></td></tr> 3279 3280 3281 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr> 3282 <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 3283 3284 Given 3285 struct S { void func(); }; 3286 functionDecl(returns(voidType())) 3287 matches "void func();" 3288 </pre></td></tr> 3289 3290 3291 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr> 3292 <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 3293 3294 Given 3295 int x; 3296 int s = sizeof(x) + alignof(x) 3297 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 3298 matches sizeof(x) 3299 </pre></td></tr> 3300 3301 3302 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3303 <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3304 unary). 3305 3306 Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3307 !(a || b) 3308 </pre></td></tr> 3309 3310 3311 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr> 3312 <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 3313 3314 Example matches x, but not y, z, or a. 3315 (matcher = varDecl(hasAutomaticStorageDuration()) 3316 void f() { 3317 int x; 3318 static int y; 3319 thread_local int z; 3320 } 3321 int a; 3322 </pre></td></tr> 3323 3324 3325 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr> 3326 <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 3327 3328 Example matches y and z (matcher = varDecl(hasGlobalStorage()) 3329 void f() { 3330 int x; 3331 static int y; 3332 } 3333 int z; 3334 </pre></td></tr> 3335 3336 3337 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr> 3338 <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 3339 non-static local variable. 3340 3341 Example matches x (matcher = varDecl(hasLocalStorage()) 3342 void f() { 3343 int x; 3344 static int y; 3345 } 3346 int z; 3347 </pre></td></tr> 3348 3349 3350 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr> 3351 <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 3352 3353 Example matches y and a, but not x or z. 3354 (matcher = varDecl(hasStaticStorageDuration()) 3355 void f() { 3356 int x; 3357 static int y; 3358 thread_local int z; 3359 } 3360 int a; 3361 </pre></td></tr> 3362 3363 3364 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr> 3365 <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 3366 3367 Example matches z, but not x, z, or a. 3368 (matcher = varDecl(hasThreadStorageDuration()) 3369 void f() { 3370 int x; 3371 static int y; 3372 thread_local int z; 3373 } 3374 int a; 3375 </pre></td></tr> 3376 3377 3378 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr> 3379 <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. 3380 3381 Given: 3382 constexpr int foo = 42; 3383 constexpr int bar(); 3384 varDecl(isConstexpr()) 3385 matches the declaration of foo. 3386 functionDecl(isConstexpr()) 3387 matches the declaration of bar. 3388 </pre></td></tr> 3389 3390 3391 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr> 3392 <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 3393 3394 Example matches A, va, fa 3395 class A {}; 3396 class B; Doesn't match, as it has no body. 3397 int va; 3398 extern int vb; Doesn't match, as it doesn't define the variable. 3399 void fa() {} 3400 void fb(); Doesn't match, as it has no body. 3401 3402 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3403 </pre></td></tr> 3404 3405 3406 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr> 3407 <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 3408 a C++ catch block, or an Objective-C statement. 3409 3410 Example matches x (matcher = varDecl(isExceptionVariable()) 3411 void f(int y) { 3412 try { 3413 } catch (int x) { 3414 } 3415 } 3416 </pre></td></tr> 3417 3418 3419 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 3420 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 3421 static member variable template instantiations. 3422 3423 Given 3424 template<typename T> void A(T t) { } 3425 template<> void A(int N) { } 3426 functionDecl(isExplicitTemplateSpecialization()) 3427 matches the specialization A<int>(). 3428 3429 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3430 </pre></td></tr> 3431 3432 3433 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr> 3434 <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 3435 member variable template instantiations. 3436 3437 Given 3438 template <typename T> class X {}; class A {}; X<A> x; 3439 or 3440 template <typename T> class X {}; class A {}; template class X<A>; 3441 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3442 matches the template instantiation of X<A>. 3443 3444 But given 3445 template <typename T> class X {}; class A {}; 3446 template <> class X<A> {}; X<A> x; 3447 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3448 does not match, as X<A> is an explicit template specialization. 3449 3450 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3451 </pre></td></tr> 3452 3453 3454 <tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr> 3455 <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3456 template instantiations. 3457 3458 Given 3459 template<typename T> void A(T t) { T i; } 3460 A(0); 3461 A(0U); 3462 functionDecl(isInstantiated()) 3463 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3464 </pre></td></tr> 3465 3466 3467 <tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr> 3468 <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3469 GNU's __null, C++11's nullptr, or C's NULL macro. 3470 3471 Given: 3472 void *v1 = NULL; 3473 void *v2 = nullptr; 3474 void *v3 = __null; GNU extension 3475 char *cp = (char *)0; 3476 int *ip = 0; 3477 int i = 0; 3478 expr(nullPointerConstant()) 3479 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3480 initializer for i. 3481 </pre></td></tr> 3482 3483 3484 <tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr> 3485 <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3486 3487 This matcher is only provided as a performance optimization of hasName. 3488 hasAnyName(a, b, c) 3489 is equivalent to, but faster than 3490 anyOf(hasName(a), hasName(b), hasName(c)) 3491 </pre></td></tr> 3492 3493 3494 <tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr> 3495 <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 3496 3497 Given 3498 int j; 3499 template<typename T> void A(T t) { T i; j += 42;} 3500 A(0); 3501 A(0U); 3502 declStmt(isInTemplateInstantiation()) 3503 matches 'int i;' and 'unsigned i'. 3504 unless(stmt(isInTemplateInstantiation())) 3505 will NOT match j += 42; as it's shared between the template definition and 3506 instantiation. 3507 </pre></td></tr> 3508 3509 <!--END_NARROWING_MATCHERS --> 3510 </table> 3511 3512 <!-- ======================================================================= --> 3513 <h2 id="traversal-matchers">AST Traversal Matchers</h2> 3514 <!-- ======================================================================= --> 3515 3516 <p>Traversal matchers specify the relationship to other nodes that are 3517 reachable from the current node.</p> 3518 3519 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and 3520 forEachDescendant) which work on all nodes and allow users to write more generic 3521 match expressions.</p> 3522 3523 <table> 3524 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 3525 <!-- START_TRAVERSAL_MATCHERS --> 3526 3527 <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 3528 <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 3529 3530 Unlike anyOf, eachOf will generate a match result for each 3531 matching submatcher. 3532 3533 For example, in: 3534 class A { int a; int b; }; 3535 The matcher: 3536 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 3537 has(fieldDecl(hasName("b")).bind("v")))) 3538 will generate two results binding "v", the first of which binds 3539 the field declaration of a, the second the field declaration of 3540 b. 3541 3542 Usable as: Any Matcher 3543 </pre></td></tr> 3544 3545 3546 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 3547 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3548 provided matcher. 3549 3550 Example matches X, A, B, C 3551 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 3552 class X {}; Matches X, because X::X is a class of name X inside X. 3553 class A { class X {}; }; 3554 class B { class C { class X {}; }; }; 3555 3556 DescendantT must be an AST base type. 3557 3558 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 3559 each result that matches instead of only on the first one. 3560 3561 Note: Recursively combined ForEachDescendant can cause many matches: 3562 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 3563 forEachDescendant(cxxRecordDecl()) 3564 ))) 3565 will match 10 times (plus injected class name matches) on: 3566 class A { class B { class C { class D { class E {}; }; }; }; }; 3567 3568 Usable as: Any Matcher 3569 </pre></td></tr> 3570 3571 3572 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 3573 <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 3574 provided matcher. 3575 3576 Example matches X, Y 3577 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 3578 class X {}; Matches X, because X::X is a class of name X inside X. 3579 class Y { class X {}; }; 3580 class Z { class Y { class X {}; }; }; Does not match Z. 3581 3582 ChildT must be an AST base type. 3583 3584 As opposed to 'has', 'forEach' will cause a match for each result that 3585 matches instead of only on the first one. 3586 3587 Usable as: Any Matcher 3588 </pre></td></tr> 3589 3590 3591 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 3592 <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 3593 matcher. 3594 3595 Given 3596 void f() { if (true) { int x = 42; } } 3597 void g() { for (;;) { int x = 43; } } 3598 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 3599 3600 Usable as: Any Matcher 3601 </pre></td></tr> 3602 3603 3604 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 3605 <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3606 provided matcher. 3607 3608 Example matches X, Y, Z 3609 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 3610 class X {}; Matches X, because X::X is a class of name X inside X. 3611 class Y { class X {}; }; 3612 class Z { class Y { class X {}; }; }; 3613 3614 DescendantT must be an AST base type. 3615 3616 Usable as: Any Matcher 3617 </pre></td></tr> 3618 3619 3620 <tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 3621 <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 3622 provided matcher. 3623 3624 Example matches X, Y 3625 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 3626 class X {}; Matches X, because X::X is a class of name X inside X. 3627 class Y { class X {}; }; 3628 class Z { class Y { class X {}; }; }; Does not match Z. 3629 3630 ChildT must be an AST base type. 3631 3632 Usable as: Any Matcher 3633 Note that has is direct matcher, so it also matches things like implicit 3634 casts and paren casts. If you are matching with expr then you should 3635 probably consider using ignoringParenImpCasts like: 3636 has(ignoringParenImpCasts(expr())). 3637 </pre></td></tr> 3638 3639 3640 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 3641 <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 3642 matcher. 3643 3644 Given 3645 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 3646 compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 3647 3648 Usable as: Any Matcher 3649 </pre></td></tr> 3650 3651 3652 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3653 <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 3654 switch statement or conditional operator. 3655 3656 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 3657 if (true) {} 3658 </pre></td></tr> 3659 3660 3661 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3662 <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 3663 (binary or ternary). 3664 3665 Example matches b 3666 condition ? a : b 3667 condition ?: b 3668 </pre></td></tr> 3669 3670 3671 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3672 <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 3673 3674 Example 1 (conditional ternary operator): matches a 3675 condition ? a : b 3676 3677 Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 3678 condition ?: b 3679 </pre></td></tr> 3680 3681 3682 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3683 <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 3684 matches the given matcher. 3685 3686 The associated declaration is: 3687 - for type nodes, the declaration of the underlying type 3688 - for CallExpr, the declaration of the callee 3689 - for MemberExpr, the declaration of the referenced member 3690 - for CXXConstructExpr, the declaration of the constructor 3691 3692 Also usable as Matcher<T> for any T supporting the getDecl() member 3693 function. e.g. various subtypes of clang::Type and various expressions. 3694 3695 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3696 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3697 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 3698 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3699 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3700 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3701 </pre></td></tr> 3702 3703 3704 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3705 <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 3706 3707 Given 3708 int i[5]; 3709 void f() { i[1] = 42; } 3710 arraySubscriptExpression(hasBase(implicitCastExpr( 3711 hasSourceExpression(declRefExpr())))) 3712 matches i[1] with the declRefExpr() matching i 3713 </pre></td></tr> 3714 3715 3716 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3717 <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 3718 3719 Given 3720 int i[5]; 3721 void f() { i[1] = 42; } 3722 arraySubscriptExpression(hasIndex(integerLiteral())) 3723 matches i[1] with the integerLiteral() matching 1 3724 </pre></td></tr> 3725 3726 3727 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3728 <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 3729 3730 Example matches a (matcher = binaryOperator(hasLHS())) 3731 a || b 3732 </pre></td></tr> 3733 3734 3735 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3736 <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 3737 3738 Example matches b (matcher = binaryOperator(hasRHS())) 3739 a || b 3740 </pre></td></tr> 3741 3742 3743 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>></td><td class="name" onclick="toggle('hasElementTypeLoc0')"><a name="hasElementTypeLoc0Anchor">hasElementTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3744 <tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 3745 type. 3746 3747 Given 3748 struct A {}; 3749 A a[7]; 3750 int b[7]; 3751 arrayType(hasElementType(builtinType())) 3752 matches "int b[7]" 3753 3754 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3755 </pre></td></tr> 3756 3757 3758 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>></td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3759 <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 3760 type. 3761 3762 Given 3763 struct A {}; 3764 A a[7]; 3765 int b[7]; 3766 arrayType(hasElementType(builtinType())) 3767 matches "int b[7]" 3768 3769 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3770 </pre></td></tr> 3771 3772 3773 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>></td><td class="name" onclick="toggle('hasValueTypeLoc0')"><a name="hasValueTypeLoc0Anchor">hasValueTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3774 <tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 3775 3776 Given 3777 _Atomic(int) i; 3778 _Atomic(float) f; 3779 atomicType(hasValueType(isInteger())) 3780 matches "_Atomic(int) i" 3781 3782 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3783 </pre></td></tr> 3784 3785 3786 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>></td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3787 <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 3788 3789 Given 3790 _Atomic(int) i; 3791 _Atomic(float) f; 3792 atomicType(hasValueType(isInteger())) 3793 matches "_Atomic(int) i" 3794 3795 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3796 </pre></td></tr> 3797 3798 3799 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>></td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3800 <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 3801 3802 Note: There is no TypeLoc for the deduced type and thus no 3803 getDeducedLoc() matcher. 3804 3805 Given 3806 auto a = 1; 3807 auto b = 2.0; 3808 autoType(hasDeducedType(isInteger())) 3809 matches "auto a" 3810 3811 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 3812 </pre></td></tr> 3813 3814 3815 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3816 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 3817 binary operator matches. 3818 </pre></td></tr> 3819 3820 3821 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3822 <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 3823 3824 Example matches a (matcher = binaryOperator(hasLHS())) 3825 a || b 3826 </pre></td></tr> 3827 3828 3829 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3830 <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 3831 3832 Example matches b (matcher = binaryOperator(hasRHS())) 3833 a || b 3834 </pre></td></tr> 3835 3836 3837 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc0')"><a name="pointeeLoc0Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3838 <tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 3839 pointee matches a given matcher. 3840 3841 Given 3842 int *a; 3843 int const *b; 3844 float const *f; 3845 pointerType(pointee(isConstQualified(), isInteger())) 3846 matches "int const *b" 3847 3848 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 3849 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 3850 </pre></td></tr> 3851 3852 3853 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>></td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3854 <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 3855 pointee matches a given matcher. 3856 3857 Given 3858 int *a; 3859 int const *b; 3860 float const *f; 3861 pointerType(pointee(isConstQualified(), isInteger())) 3862 matches "int const *b" 3863 3864 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 3865 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 3866 </pre></td></tr> 3867 3868 3869 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 3870 <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 3871 3872 Given 3873 void f(int i); 3874 int y; 3875 f(y); 3876 callExpr( 3877 forEachArgumentWithParam( 3878 declRefExpr(to(varDecl(hasName("y")))), 3879 parmVarDecl(hasType(isInteger())) 3880 )) 3881 matches f(y); 3882 with declRefExpr(...) 3883 matching int y 3884 and parmVarDecl(...) 3885 matching int i 3886 </pre></td></tr> 3887 3888 3889 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3890 <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 3891 expression. 3892 3893 Given 3894 void x(int, int, int) { int y; x(1, y, 42); } 3895 callExpr(hasAnyArgument(declRefExpr())) 3896 matches x(1, y, 42) 3897 with hasAnyArgument(...) 3898 matching y 3899 </pre></td></tr> 3900 3901 3902 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3903 <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 3904 call expression. 3905 3906 Example matches y in x(y) 3907 (matcher = callExpr(hasArgument(0, declRefExpr()))) 3908 void x(int) { int y; x(y); } 3909 </pre></td></tr> 3910 3911 3912 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3913 <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 3914 matches the given matcher. 3915 3916 The associated declaration is: 3917 - for type nodes, the declaration of the underlying type 3918 - for CallExpr, the declaration of the callee 3919 - for MemberExpr, the declaration of the referenced member 3920 - for CXXConstructExpr, the declaration of the constructor 3921 3922 Also usable as Matcher<T> for any T supporting the getDecl() member 3923 function. e.g. various subtypes of clang::Type and various expressions. 3924 3925 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3926 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3927 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 3928 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3929 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3930 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3931 </pre></td></tr> 3932 3933 3934 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 3935 <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 3936 3937 Given 3938 class A { A() : i(42), j(42) {} int i; int j; }; 3939 cxxConstructorDecl(forEachConstructorInitializer( 3940 forField(decl().bind("x")) 3941 )) 3942 will trigger two matches, binding for 'i' and 'j' respectively. 3943 </pre></td></tr> 3944 3945 3946 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 3947 <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 3948 3949 Given 3950 struct Foo { 3951 Foo() : foo_(1) { } 3952 int foo_; 3953 }; 3954 cxxRecordDecl(has(cxxConstructorDecl( 3955 hasAnyConstructorInitializer(anything()) 3956 ))) 3957 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 3958 </pre></td></tr> 3959 3960 3961 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr> 3962 <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 3963 3964 Given 3965 struct Foo { 3966 Foo() : foo_(1) { } 3967 int foo_; 3968 }; 3969 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3970 forField(hasName("foo_")))))) 3971 matches Foo 3972 with forField matching foo_ 3973 </pre></td></tr> 3974 3975 3976 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3977 <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 3978 3979 Given 3980 struct Foo { 3981 Foo() : foo_(1) { } 3982 int foo_; 3983 }; 3984 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3985 withInitializer(integerLiteral(equals(1))))))) 3986 matches Foo 3987 with withInitializer matching (1) 3988 </pre></td></tr> 3989 3990 3991 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3992 <tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 3993 definition that has a given body. 3994 3995 Given 3996 for (;;) {} 3997 hasBody(compoundStmt()) 3998 matches 'for (;;) {}' 3999 with compoundStmt() 4000 matching '{}' 4001 </pre></td></tr> 4002 4003 4004 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 4005 <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 4006 4007 Example: 4008 forStmt(hasLoopVariable(anything())) 4009 matches 'int x' in 4010 for (int x : a) { } 4011 </pre></td></tr> 4012 4013 4014 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4015 <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 4016 4017 Example: 4018 forStmt(hasRangeInit(anything())) 4019 matches 'a' in 4020 for (int x : a) { } 4021 </pre></td></tr> 4022 4023 4024 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4025 <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 4026 4027 4028 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4029 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 4030 4031 Example matches y.x() 4032 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) 4033 class Y { public: void x(); }; 4034 void z() { Y y; y.x(); }", 4035 4036 FIXME: Overload to allow directly matching types? 4037 </pre></td></tr> 4038 4039 4040 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4041 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 4042 </pre></td></tr> 4043 4044 4045 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4046 <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 4047 matcher, or is a pointer to a type that matches the InnerMatcher. 4048 </pre></td></tr> 4049 4050 4051 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 4052 <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may 4053 produce multiple matches. 4054 4055 Given 4056 class A { virtual void f(); }; 4057 class B : public A { void f(); }; 4058 class C : public B { void f(); }; 4059 cxxMethodDecl(ofClass(hasName("C")), 4060 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4061 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 4062 that B::f is not overridden by C::f). 4063 4064 The check can produce multiple matches in case of multiple inheritance, e.g. 4065 class A1 { virtual void f(); }; 4066 class A2 { virtual void f(); }; 4067 class C : public A1, public A2 { void f(); }; 4068 cxxMethodDecl(ofClass(hasName("C")), 4069 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4070 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 4071 once with "b" binding "A2::f" and "d" binding "C::f". 4072 </pre></td></tr> 4073 4074 4075 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr> 4076 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 4077 belongs to. 4078 4079 FIXME: Generalize this for other kinds of declarations. 4080 FIXME: What other kind of declarations would we need to generalize 4081 this to? 4082 4083 Example matches A() in the last line 4084 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 4085 ofClass(hasName("A")))))) 4086 class A { 4087 public: 4088 A(); 4089 }; 4090 A a = A(); 4091 </pre></td></tr> 4092 4093 4094 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 4095 <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 4096 4097 Given: 4098 class A { void func(); }; 4099 class B { void member(); }; 4100 4101 cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 4102 A but not B. 4103 </pre></td></tr> 4104 4105 4106 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 4107 <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 4108 a class matching Base. 4109 4110 Note that a class is not considered to be derived from itself. 4111 4112 Example matches Y, Z, C (Base == hasName("X")) 4113 class X; 4114 class Y : public X {}; directly derived 4115 class Z : public Y {}; indirectly derived 4116 typedef X A; 4117 typedef A B; 4118 class C : public B {}; derived from a typedef of X 4119 4120 In the following example, Bar matches isDerivedFrom(hasName("X")): 4121 class Foo; 4122 typedef Foo X; 4123 class Bar : public Foo {}; derived from a type that X is a typedef of 4124 </pre></td></tr> 4125 4126 4127 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 4128 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 4129 match Base. 4130 </pre></td></tr> 4131 4132 4133 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4134 <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 4135 given matcher. 4136 4137 Example matches y.x() (matcher = callExpr(callee( 4138 cxxMethodDecl(hasName("x"))))) 4139 class Y { public: void x(); }; 4140 void z() { Y y; y.x(); } 4141 </pre></td></tr> 4142 4143 4144 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4145 <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 4146 4147 Given 4148 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 4149 void f() { f(); } 4150 callExpr(callee(expr())) 4151 matches this->x(), x(), y.x(), f() 4152 with callee(...) 4153 matching this->x, x, y.x, f respectively 4154 4155 Note: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 4156 because this introduces ambiguous overloads with calls to Callee taking a 4157 internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 4158 implemented in terms of implicit casts. 4159 </pre></td></tr> 4160 4161 4162 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 4163 <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 4164 4165 Given 4166 void f(int i); 4167 int y; 4168 f(y); 4169 callExpr( 4170 forEachArgumentWithParam( 4171 declRefExpr(to(varDecl(hasName("y")))), 4172 parmVarDecl(hasType(isInteger())) 4173 )) 4174 matches f(y); 4175 with declRefExpr(...) 4176 matching int y 4177 and parmVarDecl(...) 4178 matching int i 4179 </pre></td></tr> 4180 4181 4182 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4183 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 4184 expression. 4185 4186 Given 4187 void x(int, int, int) { int y; x(1, y, 42); } 4188 callExpr(hasAnyArgument(declRefExpr())) 4189 matches x(1, y, 42) 4190 with hasAnyArgument(...) 4191 matching y 4192 </pre></td></tr> 4193 4194 4195 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4196 <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 4197 call expression. 4198 4199 Example matches y in x(y) 4200 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4201 void x(int) { int y; x(y); } 4202 </pre></td></tr> 4203 4204 4205 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4206 <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 4207 matches the given matcher. 4208 4209 The associated declaration is: 4210 - for type nodes, the declaration of the underlying type 4211 - for CallExpr, the declaration of the callee 4212 - for MemberExpr, the declaration of the referenced member 4213 - for CXXConstructExpr, the declaration of the constructor 4214 4215 Also usable as Matcher<T> for any T supporting the getDecl() member 4216 function. e.g. various subtypes of clang::Type and various expressions. 4217 4218 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4219 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4220 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4221 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4222 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4223 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4224 </pre></td></tr> 4225 4226 4227 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>></td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4228 <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 4229 extension, matches the constant given in the statement. 4230 4231 Given 4232 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 4233 caseStmt(hasCaseConstant(integerLiteral())) 4234 matches "case 1:" 4235 </pre></td></tr> 4236 4237 4238 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4239 <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr> 4240 4241 4242 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 4243 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one 4244 TemplateArgument matching the given InnerMatcher. 4245 4246 Given 4247 template<typename T> class A {}; 4248 template<> class A<double> {}; 4249 A<int> a; 4250 classTemplateSpecializationDecl(hasAnyTemplateArgument( 4251 refersToType(asString("int")))) 4252 matches the specialization A<int> 4253 </pre></td></tr> 4254 4255 4256 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 4257 <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 4258 matches the given InnerMatcher. 4259 4260 Given 4261 template<typename T, typename U> class A {}; 4262 A<bool, int> b; 4263 A<int, bool> c; 4264 classTemplateSpecializationDecl(hasTemplateArgument( 4265 1, refersToType(asString("int")))) 4266 matches the specialization A<bool, int> 4267 </pre></td></tr> 4268 4269 4270 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>></td><td class="name" onclick="toggle('hasElementTypeLoc1')"><a name="hasElementTypeLoc1Anchor">hasElementTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4271 <tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 4272 type. 4273 4274 Given 4275 struct A {}; 4276 A a[7]; 4277 int b[7]; 4278 arrayType(hasElementType(builtinType())) 4279 matches "int b[7]" 4280 4281 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 4282 </pre></td></tr> 4283 4284 4285 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>></td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4286 <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 4287 type. 4288 4289 Given 4290 struct A {}; 4291 A a[7]; 4292 int b[7]; 4293 arrayType(hasElementType(builtinType())) 4294 matches "int b[7]" 4295 4296 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 4297 </pre></td></tr> 4298 4299 4300 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4301 <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 4302 a given matcher. Also matches StmtExprs that have CompoundStmt as children. 4303 4304 Given 4305 { {}; 1+2; } 4306 hasAnySubstatement(compoundStmt()) 4307 matches '{ {}; 1+2; }' 4308 with compoundStmt() 4309 matching '{}' 4310 </pre></td></tr> 4311 4312 4313 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>></td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr> 4314 <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 4315 </pre></td></tr> 4316 4317 4318 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4319 <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 4320 matches the given matcher. 4321 4322 The associated declaration is: 4323 - for type nodes, the declaration of the underlying type 4324 - for CallExpr, the declaration of the callee 4325 - for MemberExpr, the declaration of the referenced member 4326 - for CXXConstructExpr, the declaration of the constructor 4327 4328 Also usable as Matcher<T> for any T supporting the getDecl() member 4329 function. e.g. various subtypes of clang::Type and various expressions. 4330 4331 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4332 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4333 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4334 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4335 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4336 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4337 </pre></td></tr> 4338 4339 4340 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 4341 <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 4342 specific using shadow declaration. 4343 4344 Given 4345 namespace a { void f() {} } 4346 using a::f; 4347 void g() { 4348 f(); Matches this .. 4349 a::f(); .. but not this. 4350 } 4351 declRefExpr(throughUsingDecl(anything())) 4352 matches f() 4353 </pre></td></tr> 4354 4355 4356 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4357 <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 4358 specified matcher. 4359 4360 Example matches x in if(x) 4361 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 4362 bool x; 4363 if (x) {} 4364 </pre></td></tr> 4365 4366 4367 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4368 <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 4369 4370 Note that this does not work for global declarations because the AST 4371 breaks up multiple-declaration DeclStmt's into multiple single-declaration 4372 DeclStmt's. 4373 Example: Given non-global declarations 4374 int a, b = 0; 4375 int c; 4376 int d = 2, e; 4377 declStmt(containsDeclaration( 4378 0, varDecl(hasInitializer(anything())))) 4379 matches only 'int d = 2, e;', and 4380 declStmt(containsDeclaration(1, varDecl())) 4381 matches 'int a, b = 0' as well as 'int d = 2, e;' 4382 but 'int c;' is not matched. 4383 </pre></td></tr> 4384 4385 4386 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4387 <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 4388 4389 Given 4390 int a, b; 4391 int c; 4392 declStmt(hasSingleDecl(anything())) 4393 matches 'int c;' but not 'int a, b;'. 4394 </pre></td></tr> 4395 4396 4397 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 4398 <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 4399 the inner matcher. 4400 4401 Given 4402 int x; 4403 declaratorDecl(hasTypeLoc(loc(asString("int")))) 4404 matches int x 4405 </pre></td></tr> 4406 4407 4408 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4409 <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 4410 Decl, matches InnerMatcher. 4411 4412 Given 4413 namespace N { 4414 namespace M { 4415 class D {}; 4416 } 4417 } 4418 4419 cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 4420 declaration of class D. 4421 </pre></td></tr> 4422 4423 4424 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4425 <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 4426 definition that has a given body. 4427 4428 Given 4429 for (;;) {} 4430 hasBody(compoundStmt()) 4431 matches 'for (;;) {}' 4432 with compoundStmt() 4433 matching '{}' 4434 </pre></td></tr> 4435 4436 4437 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4438 <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 4439 switch statement or conditional operator. 4440 4441 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4442 if (true) {} 4443 </pre></td></tr> 4444 4445 4446 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 4447 <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 4448 matches InnerMatcher if the qualifier exists. 4449 4450 Given 4451 namespace N { 4452 namespace M { 4453 class D {}; 4454 } 4455 } 4456 N::M::D d; 4457 4458 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 4459 matches the type of the variable declaration of d. 4460 </pre></td></tr> 4461 4462 4463 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4464 <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 4465 4466 Given 4467 namespace N { 4468 namespace M { 4469 class D {}; 4470 } 4471 } 4472 N::M::D d; 4473 4474 elaboratedType(namesType(recordType( 4475 hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 4476 declaration of d. 4477 </pre></td></tr> 4478 4479 4480 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4481 <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 4482 matches the given matcher. 4483 4484 The associated declaration is: 4485 - for type nodes, the declaration of the underlying type 4486 - for CallExpr, the declaration of the callee 4487 - for MemberExpr, the declaration of the referenced member 4488 - for CXXConstructExpr, the declaration of the constructor 4489 4490 Also usable as Matcher<T> for any T supporting the getDecl() member 4491 function. e.g. various subtypes of clang::Type and various expressions. 4492 4493 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4494 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4495 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4496 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4497 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4498 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4499 </pre></td></tr> 4500 4501 4502 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4503 <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 4504 4505 (Note: Clang's AST refers to other conversions as "casts" too, and calls 4506 actual casts "explicit" casts.) 4507 </pre></td></tr> 4508 4509 4510 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4511 <tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 4512 declaration's type. 4513 4514 In case of a value declaration (for example a variable declaration), 4515 this resolves one layer of indirection. For example, in the value 4516 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 4517 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 4518 declaration of x. 4519 4520 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4521 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4522 class X {}; 4523 void y(X &x) { x; X z; } 4524 4525 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> 4526 </pre></td></tr> 4527 4528 4529 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4530 <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 4531 matcher. 4532 4533 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4534 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4535 and U (matcher = typedefDecl(hasType(asString("int"))) 4536 class X {}; 4537 void y(X &x) { x; X z; } 4538 typedef int U; 4539 </pre></td></tr> 4540 4541 4542 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4543 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 4544 are stripped off. 4545 4546 Parentheses and explicit casts are not discarded. 4547 Given 4548 int arr[5]; 4549 int a = 0; 4550 char b = 0; 4551 const int c = a; 4552 int *d = arr; 4553 long e = (long) 0l; 4554 The matchers 4555 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 4556 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 4557 would match the declarations for a, b, c, and d, but not e. 4558 While 4559 varDecl(hasInitializer(integerLiteral())) 4560 varDecl(hasInitializer(declRefExpr())) 4561 only match the declarations for b, c, and d. 4562 </pre></td></tr> 4563 4564 4565 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>ast_matchers::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4566 <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 4567 nodes are stripped off. 4568 4569 Parentheses and explicit casts are not discarded. 4570 Given 4571 class C {}; 4572 C a = C(); 4573 C b; 4574 C c = b; 4575 The matchers 4576 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 4577 would match the declarations for a, b, and c. 4578 While 4579 varDecl(hasInitializer(cxxConstructExpr())) 4580 only match the declarations for b and c. 4581 </pre></td></tr> 4582 4583 4584 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4585 <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 4586 casts are stripped off. 4587 4588 Implicit and non-C Style casts are also discarded. 4589 Given 4590 int a = 0; 4591 char b = (0); 4592 void* c = reinterpret_cast<char*>(0); 4593 char d = char(0); 4594 The matcher 4595 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 4596 would match the declarations for a, b, c, and d. 4597 while 4598 varDecl(hasInitializer(integerLiteral())) 4599 only match the declaration for a. 4600 </pre></td></tr> 4601 4602 4603 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4604 <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 4605 parentheses are stripped off. 4606 4607 Explicit casts are not discarded. 4608 Given 4609 int arr[5]; 4610 int a = 0; 4611 char b = (0); 4612 const int c = a; 4613 int *d = (arr); 4614 long e = ((long) 0l); 4615 The matchers 4616 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 4617 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 4618 would match the declarations for a, b, c, and d, but not e. 4619 while 4620 varDecl(hasInitializer(integerLiteral())) 4621 varDecl(hasInitializer(declRefExpr())) 4622 would only match the declaration for a. 4623 </pre></td></tr> 4624 4625 4626 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4627 <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 4628 definition that has a given body. 4629 4630 Given 4631 for (;;) {} 4632 hasBody(compoundStmt()) 4633 matches 'for (;;) {}' 4634 with compoundStmt() 4635 matching '{}' 4636 </pre></td></tr> 4637 4638 4639 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4640 <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 4641 switch statement or conditional operator. 4642 4643 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4644 if (true) {} 4645 </pre></td></tr> 4646 4647 4648 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4649 <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 4650 4651 Example: 4652 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 4653 matches '++x' in 4654 for (x; x < N; ++x) { } 4655 </pre></td></tr> 4656 4657 4658 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4659 <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 4660 4661 Example: 4662 forStmt(hasLoopInit(declStmt())) 4663 matches 'int x = 0' in 4664 for (int x = 0; x < N; ++x) { } 4665 </pre></td></tr> 4666 4667 4668 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 4669 <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration. 4670 4671 Does not match the 'this' parameter of a method. 4672 4673 Given 4674 class X { void f(int x, int y, int z) {} }; 4675 cxxMethodDecl(hasAnyParameter(hasName("y"))) 4676 matches f(int x, int y, int z) {} 4677 with hasAnyParameter(...) 4678 matching int y 4679 </pre></td></tr> 4680 4681 4682 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4683 <tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 4684 definition that has a given body. 4685 4686 Given 4687 for (;;) {} 4688 hasBody(compoundStmt()) 4689 matches 'for (;;) {}' 4690 with compoundStmt() 4691 matching '{}' 4692 </pre></td></tr> 4693 4694 4695 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 4696 <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration. 4697 4698 Given 4699 class X { void f(int x) {} }; 4700 cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 4701 matches f(int x) {} 4702 with hasParameter(...) 4703 matching int x 4704 </pre></td></tr> 4705 4706 4707 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4708 <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 4709 4710 Given: 4711 class X { int f() { return 1; } }; 4712 cxxMethodDecl(returns(asString("int"))) 4713 matches int f() { return 1; } 4714 </pre></td></tr> 4715 4716 4717 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4718 <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 4719 switch statement or conditional operator. 4720 4721 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4722 if (true) {} 4723 </pre></td></tr> 4724 4725 4726 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr> 4727 <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 4728 4729 Given 4730 if (A* a = GetAPointer()) {} 4731 hasConditionVariableStatement(...) 4732 matches 'A* a = GetAPointer()'. 4733 </pre></td></tr> 4734 4735 4736 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4737 <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 4738 4739 Examples matches the if statement 4740 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 4741 if (false) false; else true; 4742 </pre></td></tr> 4743 4744 4745 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4746 <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 4747 4748 Examples matches the if statement 4749 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 4750 if (false) true; else false; 4751 </pre></td></tr> 4752 4753 4754 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>></td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4755 <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 4756 matcher. 4757 4758 FIXME: Unit test this matcher 4759 </pre></td></tr> 4760 4761 4762 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4763 <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 4764 (if expression have it). 4765 </pre></td></tr> 4766 4767 4768 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4769 <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 4770 matches the given matcher. 4771 4772 The associated declaration is: 4773 - for type nodes, the declaration of the underlying type 4774 - for CallExpr, the declaration of the callee 4775 - for MemberExpr, the declaration of the referenced member 4776 - for CXXConstructExpr, the declaration of the constructor 4777 4778 Also usable as Matcher<T> for any T supporting the getDecl() member 4779 function. e.g. various subtypes of clang::Type and various expressions. 4780 4781 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4782 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4783 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4784 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4785 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4786 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4787 </pre></td></tr> 4788 4789 4790 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4791 <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 4792 matches the given matcher. 4793 4794 The associated declaration is: 4795 - for type nodes, the declaration of the underlying type 4796 - for CallExpr, the declaration of the callee 4797 - for MemberExpr, the declaration of the referenced member 4798 - for CXXConstructExpr, the declaration of the constructor 4799 4800 Also usable as Matcher<T> for any T supporting the getDecl() member 4801 function. e.g. various subtypes of clang::Type and various expressions. 4802 4803 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4804 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4805 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4806 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4807 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4808 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4809 </pre></td></tr> 4810 4811 4812 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4813 <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 4814 matches the given matcher. 4815 4816 The associated declaration is: 4817 - for type nodes, the declaration of the underlying type 4818 - for CallExpr, the declaration of the callee 4819 - for MemberExpr, the declaration of the referenced member 4820 - for CXXConstructExpr, the declaration of the constructor 4821 4822 Also usable as Matcher<T> for any T supporting the getDecl() member 4823 function. e.g. various subtypes of clang::Type and various expressions. 4824 4825 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4826 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4827 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4828 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4829 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4830 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4831 </pre></td></tr> 4832 4833 4834 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4835 <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 4836 matched by a given matcher. 4837 4838 Given 4839 struct X { int m; }; 4840 void f(X x) { x.m; m; } 4841 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) 4842 matches "x.m" and "m" 4843 with hasObjectExpression(...) 4844 matching "x" and the implicit object expression of "m" which has type X*. 4845 </pre></td></tr> 4846 4847 4848 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 4849 <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 4850 given matcher. 4851 4852 Given 4853 struct { int first, second; } first, second; 4854 int i(second.first); 4855 int j(first.second); 4856 memberExpr(member(hasName("first"))) 4857 matches second.first 4858 but not first.second (because the member name there is "second"). 4859 </pre></td></tr> 4860 4861 4862 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4863 <tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 4864 pointee matches a given matcher. 4865 4866 Given 4867 int *a; 4868 int const *b; 4869 float const *f; 4870 pointerType(pointee(isConstQualified(), isInteger())) 4871 matches "int const *b" 4872 4873 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4874 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4875 </pre></td></tr> 4876 4877 4878 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>></td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4879 <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 4880 pointee matches a given matcher. 4881 4882 Given 4883 int *a; 4884 int const *b; 4885 float const *f; 4886 pointerType(pointee(isConstQualified(), isInteger())) 4887 matches "int const *b" 4888 4889 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4890 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4891 </pre></td></tr> 4892 4893 4894 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr> 4895 <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 4896 4897 Given 4898 struct A { struct B { struct C {}; }; }; 4899 A::B::C c; 4900 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 4901 matches "A::" 4902 </pre></td></tr> 4903 4904 4905 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 4906 <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 4907 given TypeLoc. 4908 4909 Given 4910 struct A { struct B { struct C {}; }; }; 4911 A::B::C c; 4912 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 4913 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 4914 matches "A::" 4915 </pre></td></tr> 4916 4917 4918 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 4919 <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 4920 4921 Given 4922 struct A { struct B { struct C {}; }; }; 4923 A::B::C c; 4924 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 4925 matches "A::" 4926 </pre></td></tr> 4927 4928 4929 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr> 4930 <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 4931 given namespace matcher. 4932 4933 Given 4934 namespace ns { struct A {}; } 4935 ns::A a; 4936 nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 4937 matches "ns::" 4938 </pre></td></tr> 4939 4940 4941 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4942 <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 4943 given QualType matcher without qualifiers. 4944 4945 Given 4946 struct A { struct B { struct C {}; }; }; 4947 A::B::C c; 4948 nestedNameSpecifier(specifiesType( 4949 hasDeclaration(cxxRecordDecl(hasName("A"))) 4950 )) 4951 matches "A::" 4952 </pre></td></tr> 4953 4954 4955 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4956 <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 4957 call expression. 4958 4959 Example matches y in x(y) 4960 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4961 void x(int) { int y; x(y); } 4962 </pre></td></tr> 4963 4964 4965 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4966 <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 4967 4968 Example 4969 matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *"))); 4970 matches the [webView ...] message invocation. 4971 NSString *webViewJavaScript = ... 4972 UIWebView *webView = ... 4973 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 4974 </pre></td></tr> 4975 4976 4977 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4978 <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr> 4979 4980 4981 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>></td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4982 <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 4983 4984 Given 4985 int (*ptr_to_array)[4]; 4986 int (*ptr_to_func)(int); 4987 4988 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 4989 ptr_to_func but not ptr_to_array. 4990 4991 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 4992 </pre></td></tr> 4993 4994 4995 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc2')"><a name="pointeeLoc2Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4996 <tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 4997 pointee matches a given matcher. 4998 4999 Given 5000 int *a; 5001 int const *b; 5002 float const *f; 5003 pointerType(pointee(isConstQualified(), isInteger())) 5004 matches "int const *b" 5005 5006 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5007 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5008 </pre></td></tr> 5009 5010 5011 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>></td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5012 <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 5013 pointee matches a given matcher. 5014 5015 Given 5016 int *a; 5017 int const *b; 5018 float const *f; 5019 pointerType(pointee(isConstQualified(), isInteger())) 5020 matches "int const *b" 5021 5022 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5023 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5024 </pre></td></tr> 5025 5026 5027 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5028 <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 5029 5030 Given: 5031 typedef int &int_ref; 5032 int a; 5033 int_ref b = a; 5034 5035 varDecl(hasType(qualType(referenceType()))))) will not match the 5036 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 5037 </pre></td></tr> 5038 5039 5040 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5041 <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 5042 matches the given matcher. 5043 5044 The associated declaration is: 5045 - for type nodes, the declaration of the underlying type 5046 - for CallExpr, the declaration of the callee 5047 - for MemberExpr, the declaration of the referenced member 5048 - for CXXConstructExpr, the declaration of the constructor 5049 5050 Also usable as Matcher<T> for any T supporting the getDecl() member 5051 function. e.g. various subtypes of clang::Type and various expressions. 5052 5053 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5054 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5055 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5056 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5057 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5058 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5059 </pre></td></tr> 5060 5061 5062 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5063 <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 5064 5065 Given 5066 void (*fp)(void); 5067 The matcher 5068 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 5069 would match the declaration for fp. 5070 </pre></td></tr> 5071 5072 5073 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5074 <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 5075 </pre></td></tr> 5076 5077 5078 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5079 <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 5080 matches the specified matcher. 5081 5082 Example matches y->x() 5083 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 5084 cxxRecordDecl(hasName("Y"))))))) 5085 class Y { public: void x(); }; 5086 void z() { Y *y; y->x(); } 5087 </pre></td></tr> 5088 5089 5090 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5091 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 5092 </pre></td></tr> 5093 5094 5095 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5096 <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 5097 type matches the specified matcher. 5098 5099 Example matches X &x and const X &y 5100 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 5101 class X { 5102 void a(X b) { 5103 X &x = b; 5104 const X &y = b; 5105 } 5106 }; 5107 </pre></td></tr> 5108 5109 5110 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>></td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5111 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 5112 matches the given matcher. 5113 5114 The associated declaration is: 5115 - for type nodes, the declaration of the underlying type 5116 - for CallExpr, the declaration of the callee 5117 - for MemberExpr, the declaration of the referenced member 5118 - for CXXConstructExpr, the declaration of the constructor 5119 5120 Also usable as Matcher<T> for any T supporting the getDecl() member 5121 function. e.g. various subtypes of clang::Type and various expressions. 5122 5123 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5124 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5125 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5126 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5127 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5128 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5129 </pre></td></tr> 5130 5131 5132 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc3')"><a name="pointeeLoc3Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 5133 <tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 5134 pointee matches a given matcher. 5135 5136 Given 5137 int *a; 5138 int const *b; 5139 float const *f; 5140 pointerType(pointee(isConstQualified(), isInteger())) 5141 matches "int const *b" 5142 5143 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5144 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5145 </pre></td></tr> 5146 5147 5148 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>></td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5149 <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 5150 pointee matches a given matcher. 5151 5152 Given 5153 int *a; 5154 int const *b; 5155 float const *f; 5156 pointerType(pointee(isConstQualified(), isInteger())) 5157 matches "int const *b" 5158 5159 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5160 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5161 </pre></td></tr> 5162 5163 5164 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>></td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5165 <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 5166 5167 Given 5168 return a + b; 5169 hasReturnValue(binaryOperator()) 5170 matches 'return a + b' 5171 with binaryOperator() 5172 matching 'a + b' 5173 </pre></td></tr> 5174 5175 5176 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 5177 <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 5178 a given matcher. Also matches StmtExprs that have CompoundStmt as children. 5179 5180 Given 5181 { {}; 1+2; } 5182 hasAnySubstatement(compoundStmt()) 5183 matches '{ {}; 1+2; }' 5184 with compoundStmt() 5185 matching '{}' 5186 </pre></td></tr> 5187 5188 5189 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 5190 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5191 alignof. 5192 </pre></td></tr> 5193 5194 5195 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr> 5196 <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statemenet belongs to 5197 5198 Given: 5199 F& operator=(const F& o) { 5200 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 5201 return *this; 5202 } 5203 returnStmt(forFunction(hasName("operator="))) 5204 matches 'return *this' 5205 but does match 'return > 0' 5206 </pre></td></tr> 5207 5208 5209 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 5210 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5211 sizeof. 5212 </pre></td></tr> 5213 5214 5215 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr> 5216 <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 5217 statement. This matcher may produce multiple matches. 5218 5219 Given 5220 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 5221 switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 5222 matches four times, with "c" binding each of "case 1:", "case 2:", 5223 "case 3:" and "case 4:", and "s" respectively binding "switch (1)", 5224 "switch (1)", "switch (2)" and "switch (2)". 5225 </pre></td></tr> 5226 5227 5228 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5229 <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 5230 switch statement or conditional operator. 5231 5232 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5233 if (true) {} 5234 </pre></td></tr> 5235 5236 5237 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>></td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5238 <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 5239 matches the given matcher. 5240 5241 The associated declaration is: 5242 - for type nodes, the declaration of the underlying type 5243 - for CallExpr, the declaration of the callee 5244 - for MemberExpr, the declaration of the referenced member 5245 - for CXXConstructExpr, the declaration of the constructor 5246 5247 Also usable as Matcher<T> for any T supporting the getDecl() member 5248 function. e.g. various subtypes of clang::Type and various expressions. 5249 5250 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5251 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5252 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5253 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5254 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5255 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5256 </pre></td></tr> 5257 5258 5259 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5260 <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 5261 5262 Given 5263 template<typename T> struct A {}; 5264 struct B { B* next; }; 5265 A<&B::next> a; 5266 templateSpecializationType(hasAnyTemplateArgument( 5267 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 5268 matches the specialization A<&B::next> with fieldDecl(...) matching 5269 B::next 5270 </pre></td></tr> 5271 5272 5273 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5274 <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 5275 declaration. 5276 5277 Given 5278 template<typename T> struct A {}; 5279 struct B { B* next; }; 5280 A<&B::next> a; 5281 classTemplateSpecializationDecl(hasAnyTemplateArgument( 5282 refersToDeclaration(fieldDecl(hasName("next")))) 5283 matches the specialization A<&B::next> with fieldDecl(...) matching 5284 B::next 5285 </pre></td></tr> 5286 5287 5288 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5289 <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 5290 5291 Given 5292 template<int T> struct A {}; 5293 C<42> c; 5294 classTemplateSpecializationDecl( 5295 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 5296 matches the implicit instantiation of C in C<42>. 5297 </pre></td></tr> 5298 5299 5300 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5301 <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 5302 5303 Given 5304 struct X {}; 5305 template<typename T> struct A {}; 5306 A<X> a; 5307 classTemplateSpecializationDecl(hasAnyTemplateArgument( 5308 refersToType(class(hasName("X"))))) 5309 matches the specialization A<X> 5310 </pre></td></tr> 5311 5312 5313 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5314 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one 5315 TemplateArgument matching the given InnerMatcher. 5316 5317 Given 5318 template<typename T> class A {}; 5319 template<> class A<double> {}; 5320 A<int> a; 5321 classTemplateSpecializationDecl(hasAnyTemplateArgument( 5322 refersToType(asString("int")))) 5323 matches the specialization A<int> 5324 </pre></td></tr> 5325 5326 5327 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5328 <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 5329 matches the given matcher. 5330 5331 The associated declaration is: 5332 - for type nodes, the declaration of the underlying type 5333 - for CallExpr, the declaration of the callee 5334 - for MemberExpr, the declaration of the referenced member 5335 - for CXXConstructExpr, the declaration of the constructor 5336 5337 Also usable as Matcher<T> for any T supporting the getDecl() member 5338 function. e.g. various subtypes of clang::Type and various expressions. 5339 5340 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5341 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5342 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5343 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5344 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5345 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5346 </pre></td></tr> 5347 5348 5349 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5350 <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 5351 matches the given InnerMatcher. 5352 5353 Given 5354 template<typename T, typename U> class A {}; 5355 A<bool, int> b; 5356 A<int, bool> c; 5357 classTemplateSpecializationDecl(hasTemplateArgument( 5358 1, refersToType(asString("int")))) 5359 matches the specialization A<bool, int> 5360 </pre></td></tr> 5361 5362 5363 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5364 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 5365 matches the given matcher. 5366 5367 The associated declaration is: 5368 - for type nodes, the declaration of the underlying type 5369 - for CallExpr, the declaration of the callee 5370 - for MemberExpr, the declaration of the referenced member 5371 - for CXXConstructExpr, the declaration of the constructor 5372 5373 Also usable as Matcher<T> for any T supporting the getDecl() member 5374 function. e.g. various subtypes of clang::Type and various expressions. 5375 5376 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5377 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5378 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5379 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5380 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5381 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5382 </pre></td></tr> 5383 5384 5385 <tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<T> Matcher</td></tr> 5386 <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5387 5388 Generates results for each match. 5389 5390 For example, in: 5391 class A { class B {}; class C {}; }; 5392 The matcher: 5393 cxxRecordDecl(hasName("::A"), 5394 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5395 will generate results for A, B and C. 5396 5397 Usable as: Any Matcher 5398 </pre></td></tr> 5399 5400 5401 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5402 <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 5403 matcher. 5404 5405 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5406 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5407 and U (matcher = typedefDecl(hasType(asString("int"))) 5408 class X {}; 5409 void y(X &x) { x; X z; } 5410 typedef int U; 5411 </pre></td></tr> 5412 5413 5414 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>></td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5415 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 5416 matches the given matcher. 5417 5418 The associated declaration is: 5419 - for type nodes, the declaration of the underlying type 5420 - for CallExpr, the declaration of the callee 5421 - for MemberExpr, the declaration of the referenced member 5422 - for CXXConstructExpr, the declaration of the constructor 5423 5424 Also usable as Matcher<T> for any T supporting the getDecl() member 5425 function. e.g. various subtypes of clang::Type and various expressions. 5426 5427 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5428 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5429 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5430 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5431 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5432 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5433 </pre></td></tr> 5434 5435 5436 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5437 <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 5438 5439 Given 5440 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 5441 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 5442 matches sizeof(a) and alignof(c) 5443 </pre></td></tr> 5444 5445 5446 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5447 <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 5448 5449 Example matches true (matcher = hasUnaryOperand( 5450 cxxBoolLiteral(equals(true)))) 5451 !true 5452 </pre></td></tr> 5453 5454 5455 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>></td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5456 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 5457 matches the given matcher. 5458 5459 The associated declaration is: 5460 - for type nodes, the declaration of the underlying type 5461 - for CallExpr, the declaration of the callee 5462 - for MemberExpr, the declaration of the referenced member 5463 - for CXXConstructExpr, the declaration of the constructor 5464 5465 Also usable as Matcher<T> for any T supporting the getDecl() member 5466 function. e.g. various subtypes of clang::Type and various expressions. 5467 5468 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5469 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5470 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5471 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5472 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5473 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5474 </pre></td></tr> 5475 5476 5477 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>></td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 5478 <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 5479 5480 Given 5481 namespace X { void b(); } 5482 using X::b; 5483 usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 5484 matches using X::b </pre></td></tr> 5485 5486 5487 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>></td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 5488 <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 5489 matched by the given matcher. 5490 5491 Given 5492 namespace X { int a; void b(); } 5493 using X::a; 5494 using X::b; 5495 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 5496 matches using X::b but not using X::a </pre></td></tr> 5497 5498 5499 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5500 <tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 5501 declaration's type. 5502 5503 In case of a value declaration (for example a variable declaration), 5504 this resolves one layer of indirection. For example, in the value 5505 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5506 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5507 declaration of x. 5508 5509 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5510 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5511 class X {}; 5512 void y(X &x) { x; X z; } 5513 5514 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> 5515 </pre></td></tr> 5516 5517 5518 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5519 <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 5520 matcher. 5521 5522 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5523 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5524 and U (matcher = typedefDecl(hasType(asString("int"))) 5525 class X {}; 5526 void y(X &x) { x; X z; } 5527 typedef int U; 5528 </pre></td></tr> 5529 5530 5531 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5532 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 5533 that matches the given matcher. 5534 5535 Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 5536 bool y() { return true; } 5537 bool x = y(); 5538 </pre></td></tr> 5539 5540 5541 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>></td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5542 <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 5543 expression. 5544 5545 Given 5546 void f(int b) { 5547 int a[b]; 5548 } 5549 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 5550 varDecl(hasName("b"))))))) 5551 matches "int a[b]" 5552 </pre></td></tr> 5553 5554 5555 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 5556 <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 5557 definition that has a given body. 5558 5559 Given 5560 for (;;) {} 5561 hasBody(compoundStmt()) 5562 matches 'for (;;) {}' 5563 with compoundStmt() 5564 matching '{}' 5565 </pre></td></tr> 5566 5567 5568 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5569 <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 5570 switch statement or conditional operator. 5571 5572 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5573 if (true) {} 5574 </pre></td></tr> 5575 5576 5577 <tr><td>Matcher<internal::BindableMatcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>></td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 5578 <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 5579 NestedNameSpecifier-matcher matches. 5580 </pre></td></tr> 5581 5582 5583 <tr><td>Matcher<internal::BindableMatcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>></td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5584 <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 5585 QualType-matcher matches. 5586 </pre></td></tr> 5587 5588 <!--END_TRAVERSAL_MATCHERS --> 5589 </table> 5590 5591 </div> 5592 </body> 5593 </html> 5594 5595 5596