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