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