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