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