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('ctorInitializer0')"><a name="ctorInitializer0Anchor">ctorInitializer</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="ctorInitializer0"><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('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</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="constructorDecl0"><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('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 161 <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 162 163 Examples matches X, C, and the friend declaration inside C; 164 void X(); 165 class C { 166 friend X; 167 }; 168 </pre></td></tr> 169 170 171 <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> 172 <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 173 and non-type template parameter declarations). 174 175 Given 176 class X { int y; }; 177 declaratorDecl() 178 matches int y. 179 </pre></td></tr> 180 181 182 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 183 <tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations. 184 185 Example matches Foo::~Foo() 186 class Foo { 187 public: 188 virtual ~Foo(); 189 }; 190 </pre></td></tr> 191 192 193 <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> 194 <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 195 196 Example matches A, B, C 197 enum X { 198 A, B, C 199 }; 200 </pre></td></tr> 201 202 203 <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> 204 <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 205 206 Example matches X 207 enum X { 208 A, B, C 209 }; 210 </pre></td></tr> 211 212 213 <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> 214 <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 215 216 Given 217 class X { int m; }; 218 fieldDecl() 219 matches 'm'. 220 </pre></td></tr> 221 222 223 <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> 224 <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 225 226 Given 227 class X { friend void foo(); }; 228 friendDecl() 229 matches 'friend void foo()'. 230 </pre></td></tr> 231 232 233 <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> 234 <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 235 236 Example matches f 237 void f(); 238 </pre></td></tr> 239 240 241 <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> 242 <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 243 244 Example matches f 245 template<class T> void f(T t) {} 246 </pre></td></tr> 247 248 249 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 250 <tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations. 251 252 Example matches y 253 class X { void y(); }; 254 </pre></td></tr> 255 256 257 <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> 258 <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 259 260 Example matches X, S, the anonymous union type, i, and U; 261 typedef int X; 262 struct S { 263 union { 264 int i; 265 } U; 266 }; 267 </pre></td></tr> 268 269 270 <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> 271 <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 272 273 Given 274 namespace {} 275 namespace test {} 276 namespaceDecl() 277 matches "namespace {}" and "namespace test {}" 278 </pre></td></tr> 279 280 281 <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> 282 <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 283 284 Given 285 void f(int x); 286 parmVarDecl() 287 matches int x. 288 </pre></td></tr> 289 290 291 <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_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 292 <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations. 293 294 Example matches X, Z 295 class X; 296 template<class T> class Z {}; 297 </pre></td></tr> 298 299 300 <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> 301 <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 302 303 Given 304 template<typename X> 305 class C : private X { 306 using X::x; 307 }; 308 unresolvedUsingValueDecl() 309 matches using X::x </pre></td></tr> 310 311 312 <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> 313 <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 314 315 Given 316 namespace X { int x; } 317 using X::x; 318 usingDecl() 319 matches using X::x </pre></td></tr> 320 321 322 <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> 323 <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 324 325 Note: this does not match declarations of member variables, which are 326 "field" declarations in Clang parlance. 327 328 Example matches a 329 int a; 330 </pre></td></tr> 331 332 333 <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> 334 <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 335 </pre></td></tr> 336 337 338 <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> 339 <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 340 341 Given 342 namespace ns { 343 struct A { static void f(); }; 344 void A::f() {} 345 void g() { A::f(); } 346 } 347 ns::A a; 348 nestedNameSpecifier() 349 matches "ns::" and both "A::" 350 </pre></td></tr> 351 352 353 <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> 354 <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 355 </pre></td></tr> 356 357 358 <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> 359 <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 360 361 Given 362 int i = a[1]; 363 arraySubscriptExpr() 364 matches "a[1]" 365 </pre></td></tr> 366 367 368 <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> 369 <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 370 371 int i = 100; 372 __asm("mov al, 2"); 373 asmStmt() 374 matches '__asm("mov al, 2")' 375 </pre></td></tr> 376 377 378 <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> 379 <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 380 381 Example matches a || b 382 !(a || b) 383 </pre></td></tr> 384 385 386 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 387 <tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 388 389 Example matches FunctionTakesString(GetStringByValue()) 390 (matcher = bindTemporaryExpr()) 391 FunctionTakesString(GetStringByValue()); 392 FunctionTakesStringByPointer(GetStringPointer()); 393 </pre></td></tr> 394 395 396 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 397 <tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals. 398 399 Example matches true 400 true 401 </pre></td></tr> 402 403 404 <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> 405 <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 406 407 Given 408 while (true) { break; } 409 breakStmt() 410 matches 'break' 411 </pre></td></tr> 412 413 414 <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> 415 <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 416 417 Example: Matches (int*) 2.2f in 418 int i = (int) 2.2f; 419 </pre></td></tr> 420 421 422 <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> 423 <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 424 425 Example matches x.y() and y() 426 X x; 427 x.y(); 428 y(); 429 </pre></td></tr> 430 431 432 <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> 433 <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 434 435 Given 436 switch(a) { case 42: break; default: break; } 437 caseStmt() 438 matches 'case 42: break;'. 439 </pre></td></tr> 440 441 442 <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> 443 <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 444 445 Example: castExpr() matches each of the following: 446 (int) 3; 447 const_cast<Expr *>(SubExpr); 448 char c = 0; 449 but does not match 450 int i = (0); 451 int k = 0; 452 </pre></td></tr> 453 454 455 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('catchStmt0')"><a name="catchStmt0Anchor">catchStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 456 <tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements. 457 458 try {} catch(int i) {} 459 catchStmt() 460 matches 'catch(int i)' 461 </pre></td></tr> 462 463 464 <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> 465 <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 466 467 Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 468 though. 469 470 Example matches 'a', L'a' 471 char ch = 'a'; wchar_t chw = L'a'; 472 </pre></td></tr> 473 474 475 <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> 476 <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 477 478 Example match: {1}, (1, 2) 479 int array[4] = {1}; vector int myvec = (vector int)(1, 2); 480 </pre></td></tr> 481 482 483 <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> 484 <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 485 486 Example matches '{}' and '{{}}'in 'for (;;) {{}}' 487 for (;;) {{}} 488 </pre></td></tr> 489 490 491 <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> 492 <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 493 494 Example matches a ? b : c 495 (a ? b : c) + 42 496 </pre></td></tr> 497 498 499 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 500 <tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression. 501 502 Example: Matches const_cast<int*>(&r) in 503 int n = 42; 504 const int &r(n); 505 int* p = const_cast<int*>(&r); 506 </pre></td></tr> 507 508 509 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 510 <tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones). 511 512 Example matches string(ptr, n) and ptr within arguments of f 513 (matcher = constructExpr()) 514 void f(const string &a, const string &b); 515 char *ptr; 516 int n; 517 f(string(ptr, n), ptr); 518 </pre></td></tr> 519 520 521 <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> 522 <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 523 524 Given 525 while (true) { continue; } 526 continueStmt() 527 matches 'continue' 528 </pre></td></tr> 529 530 531 <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> 532 <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 533 534 Example matches x in if (x) 535 bool x; 536 if (x) {} 537 </pre></td></tr> 538 539 540 <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> 541 <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 542 543 Given 544 int a; 545 declStmt() 546 matches 'int a'. 547 </pre></td></tr> 548 549 550 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 551 <tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site. 552 553 Example matches the CXXDefaultArgExpr placeholder inserted for the 554 default value of the second parameter in the call expression f(42) 555 (matcher = defaultArgExpr()) 556 void f(int x, int y = 0); 557 f(42); 558 </pre></td></tr> 559 560 561 <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> 562 <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 563 564 Given 565 switch(a) { case 42: break; default: break; } 566 defaultStmt() 567 matches 'default: break;'. 568 </pre></td></tr> 569 570 571 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 572 <tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions. 573 574 Given 575 delete X; 576 deleteExpr() 577 matches 'delete X'. 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('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 582 <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 583 584 Given 585 do {} while (true); 586 doStmt() 587 matches 'do {} while(true)' 588 </pre></td></tr> 589 590 591 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 592 <tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression. 593 594 Example: 595 dynamicCastExpr() 596 matches 597 dynamic_cast<D*>(&b); 598 in 599 struct B { virtual ~B() {} }; struct D : B {}; 600 B b; 601 D* p = dynamic_cast<D*>(&b); 602 </pre></td></tr> 603 604 605 <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> 606 <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 607 608 Matches any cast expression written in user code, whether it be a 609 C-style cast, a functional-style cast, or a keyword cast. 610 611 Does not match implicit conversions. 612 613 Note: the name "explicitCast" is chosen to match Clang's terminology, as 614 Clang uses the term "cast" to apply to implicit conversions as well as to 615 actual cast expressions. 616 617 hasDestinationType. 618 619 Example: matches all five of the casts in 620 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 621 but does not match the implicit conversion in 622 long ell = 42; 623 </pre></td></tr> 624 625 626 <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> 627 <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 628 629 Example matches x() 630 void f() { x(); } 631 </pre></td></tr> 632 633 634 <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> 635 <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 636 of the sub-expression's evaluation. 637 638 Example matches std::string() 639 const std::string str = std::string(); 640 </pre></td></tr> 641 642 643 <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> 644 <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g. 645 1.0, 1.0f, 1.0L and 1e10. 646 647 Does not match implicit conversions such as 648 float a = 10; 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('forRangeStmt0')"><a name="forRangeStmt0Anchor">forRangeStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 653 <tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements. 654 655 forRangeStmt() matches 'for (auto a : i)' 656 int i[] = {1, 2, 3}; for (auto a : i); 657 for(int j = 0; j < 5; ++j); 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('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 662 <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 663 664 Example matches 'for (;;) {}' 665 for (;;) {} 666 int i[] = {1, 2, 3}; for (auto a : i); 667 </pre></td></tr> 668 669 670 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 671 <tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions 672 673 Example: Matches Foo(bar); 674 Foo f = bar; 675 Foo g = (Foo) bar; 676 Foo h = Foo(bar); 677 </pre></td></tr> 678 679 680 <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> 681 <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 682 683 Given 684 goto FOO; 685 FOO: bar(); 686 gotoStmt() 687 matches 'goto FOO' 688 </pre></td></tr> 689 690 691 <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> 692 <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 693 694 Example matches 'if (x) {}' 695 if (x) {} 696 </pre></td></tr> 697 698 699 <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> 700 <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 701 702 This matches many different places, including function call return value 703 eliding, as well as any type conversions. 704 </pre></td></tr> 705 706 707 <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> 708 <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 709 710 Given 711 int a[] = { 1, 2 }; 712 struct B { int x, y; }; 713 B b = { 5, 6 }; 714 initList() 715 matches "{ 1, 2 }" and "{ 5, 6 }" 716 </pre></td></tr> 717 718 719 <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> 720 <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g. 721 1, 1L, 0x1 and 1U. 722 723 Does not match character-encoded integers such as L'a'. 724 </pre></td></tr> 725 726 727 <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> 728 <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 729 730 Given 731 goto FOO; 732 FOO: bar(); 733 labelStmt() 734 matches 'FOO:' 735 </pre></td></tr> 736 737 738 <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> 739 <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 740 741 Example matches [&](){return 5;} 742 [&](){return 5;} 743 </pre></td></tr> 744 745 746 <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> 747 <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 748 749 Example: Given 750 struct T {void func()}; 751 T f(); 752 void g(T); 753 materializeTemporaryExpr() matches 'f()' in these statements 754 T u(f()); 755 g(f()); 756 but does not match 757 f(); 758 f().func(); 759 </pre></td></tr> 760 761 762 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 763 <tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions. 764 765 Example matches x.y() 766 X x; 767 x.y(); 768 </pre></td></tr> 769 770 771 <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> 772 <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 773 774 Given 775 class Y { 776 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 777 int a; static int b; 778 }; 779 memberExpr() 780 matches this->x, x, y.x, a, this->b 781 </pre></td></tr> 782 783 784 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 785 <tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions. 786 787 Given 788 new X; 789 newExpr() 790 matches 'new X'. 791 </pre></td></tr> 792 793 794 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullPtrLiteralExpr0')"><a name="nullPtrLiteralExpr0Anchor">nullPtrLiteralExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 795 <tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal. 796 </pre></td></tr> 797 798 799 <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> 800 <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 801 802 foo();; 803 nullStmt() 804 matches the second ';' 805 </pre></td></tr> 806 807 808 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 809 <tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls. 810 811 Note that if an operator isn't overloaded, it won't match. Instead, use 812 binaryOperator matcher. 813 Currently it does not match operators such as new delete. 814 FIXME: figure out why these do not match? 815 816 Example matches both operator<<((o << b), c) and operator<<(o, b) 817 (matcher = operatorCallExpr()) 818 ostream &operator<< (ostream &out, int i) { }; 819 ostream &o; int b = 1, c = 1; 820 o << b << c; 821 </pre></td></tr> 822 823 824 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 825 <tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 826 827 Either the source expression or the destination type can be matched 828 using has(), but hasDestinationType() is more specific and can be 829 more readable. 830 831 Example matches reinterpret_cast<char*>(&p) in 832 void* p = reinterpret_cast<char*>(&p); 833 </pre></td></tr> 834 835 836 <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> 837 <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 838 839 Given 840 return 1; 841 returnStmt() 842 matches 'return 1' 843 </pre></td></tr> 844 845 846 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 847 <tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression. 848 849 hasDestinationType 850 reinterpretCast 851 852 Example: 853 staticCastExpr() 854 matches 855 static_cast<long>(8) 856 in 857 long eight(static_cast<long>(8)); 858 </pre></td></tr> 859 860 861 <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> 862 <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 863 864 Given 865 { ++a; } 866 stmt() 867 matches both the compound statement '{ ++a; }' and '++a'. 868 </pre></td></tr> 869 870 871 <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> 872 <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 873 874 Example matches "abcd", L"abcd" 875 char *s = "abcd"; wchar_t *ws = L"abcd" 876 </pre></td></tr> 877 878 879 <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> 880 <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 881 882 Given 883 switch(a) { case 42: break; default: break; } 884 switchCase() 885 matches 'case 42: break;' and 'default: break;'. 886 </pre></td></tr> 887 888 889 <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> 890 <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 891 892 Given 893 switch(a) { case 42: break; default: break; } 894 switchStmt() 895 matches 'switch(a)'. 896 </pre></td></tr> 897 898 899 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('temporaryObjectExpr0')"><a name="temporaryObjectExpr0Anchor">temporaryObjectExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 900 <tr><td colspan="4" class="doc" id="temporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 901 902 Example: Matches Foo(bar, bar) 903 Foo h = Foo(bar, bar); 904 </pre></td></tr> 905 906 907 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('thisExpr0')"><a name="thisExpr0Anchor">thisExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 908 <tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions. 909 910 Example matches the implicit this expression in "return i". 911 (matcher = thisExpr()) 912 struct foo { 913 int i; 914 int f() { return i; } 915 }; 916 </pre></td></tr> 917 918 919 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('throwExpr0')"><a name="throwExpr0Anchor">throwExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 920 <tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions. 921 922 try { throw 5; } catch(int i) {} 923 throwExpr() 924 matches 'throw 5' 925 </pre></td></tr> 926 927 928 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('tryStmt0')"><a name="tryStmt0Anchor">tryStmt</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 929 <tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements. 930 931 try {} catch(int i) {} 932 tryStmt() 933 matches 'try {}' 934 </pre></td></tr> 935 936 937 <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> 938 <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 939 940 Given 941 Foo x = bar; 942 int y = sizeof(x) + alignof(x); 943 unaryExprOrTypeTraitExpr() 944 matches sizeof(x) and alignof(x) 945 </pre></td></tr> 946 947 948 <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> 949 <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 950 951 Example matches !a 952 !a || b 953 </pre></td></tr> 954 955 956 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedConstructExpr0')"><a name="unresolvedConstructExpr0Anchor">unresolvedConstructExpr</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 957 <tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 958 959 Example matches T(t) in return statement of f 960 (matcher = unresolvedConstructExpr()) 961 template <typename T> 962 void f(const T& t) { return T(t); } 963 </pre></td></tr> 964 965 966 <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> 967 <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 968 969 Example match: "foo"_suffix 970 </pre></td></tr> 971 972 973 <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> 974 <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 975 976 Given 977 while (true) {} 978 whileStmt() 979 matches 'while (true) {}'. 980 </pre></td></tr> 981 982 983 <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> 984 <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 985 </pre></td></tr> 986 987 988 <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> 989 <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 990 991 Given 992 int a[] = { 2, 3 }; 993 int b[4]; 994 void f() { int c[a[0]]; } 995 arrayType() 996 matches "int a[]", "int b[4]" and "int c[a[0]]"; 997 </pre></td></tr> 998 999 1000 <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> 1001 <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1002 1003 Given 1004 _Atomic(int) i; 1005 atomicType() 1006 matches "_Atomic(int) i" 1007 </pre></td></tr> 1008 1009 1010 <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> 1011 <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1012 1013 Given: 1014 auto n = 4; 1015 int v[] = { 2, 3 } 1016 for (auto i : v) { } 1017 autoType() 1018 matches "auto n" and "auto i" 1019 </pre></td></tr> 1020 1021 1022 <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> 1023 <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1024 "void (^)(int)". 1025 1026 The pointee is always required to be a FunctionType. 1027 </pre></td></tr> 1028 1029 1030 <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> 1031 <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1032 1033 Given 1034 struct A {}; 1035 A a; 1036 int b; 1037 float c; 1038 bool d; 1039 builtinType() 1040 matches "int b", "float c" and "bool d" 1041 </pre></td></tr> 1042 1043 1044 <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> 1045 <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1046 1047 Given 1048 _Complex float f; 1049 complexType() 1050 matches "_Complex float f" 1051 </pre></td></tr> 1052 1053 1054 <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> 1055 <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1056 1057 Given 1058 void() { 1059 int a[2]; 1060 int b[] = { 2, 3 }; 1061 int c[b[0]]; 1062 } 1063 constantArrayType() 1064 matches "int a[2]" 1065 </pre></td></tr> 1066 1067 1068 <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> 1069 <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1070 1071 Given 1072 template<typename T, int Size> 1073 class array { 1074 T data[Size]; 1075 }; 1076 dependentSizedArrayType 1077 matches "T data[Size]" 1078 </pre></td></tr> 1079 1080 1081 <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> 1082 <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1083 qualified name. 1084 1085 Given 1086 namespace N { 1087 namespace M { 1088 class D {}; 1089 } 1090 } 1091 class C {}; 1092 1093 class C c; 1094 N::M::D d; 1095 1096 elaboratedType() matches the type of the variable declarations of both 1097 c and d. 1098 </pre></td></tr> 1099 1100 1101 <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> 1102 <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1103 1104 Given 1105 int (*f)(int); 1106 void g(); 1107 functionType() 1108 matches "int (*f)(int)" and the type of "g". 1109 </pre></td></tr> 1110 1111 1112 <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> 1113 <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1114 1115 Given 1116 int a[] = { 2, 3 }; 1117 int b[42]; 1118 void f(int c[]) { int d[a[0]]; }; 1119 incompleteArrayType() 1120 matches "int a[]" and "int c[]" 1121 </pre></td></tr> 1122 1123 1124 <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> 1125 <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1126 1127 Given: 1128 int *a; 1129 int &b = *a; 1130 int &&c = 1; 1131 auto &d = b; 1132 auto &&e = c; 1133 auto &&f = 2; 1134 int g = 5; 1135 1136 lValueReferenceType() matches the types of b, d, and e. e is 1137 matched since the type is deduced as int& by reference collapsing rules. 1138 </pre></td></tr> 1139 1140 1141 <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> 1142 <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1143 Given 1144 struct A { int i; } 1145 A::* ptr = A::i; 1146 memberPointerType() 1147 matches "A::* ptr" 1148 </pre></td></tr> 1149 1150 1151 <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> 1152 <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1153 1154 Given 1155 int (*ptr_to_array)[4]; 1156 int *array_of_ptrs[4]; 1157 1158 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1159 array_of_ptrs. 1160 </pre></td></tr> 1161 1162 1163 <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> 1164 <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types. 1165 1166 Given 1167 int *a; 1168 int &b = *a; 1169 int c = 5; 1170 pointerType() 1171 matches "int *a" 1172 </pre></td></tr> 1173 1174 1175 <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> 1176 <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1177 1178 Given: 1179 int *a; 1180 int &b = *a; 1181 int &&c = 1; 1182 auto &d = b; 1183 auto &&e = c; 1184 auto &&f = 2; 1185 int g = 5; 1186 1187 rValueReferenceType() matches the types of c and f. e is not 1188 matched as it is deduced to int& by reference collapsing rules. 1189 </pre></td></tr> 1190 1191 1192 <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> 1193 <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1194 1195 Given 1196 class C {}; 1197 struct S {}; 1198 1199 C c; 1200 S s; 1201 1202 recordType() matches the type of the variable declarations of both c 1203 and s. 1204 </pre></td></tr> 1205 1206 1207 <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> 1208 <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 1209 1210 Given 1211 int *a; 1212 int &b = *a; 1213 int &&c = 1; 1214 auto &d = b; 1215 auto &&e = c; 1216 auto &&f = 2; 1217 int g = 5; 1218 1219 referenceType() matches the types of b, c, d, e, and f. 1220 </pre></td></tr> 1221 1222 1223 <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> 1224 <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 1225 1226 Given 1227 template <typename T> 1228 class C { }; 1229 1230 template class C<int>; A 1231 C<char> var; B 1232 1233 templateSpecializationType() matches the type of the explicit 1234 instantiation in A and the type of the variable declaration in B. 1235 </pre></td></tr> 1236 1237 1238 <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> 1239 <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 1240 </pre></td></tr> 1241 1242 1243 <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> 1244 <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 1245 1246 Given 1247 typedef int X; 1248 typedefType() 1249 matches "typedef int X" 1250 </pre></td></tr> 1251 1252 1253 <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> 1254 <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 1255 1256 Given: 1257 typedef __underlying_type(T) type; 1258 unaryTransformType() 1259 matches "__underlying_type(T)" 1260 </pre></td></tr> 1261 1262 1263 <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> 1264 <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 1265 integer-constant-expression. 1266 1267 Given 1268 void f() { 1269 int a[] = { 2, 3 } 1270 int b[42]; 1271 int c[a[0]]; 1272 variableArrayType() 1273 matches "int c[a[0]]" 1274 </pre></td></tr> 1275 1276 <!--END_DECL_MATCHERS --> 1277 </table> 1278 1279 <!-- ======================================================================= --> 1280 <h2 id="narrowing-matchers">Narrowing Matchers</h2> 1281 <!-- ======================================================================= --> 1282 1283 <p>Narrowing matchers match certain attributes on the current node, thus 1284 narrowing down the set of nodes of the current type to match on.</p> 1285 1286 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 1287 which allow users to create more powerful match expressions.</p> 1288 1289 <table> 1290 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 1291 <!-- START_NARROWING_MATCHERS --> 1292 1293 <tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1294 <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 1295 1296 Usable as: Any Matcher 1297 </pre></td></tr> 1298 1299 1300 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1301 <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 1302 1303 Usable as: Any Matcher 1304 </pre></td></tr> 1305 1306 1307 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 1308 <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 1309 1310 Useful when another matcher requires a child matcher, but there's no 1311 additional constraint. This will often be used with an explicit conversion 1312 to an internal::Matcher<> type such as TypeMatcher. 1313 1314 Example: DeclarationMatcher(anything()) matches all declarations, e.g., 1315 "int* p" and "void f()" in 1316 int* p; 1317 void f(); 1318 1319 Usable as: Any Matcher 1320 </pre></td></tr> 1321 1322 1323 <tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 1324 <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 1325 1326 Example matches Y (matcher = recordDecl(unless(hasName("X")))) 1327 class X {}; 1328 class Y {}; 1329 1330 Usable as: Any Matcher 1331 </pre></td></tr> 1332 1333 1334 <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> 1335 <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 1336 unary). 1337 1338 Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 1339 !(a || b) 1340 </pre></td></tr> 1341 1342 1343 <tr><td>Matcher<CXXBoolLiteral></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr> 1344 <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value. 1345 1346 Example matches true (matcher = boolLiteral(equals(true))) 1347 true 1348 1349 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1350 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>> 1351 </pre></td></tr> 1352 1353 1354 <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> 1355 <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 1356 a specific number of arguments (including absent default arguments). 1357 1358 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 1359 void f(int x, int y); 1360 f(0, 0); 1361 </pre></td></tr> 1362 1363 1364 <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> 1365 <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 1366 </pre></td></tr> 1367 1368 1369 <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> 1370 <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 1371 code (as opposed to implicitly added by the compiler). 1372 1373 Given 1374 struct Foo { 1375 Foo() { } 1376 Foo(int) : foo_("A") { } 1377 string foo_; 1378 }; 1379 constructorDecl(hasAnyConstructorInitializer(isWritten())) 1380 will match Foo(int), but not Foo() 1381 </pre></td></tr> 1382 1383 1384 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 1385 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 1386 1387 Matches overloaded operator names specified in strings without the 1388 "operator" prefix: e.g. "<<". 1389 1390 Given: 1391 class A { int operator*(); }; 1392 const A &operator<<(const A &a, const A &b); 1393 A a; 1394 a << a; <-- This matches 1395 1396 operatorCallExpr(hasOverloadedOperatorName("<<"))) matches the specified 1397 line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches 1398 the declaration of A. 1399 1400 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_1CXXMethodDecl.html">CXXMethodDecl</a>> 1401 </pre></td></tr> 1402 1403 1404 <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> 1405 <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 1406 1407 Given 1408 struct A { 1409 void foo() const; 1410 void bar(); 1411 }; 1412 1413 methodDecl(isConst()) matches A::foo() but not A::bar() 1414 </pre></td></tr> 1415 1416 1417 <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> 1418 <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 1419 1420 Given 1421 class A { 1422 public: 1423 virtual void x(); 1424 }; 1425 class B : public A { 1426 public: 1427 virtual void x(); 1428 }; 1429 matches B::x 1430 </pre></td></tr> 1431 1432 1433 <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> 1434 <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 1435 1436 Given 1437 class A { 1438 public: 1439 virtual void x() = 0; 1440 }; 1441 matches A::x 1442 </pre></td></tr> 1443 1444 1445 <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> 1446 <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual. 1447 1448 Given 1449 class A { 1450 public: 1451 virtual void x(); 1452 }; 1453 matches A::x 1454 </pre></td></tr> 1455 1456 1457 <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> 1458 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 1459 1460 Matches overloaded operator names specified in strings without the 1461 "operator" prefix: e.g. "<<". 1462 1463 Given: 1464 class A { int operator*(); }; 1465 const A &operator<<(const A &a, const A &b); 1466 A a; 1467 a << a; <-- This matches 1468 1469 operatorCallExpr(hasOverloadedOperatorName("<<"))) matches the specified 1470 line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches 1471 the declaration of A. 1472 1473 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_1CXXMethodDecl.html">CXXMethodDecl</a>> 1474 </pre></td></tr> 1475 1476 1477 <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>StringRef BaseName</td></tr> 1478 <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 1479 </pre></td></tr> 1480 1481 1482 <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> 1483 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 1484 static member variable template instantiations. 1485 1486 Given 1487 template<typename T> void A(T t) { } 1488 template<> void A(int N) { } 1489 functionDecl(isExplicitTemplateSpecialization()) 1490 matches the specialization A<int>(). 1491 1492 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>> 1493 </pre></td></tr> 1494 1495 1496 <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>StringRef BaseName</td></tr> 1497 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for 1498 isSameOrDerivedFrom(hasName(...)). 1499 </pre></td></tr> 1500 1501 1502 <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> 1503 <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 1504 member variable template instantiations. 1505 1506 Given 1507 template <typename T> class X {}; class A {}; X<A> x; 1508 or 1509 template <typename T> class X {}; class A {}; template class X<A>; 1510 recordDecl(hasName("::X"), isTemplateInstantiation()) 1511 matches the template instantiation of X<A>. 1512 1513 But given 1514 template <typename T> class X {}; class A {}; 1515 template <> class X<A> {}; X<A> x; 1516 recordDecl(hasName("::X"), isTemplateInstantiation()) 1517 does not match, as X<A> is an explicit template specialization. 1518 1519 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>> 1520 </pre></td></tr> 1521 1522 1523 <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> 1524 <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 1525 a specific number of arguments (including absent default arguments). 1526 1527 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 1528 void f(int x, int y); 1529 f(0, 0); 1530 </pre></td></tr> 1531 1532 1533 <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> 1534 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value. 1535 1536 Example matches true (matcher = boolLiteral(equals(true))) 1537 true 1538 1539 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1540 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>> 1541 </pre></td></tr> 1542 1543 1544 <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> 1545 <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 1546 child statements. 1547 1548 Example: Given 1549 { for (;;) {} } 1550 compoundStmt(statementCountIs(0))) 1551 matches '{}' 1552 but does not match the outer compound statement. 1553 </pre></td></tr> 1554 1555 1556 <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> 1557 <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size. 1558 1559 Given 1560 int a[42]; 1561 int b[2 * 21]; 1562 int c[41], d[43]; 1563 constantArrayType(hasSize(42)) 1564 matches "int a[42]" and "int b[2 * 21]" 1565 </pre></td></tr> 1566 1567 1568 <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> 1569 <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 1570 declarations. 1571 1572 Example: Given 1573 int a, b; 1574 int c; 1575 int d = 2, e; 1576 declCountIs(2) 1577 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 1578 </pre></td></tr> 1579 1580 1581 <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> 1582 <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 1583 1584 Matches a node if it equals the node previously bound to ID. 1585 1586 Given 1587 class X { int a; int b; }; 1588 recordDecl( 1589 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 1590 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 1591 matches the class X, as a and b have the same type. 1592 1593 Note that when multiple matches are involved via forEach* matchers, 1594 equalsBoundNodes acts as a filter. 1595 For example: 1596 compoundStmt( 1597 forEachDescendant(varDecl().bind("d")), 1598 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 1599 will trigger a match for each combination of variable declaration 1600 and reference to that variable declaration within a compound statement. 1601 </pre></td></tr> 1602 1603 1604 <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>Decl *Node</td></tr> 1605 <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 1606 1607 Decl has pointer identity in the AST. 1608 </pre></td></tr> 1609 1610 1611 <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> 1612 <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 1613 by the compiler (eg. implicit defaultcopy constructors). 1614 </pre></td></tr> 1615 1616 1617 <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> 1618 <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. 1619 1620 Given 1621 class C { 1622 public: int a; 1623 protected: int b; 1624 private: int c; 1625 }; 1626 fieldDecl(isPrivate()) 1627 matches 'int c;' 1628 </pre></td></tr> 1629 1630 1631 <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> 1632 <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations. 1633 1634 Given 1635 class C { 1636 public: int a; 1637 protected: int b; 1638 private: int c; 1639 }; 1640 fieldDecl(isProtected()) 1641 matches 'int b;' 1642 </pre></td></tr> 1643 1644 1645 <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> 1646 <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations. 1647 1648 Given 1649 class C { 1650 public: int a; 1651 protected: int b; 1652 private: int c; 1653 }; 1654 fieldDecl(isPublic()) 1655 matches 'int a;' 1656 </pre></td></tr> 1657 1658 1659 <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> 1660 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value. 1661 1662 Example matches true (matcher = boolLiteral(equals(true))) 1663 true 1664 1665 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1666 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>> 1667 </pre></td></tr> 1668 1669 1670 <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> 1671 <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 1672 1673 Example matches A, va, fa 1674 class A {}; 1675 class B; Doesn't match, as it has no body. 1676 int va; 1677 extern int vb; Doesn't match, as it doesn't define the variable. 1678 void fa() {} 1679 void fb(); Doesn't match, as it has no body. 1680 1681 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>> 1682 </pre></td></tr> 1683 1684 1685 <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> 1686 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 1687 static member variable template instantiations. 1688 1689 Given 1690 template<typename T> void A(T t) { } 1691 template<> void A(int N) { } 1692 functionDecl(isExplicitTemplateSpecialization()) 1693 matches the specialization A<int>(). 1694 1695 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>> 1696 </pre></td></tr> 1697 1698 1699 <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> 1700 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations. 1701 1702 Given: 1703 extern "C" void f() {} 1704 extern "C" { void g() {} } 1705 void h() {} 1706 functionDecl(isExternC()) 1707 matches the declaration of f and g, but not the declaration h 1708 </pre></td></tr> 1709 1710 1711 <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> 1712 <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 1713 member variable template instantiations. 1714 1715 Given 1716 template <typename T> class X {}; class A {}; X<A> x; 1717 or 1718 template <typename T> class X {}; class A {}; template class X<A>; 1719 recordDecl(hasName("::X"), isTemplateInstantiation()) 1720 matches the template instantiation of X<A>. 1721 1722 But given 1723 template <typename T> class X {}; class A {}; 1724 template <> class X<A> {}; X<A> x; 1725 recordDecl(hasName("::X"), isTemplateInstantiation()) 1726 does not match, as X<A> is an explicit template specialization. 1727 1728 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>> 1729 </pre></td></tr> 1730 1731 1732 <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> 1733 <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count. 1734 1735 Given 1736 void f(int i) {} 1737 void g(int i, int j) {} 1738 functionDecl(parameterCountIs(2)) 1739 matches g(int i, int j) {} 1740 </pre></td></tr> 1741 1742 1743 <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> 1744 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value. 1745 1746 Example matches true (matcher = boolLiteral(equals(true))) 1747 true 1748 1749 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1750 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>> 1751 </pre></td></tr> 1752 1753 1754 <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> 1755 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 1756 to '.'. 1757 1758 Member calls on the implicit this pointer match as called with '->'. 1759 1760 Given 1761 class Y { 1762 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1763 int a; 1764 static int b; 1765 }; 1766 memberExpr(isArrow()) 1767 matches this->x, x, y.x, a, this->b 1768 </pre></td></tr> 1769 1770 1771 <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> 1772 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 1773 1774 Supports specifying enclosing namespaces or classes by prefixing the name 1775 with '<enclosing>::'. 1776 Does not match typedefs of an underlying type with the given name. 1777 1778 Example matches X (Name == "X") 1779 class X; 1780 1781 Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 1782 namespace a { namespace b { class X; } } 1783 </pre></td></tr> 1784 1785 1786 <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> 1787 <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 1788 a substring matched by the given RegExp. 1789 1790 Supports specifying enclosing namespaces or classes by 1791 prefixing the name with '<enclosing>::'. Does not match typedefs 1792 of an underlying type with the given name. 1793 1794 Example matches X (regexp == "::X") 1795 class X; 1796 1797 Example matches X (regexp is one of "::X", "^foo::.*X", among others) 1798 namespace foo { namespace bar { class X; } } 1799 </pre></td></tr> 1800 1801 1802 <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> 1803 <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 1804 1805 Given 1806 class Y { public: void x(); }; 1807 void z() { Y* y; y->x(); } 1808 callExpr(on(hasType(asString("class Y *")))) 1809 matches y->x() 1810 </pre></td></tr> 1811 1812 1813 <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> 1814 <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 1815 1816 Matches a node if it equals the node previously bound to ID. 1817 1818 Given 1819 class X { int a; int b; }; 1820 recordDecl( 1821 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 1822 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 1823 matches the class X, as a and b have the same type. 1824 1825 Note that when multiple matches are involved via forEach* matchers, 1826 equalsBoundNodes acts as a filter. 1827 For example: 1828 compoundStmt( 1829 forEachDescendant(varDecl().bind("d")), 1830 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 1831 will trigger a match for each combination of variable declaration 1832 and reference to that variable declaration within a compound statement. 1833 </pre></td></tr> 1834 1835 1836 <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> 1837 <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 1838 the node, not hidden within a typedef. 1839 1840 Given 1841 typedef const int const_int; 1842 const_int i; 1843 int *const j; 1844 int *volatile k; 1845 int m; 1846 varDecl(hasType(hasLocalQualifiers())) matches only j and k. 1847 i is const-qualified but the qualifier is not local. 1848 </pre></td></tr> 1849 1850 1851 <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> 1852 <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 1853 include "top-level" const. 1854 1855 Given 1856 void a(int); 1857 void b(int const); 1858 void c(const int); 1859 void d(const int*); 1860 void e(int const) {}; 1861 functionDecl(hasAnyParameter(hasType(isConstQualified()))) 1862 matches "void b(int const)", "void c(const int)" and 1863 "void e(int const) {}". It does not match d as there 1864 is no top-level const on the parameter type "const int *". 1865 </pre></td></tr> 1866 1867 1868 <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> 1869 <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 1870 1871 Given 1872 void a(int); 1873 void b(long); 1874 void c(double); 1875 functionDecl(hasAnyParameter(hasType(isInteger()))) 1876 matches "a(int)", "b(long)", but not "c(double)". 1877 </pre></td></tr> 1878 1879 1880 <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> 1881 <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 1882 1883 Matches a node if it equals the node previously bound to ID. 1884 1885 Given 1886 class X { int a; int b; }; 1887 recordDecl( 1888 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 1889 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 1890 matches the class X, as a and b have the same type. 1891 1892 Note that when multiple matches are involved via forEach* matchers, 1893 equalsBoundNodes acts as a filter. 1894 For example: 1895 compoundStmt( 1896 forEachDescendant(varDecl().bind("d")), 1897 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 1898 will trigger a match for each combination of variable declaration 1899 and reference to that variable declaration within a compound statement. 1900 </pre></td></tr> 1901 1902 1903 <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>Stmt *Node</td></tr> 1904 <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 1905 1906 Stmt has pointer identity in the AST. 1907 1908 </pre></td></tr> 1909 1910 1911 <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> 1912 <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 1913 1914 Example matches A, va, fa 1915 class A {}; 1916 class B; Doesn't match, as it has no body. 1917 int va; 1918 extern int vb; Doesn't match, as it doesn't define the variable. 1919 void fa() {} 1920 void fb(); Doesn't match, as it has no body. 1921 1922 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>> 1923 </pre></td></tr> 1924 1925 1926 <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> 1927 <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 1928 1929 Matches a node if it equals the node previously bound to ID. 1930 1931 Given 1932 class X { int a; int b; }; 1933 recordDecl( 1934 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 1935 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 1936 matches the class X, as a and b have the same type. 1937 1938 Note that when multiple matches are involved via forEach* matchers, 1939 equalsBoundNodes acts as a filter. 1940 For example: 1941 compoundStmt( 1942 forEachDescendant(varDecl().bind("d")), 1943 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 1944 will trigger a match for each combination of variable declaration 1945 and reference to that variable declaration within a compound statement. 1946 </pre></td></tr> 1947 1948 1949 <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> 1950 <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 1951 1952 Given 1953 int x; 1954 int s = sizeof(x) + alignof(x) 1955 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 1956 matches sizeof(x) 1957 </pre></td></tr> 1958 1959 1960 <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> 1961 <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 1962 unary). 1963 1964 Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 1965 !(a || b) 1966 </pre></td></tr> 1967 1968 1969 <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> 1970 <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 1971 1972 Example matches y and z (matcher = varDecl(hasGlobalStorage()) 1973 void f() { 1974 int x; 1975 static int y; 1976 } 1977 int z; 1978 </pre></td></tr> 1979 1980 1981 <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> 1982 <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 1983 non-static local variable. 1984 1985 Example matches x (matcher = varDecl(hasLocalStorage()) 1986 void f() { 1987 int x; 1988 static int y; 1989 } 1990 int z; 1991 </pre></td></tr> 1992 1993 1994 <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> 1995 <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 1996 1997 Example matches A, va, fa 1998 class A {}; 1999 class B; Doesn't match, as it has no body. 2000 int va; 2001 extern int vb; Doesn't match, as it doesn't define the variable. 2002 void fa() {} 2003 void fb(); Doesn't match, as it has no body. 2004 2005 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>> 2006 </pre></td></tr> 2007 2008 2009 <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> 2010 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 2011 static member variable template instantiations. 2012 2013 Given 2014 template<typename T> void A(T t) { } 2015 template<> void A(int N) { } 2016 functionDecl(isExplicitTemplateSpecialization()) 2017 matches the specialization A<int>(). 2018 2019 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>> 2020 </pre></td></tr> 2021 2022 2023 <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> 2024 <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 2025 member variable template instantiations. 2026 2027 Given 2028 template <typename T> class X {}; class A {}; X<A> x; 2029 or 2030 template <typename T> class X {}; class A {}; template class X<A>; 2031 recordDecl(hasName("::X"), isTemplateInstantiation()) 2032 matches the template instantiation of X<A>. 2033 2034 But given 2035 template <typename T> class X {}; class A {}; 2036 template <> class X<A> {}; X<A> x; 2037 recordDecl(hasName("::X"), isTemplateInstantiation()) 2038 does not match, as X<A> is an explicit template specialization. 2039 2040 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>> 2041 </pre></td></tr> 2042 2043 <!--END_NARROWING_MATCHERS --> 2044 </table> 2045 2046 <!-- ======================================================================= --> 2047 <h2 id="traversal-matchers">AST Traversal Matchers</h2> 2048 <!-- ======================================================================= --> 2049 2050 <p>Traversal matchers specify the relationship to other nodes that are 2051 reachable from the current node.</p> 2052 2053 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and 2054 forEachDescendant) which work on all nodes and allow users to write more generic 2055 match expressions.</p> 2056 2057 <table> 2058 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2059 <!-- START_TRAVERSAL_MATCHERS --> 2060 2061 <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2062 <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 2063 2064 Unlike anyOf, eachOf will generate a match result for each 2065 matching submatcher. 2066 2067 For example, in: 2068 class A { int a; int b; }; 2069 The matcher: 2070 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 2071 has(fieldDecl(hasName("b")).bind("v")))) 2072 will generate two results binding "v", the first of which binds 2073 the field declaration of a, the second the field declaration of 2074 b. 2075 2076 Usable as: Any Matcher 2077 </pre></td></tr> 2078 2079 2080 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 2081 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 2082 provided matcher. 2083 2084 Example matches X, A, B, C 2085 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X"))))) 2086 class X {}; Matches X, because X::X is a class of name X inside X. 2087 class A { class X {}; }; 2088 class B { class C { class X {}; }; }; 2089 2090 DescendantT must be an AST base type. 2091 2092 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 2093 each result that matches instead of only on the first one. 2094 2095 Note: Recursively combined ForEachDescendant can cause many matches: 2096 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl())))) 2097 will match 10 times (plus injected class name matches) on: 2098 class A { class B { class C { class D { class E {}; }; }; }; }; 2099 2100 Usable as: Any Matcher 2101 </pre></td></tr> 2102 2103 2104 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 2105 <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 2106 provided matcher. 2107 2108 Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X"))) 2109 class X {}; Matches X, because X::X is a class of name X inside X. 2110 class Y { class X {}; }; 2111 class Z { class Y { class X {}; }; }; Does not match Z. 2112 2113 ChildT must be an AST base type. 2114 2115 As opposed to 'has', 'forEach' will cause a match for each result that 2116 matches instead of only on the first one. 2117 2118 Usable as: Any Matcher 2119 </pre></td></tr> 2120 2121 2122 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 2123 <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 2124 matcher. 2125 2126 Given 2127 void f() { if (true) { int x = 42; } } 2128 void g() { for (;;) { int x = 43; } } 2129 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 2130 2131 Usable as: Any Matcher 2132 </pre></td></tr> 2133 2134 2135 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 2136 <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 2137 provided matcher. 2138 2139 Example matches X, Y, Z 2140 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X"))))) 2141 class X {}; Matches X, because X::X is a class of name X inside X. 2142 class Y { class X {}; }; 2143 class Z { class Y { class X {}; }; }; 2144 2145 DescendantT must be an AST base type. 2146 2147 Usable as: Any Matcher 2148 </pre></td></tr> 2149 2150 2151 <tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 2152 <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 2153 provided matcher. 2154 2155 Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X"))) 2156 class X {}; Matches X, because X::X is a class of name X inside X. 2157 class Y { class X {}; }; 2158 class Z { class Y { class X {}; }; }; Does not match Z. 2159 2160 ChildT must be an AST base type. 2161 2162 Usable as: Any Matcher 2163 </pre></td></tr> 2164 2165 2166 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 2167 <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 2168 matcher. 2169 2170 Given 2171 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 2172 compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 2173 2174 Usable as: Any Matcher 2175 </pre></td></tr> 2176 2177 2178 <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> 2179 <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 2180 2181 Given 2182 int i[5]; 2183 void f() { i[1] = 42; } 2184 arraySubscriptExpression(hasBase(implicitCastExpr( 2185 hasSourceExpression(declRefExpr())))) 2186 matches i[1] with the declRefExpr() matching i 2187 </pre></td></tr> 2188 2189 2190 <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> 2191 <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 2192 2193 Given 2194 int i[5]; 2195 void f() { i[1] = 42; } 2196 arraySubscriptExpression(hasIndex(integerLiteral())) 2197 matches i[1] with the integerLiteral() matching 1 2198 </pre></td></tr> 2199 2200 2201 <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> 2202 <tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 2203 type. 2204 2205 Given 2206 struct A {}; 2207 A a[7]; 2208 int b[7]; 2209 arrayType(hasElementType(builtinType())) 2210 matches "int b[7]" 2211 2212 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>> 2213 </pre></td></tr> 2214 2215 2216 <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> 2217 <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 2218 type. 2219 2220 Given 2221 struct A {}; 2222 A a[7]; 2223 int b[7]; 2224 arrayType(hasElementType(builtinType())) 2225 matches "int b[7]" 2226 2227 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>> 2228 </pre></td></tr> 2229 2230 2231 <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> 2232 <tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 2233 2234 Given 2235 _Atomic(int) i; 2236 _Atomic(float) f; 2237 atomicType(hasValueType(isInteger())) 2238 matches "_Atomic(int) i" 2239 2240 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 2241 </pre></td></tr> 2242 2243 2244 <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> 2245 <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 2246 2247 Given 2248 _Atomic(int) i; 2249 _Atomic(float) f; 2250 atomicType(hasValueType(isInteger())) 2251 matches "_Atomic(int) i" 2252 2253 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 2254 </pre></td></tr> 2255 2256 2257 <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> 2258 <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 2259 2260 Note: There is no TypeLoc for the deduced type and thus no 2261 getDeducedLoc() matcher. 2262 2263 Given 2264 auto a = 1; 2265 auto b = 2.0; 2266 autoType(hasDeducedType(isInteger())) 2267 matches "auto a" 2268 2269 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 2270 </pre></td></tr> 2271 2272 2273 <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> 2274 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 2275 binary operator matches. 2276 </pre></td></tr> 2277 2278 2279 <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> 2280 <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 2281 2282 Example matches a (matcher = binaryOperator(hasLHS())) 2283 a || b 2284 </pre></td></tr> 2285 2286 2287 <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> 2288 <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 2289 2290 Example matches b (matcher = binaryOperator(hasRHS())) 2291 a || b 2292 </pre></td></tr> 2293 2294 2295 <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> 2296 <tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 2297 pointee matches a given matcher. 2298 2299 Given 2300 int *a; 2301 int const *b; 2302 float const *f; 2303 pointerType(pointee(isConstQualified(), isInteger())) 2304 matches "int const *b" 2305 2306 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>>, 2307 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>> 2308 </pre></td></tr> 2309 2310 2311 <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> 2312 <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 2313 pointee matches a given matcher. 2314 2315 Given 2316 int *a; 2317 int const *b; 2318 float const *f; 2319 pointerType(pointee(isConstQualified(), isInteger())) 2320 matches "int const *b" 2321 2322 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>>, 2323 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>> 2324 </pre></td></tr> 2325 2326 2327 <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> 2328 <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 2329 expression. 2330 2331 Given 2332 void x(int, int, int) { int y; x(1, y, 42); } 2333 callExpr(hasAnyArgument(declRefExpr())) 2334 matches x(1, y, 42) 2335 with hasAnyArgument(...) 2336 matching y 2337 2338 FIXME: Currently this will ignore parentheses and implicit casts on 2339 the argument before applying the inner matcher. We'll want to remove 2340 this to allow for greater control by the user once ignoreImplicit() 2341 has been implemented. 2342 </pre></td></tr> 2343 2344 2345 <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> 2346 <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 2347 call expression. 2348 2349 Example matches y in x(y) 2350 (matcher = callExpr(hasArgument(0, declRefExpr()))) 2351 void x(int) { int y; x(y); } 2352 </pre></td></tr> 2353 2354 2355 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</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> 2356 <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 2357 matches the given matcher. 2358 2359 The associated declaration is: 2360 - for type nodes, the declaration of the underlying type 2361 - for CallExpr, the declaration of the callee 2362 - for MemberExpr, the declaration of the referenced member 2363 - for CXXConstructExpr, the declaration of the constructor 2364 2365 Also usable as Matcher<T> for any T supporting the getDecl() member 2366 function. e.g. various subtypes of clang::Type and various expressions. 2367 2368 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>>, 2369 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>>, 2370 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 2371 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>>, 2372 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>>, 2373 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>> 2374 </pre></td></tr> 2375 2376 2377 <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> 2378 <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 2379 2380 Given 2381 class A { A() : i(42), j(42) {} int i; int j; }; 2382 constructorDecl(forEachConstructorInitializer(forField(decl().bind("x")))) 2383 will trigger two matches, binding for 'i' and 'j' respectively. 2384 </pre></td></tr> 2385 2386 2387 <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> 2388 <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 2389 2390 Given 2391 struct Foo { 2392 Foo() : foo_(1) { } 2393 int foo_; 2394 }; 2395 recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything())))) 2396 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 2397 </pre></td></tr> 2398 2399 2400 <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> 2401 <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 2402 2403 Given 2404 struct Foo { 2405 Foo() : foo_(1) { } 2406 int foo_; 2407 }; 2408 recordDecl(has(constructorDecl(hasAnyConstructorInitializer( 2409 forField(hasName("foo_")))))) 2410 matches Foo 2411 with forField matching foo_ 2412 </pre></td></tr> 2413 2414 2415 <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> 2416 <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 2417 2418 Given 2419 struct Foo { 2420 Foo() : foo_(1) { } 2421 int foo_; 2422 }; 2423 recordDecl(has(constructorDecl(hasAnyConstructorInitializer( 2424 withInitializer(integerLiteral(equals(1))))))) 2425 matches Foo 2426 with withInitializer matching (1) 2427 </pre></td></tr> 2428 2429 2430 <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> 2431 <tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', or 'do while' statement that has 2432 a given body. 2433 2434 Given 2435 for (;;) {} 2436 hasBody(compoundStmt()) 2437 matches 'for (;;) {}' 2438 with compoundStmt() 2439 matching '{}' 2440 </pre></td></tr> 2441 2442 2443 <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> 2444 <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 2445 2446 Example: 2447 forStmt(hasLoopVariable(anything())) 2448 matches 'int x' in 2449 for (int x : a) { } 2450 </pre></td></tr> 2451 2452 2453 <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> 2454 <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 2455 2456 Example: 2457 forStmt(hasRangeInit(anything())) 2458 matches 'a' in 2459 for (int x : a) { } 2460 </pre></td></tr> 2461 2462 2463 <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> 2464 <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 2465 2466 2467 <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> 2468 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 2469 2470 Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y")))))) 2471 class Y { public: void x(); }; 2472 void z() { Y y; y.x(); }", 2473 2474 FIXME: Overload to allow directly matching types? 2475 </pre></td></tr> 2476 2477 2478 <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> 2479 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 2480 </pre></td></tr> 2481 2482 2483 <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> 2484 <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 2485 matcher, or is a pointer to a type that matches the InnerMatcher. 2486 </pre></td></tr> 2487 2488 2489 <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> 2490 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 2491 belongs to. 2492 2493 FIXME: Generalize this for other kinds of declarations. 2494 FIXME: What other kind of declarations would we need to generalize 2495 this to? 2496 2497 Example matches A() in the last line 2498 (matcher = constructExpr(hasDeclaration(methodDecl( 2499 ofClass(hasName("A")))))) 2500 class A { 2501 public: 2502 A(); 2503 }; 2504 A a = A(); 2505 </pre></td></tr> 2506 2507 2508 <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> 2509 <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 2510 2511 Given: 2512 class A { void func(); }; 2513 class B { void member(); }; 2514 2515 recordDecl(hasMethod(hasName("func"))) matches the declaration of A 2516 but not B. 2517 </pre></td></tr> 2518 2519 2520 <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> 2521 <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 2522 a class matching Base. 2523 2524 Note that a class is not considered to be derived from itself. 2525 2526 Example matches Y, Z, C (Base == hasName("X")) 2527 class X; 2528 class Y : public X {}; directly derived 2529 class Z : public Y {}; indirectly derived 2530 typedef X A; 2531 typedef A B; 2532 class C : public B {}; derived from a typedef of X 2533 2534 In the following example, Bar matches isDerivedFrom(hasName("X")): 2535 class Foo; 2536 typedef Foo X; 2537 class Bar : public Foo {}; derived from a type that X is a typedef of 2538 </pre></td></tr> 2539 2540 2541 <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> 2542 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 2543 match Base. 2544 </pre></td></tr> 2545 2546 2547 <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> 2548 <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 2549 given matcher. 2550 2551 Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x"))))) 2552 class Y { public: void x(); }; 2553 void z() { Y y; y.x(); 2554 </pre></td></tr> 2555 2556 2557 <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> 2558 <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 2559 2560 Given 2561 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 2562 void f() { f(); } 2563 callExpr(callee(expr())) 2564 matches this->x(), x(), y.x(), f() 2565 with callee(...) 2566 matching this->x, x, y.x, f respectively 2567 2568 Note: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 2569 because this introduces ambiguous overloads with calls to Callee taking a 2570 internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 2571 implemented in terms of implicit casts. 2572 </pre></td></tr> 2573 2574 2575 <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> 2576 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 2577 expression. 2578 2579 Given 2580 void x(int, int, int) { int y; x(1, y, 42); } 2581 callExpr(hasAnyArgument(declRefExpr())) 2582 matches x(1, y, 42) 2583 with hasAnyArgument(...) 2584 matching y 2585 2586 FIXME: Currently this will ignore parentheses and implicit casts on 2587 the argument before applying the inner matcher. We'll want to remove 2588 this to allow for greater control by the user once ignoreImplicit() 2589 has been implemented. 2590 </pre></td></tr> 2591 2592 2593 <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> 2594 <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 2595 call expression. 2596 2597 Example matches y in x(y) 2598 (matcher = callExpr(hasArgument(0, declRefExpr()))) 2599 void x(int) { int y; x(y); } 2600 </pre></td></tr> 2601 2602 2603 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</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> 2604 <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 2605 matches the given matcher. 2606 2607 The associated declaration is: 2608 - for type nodes, the declaration of the underlying type 2609 - for CallExpr, the declaration of the callee 2610 - for MemberExpr, the declaration of the referenced member 2611 - for CXXConstructExpr, the declaration of the constructor 2612 2613 Also usable as Matcher<T> for any T supporting the getDecl() member 2614 function. e.g. various subtypes of clang::Type and various expressions. 2615 2616 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>>, 2617 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>>, 2618 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 2619 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>>, 2620 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>>, 2621 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>> 2622 </pre></td></tr> 2623 2624 2625 <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> 2626 <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 2627 extension, matches the constant given in the statement. 2628 2629 Given 2630 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 2631 caseStmt(hasCaseConstant(integerLiteral())) 2632 matches "case 1:" 2633 </pre></td></tr> 2634 2635 2636 <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> 2637 <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher. 2638 2639 Example: matches "a string" (matcher = 2640 hasSourceExpression(constructExpr())) 2641 class URL { URL(string); }; 2642 URL url = "a string"; 2643 </pre></td></tr> 2644 2645 2646 <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> 2647 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one 2648 TemplateArgument matching the given InnerMatcher. 2649 2650 Given 2651 template<typename T> class A {}; 2652 template<> class A<double> {}; 2653 A<int> a; 2654 classTemplateSpecializationDecl(hasAnyTemplateArgument( 2655 refersToType(asString("int")))) 2656 matches the specialization A<int> 2657 </pre></td></tr> 2658 2659 2660 <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> 2661 <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 2662 matches the given InnerMatcher. 2663 2664 Given 2665 template<typename T, typename U> class A {}; 2666 A<bool, int> b; 2667 A<int, bool> c; 2668 classTemplateSpecializationDecl(hasTemplateArgument( 2669 1, refersToType(asString("int")))) 2670 matches the specialization A<bool, int> 2671 </pre></td></tr> 2672 2673 2674 <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> 2675 <tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 2676 type. 2677 2678 Given 2679 struct A {}; 2680 A a[7]; 2681 int b[7]; 2682 arrayType(hasElementType(builtinType())) 2683 matches "int b[7]" 2684 2685 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>> 2686 </pre></td></tr> 2687 2688 2689 <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> 2690 <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 2691 type. 2692 2693 Given 2694 struct A {}; 2695 A a[7]; 2696 int b[7]; 2697 arrayType(hasElementType(builtinType())) 2698 matches "int b[7]" 2699 2700 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>> 2701 </pre></td></tr> 2702 2703 2704 <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> 2705 <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 2706 a given matcher. 2707 2708 Given 2709 { {}; 1+2; } 2710 hasAnySubstatement(compoundStmt()) 2711 matches '{ {}; 1+2; }' 2712 with compoundStmt() 2713 matching '{}' 2714 </pre></td></tr> 2715 2716 2717 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</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> 2718 <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 2719 or conditional operator. 2720 2721 Example matches true (matcher = hasCondition(boolLiteral(equals(true)))) 2722 if (true) {} 2723 </pre></td></tr> 2724 2725 2726 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</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> 2727 <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator. 2728 2729 Example matches b 2730 condition ? a : b 2731 </pre></td></tr> 2732 2733 2734 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</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> 2735 <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 2736 2737 Example matches a 2738 condition ? a : b 2739 </pre></td></tr> 2740 2741 2742 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</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> 2743 <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 2744 matches the given matcher. 2745 2746 The associated declaration is: 2747 - for type nodes, the declaration of the underlying type 2748 - for CallExpr, the declaration of the callee 2749 - for MemberExpr, the declaration of the referenced member 2750 - for CXXConstructExpr, the declaration of the constructor 2751 2752 Also usable as Matcher<T> for any T supporting the getDecl() member 2753 function. e.g. various subtypes of clang::Type and various expressions. 2754 2755 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>>, 2756 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>>, 2757 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 2758 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>>, 2759 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>>, 2760 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>> 2761 </pre></td></tr> 2762 2763 2764 <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> 2765 <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 2766 specific using shadow declaration. 2767 2768 FIXME: This currently only works for functions. Fix. 2769 2770 Given 2771 namespace a { void f() {} } 2772 using a::f; 2773 void g() { 2774 f(); Matches this .. 2775 a::f(); .. but not this. 2776 } 2777 declRefExpr(throughUsingDeclaration(anything())) 2778 matches f() 2779 </pre></td></tr> 2780 2781 2782 <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> 2783 <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 2784 specified matcher. 2785 2786 Example matches x in if(x) 2787 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 2788 bool x; 2789 if (x) {} 2790 </pre></td></tr> 2791 2792 2793 <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> 2794 <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 2795 2796 Note that this does not work for global declarations because the AST 2797 breaks up multiple-declaration DeclStmt's into multiple single-declaration 2798 DeclStmt's. 2799 Example: Given non-global declarations 2800 int a, b = 0; 2801 int c; 2802 int d = 2, e; 2803 declStmt(containsDeclaration( 2804 0, varDecl(hasInitializer(anything())))) 2805 matches only 'int d = 2, e;', and 2806 declStmt(containsDeclaration(1, varDecl())) 2807 matches 'int a, b = 0' as well as 'int d = 2, e;' 2808 but 'int c;' is not matched. 2809 </pre></td></tr> 2810 2811 2812 <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> 2813 <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 2814 2815 Given 2816 int a, b; 2817 int c; 2818 declStmt(hasSingleDecl(anything())) 2819 matches 'int c;' but not 'int a, b;'. 2820 </pre></td></tr> 2821 2822 2823 <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> 2824 <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 2825 the inner matcher. 2826 2827 Given 2828 int x; 2829 declaratorDecl(hasTypeLoc(loc(asString("int")))) 2830 matches int x 2831 </pre></td></tr> 2832 2833 2834 <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> 2835 <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 2836 Decl, matches InnerMatcher. 2837 2838 Given 2839 namespace N { 2840 namespace M { 2841 class D {}; 2842 } 2843 } 2844 2845 recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 2846 declaration of class D. 2847 </pre></td></tr> 2848 2849 2850 <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> 2851 <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has 2852 a given body. 2853 2854 Given 2855 for (;;) {} 2856 hasBody(compoundStmt()) 2857 matches 'for (;;) {}' 2858 with compoundStmt() 2859 matching '{}' 2860 </pre></td></tr> 2861 2862 2863 <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> 2864 <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 2865 or conditional operator. 2866 2867 Example matches true (matcher = hasCondition(boolLiteral(equals(true)))) 2868 if (true) {} 2869 </pre></td></tr> 2870 2871 2872 <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> 2873 <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 2874 matches InnerMatcher if the qualifier exists. 2875 2876 Given 2877 namespace N { 2878 namespace M { 2879 class D {}; 2880 } 2881 } 2882 N::M::D d; 2883 2884 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 2885 matches the type of the variable declaration of d. 2886 </pre></td></tr> 2887 2888 2889 <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> 2890 <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 2891 2892 Given 2893 namespace N { 2894 namespace M { 2895 class D {}; 2896 } 2897 } 2898 N::M::D d; 2899 2900 elaboratedType(namesType(recordType( 2901 hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 2902 declaration of d. 2903 </pre></td></tr> 2904 2905 2906 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</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> 2907 <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 2908 matches the given matcher. 2909 2910 The associated declaration is: 2911 - for type nodes, the declaration of the underlying type 2912 - for CallExpr, the declaration of the callee 2913 - for MemberExpr, the declaration of the referenced member 2914 - for CXXConstructExpr, the declaration of the constructor 2915 2916 Also usable as Matcher<T> for any T supporting the getDecl() member 2917 function. e.g. various subtypes of clang::Type and various expressions. 2918 2919 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>>, 2920 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>>, 2921 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 2922 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>>, 2923 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>>, 2924 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>> 2925 </pre></td></tr> 2926 2927 2928 <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> 2929 <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 2930 2931 (Note: Clang's AST refers to other conversions as "casts" too, and calls 2932 actual casts "explicit" casts.) 2933 </pre></td></tr> 2934 2935 2936 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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_1Decl.html">Decl</a>> InnerMatcher</td></tr> 2937 <tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value 2938 declaration's type. 2939 2940 In case of a value declaration (for example a variable declaration), 2941 this resolves one layer of indirection. For example, in the value 2942 declaration "X x;", recordDecl(hasName("X")) matches the declaration of X, 2943 while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration 2944 of x." 2945 2946 Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 2947 and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 2948 class X {}; 2949 void y(X &x) { x; X z; } 2950 2951 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>> 2952 </pre></td></tr> 2953 2954 2955 <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> 2956 <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 2957 matcher. 2958 2959 Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 2960 and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 2961 class X {}; 2962 void y(X &x) { x; X z; } 2963 </pre></td></tr> 2964 2965 2966 <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> 2967 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 2968 are stripped off. 2969 2970 Parentheses and explicit casts are not discarded. 2971 Given 2972 int arr[5]; 2973 int a = 0; 2974 char b = 0; 2975 const int c = a; 2976 int *d = arr; 2977 long e = (long) 0l; 2978 The matchers 2979 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 2980 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 2981 would match the declarations for a, b, c, and d, but not e. 2982 While 2983 varDecl(hasInitializer(integerLiteral())) 2984 varDecl(hasInitializer(declRefExpr())) 2985 only match the declarations for b, c, and d. 2986 </pre></td></tr> 2987 2988 2989 <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> 2990 <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 2991 casts are stripped off. 2992 2993 Implicit and non-C Style casts are also discarded. 2994 Given 2995 int a = 0; 2996 char b = (0); 2997 void* c = reinterpret_cast<char*>(0); 2998 char d = char(0); 2999 The matcher 3000 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 3001 would match the declarations for a, b, c, and d. 3002 while 3003 varDecl(hasInitializer(integerLiteral())) 3004 only match the declaration for a. 3005 </pre></td></tr> 3006 3007 3008 <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> 3009 <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 3010 parentheses are stripped off. 3011 3012 Explicit casts are not discarded. 3013 Given 3014 int arr[5]; 3015 int a = 0; 3016 char b = (0); 3017 const int c = a; 3018 int *d = (arr); 3019 long e = ((long) 0l); 3020 The matchers 3021 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 3022 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 3023 would match the declarations for a, b, c, and d, but not e. 3024 while 3025 varDecl(hasInitializer(integerLiteral())) 3026 varDecl(hasInitializer(declRefExpr())) 3027 would only match the declaration for a. 3028 </pre></td></tr> 3029 3030 3031 <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> 3032 <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has 3033 a given body. 3034 3035 Given 3036 for (;;) {} 3037 hasBody(compoundStmt()) 3038 matches 'for (;;) {}' 3039 with compoundStmt() 3040 matching '{}' 3041 </pre></td></tr> 3042 3043 3044 <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> 3045 <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 3046 or conditional operator. 3047 3048 Example matches true (matcher = hasCondition(boolLiteral(equals(true)))) 3049 if (true) {} 3050 </pre></td></tr> 3051 3052 3053 <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> 3054 <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 3055 3056 Example: 3057 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 3058 matches '++x' in 3059 for (x; x < N; ++x) { } 3060 </pre></td></tr> 3061 3062 3063 <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> 3064 <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 3065 3066 Example: 3067 forStmt(hasLoopInit(declStmt())) 3068 matches 'int x = 0' in 3069 for (int x = 0; x < N; ++x) { } 3070 </pre></td></tr> 3071 3072 3073 <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> 3074 <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration. 3075 3076 Does not match the 'this' parameter of a method. 3077 3078 Given 3079 class X { void f(int x, int y, int z) {} }; 3080 methodDecl(hasAnyParameter(hasName("y"))) 3081 matches f(int x, int y, int z) {} 3082 with hasAnyParameter(...) 3083 matching int y 3084 </pre></td></tr> 3085 3086 3087 <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> 3088 <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration. 3089 3090 Given 3091 class X { void f(int x) {} }; 3092 methodDecl(hasParameter(0, hasType(varDecl()))) 3093 matches f(int x) {} 3094 with hasParameter(...) 3095 matching int x 3096 </pre></td></tr> 3097 3098 3099 <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> 3100 <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 3101 3102 Given: 3103 class X { int f() { return 1; } }; 3104 methodDecl(returns(asString("int"))) 3105 matches int f() { return 1; } 3106 </pre></td></tr> 3107 3108 3109 <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> 3110 <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 3111 or conditional operator. 3112 3113 Example matches true (matcher = hasCondition(boolLiteral(equals(true)))) 3114 if (true) {} 3115 </pre></td></tr> 3116 3117 3118 <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> 3119 <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 3120 3121 Given 3122 if (A* a = GetAPointer()) {} 3123 hasConditionVariableStatement(...) 3124 matches 'A* a = GetAPointer()'. 3125 </pre></td></tr> 3126 3127 3128 <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> 3129 <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 3130 3131 Examples matches the if statement 3132 (matcher = ifStmt(hasElse(boolLiteral(equals(true))))) 3133 if (false) false; else true; 3134 </pre></td></tr> 3135 3136 3137 <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> 3138 <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 3139 3140 Examples matches the if statement 3141 (matcher = ifStmt(hasThen(boolLiteral(equals(true))))) 3142 if (false) true; else false; 3143 </pre></td></tr> 3144 3145 3146 <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> 3147 <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 3148 matcher. 3149 3150 FIXME: Unit test this matcher 3151 </pre></td></tr> 3152 3153 3154 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</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> 3155 <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 3156 matches the given matcher. 3157 3158 The associated declaration is: 3159 - for type nodes, the declaration of the underlying type 3160 - for CallExpr, the declaration of the callee 3161 - for MemberExpr, the declaration of the referenced member 3162 - for CXXConstructExpr, the declaration of the constructor 3163 3164 Also usable as Matcher<T> for any T supporting the getDecl() member 3165 function. e.g. various subtypes of clang::Type and various expressions. 3166 3167 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>>, 3168 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>>, 3169 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3170 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>>, 3171 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>>, 3172 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>> 3173 </pre></td></tr> 3174 3175 3176 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</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> 3177 <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 3178 matches the given matcher. 3179 3180 The associated declaration is: 3181 - for type nodes, the declaration of the underlying type 3182 - for CallExpr, the declaration of the callee 3183 - for MemberExpr, the declaration of the referenced member 3184 - for CXXConstructExpr, the declaration of the constructor 3185 3186 Also usable as Matcher<T> for any T supporting the getDecl() member 3187 function. e.g. various subtypes of clang::Type and various expressions. 3188 3189 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>>, 3190 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>>, 3191 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3192 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>>, 3193 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>>, 3194 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>> 3195 </pre></td></tr> 3196 3197 3198 <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> 3199 <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 3200 matches the given matcher. 3201 3202 The associated declaration is: 3203 - for type nodes, the declaration of the underlying type 3204 - for CallExpr, the declaration of the callee 3205 - for MemberExpr, the declaration of the referenced member 3206 - for CXXConstructExpr, the declaration of the constructor 3207 3208 Also usable as Matcher<T> for any T supporting the getDecl() member 3209 function. e.g. various subtypes of clang::Type and various expressions. 3210 3211 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>>, 3212 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>>, 3213 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3214 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>>, 3215 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>>, 3216 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>> 3217 </pre></td></tr> 3218 3219 3220 <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> 3221 <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 3222 matched by a given matcher. 3223 3224 Given 3225 struct X { int m; }; 3226 void f(X x) { x.m; m; } 3227 memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X"))))))) 3228 matches "x.m" and "m" 3229 with hasObjectExpression(...) 3230 matching "x" and the implicit object expression of "m" which has type X*. 3231 </pre></td></tr> 3232 3233 3234 <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> 3235 <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 3236 given matcher. 3237 3238 Given 3239 struct { int first, second; } first, second; 3240 int i(second.first); 3241 int j(first.second); 3242 memberExpr(member(hasName("first"))) 3243 matches second.first 3244 but not first.second (because the member name there is "second"). 3245 </pre></td></tr> 3246 3247 3248 <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> 3249 <tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 3250 pointee matches a given matcher. 3251 3252 Given 3253 int *a; 3254 int const *b; 3255 float const *f; 3256 pointerType(pointee(isConstQualified(), isInteger())) 3257 matches "int const *b" 3258 3259 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>>, 3260 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>> 3261 </pre></td></tr> 3262 3263 3264 <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> 3265 <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 3266 pointee matches a given matcher. 3267 3268 Given 3269 int *a; 3270 int const *b; 3271 float const *f; 3272 pointerType(pointee(isConstQualified(), isInteger())) 3273 matches "int const *b" 3274 3275 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>>, 3276 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>> 3277 </pre></td></tr> 3278 3279 3280 <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> 3281 <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 3282 3283 Given 3284 struct A { struct B { struct C {}; }; }; 3285 A::B::C c; 3286 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 3287 matches "A::" 3288 </pre></td></tr> 3289 3290 3291 <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> 3292 <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 3293 given TypeLoc. 3294 3295 Given 3296 struct A { struct B { struct C {}; }; }; 3297 A::B::C c; 3298 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 3299 hasDeclaration(recordDecl(hasName("A"))))))) 3300 matches "A::" 3301 </pre></td></tr> 3302 3303 3304 <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> 3305 <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 3306 3307 Given 3308 struct A { struct B { struct C {}; }; }; 3309 A::B::C c; 3310 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 3311 matches "A::" 3312 </pre></td></tr> 3313 3314 3315 <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> 3316 <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 3317 given namespace matcher. 3318 3319 Given 3320 namespace ns { struct A {}; } 3321 ns::A a; 3322 nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 3323 matches "ns::" 3324 </pre></td></tr> 3325 3326 3327 <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> 3328 <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 3329 given QualType matcher without qualifiers. 3330 3331 Given 3332 struct A { struct B { struct C {}; }; }; 3333 A::B::C c; 3334 nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A"))))) 3335 matches "A::" 3336 </pre></td></tr> 3337 3338 3339 <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> 3340 <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 3341 3342 Given 3343 int (*ptr_to_array)[4]; 3344 int (*ptr_to_func)(int); 3345 3346 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 3347 ptr_to_func but not ptr_to_array. 3348 3349 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 3350 </pre></td></tr> 3351 3352 3353 <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> 3354 <tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 3355 pointee matches a given matcher. 3356 3357 Given 3358 int *a; 3359 int const *b; 3360 float const *f; 3361 pointerType(pointee(isConstQualified(), isInteger())) 3362 matches "int const *b" 3363 3364 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>>, 3365 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>> 3366 </pre></td></tr> 3367 3368 3369 <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> 3370 <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 3371 pointee matches a given matcher. 3372 3373 Given 3374 int *a; 3375 int const *b; 3376 float const *f; 3377 pointerType(pointee(isConstQualified(), isInteger())) 3378 matches "int const *b" 3379 3380 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>>, 3381 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>> 3382 </pre></td></tr> 3383 3384 3385 <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> 3386 <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 3387 3388 Given: 3389 typedef int &int_ref; 3390 int a; 3391 int_ref b = a; 3392 3393 varDecl(hasType(qualType(referenceType()))))) will not match the 3394 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 3395 </pre></td></tr> 3396 3397 3398 <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> 3399 <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 3400 matches the given matcher. 3401 3402 The associated declaration is: 3403 - for type nodes, the declaration of the underlying type 3404 - for CallExpr, the declaration of the callee 3405 - for MemberExpr, the declaration of the referenced member 3406 - for CXXConstructExpr, the declaration of the constructor 3407 3408 Also usable as Matcher<T> for any T supporting the getDecl() member 3409 function. e.g. various subtypes of clang::Type and various expressions. 3410 3411 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>>, 3412 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>>, 3413 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3414 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>>, 3415 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>>, 3416 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>> 3417 </pre></td></tr> 3418 3419 3420 <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> 3421 <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 3422 </pre></td></tr> 3423 3424 3425 <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> 3426 <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 3427 matches the specified matcher. 3428 3429 Example matches y->x() 3430 (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y"))))))) 3431 class Y { public: void x(); }; 3432 void z() { Y *y; y->x(); } 3433 </pre></td></tr> 3434 3435 3436 <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> 3437 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 3438 </pre></td></tr> 3439 3440 3441 <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> 3442 <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 3443 type matches the specified matcher. 3444 3445 Example matches X &x and const X &y 3446 (matcher = varDecl(hasType(references(recordDecl(hasName("X")))))) 3447 class X { 3448 void a(X b) { 3449 X &x = b; 3450 const X &y = b; 3451 }; 3452 </pre></td></tr> 3453 3454 3455 <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> 3456 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 3457 matches the given matcher. 3458 3459 The associated declaration is: 3460 - for type nodes, the declaration of the underlying type 3461 - for CallExpr, the declaration of the callee 3462 - for MemberExpr, the declaration of the referenced member 3463 - for CXXConstructExpr, the declaration of the constructor 3464 3465 Also usable as Matcher<T> for any T supporting the getDecl() member 3466 function. e.g. various subtypes of clang::Type and various expressions. 3467 3468 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>>, 3469 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>>, 3470 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3471 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>>, 3472 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>>, 3473 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>> 3474 </pre></td></tr> 3475 3476 3477 <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> 3478 <tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 3479 pointee matches a given matcher. 3480 3481 Given 3482 int *a; 3483 int const *b; 3484 float const *f; 3485 pointerType(pointee(isConstQualified(), isInteger())) 3486 matches "int const *b" 3487 3488 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>>, 3489 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>> 3490 </pre></td></tr> 3491 3492 3493 <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> 3494 <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 3495 pointee matches a given matcher. 3496 3497 Given 3498 int *a; 3499 int const *b; 3500 float const *f; 3501 pointerType(pointee(isConstQualified(), isInteger())) 3502 matches "int const *b" 3503 3504 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>>, 3505 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>> 3506 </pre></td></tr> 3507 3508 3509 <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> 3510 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 3511 alignof. 3512 </pre></td></tr> 3513 3514 3515 <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> 3516 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 3517 sizeof. 3518 </pre></td></tr> 3519 3520 3521 <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> 3522 <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 3523 statement. This matcher may produce multiple matches. 3524 3525 Given 3526 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 3527 switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 3528 matches four times, with "c" binding each of "case 1:", "case 2:", 3529 "case 3:" and "case 4:", and "s" respectively binding "switch (1)", 3530 "switch (1)", "switch (2)" and "switch (2)". 3531 </pre></td></tr> 3532 3533 3534 <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> 3535 <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 3536 matches the given matcher. 3537 3538 The associated declaration is: 3539 - for type nodes, the declaration of the underlying type 3540 - for CallExpr, the declaration of the callee 3541 - for MemberExpr, the declaration of the referenced member 3542 - for CXXConstructExpr, the declaration of the constructor 3543 3544 Also usable as Matcher<T> for any T supporting the getDecl() member 3545 function. e.g. various subtypes of clang::Type and various expressions. 3546 3547 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>>, 3548 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>>, 3549 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3550 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>>, 3551 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>>, 3552 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>> 3553 </pre></td></tr> 3554 3555 3556 <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> 3557 <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 3558 3559 Given 3560 template<typename T> struct A {}; 3561 struct B { B* next; }; 3562 A<&B::next> a; 3563 templateSpecializationType(hasAnyTemplateArgument( 3564 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 3565 matches the specialization A<&B::next> with fieldDecl(...) matching 3566 B::next 3567 </pre></td></tr> 3568 3569 3570 <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> 3571 <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 3572 declaration. 3573 3574 Given 3575 template<typename T> struct A {}; 3576 struct B { B* next; }; 3577 A<&B::next> a; 3578 classTemplateSpecializationDecl(hasAnyTemplateArgument( 3579 refersToDeclaration(fieldDecl(hasName("next")))) 3580 matches the specialization A<&B::next> with fieldDecl(...) matching 3581 B::next 3582 </pre></td></tr> 3583 3584 3585 <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> 3586 <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 3587 3588 Given 3589 struct X {}; 3590 template<typename T> struct A {}; 3591 A<X> a; 3592 classTemplateSpecializationDecl(hasAnyTemplateArgument( 3593 refersToType(class(hasName("X"))))) 3594 matches the specialization A<X> 3595 </pre></td></tr> 3596 3597 3598 <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> 3599 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one 3600 TemplateArgument matching the given InnerMatcher. 3601 3602 Given 3603 template<typename T> class A {}; 3604 template<> class A<double> {}; 3605 A<int> a; 3606 classTemplateSpecializationDecl(hasAnyTemplateArgument( 3607 refersToType(asString("int")))) 3608 matches the specialization A<int> 3609 </pre></td></tr> 3610 3611 3612 <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> 3613 <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 3614 matches the given matcher. 3615 3616 The associated declaration is: 3617 - for type nodes, the declaration of the underlying type 3618 - for CallExpr, the declaration of the callee 3619 - for MemberExpr, the declaration of the referenced member 3620 - for CXXConstructExpr, the declaration of the constructor 3621 3622 Also usable as Matcher<T> for any T supporting the getDecl() member 3623 function. e.g. various subtypes of clang::Type and various expressions. 3624 3625 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>>, 3626 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>>, 3627 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3628 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>>, 3629 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>>, 3630 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>> 3631 </pre></td></tr> 3632 3633 3634 <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> 3635 <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 3636 matches the given InnerMatcher. 3637 3638 Given 3639 template<typename T, typename U> class A {}; 3640 A<bool, int> b; 3641 A<int, bool> c; 3642 classTemplateSpecializationDecl(hasTemplateArgument( 3643 1, refersToType(asString("int")))) 3644 matches the specialization A<bool, int> 3645 </pre></td></tr> 3646 3647 3648 <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> 3649 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 3650 matches the given matcher. 3651 3652 The associated declaration is: 3653 - for type nodes, the declaration of the underlying type 3654 - for CallExpr, the declaration of the callee 3655 - for MemberExpr, the declaration of the referenced member 3656 - for CXXConstructExpr, the declaration of the constructor 3657 3658 Also usable as Matcher<T> for any T supporting the getDecl() member 3659 function. e.g. various subtypes of clang::Type and various expressions. 3660 3661 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>>, 3662 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>>, 3663 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3664 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>>, 3665 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>>, 3666 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>> 3667 </pre></td></tr> 3668 3669 3670 <tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<T> Matcher</td></tr> 3671 <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 3672 3673 Generates results for each match. 3674 3675 For example, in: 3676 class A { class B {}; class C {}; }; 3677 The matcher: 3678 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m"))) 3679 will generate results for A, B and C. 3680 3681 Usable as: Any Matcher 3682 </pre></td></tr> 3683 3684 3685 <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> 3686 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 3687 matches the given matcher. 3688 3689 The associated declaration is: 3690 - for type nodes, the declaration of the underlying type 3691 - for CallExpr, the declaration of the callee 3692 - for MemberExpr, the declaration of the referenced member 3693 - for CXXConstructExpr, the declaration of the constructor 3694 3695 Also usable as Matcher<T> for any T supporting the getDecl() member 3696 function. e.g. various subtypes of clang::Type and various expressions. 3697 3698 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>>, 3699 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>>, 3700 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3701 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>>, 3702 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>>, 3703 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>> 3704 </pre></td></tr> 3705 3706 3707 <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> 3708 <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 3709 3710 Given 3711 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 3712 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 3713 matches sizeof(a) and alignof(c) 3714 </pre></td></tr> 3715 3716 3717 <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> 3718 <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 3719 3720 Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true)))) 3721 !true 3722 </pre></td></tr> 3723 3724 3725 <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> 3726 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 3727 matches the given matcher. 3728 3729 The associated declaration is: 3730 - for type nodes, the declaration of the underlying type 3731 - for CallExpr, the declaration of the callee 3732 - for MemberExpr, the declaration of the referenced member 3733 - for CXXConstructExpr, the declaration of the constructor 3734 3735 Also usable as Matcher<T> for any T supporting the getDecl() member 3736 function. e.g. various subtypes of clang::Type and various expressions. 3737 3738 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>>, 3739 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>>, 3740 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3741 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>>, 3742 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>>, 3743 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>> 3744 </pre></td></tr> 3745 3746 3747 <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> 3748 <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 3749 3750 Given 3751 namespace X { void b(); } 3752 using X::b; 3753 usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 3754 matches using X::b </pre></td></tr> 3755 3756 3757 <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> 3758 <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 3759 matched by the given matcher. 3760 3761 Given 3762 namespace X { int a; void b(); } 3763 using X::a; 3764 using X::b; 3765 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 3766 matches using X::b but not using X::a </pre></td></tr> 3767 3768 3769 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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> 3770 <tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 3771 declaration's type. 3772 3773 In case of a value declaration (for example a variable declaration), 3774 this resolves one layer of indirection. For example, in the value 3775 declaration "X x;", recordDecl(hasName("X")) matches the declaration of X, 3776 while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration 3777 of x." 3778 3779 Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 3780 and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 3781 class X {}; 3782 void y(X &x) { x; X z; } 3783 3784 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>> 3785 </pre></td></tr> 3786 3787 3788 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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> 3789 <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 3790 matcher. 3791 3792 Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 3793 and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 3794 class X {}; 3795 void y(X &x) { x; X z; } 3796 </pre></td></tr> 3797 3798 3799 <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> 3800 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 3801 that matches the given matcher. 3802 3803 Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 3804 bool y() { return true; } 3805 bool x = y(); 3806 </pre></td></tr> 3807 3808 3809 <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> 3810 <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 3811 expression. 3812 3813 Given 3814 void f(int b) { 3815 int a[b]; 3816 } 3817 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 3818 varDecl(hasName("b"))))))) 3819 matches "int a[b]" 3820 </pre></td></tr> 3821 3822 3823 <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> 3824 <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has 3825 a given body. 3826 3827 Given 3828 for (;;) {} 3829 hasBody(compoundStmt()) 3830 matches 'for (;;) {}' 3831 with compoundStmt() 3832 matching '{}' 3833 </pre></td></tr> 3834 3835 3836 <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> 3837 <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 3838 or conditional operator. 3839 3840 Example matches true (matcher = hasCondition(boolLiteral(equals(true)))) 3841 if (true) {} 3842 </pre></td></tr> 3843 3844 3845 <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> 3846 <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 3847 NestedNameSpecifier-matcher matches. 3848 </pre></td></tr> 3849 3850 3851 <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> 3852 <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 3853 QualType-matcher matches. 3854 </pre></td></tr> 3855 3856 <!--END_TRAVERSAL_MATCHERS --> 3857 </table> 3858 3859 </div> 3860 </body> 3861 </html> 3862 3863 3864