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