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